public static EntityApiRoles AddEntityApi <TKey, TEntity, TDbContext>(this IPlatformModuleBuilder builder, Action <EntityApiBuildContext <TKey, TEntity> > config = null)
            where TEntity : class
            where TDbContext : DbContext
        {
            var ctx = new EntityApiBuildContext <TKey, TEntity>();

            config?.Invoke(ctx);
            return(new EntityApiRoles
            {
                Get = builder.AddGetApi <TKey, TEntity, TDbContext>(ctx.GetConfig),
                Put = builder.AddPutApi <TKey, TEntity, TDbContext>(ctx.PutConfig),
                Delete = builder.AddDeleteApi <TKey, TEntity, TDbContext>(ctx.DeleteConfig),
                Post = builder.AddPostApi <TKey, TEntity, TDbContext>(ctx.PostConfig),
                Query = builder.AddQueryApi <TEntity, TDbContext>(ctx.QueryConfig)
            });
        }
 public static EntityApiBuildContext <TKey, TEntity> SetupFilePipes <TKey, TEntity>(
     this EntityApiBuildContext <TKey, TEntity> apiBuildContext,
     Func <IServiceProvider, TEntity, Task <IEnumerable <string> > > findFilesFromModel,
     Func <IServiceProvider, DbContext, TKey, Task <IEnumerable <string> > > findFilesFromDb,
     Func <IServiceProvider, DbContext, TEntity, Task <IEnumerable <string> > > findReferencedFilesFromDb) where TEntity : class
 {
     apiBuildContext.ConfigPostApi(x => x.OnCreated(y => y.ConfirmFilesFor(findFilesFromModel)));
     apiBuildContext.ConfigDeleteApi(x => x.OnKeyGeted(y => y.StageOldFilesFor(findFilesFromDb)).OnDeleted(y => y.DeleteAllStagedFilesFor(findReferencedFilesFromDb)));
     apiBuildContext.ConfigPutApi(x => x.OnKeySet(y => y.Pipe <TEntity, IServiceProvider>(async(sp, model) =>
     {
         var keyContext = sp.GetRequiredService <KeyRequestContext <TKey> >();
         await StageOldFilesFor(findFilesFromDb, sp, keyContext.Key);
         return(model);
     })).OnUpdated(y => y.ConfirmFilesFor(findFilesFromModel).CheckDeleteFileOnUpdateFor(findFilesFromDb, findReferencedFilesFromDb)));
     return(apiBuildContext);
 }
        public static EntityApiBuildContext <TKey, TEntity> SetupFilePipes <TKey, TEntity, TDbContext>(
            this EntityApiBuildContext <TKey, TEntity> apiBuildContext,
            Expression <Func <TEntity, string> > property)
            where TEntity : class
            where TDbContext : DbContext
        {
            var compiled = property.Compile();

            return(apiBuildContext.SetupFilePipes <TKey, TEntity>(
                       (sp, x) => Task.FromResult((new string[] { compiled(x) }).AsEnumerable()),
                       async(sp, db, key) =>
            {
                var info = sp.GetRequiredService <IModelInfo <TDbContext, TEntity, TKey> >();
                var exp = CreateWhereExpression <TKey, TEntity, TDbContext>(info, key);
                return await db.Set <TEntity>().Where(exp).Select(property).ToArrayAsync();
            },
                       async(sp, db, model) =>
            {
                var info = sp.GetRequiredService <IModelInfo <TDbContext, TEntity, TKey> >();
                var exp = CreateWhereExpression <TKey, TEntity, TDbContext>(info, info.PrimaryKeyAccessor.Getter(model), true);
                return await db.Set <TEntity>().Where(exp).Select(property).ToArrayAsync();
            }
                       ));
        }
 public static EntityApiBuildContext <TKey, TEntity> SetupFilePipes <TKey, TEntity>(
     this EntityApiBuildContext <TKey, TEntity> apiBuildContext,
     Func <TEntity, Task <IEnumerable <string> > > findFilesFromModel,
     Func <DbContext, TKey, Task <IEnumerable <string> > > findFilesFromDb,
     Func <DbContext, TEntity, Task <IEnumerable <string> > > findReferencedFilesFromDb) where TEntity : class
 => apiBuildContext.SetupFilePipes((sp, model) => findFilesFromModel(model), (sp, db, key) => findFilesFromDb(db, key), (sp, db, model) => findReferencedFilesFromDb(db, model));
 public static EntityApiBuildContext <TKey, TEntity> SetupFilePipes <TKey, TEntity>(this EntityApiBuildContext <TKey, TEntity> apiBuildContext,
                                                                                    Expression <Func <TEntity, string> > property)
     where TEntity : class => apiBuildContext.SetupFilePipes <TKey, TEntity, PlatformDbContext>(property);