IDocumentStore => IZeroStore

This commit is contained in:
2020-11-15 17:07:27 +01:00
parent 3943f92f4c
commit c4e91efd5b
33 changed files with 155 additions and 164 deletions
+2 -2
View File
@@ -29,7 +29,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<IApplication>> GetAll()
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session
.Query<IApplication>()
.OrderByDescending(x => x.CreatedDate)
@@ -42,7 +42,7 @@ namespace zero.Core.Api
{
query.SearchFor(entity => entity.Name);
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<IApplication>().ToQueriedListAsync(query);
}
+4 -3
View File
@@ -4,6 +4,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Identity;
@@ -11,16 +12,16 @@ namespace zero.Core.Api
{
public class AuthenticationApi : IAuthenticationApi
{
protected IDocumentStore Raven { get; private set; }
protected IZeroStore Store { get; private set; }
protected IZeroContext Context { get; set; }
protected SignInManager<BackofficeUser> SignInManager { get; private set; }
public AuthenticationApi(IDocumentStore raven, IZeroContext context, SignInManager<BackofficeUser> signInManager)
public AuthenticationApi(IZeroStore store, IZeroContext context, SignInManager<BackofficeUser> signInManager)
{
Raven = raven;
Store = store;
Context = context;
SignInManager = signInManager;
}
+4 -3
View File
@@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Identity;
@@ -14,7 +15,7 @@ namespace zero.Core.Api
{
public class AuthorizationApi : IAuthorizationApi
{
protected IDocumentStore Raven { get; private set; }
protected IZeroStore Store { get; private set; }
protected IHttpContextAccessor HttpContextAccessor { get; set; }
@@ -23,9 +24,9 @@ namespace zero.Core.Api
protected ClaimsPrincipal Principal => HttpContextAccessor.HttpContext?.User;
public AuthorizationApi(IDocumentStore raven, IHttpContextAccessor httpContextAccessor, SignInManager<BackofficeUser> signInManager)
public AuthorizationApi(IZeroStore store, IHttpContextAccessor httpContextAccessor, SignInManager<BackofficeUser> signInManager)
{
Raven = raven;
Store = store;
HttpContextAccessor = httpContextAccessor;
SignInManager = signInManager;
}
+8 -8
View File
@@ -1,12 +1,12 @@
using FluentValidation;
using FluentValidation.Results;
using Raven.Client;
using Raven.Client.Documents;
using Raven.Client.Documents.Session;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using zero.Core.Attributes;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Entities.Messages;
using zero.Core.Extensions;
@@ -16,7 +16,7 @@ namespace zero.Core.Api
{
public abstract class BackofficeApi : IBackofficeApi
{
protected IDocumentStore Raven { get; private set; }
protected IZeroStore Store { get; private set; }
const string NEW_ID = "new:";
@@ -25,7 +25,7 @@ namespace zero.Core.Api
public BackofficeApi(IBackofficeStore store)
{
Raven = store.Raven;
Store = store.Store;
Backoffice = store;
}
@@ -38,7 +38,7 @@ namespace zero.Core.Api
return default;
}
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.LoadAsync<T>(id);
}
@@ -46,7 +46,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<Dictionary<string, T>> GetByIds<T>(params string[] ids) where T : IZeroIdEntity
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
Dictionary<string, T> models = await session.LoadAsync<T>(ids);
Dictionary<string, T> result = new Dictionary<string, T>();
@@ -145,7 +145,7 @@ namespace zero.Core.Api
model.CreatedById ??= userId;
model.Hash ??= IdGenerator.Create();
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
session.Advanced.WaitForIndexesAfterSaveChanges(throwOnTimeout: false);
await session.StoreAsync(model);
@@ -171,7 +171,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<EntityResult<T>> DeleteById<T>(string id) where T : IZeroIdEntity
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
session.Advanced.WaitForIndexesAfterSaveChanges(throwOnTimeout: false);
T entity = await session.LoadAsync<T>(id);
@@ -207,7 +207,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<EntityResult<T>> Purge<T>(string querySuffix = null, Parameters parameters = null)
{
await Raven.PurgeAsync<T>(querySuffix, parameters);
await Store.RavenStore.PurgeAsync<T>(querySuffix, parameters);
return EntityResult<T>.Success();
}
}
+5 -4
View File
@@ -1,4 +1,5 @@
using Raven.Client.Documents;
using zero.Core.Database;
using zero.Core.Messages;
using zero.Core.Options;
@@ -6,7 +7,7 @@ namespace zero.Core.Api
{
public class BackofficeStore : IBackofficeStore
{
public IDocumentStore Raven { get; private set; }
public IZeroStore Store { get; private set; }
public IApplicationContext AppContext { get; private set; }
@@ -17,9 +18,9 @@ namespace zero.Core.Api
public IMessageAggregator Messages { get; private set; }
public BackofficeStore(IDocumentStore raven, IApplicationContext appContext, IZeroOptions options, IAuthenticationApi authenticationApi, IMessageAggregator messages)
public BackofficeStore(IZeroStore store, IApplicationContext appContext, IZeroOptions options, IAuthenticationApi authenticationApi, IMessageAggregator messages)
{
Raven = raven;
Store = store;
AppContext = appContext;
Options = options;
Auth = authenticationApi;
@@ -30,7 +31,7 @@ namespace zero.Core.Api
public interface IBackofficeStore
{
IDocumentStore Raven { get; }
IZeroStore Store { get; }
IApplicationContext AppContext { get; }
+2 -2
View File
@@ -37,7 +37,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<ICountry>> GetAll(string languageId)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<ICountry>()
.OrderByDescending(x => x.IsPreferred)
.ThenBy(x => x.Name)
@@ -50,7 +50,7 @@ namespace zero.Core.Api
{
query.SearchSelector = country => country.Name;
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<ICountry>()
.OrderByDescending(x => x.IsPreferred)
.ThenBy(x => x.Name)
+2 -2
View File
@@ -40,7 +40,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<ILanguage>> GetAll()
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<ILanguage>()
.OrderByDescending(x => x.CreatedDate)
@@ -70,7 +70,7 @@ namespace zero.Core.Api
{
query.SearchFor(entity => entity.Name);
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<ILanguage>().ToQueriedListAsync(query);
}
+3 -3
View File
@@ -30,7 +30,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IMailTemplate> GetByKey(string key)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<IMailTemplate>().FirstOrDefaultAsync(x => x.Key == key);
}
@@ -47,7 +47,7 @@ namespace zero.Core.Api
/// </summary>
public async Task<IList<IMailTemplate>> GetAll()
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<IMailTemplate>().ToListAsync();
}
@@ -59,7 +59,7 @@ namespace zero.Core.Api
{
query.SearchSelector = entity => entity.Name;
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<IMailTemplate>()
.ToQueriedListAsync(query);
+4 -4
View File
@@ -48,7 +48,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<string> GetSourceById(string id, bool thumb = false, bool enforceAppId = true)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
IMedia media = await session.LoadAsync<IMedia>(id);
@@ -69,7 +69,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<Dictionary<string, IMedia>> GetById(IEnumerable<string> ids)
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.LoadAsync<IMedia>(ids);
}
@@ -81,7 +81,7 @@ namespace zero.Core.Api
{
query.SearchFor(entity => entity.Name);
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<IMedia>()
.WhereIf(x => x.FolderId == query.FolderId, !query.FolderId.IsNullOrEmpty(), x => x.FolderId == null)
@@ -99,7 +99,7 @@ namespace zero.Core.Api
.OrderByDescending(x => x.IsFolder)
.ThenBy(query.OrderBy, query.OrderIsDescending, query.OrderType == ListQueryOrderType.String ? OrderingType.String : OrderingType.Double);
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
session.Advanced.MaxNumberOfRequestsPerSession = query.PageSize + 1;
IRavenQueryable<MediaListItem> dbQuery = session.Query<MediaListItem, Media_ByParent>().ProjectInto<MediaListItem>();
+3 -3
View File
@@ -33,7 +33,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<IMediaFolder>> GetAll(string parentId = null)
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<IMediaFolder>()
.WhereIf(x => x.ParentId == parentId, !parentId.IsNullOrEmpty(), x => x.ParentId == null)
@@ -49,7 +49,7 @@ namespace zero.Core.Api
List<TreeItem> items = new List<TreeItem>();
string[] openIds = new string[0] { };
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
IList<IMediaFolder> folders = await session.Query<IMediaFolder>()
.WhereIf(x => x.ParentId == parentId, !parentId.IsNullOrEmpty(), x => x.ParentId == null)
@@ -126,7 +126,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<IMediaFolder>> GetHierarchy(string id)
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
MediaFolder_ByHierarchy.Result result = await session.Query<MediaFolder_ByHierarchy.Result, MediaFolder_ByHierarchy>()
.ProjectInto<MediaFolder_ByHierarchy.Result>()
+1 -1
View File
@@ -24,7 +24,7 @@ namespace zero.Core.Api
IReadOnlyCollection<PageType> pageTypes = Backoffice.Options.Pages.GetAllItems();
string[] openIds = new string[0] { };
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
IList<IPage> pages = await session
.Query<IPage>()
+3 -3
View File
@@ -141,7 +141,7 @@ namespace zero.Core.Api
return EntityResult<IList<IPage>>.Fail("@errors.page.sortingmultipleparents");
}
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
session.Advanced.WaitForIndexesAfterSaveChanges(throwOnTimeout: false);
@@ -211,7 +211,7 @@ namespace zero.Core.Api
return EntityResult<IPage>.Fail("@errors.page.parentnotallowed");
}
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
session.Advanced.WaitForIndexesAfterSaveChanges(throwOnTimeout: false);
@@ -360,7 +360,7 @@ namespace zero.Core.Api
items.Add(model);
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
// recursive function to store descendants
async Task AddChildren(string parentId)
+3 -3
View File
@@ -67,7 +67,7 @@ namespace zero.Core.Api
{
query.SearchSelector = x => x.Name;
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<IRecycledEntity>()
.WhereIf(x => x.Group == query.Group, !query.Group.IsNullOrWhiteSpace())
@@ -80,7 +80,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<IRecycledEntity>> GetByOperation(string operationId)
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<IRecycledEntity>()
.Where(x => x.OperationId == operationId)
@@ -94,7 +94,7 @@ namespace zero.Core.Api
/// </summary>
public async Task<int> GetCountByOperation(string operationId)
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<IRecycledEntity>()
.Where(x => x.OperationId == operationId)
+5 -4
View File
@@ -8,6 +8,7 @@ using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Extensions;
using zero.Core.Options;
@@ -18,13 +19,13 @@ namespace zero.Core.Api
{
protected IZeroOptions Options { get; set; }
protected IDocumentStore Raven { get; set; }
protected IZeroStore Store { get; set; }
public RevisionsApi(IZeroOptions options, IDocumentStore raven)
public RevisionsApi(IZeroOptions options, IZeroStore store)
{
Options = options;
Raven = raven;
Store = store;
}
@@ -33,7 +34,7 @@ namespace zero.Core.Api
/// </summary>
public async Task<ListResult<Revision>> GetPaged<T>(string id, int pageNumber = 1, int pageSize = 10, bool includeContent = false) where T : IZeroEntity
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
// get paged revisions
List<T> items = await session.Advanced.Revisions.GetForAsync<T>(id, (pageNumber - 1) * pageSize, pageSize);
+4 -4
View File
@@ -48,7 +48,7 @@ namespace zero.Core.Api
{
Space space = GetByAlias(alias);
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<ISpaceContent>()
.Where(x => x.SpaceAlias == space.Alias)
@@ -63,7 +63,7 @@ namespace zero.Core.Api
{
Space space = GetBy<T>();
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<T>()
.Where(x => x.SpaceAlias == space.Alias)
@@ -78,7 +78,7 @@ namespace zero.Core.Api
{
query.SearchSelector = item => item.Name;
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<ISpaceContent>()
.Where(x => x.SpaceAlias == alias)
@@ -93,7 +93,7 @@ namespace zero.Core.Api
Space space = GetBy<T>();
query.SearchSelector = item => item.Name;
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<T>()
.Where(x => x.SpaceAlias == space.Alias)
+7 -6
View File
@@ -3,6 +3,7 @@ using Raven.Client.Documents.Session;
using System;
using System.Linq;
using System.Threading.Tasks;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Extensions;
using zero.Core.Options;
@@ -11,16 +12,16 @@ namespace zero.Core.Api
{
public class Token : IToken
{
protected IDocumentStore Raven { get; private set; }
protected IZeroStore Store { get; private set; }
protected IZeroOptions Options { get; private set; }
private const string PREFIX = "changeTokens";
public Token(IDocumentStore raven, IZeroOptions options)
public Token(IZeroStore store, IZeroOptions options)
{
Raven = raven;
Store = store;
Options = options;
}
@@ -45,7 +46,7 @@ namespace zero.Core.Api
return false;
}
using (IDocumentSession session = Raven.OpenSession())
using (IDocumentSession session = Store.OpenSession())
{
return session.Query<ChangeToken>().Any(x => x.Id == token && x.ReferenceId == entityId);
}
@@ -69,11 +70,11 @@ namespace zero.Core.Api
ChangeToken token = new ChangeToken()
{
Id = Options.Raven.CollectionPrefix.EnsureEndsWith(Raven.Conventions.IdentityPartsSeparator) + PREFIX.EnsureEndsWith(Raven.Conventions.IdentityPartsSeparator) + Guid.NewGuid(),
Id = Options.Raven.CollectionPrefix.EnsureEndsWith(Store.RavenStore.Conventions.IdentityPartsSeparator) + PREFIX.EnsureEndsWith(Store.RavenStore.Conventions.IdentityPartsSeparator) + Guid.NewGuid(),
ReferenceId = entityId
};
using (IDocumentSession session = Raven.OpenSession())
using (IDocumentSession session = Store.OpenSession())
{
session.Store(token);
session.Advanced.GetMetadataFor(token)[Constants.Database.Expires] = DateTime.UtcNow.AddMinutes(Options.TokenExpiration);
+2 -2
View File
@@ -38,7 +38,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<ITranslation>> GetAll()
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<ITranslation>().OrderByDescending(x => x.CreatedDate).ToListAsync();
}
@@ -48,7 +48,7 @@ namespace zero.Core.Api
{
query.SearchFor(entity => entity.Key, entity => entity.Value);
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<ITranslation>().OrderByDescending(x => x.CreatedDate).ToQueriedListAsync(query);
}
+2 -2
View File
@@ -49,7 +49,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<IBackofficeUser>> GetAll()
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<IBackofficeUser>()
.OrderByDescending(x => x.CreatedDate)
.ToListAsync();
@@ -63,7 +63,7 @@ namespace zero.Core.Api
query.SearchSelector = user => user.Name;
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await session.Query<IBackofficeUser>()
.ToQueriedListAsync(query);
}
+3 -3
View File
@@ -37,7 +37,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<IList<IBackofficeUserRole>> GetAll()
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
return await session.Query<IBackofficeUserRole>().OrderBy(x => x.Sort).ThenBy(x => x.Name).ToListAsync();
}
@@ -68,7 +68,7 @@ namespace zero.Core.Api
model.Alias = Safenames.Alias(model.Name);
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
await session.StoreAsync(model);
@@ -89,7 +89,7 @@ namespace zero.Core.Api
/// <inheritdoc />
public async Task<EntityResult<IBackofficeUserRole>> Delete(string id)
{
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
BackofficeUserRole country = await session.LoadAsync<BackofficeUserRole>(id);
+14 -6
View File
@@ -7,7 +7,7 @@ namespace zero.Core.Database
{
public interface IZeroStore
{
IDocumentStore Store { get; }
IDocumentStore RavenStore { get; }
BulkInsertOperation BulkInsert(CancellationToken token = default);
BulkInsertOperation BulkInsert(string database, CancellationToken token = default);
@@ -23,13 +23,19 @@ namespace zero.Core.Database
{
public ZeroStore() : base()
{
CurrentDatabase = "laola.hofbauer";
}
/// <summary>
/// Get underlying raven document store
/// </summary>
public IDocumentStore Store => this;
public IDocumentStore RavenStore => this;
/// <summary>
/// Database for the currently resolved application
/// </summary>
public string CurrentDatabase { get; private set; }
/// <inheritdoc />
public override IAsyncDocumentSession OpenAsyncSession(string database)
@@ -40,18 +46,20 @@ namespace zero.Core.Database
/// <inheritdoc />
public override IAsyncDocumentSession OpenAsyncSession(SessionOptions options)
{
options.Database = options.Database ?? CurrentDatabase;
return base.OpenAsyncSession(options);
}
/// <inheritdoc />
public override IAsyncDocumentSession OpenAsyncSession()
{
return base.OpenAsyncSession();
return base.OpenAsyncSession(CurrentDatabase);
}
/// <inheritdoc />
public override IDocumentSession OpenSession(SessionOptions options)
{
options.Database = options.Database ?? CurrentDatabase;
return base.OpenSession(options);
}
@@ -64,7 +72,7 @@ namespace zero.Core.Database
/// <inheritdoc />
public override IDocumentSession OpenSession()
{
return base.OpenSession();
return base.OpenSession(CurrentDatabase);
}
/// <inheritdoc />
@@ -78,7 +86,7 @@ namespace zero.Core.Database
/// </summary>
public BulkInsertOperation BulkInsert(CancellationToken token = default)
{
return base.BulkInsert(null, token);
return base.BulkInsert(CurrentDatabase, token);
}
}
}
@@ -94,15 +94,6 @@ namespace zero.Core.Extensions
}
/// <summary>
/// Create a new unique Id
/// </summary>
public static string Id(this IDocumentStore store, int length = -1)
{
return IdGenerator.Create(length);
}
/// <summary>
/// Reserves a key cluster-wide
/// </summary>
+3 -3
View File
@@ -105,7 +105,7 @@ namespace zero.Core.Extensions
{
return ruleBuilder.MustAsync(async (entity, value, context, cancellation) =>
{
using IAsyncDocumentSession session = store.Raven.OpenAsyncSession();
using IAsyncDocumentSession session = store.Store.OpenAsyncSession();
bool any = await session.Advanced.AsyncDocumentQuery<T>()
.WhereNotEquals(nameof(IZeroIdEntity.Id), entity.Id)
@@ -124,7 +124,7 @@ namespace zero.Core.Extensions
{
return ruleBuilder.MustAsync(async (entity, value, context, cancellation) =>
{
using IAsyncDocumentSession session = store.Raven.OpenAsyncSession();
using IAsyncDocumentSession session = store.Store.OpenAsyncSession();
return await session.Advanced.AsyncDocumentQuery<T>()
.WhereNotEquals(nameof(IZeroIdEntity.Id), entity.Id)
@@ -155,7 +155,7 @@ namespace zero.Core.Extensions
return true;
}
using IAsyncDocumentSession session = store.Raven.OpenAsyncSession();
using IAsyncDocumentSession session = store.Store.OpenAsyncSession();
TReference model = await session.LoadAsync<TReference>(id);
return model != null;
}).WithMessage("@errors.forms.reference_notfound");
+9 -8
View File
@@ -8,6 +8,7 @@ using System.Linq;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
using zero.Core.Database;
using zero.Core.Entities;
namespace zero.Core.Identity
@@ -15,14 +16,14 @@ namespace zero.Core.Identity
public class RavenRoleStore<TRole> : IRoleStore<TRole>, IRoleClaimStore<TRole>
where TRole : class, IIdentityUserRole
{
protected IDocumentStore Raven { get; private set; }
protected IZeroStore Store { get; private set; }
protected IdentityErrorDescriber ErrorDescriber { get; private set; }
public RavenRoleStore(IDocumentStore raven, IdentityErrorDescriber describer = null)
public RavenRoleStore(IZeroStore store, IdentityErrorDescriber describer = null)
{
Raven = raven;
Store = store;
ErrorDescriber = describer ?? new IdentityErrorDescriber();
}
@@ -50,7 +51,7 @@ namespace zero.Core.Identity
Description = $"The affected role is is not part of this role store and can't be created."
});
}
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
await session.StoreAsync(role);
await session.SaveChangesAsync(cancellationToken);
@@ -72,7 +73,7 @@ namespace zero.Core.Identity
}
try
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
await session.StoreAsync(role, cancellationToken);
await session.SaveChangesAsync(cancellationToken);
}
@@ -97,7 +98,7 @@ namespace zero.Core.Identity
}
try
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
session.Delete(role);
await session.SaveChangesAsync(cancellationToken);
}
@@ -139,7 +140,7 @@ namespace zero.Core.Identity
/// <inheritdoc/>
public async Task<TRole> FindByIdAsync(string roleId, CancellationToken cancellationToken)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await ScopeQuery(session.Query<TRole>()).FirstOrDefaultAsync(x => x.Id == roleId, cancellationToken);
}
@@ -147,7 +148,7 @@ namespace zero.Core.Identity
/// <inheritdoc/>
public async Task<TRole> FindByNameAsync(string normalizedRoleName, CancellationToken cancellationToken)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await ScopeQuery(session.Query<TRole>()).FirstOrDefaultAsync(x => x.Name == normalizedRoleName, cancellationToken);
}
+4 -3
View File
@@ -2,6 +2,7 @@
using Raven.Client.Documents;
using Raven.Client.Documents.Linq;
using System;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Extensions;
@@ -12,7 +13,7 @@ namespace zero.Core.Identity
{
protected IZeroContext Context { get; private set; }
public RavenScopedRoleStore(IDocumentStore raven, IZeroContext context, IdentityErrorDescriber describer = null) : base(raven, describer)
public RavenScopedRoleStore(IZeroStore store, IZeroContext context, IdentityErrorDescriber describer = null) : base(store, describer)
{
Context = context;
}
@@ -31,7 +32,7 @@ namespace zero.Core.Identity
{
protected IZeroContext Context { get; private set; }
public RavenScopedUserStore(IDocumentStore raven, IZeroContext context) : base(raven)
public RavenScopedUserStore(IZeroStore store, IZeroContext context) : base(store)
{
Context = context;
}
@@ -54,7 +55,7 @@ namespace zero.Core.Identity
{
protected IZeroContext Context { get; private set; }
public RavenScopedUserStore(IDocumentStore raven, IZeroContext context) : base(raven)
public RavenScopedUserStore(IZeroStore store, IZeroContext context) : base(store)
{
Context = context;
}
+20 -19
View File
@@ -8,6 +8,7 @@ using System.Linq;
using System.Security.Claims;
using System.Threading;
using System.Threading.Tasks;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Extensions;
@@ -23,11 +24,11 @@ namespace zero.Core.Identity
IProtectedUserStore<TUser>
where TUser : class, IIdentityUser
{
protected IDocumentStore Raven { get; private set; }
protected IZeroStore Store { get; private set; }
public RavenUserStore(IDocumentStore raven)
public RavenUserStore(IZeroStore store)
{
Raven = raven;
Store = store;
}
@@ -61,10 +62,10 @@ namespace zero.Core.Identity
});
}
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
// try to reserve the key for the new user
if (!await Raven.ReserveAsync(GetReservationKey(user), user.Id))
if (!await Store.RavenStore.ReserveAsync(GetReservationKey(user), user.Id))
{
return IdentityResult.Failed(new IdentityError
{
@@ -86,7 +87,7 @@ namespace zero.Core.Identity
{
// The compare/exchange email reservation is cluster-wide, outside of the session scope.
// We need to manually roll it back.
await Raven.RemoveReservationAsync(GetReservationKey(user));
await Store.RavenStore.RemoveReservationAsync(GetReservationKey(user));
throw;
}
@@ -107,11 +108,11 @@ namespace zero.Core.Identity
}
// Remove the cluster-wide compare/exchange key.
await Raven.RemoveReservationAsync(GetReservationKey(user));
await Store.RavenStore.RemoveReservationAsync(GetReservationKey(user));
// Delete the user and save it. We must save it because deleting is a cluster-wide operation.
// Only if the deletion succeeds will we remove the cluster-wide compare/exchange key.
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
TUser source = await session.LoadAsync<TUser>(user.Id, cancellationToken);
@@ -134,7 +135,7 @@ namespace zero.Core.Identity
});
}
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
TUser source = await session.LoadAsync<TUser>(user.Id, cancellationToken);
@@ -150,7 +151,7 @@ namespace zero.Core.Identity
if (source.Email != user.Email)
{
// try to reserve the key for the new user
if (!await Raven.ReserveAsync(GetReservationKey(user), user.Id))
if (!await Store.RavenStore.ReserveAsync(GetReservationKey(user), user.Id))
{
return IdentityResult.Failed(new IdentityError
{
@@ -160,11 +161,11 @@ namespace zero.Core.Identity
}
// Remove the cluster-wide compare/exchange key.
await Raven.RemoveReservationAsync(GetReservationKey(source));
await Store.RavenStore.RemoveReservationAsync(GetReservationKey(source));
}
}
using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
using (IAsyncDocumentSession session = Store.OpenAsyncSession())
{
await session.StoreAsync(user, cancellationToken);
await session.SaveChangesAsync(cancellationToken);
@@ -177,7 +178,7 @@ namespace zero.Core.Identity
/// <inheritdoc />
public async Task<TUser> FindByIdAsync(string userId, CancellationToken cancellationToken)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await ScopeQuery(session.Query<TUser>()).FirstOrDefaultAsync(x => x.Id == userId, cancellationToken);
}
@@ -185,7 +186,7 @@ namespace zero.Core.Identity
/// <inheritdoc />
public async Task<TUser> FindByNameAsync(string normalizedUserName, CancellationToken cancellationToken)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await ScopeQuery(session.Query<TUser>()).FirstOrDefaultAsync(x => x.Username == normalizedUserName, cancellationToken);
}
@@ -253,7 +254,7 @@ namespace zero.Core.Identity
/// <inheritdoc />
public async Task<TUser> FindByEmailAsync(string normalizedEmail, CancellationToken cancellationToken)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await ScopeQuery(session.Query<TUser>()).FirstOrDefaultAsync(x => x.Email == normalizedEmail, cancellationToken);
}
@@ -384,7 +385,7 @@ namespace zero.Core.Identity
return;
}
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
user.Claims.AddRange(claims.Select(claim => new UserClaim(claim)));
await session.StoreAsync(user, cancellationToken);
@@ -402,7 +403,7 @@ namespace zero.Core.Identity
/// <inheritdoc />
public async Task<IList<TUser>> GetUsersForClaimAsync(Claim claim, CancellationToken cancellationToken)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
UserClaim userClaim = new UserClaim(claim);
return await ScopeQuery(session.Query<TUser>()).Where(x => x.Claims.Any(c => c.Type == userClaim.Type && c.Value == userClaim.Value)).ToListAsync();
}
@@ -417,7 +418,7 @@ namespace zero.Core.Identity
return;
}
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
IEnumerable<UserClaim> userClaims = claims.Select(c => new UserClaim(c)).ToList();
@@ -438,7 +439,7 @@ namespace zero.Core.Identity
return;
}
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
UserClaim userClaim = new UserClaim(claim);
UserClaim newUserClaim = new UserClaim(newClaim);
@@ -7,6 +7,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using zero.Core.Database;
namespace zero.Core.Identity
{
@@ -18,7 +19,7 @@ namespace zero.Core.Identity
where TUser : class, IIdentityUserWithRoles
where TRole : class, IIdentityUserRole
{
public RavenUserStore(IDocumentStore raven) : base(raven) { }
public RavenUserStore(IZeroStore store) : base(store) { }
/// <inheritdoc />
@@ -39,7 +40,7 @@ namespace zero.Core.Identity
/// <inheritdoc />
public async Task<IList<TUser>> GetUsersInRoleAsync(string roleName, CancellationToken cancellationToken)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await ScopeQuery(session.Query<TUser>()).Where(x => roleName.In(x.RoleIds)).ToListAsync(); // TODO scope
}
+5 -4
View File
@@ -6,6 +6,7 @@ using System.Linq;
using System.Text;
using System.Threading.Tasks;
using zero.Core.Api;
using zero.Core.Database;
using zero.Core.Database.Indexes;
using zero.Core.Entities;
using zero.Core.Extensions;
@@ -18,19 +19,19 @@ namespace zero.Core.Routing
const bool TRAILING_SLASH = false;
protected IDocumentStore Raven { get; private set; }
protected IZeroStore Store { get; private set; }
public PageUrlBuilder(IDocumentStore raven)
public PageUrlBuilder(IZeroStore store)
{
Raven = raven;
Store = store;
}
/// <inheritdoc />
public async Task<string> GetUrl(IPage page)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
Pages_ByHierarchy.Result result = await session.Query<Pages_ByHierarchy.Result, Pages_ByHierarchy>()
.ProjectInto<Pages_ByHierarchy.Result>()
+11 -10
View File
@@ -9,6 +9,7 @@ using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using zero.Core.Api;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Extensions;
@@ -16,15 +17,15 @@ namespace zero.Core.Routing
{
public class Routes : IRoutes
{
protected IDocumentStore Raven { get; set; }
protected IZeroStore Store { get; set; }
protected ILogger<Routes> Logger { get; set; }
protected IEnumerable<IRouteProvider> Providers { get; set; }
protected IApplicationContext Context { get; set; }
public Routes(IDocumentStore raven, ILogger<Routes> logger, IEnumerable<IRouteProvider> providers, IApplicationContext context)
public Routes(IZeroStore store, ILogger<Routes> logger, IEnumerable<IRouteProvider> providers, IApplicationContext context)
{
Raven = raven;
Store = store;
Logger = logger;
Providers = providers;
Context = context;
@@ -50,7 +51,7 @@ namespace zero.Core.Routing
return null;
}
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await routeProvider.GetRoute(session, model);
}
@@ -73,7 +74,7 @@ namespace zero.Core.Routing
Dictionary<T, IRoute> result = new Dictionary<T, IRoute>();
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
foreach (T model in models)
{
@@ -89,7 +90,7 @@ namespace zero.Core.Routing
{
path = path.Length > 1 ? path.TrimEnd('/') : path;
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
string[] pathParts = path.Trim('/').Split('/');
string[] parts = new string[pathParts.Length];
@@ -142,7 +143,7 @@ namespace zero.Core.Routing
/// <inheritdoc />
public async Task<IResolvedRoute> ResolveRoute(IRoute route)
{
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
return await ResolveRouteInternal(session, route);
}
@@ -152,7 +153,7 @@ namespace zero.Core.Routing
{
int count = 0;
List<IRoute> all = new List<IRoute>();
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
session.Advanced.MaxNumberOfRequestsPerSession = 1000;
foreach (IRouteProvider provider in Providers)
@@ -161,13 +162,13 @@ namespace zero.Core.Routing
IList<IRoute> routes = await provider.GetAllRoutes(session);
// delete all registered routes in the database for this provider
await Raven.PurgeAsync<IRoute>($"where {nameof(IRoute.ProviderAlias)} = $alias", new Raven.Client.Parameters()
await Store.RavenStore.PurgeAsync<IRoute>($"where {nameof(IRoute.ProviderAlias)} = $alias", new Raven.Client.Parameters()
{
{ "alias", provider.Alias }
});
// store new routes
using (BulkInsertOperation bulkInsert = Raven.BulkInsert())
using (BulkInsertOperation bulkInsert = Store.BulkInsert())
{
foreach (IRoute route in routes)
{
@@ -24,7 +24,7 @@
// {
// IList<IApplication> apps;
// using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
// using (IAsyncDocumentSession session = Store.OpenAsyncSession())
// {
// apps = await session.Query<IApplication>().ToListAsync();
// }
@@ -69,7 +69,7 @@
// HashSet<string> ids = new HashSet<string>();
// IList<T> items;
// using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
// using (IAsyncDocumentSession session = Store.OpenAsyncSession())
// {
// session.Advanced.MaxNumberOfRequestsPerSession = 10000;
@@ -98,7 +98,7 @@
// await session.SaveChangesAsync();
// }
// using (IAsyncDocumentSession session = Raven.OpenAsyncSession())
// using (IAsyncDocumentSession session = Store.OpenAsyncSession())
// {
// session.Advanced.MaxNumberOfRequestsPerSession = 10000;
+4 -16
View File
@@ -1,27 +1,15 @@
using Microsoft.AspNetCore.Mvc;
using Raven.Client.Documents;
using Raven.Client.Documents.Session;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using zero.Commerce.Entities;
using zero.Core;
using zero.Core.Api;
using zero.Core.Attributes;
using zero.Core.Entities;
using zero.Core.Extensions;
using zero.Core.Utils;
using zero.Core.Database;
namespace zero.Debug.Controllers
{
public partial class MigrationController : Controller
{
private IDocumentStore Raven { get; set; }
private IZeroStore Store { get; set; }
public MigrationController(IDocumentStore raven)
public MigrationController(IZeroStore store)
{
Raven = raven;
Store = store;
}
}
}
+5 -6
View File
@@ -1,13 +1,12 @@
using Microsoft.AspNetCore.Mvc;
using Raven.Client.Documents;
using Raven.Client.Documents.Session;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using zero.Core.Api;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Extensions;
using zero.Core.Routing;
using zero.Web.Models;
@@ -16,14 +15,14 @@ namespace zero.Web.Controllers
public class PagesController : BackofficeController
{
IPagesApi Api;
IDocumentStore Raven;
IZeroStore Store;
IRevisionsApi RevisionsApi;
public PagesController(IPagesApi api, IRevisionsApi revisionsApi, IDocumentStore raven)
public PagesController(IPagesApi api, IRevisionsApi revisionsApi, IZeroStore store)
{
Api = api;
RevisionsApi = revisionsApi;
Raven = raven;
Store = store;
}
@@ -60,7 +59,7 @@ namespace zero.Web.Controllers
{
IReadOnlyCollection<PageType> pageTypes = Options.Pages.GetAllItems();
using IAsyncDocumentSession session = Raven.OpenAsyncSession();
using IAsyncDocumentSession session = Store.OpenAsyncSession();
Dictionary<string, IPage> pages = await session.LoadAsync<IPage>(ids);
Dictionary<string, IRoute> routes = await session.LoadAsync<IRoute>(pages.Where(x => x.Value != null).Select(x => "routes." + x.Value.Hash));
+7 -7
View File
@@ -17,6 +17,7 @@ using System.Threading.Tasks;
using zero.Core;
using zero.Core.Api;
using zero.Core.Assemblies;
using zero.Core.Database;
using zero.Core.Entities;
using zero.Core.Extensions;
using zero.Core.Handlers;
@@ -139,14 +140,13 @@ namespace zero.Web
void ConfigureDatabase()
{
// add raven
Services.AddSingleton(context =>
Services.AddSingleton<IZeroStore, ZeroStore>(context =>
{
IZeroOptions options = context.GetService<IZeroOptions>();
DocumentStore store = new DocumentStore()
IDocumentStore store = new ZeroStore()
{
Urls = new string[1] { options.Raven.Url },
//Database = options.Raven.Database // we do not specify a default database so every session + operation is forced to specify it
Urls = new string[1] { options.Raven.Url }
};
IDocumentStore raven = store.Setup(options).Initialize();
@@ -157,10 +157,10 @@ namespace zero.Web
// TODO maybe we shouldn't use all auto-registered assemblies but specify them directly via options?
foreach (Assembly assembly in assemblies)
{
IndexCreation.CreateIndexes(assembly, store);
IndexCreation.CreateIndexes(assembly, store, database: "laola.hofbauer");
}
return raven;
return (ZeroStore)raven;
});
}
-6
View File
@@ -7,8 +7,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "zero.Core", "zero.Core\zero
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "zero.Commerce", "zero.Commerce\zero.Commerce.csproj", "{63A8AD15-15F0-4555-BD62-C38B4465FFC1}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "zero.Debug", "zero.Debug\zero.Debug.csproj", "{83473041-7A1B-40ED-9FD0-968B22EB36B3}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "zero.Web", "zero.Web\zero.Web.csproj", "{06156006-7684-41EC-8BD4-3B2A762147CD}"
EndProject
Project("{E24C65DC-7377-472B-9ABA-BC803B73C61A}") = "zero.Web.UI", "zero.Web.UI\", "{8CE1A69A-35DB-4748-AE1C-86F5BC2E11D4}"
@@ -53,10 +51,6 @@ Global
{63A8AD15-15F0-4555-BD62-C38B4465FFC1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{63A8AD15-15F0-4555-BD62-C38B4465FFC1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{63A8AD15-15F0-4555-BD62-C38B4465FFC1}.Release|Any CPU.Build.0 = Release|Any CPU
{83473041-7A1B-40ED-9FD0-968B22EB36B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{83473041-7A1B-40ED-9FD0-968B22EB36B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{83473041-7A1B-40ED-9FD0-968B22EB36B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{83473041-7A1B-40ED-9FD0-968B22EB36B3}.Release|Any CPU.Build.0 = Release|Any CPU
{06156006-7684-41EC-8BD4-3B2A762147CD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{06156006-7684-41EC-8BD4-3B2A762147CD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{06156006-7684-41EC-8BD4-3B2A762147CD}.Release|Any CPU.ActiveCfg = Release|Any CPU