public async Task <TEntity> Insert(TEntity entity)
        {
            entity.Id = AssignId();
            await Task.Run(() => LiteDbUtility.Command(_dbName, db =>
            {
                ICollection <FileModel> fileList = new List <FileModel>();
                var isFileContainer = entity is IFileContainer;
                if (isFileContainer)
                {
                    foreach (var f in (entity as IFileContainer).Files)
                    {
                        f.ParentId = entity.Id;
                        f.Id       = AssignId();

                        fileList.Add(new FileModel {
                            Id = f.Id, DisplayFileName = f.DisplayFileName, Bytes = f.Bytes
                        });
                        f.Bytes = null;
                    }
                }
                db.GetCollection <TEntity>().Insert(entity);
                if (isFileContainer)
                {
                    foreach (var f in (entity as IFileContainer).Files)
                    {
                        f.Bytes = fileList.First(i => i.Id == f.Id).Bytes;
                    }
                }
            }));

            return(entity);
        }
        public async Task <IEnumerable <TEntity> > BulkInsert(IEnumerable <TEntity> entities, bool trackIds = false)
        {
            foreach (var e in entities)
            {
                e.Id = AssignId();
            }
            await Task.Run(() => LiteDbUtility.Command(_dbName, db => db.GetCollection <TEntity>().InsertBulk(entities)));

            return(entities);
        }
        public async Task <TEntity> Delete(TEntity entity)
        {
            await Task.Run(() =>
                           LiteDbUtility.Command(_dbName, db =>
            {
                var col = db.GetCollection <TEntity>();
                if (!col.Delete(entity.Id.ToString()))
                {
                    entity = default;
                }
            }));

            return(entity);
        }
        public async Task <IEnumerable <FileStorageResponse> > Delete(IEnumerable <FileModel> files)
        {
            var furList = new List <FileStorageResponse>();
            await Task.Run(() => LiteDbUtility.Command(_dbName, db =>
            {
                foreach (var f in files)
                {
                    var s = db.FileStorage.Delete(f.Id);
                    furList.Add(new FileStorageResponse
                    {
                        File   = f,
                        Status = s ? FileStoreState.Deleted : FileStoreState.DeleteFailed
                    });
                }
            }));

            return(furList);
        }
        public Task <IEnumerable <TEntity> > GetAll(Pagination <TEntity> pagination)
        {
            var data = LiteDbUtility.Query <IEnumerable <TEntity> >(_dbName, db =>
            {
                var col = db.GetCollection <TEntity>();
                if (pagination == null)
                {
                    return(col.FindAll().ToArray());
                }

                var query = ExpressionTreeBuilder.BuildBinaryTreeExpression <TEntity>(pagination.QueryOrFilter);
                if (query == null)
                {
                    return(null);
                }
                return(col.Find(query).ToArray());
            });

            return(Task.FromResult(data));
        }
        public async Task <IEnumerable <FileStorageResponse> > Upload(IEnumerable <FileModel> files)
        {
            var furList = new List <FileStorageResponse>();
            await Task.Run(() => LiteDbUtility.Command(_dbName, db =>
            {
                foreach (var f in files)
                {
                    using (var stream = f.TempPath.HasValue()
                        ? File.OpenRead(f.TempPath)
                        : new MemoryStream(f.Bytes.ToArray()) as Stream)
                    {
                        var lfi = db.FileStorage.Upload(f.Id, f.StoredFileName, stream);
                        furList.Add(new FileStorageResponse {
                            File = f, Status = FileStoreState.Uploaded
                        });
                    }
                }
            }));

            return(furList);
        }
        public async Task <TEntity> Update(TEntity entity)
        {
            await Task.Run(() => LiteDbUtility.Command(_dbName, db => db.GetCollection <TEntity>().Update(entity)));

            return(entity);
        }
 public async Task <TEntity> GetById(string id)
 {
     return(await Task.Run(() => LiteDbUtility.Query(_dbName, db => db.GetCollection <TEntity>().FindById(id.ToString()))));
 }