public async Task <IActionResult> Delete(CollectionEnum collection, string id, bool force = false)
        {
            if (!Authorize())
            {
                return(Unauthorized());
            }

            try
            {
                if (collection == CollectionEnum.undefined)
                {
                    return(NotFound());
                }

                if (!await collectionRepo.Delete(collection, id))
                {
                    return(NotFound());
                }

                return(Ok());
            }
            catch (Exception ex)
            {
                return(BadRequest(ex));
            }
        }
        private long?GetCreatedEpoch(CollectionEnum collection, BsonDocument doc)
        {
            if (doc.Contains(Const.CREATED_ELEMENT))
            {
                return(doc[Const.CREATED_ELEMENT].AsInt64);
            }

            if (doc.Contains(Const.MODIFIED_ELEMENT))
            {
                return(doc[Const.MODIFIED_ELEMENT].AsInt64);
            }

            if (collection == CollectionEnum.entries && doc.Contains(Const.DATE_ELEMENT))
            {
                return((long)doc.GetValue(Const.DATE_ELEMENT).AsDouble);
            }

            if (doc.Contains(Const.CREATED_AT_ELEMENT))
            {
                string   createdAtString = doc.GetValue(Const.CREATED_AT_ELEMENT).AsString;
                DateTime createdAt;
                if (DateTime.TryParse(createdAtString, out createdAt))
                {
                    return(DateTimeHelper.ToEpoch(createdAt.ToUniversalTime()));
                }
            }

            return(null);
        }
        public async Task <IActionResult> Get(CollectionEnum collection, int?count, DateTime?fromDate, long?fromMs)
        {
            if (!Authorize())
            {
                return(Unauthorized());
            }

            if (collection == CollectionEnum.undefined)
            {
                return(NotFound());
            }

            fromDate = fromDate ?? DateTimeHelper.FromEpoch(fromMs) ?? Const.MIN_DATE;
            count    = count ?? Const.DEFAULT_COUNT;

            var list = await collectionRepo.List(collection, fromDate, count, includeDeleted : false);

            var bson = new BsonDocument();

            bson.Add("count", list.Count);

            var array = new BsonArray(list);

            bson.Add("items", array);

            return(Content(bson.ToJson(jsonWriterSettings), JSON_CONTENT_TYPE));
        }
        public async Task <IActionResult> Get(CollectionEnum collection, string id)
        {
            if (!Authorize())
            {
                return(Unauthorized());
            }

            try
            {
                if (collection == CollectionEnum.undefined)
                {
                    return(NotFound());
                }

                var bson = await collectionRepo.Get(collection, id);

                if (bson == null)
                {
                    return(NotFound());
                }
                else
                {
                    return(Content(bson.ToJson(jsonWriterSettings), JSON_CONTENT_TYPE));
                }
            }
            catch (Exception ex)
            {
                return(BadRequest(ex));
            }
        }
        public async Task <BsonDocument> Get(CollectionEnum collection, string id)
        {
            var col = mongoDB.GetCollection <BsonDocument>(collection.ToString());

            var filter_id = Builders <BsonDocument> .Filter.Eq(Const.ID, ObjectId.Parse(id));

            var items = await col.FindAsync(filter_id);

            var doc = items.FirstOrDefault();

            if (doc == null)
            {
                return(null);
            }

            UnpackId(doc);

            var created = GetCreatedEpoch(collection, doc);

            if (created.HasValue)
            {
                SetDate(doc, Const.MODIFIED_ELEMENT, created);
            }

            return(doc);
        }
        public async Task <IActionResult> Put(CollectionEnum collection)
        {
            if (!Authorize())
            {
                return(Unauthorized());
            }

            try
            {
                if (collection == CollectionEnum.undefined)
                {
                    return(NotFound());
                }

                var bson = BsonDocument.Parse(await ReadBody());

                if (!await collectionRepo.Update(collection, bson))
                {
                    return(NotFound());
                }

                return(Ok());
            }
            catch (Exception ex)
            {
                return(BadRequest(ex));
            }
        }
        public async Task <string> Create(CollectionEnum collection, BsonDocument doc)
        {
            SetDate(doc, Const.MODIFIED_ELEMENT, DateTime.Now);

            var col = mongoDB.GetCollection <BsonDocument>(collection.ToString());

            await col.InsertOneAsync(doc);

            var idElement = doc.GetElement(Const.ID);

            return(idElement.Value.AsObjectId.ToString());
        }
        public async Task <BsonDocument> FindDuplicate(CollectionEnum collectionEnum, BsonDocument doc)
        {
            var col = mongoDB.GetCollection <BsonDocument>(collectionEnum.ToString());

            var builder = Builders <BsonDocument> .Filter;
            FilterDefinition <BsonDocument> filter = null;

            if (doc.Contains(Const.ID))
            {
                string id = doc.GetValue(Const.ID).AsString;

                filter = AddFilter(filter, builder.Eq(Const.ID, new ObjectId(id)));
            }

            if (collectionEnum == CollectionEnum.entries && doc.Contains(Const.DATE_ELEMENT))
            {
                double date = doc.GetValue(Const.DATE_ELEMENT).AsInt64;

                filter = AddFilter(filter, builder.Gt(Const.DATE_ELEMENT, date - 1000));
                filter = AddFilter(filter, builder.Lt(Const.DATE_ELEMENT, date + 1000));
            }

            if (filter == null)
            {
                return(null);
            }

            var list = await col.Find(filter)
                       .Limit(1)
                       .ToListAsync();

            if (list.Count > 0)
            {
                var existingDoc = list[0];
                UnpackId(existingDoc);
                return(existingDoc);
            }
            else
            {
                return(null);
            }
        }
        public async Task <bool> Update(CollectionEnum collection, BsonDocument doc)
        {
            var modified = GetCreatedEpoch(collection, doc);

            if (modified.HasValue)
            {
                SetDate(doc, Const.CREATED_ELEMENT, modified);
            }

            SetDate(doc, Const.MODIFIED_ELEMENT, DateTime.Now);
            PackId(doc);

            var col = mongoDB.GetCollection <BsonDocument>(collection.ToString());

            var filter_id = Builders <BsonDocument> .Filter.Eq(Const.ID, new ObjectId(doc.GetValue(Const.ID).ToString()));

            var result = await col.FindOneAndReplaceAsync(filter_id, doc);

            return(result != null);
        }
        public async Task <bool> Delete(CollectionEnum collection, string id)
        {
            var objectId   = new ObjectId(id);
            var col        = mongoDB.GetCollection <BsonDocument>(collection.ToString());
            var colDeleted = mongoDB.GetCollection <BsonDocument>(CollectionEnum.deleted.ToString());

            var filter_id = Builders <BsonDocument> .Filter.Eq(Const.ID, objectId);

            var documentToDelete = await col.FindOneAndDeleteAsync(filter_id);

            if (documentToDelete == null)
            {
                var alreadyDeleted = await colDeleted.FindAsync(filter_id);

                return(alreadyDeleted.Any());
            }

            UnpackId(documentToDelete);

            var created = GetCreatedEpoch(collection, documentToDelete);

            if (created.HasValue && !documentToDelete.Contains(Const.CREATED_ELEMENT))
            {
                SetDate(documentToDelete, Const.CREATED_ELEMENT, created);
            }
            SetDate(documentToDelete, Const.MODIFIED_ELEMENT, DateTime.Now);
            SetDate(documentToDelete, Const.DELETED_ELEMENT, DateTime.Now);

            var deletionRecord = new BsonDocument {
                { Const.ID, objectId },
                { Const.COLLECTION_ELEMENT, collection.ToString() },
                { Const.DELETED_ELEMENT, documentToDelete },
            };

            SetDate(deletionRecord, Const.MODIFIED_ELEMENT, DateTime.Now);

            await colDeleted.InsertOneAsync(deletionRecord);

            return(true);
        }
        private async Task ListDeleted(CollectionEnum collection, int?count,
                                       List <BsonDocument> listExisting,
                                       FilterDefinitionBuilder <BsonDocument> builder,
                                       FilterDefinition <BsonDocument> filterExisting)
        {
            var colDeleted = mongoDB.GetCollection <BsonDocument>(CollectionEnum.deleted.ToString());

            var filterDeleted = AddFilter(filterExisting, builder.Eq(Const.COLLECTION_ELEMENT, collection.ToString()));

            var listDeleted = await colDeleted.Find(filterDeleted ?? new BsonDocument())
                              .SortBy(bson => bson[Const.MODIFIED_ELEMENT])
                              .Limit(count)
                              .Project(bson => bson.GetElement(Const.DELETED_ELEMENT))
                              .ToListAsync();

            foreach (var valueDeleted in listDeleted)
            {
                var bsonDeleted = valueDeleted.Value.AsBsonDocument;
                UnpackId(bsonDeleted);

                listExisting.Add(bsonDeleted);
            }
        }
        public async Task <IActionResult> Post(CollectionEnum collection)
        {
            if (!Authorize())
            {
                return(Unauthorized());
            }

            try
            {
                if (collection == CollectionEnum.undefined)
                {
                    return(NotFound());
                }

                // TODO authorization

                var bson = BsonDocument.Parse(await ReadBody());

                var existingDoc = await collectionRepo.FindDuplicate(collection, bson);

                if (existingDoc != null)
                {
                    return(Content(existingDoc.ToJson(jsonWriterSettings), JSON_CONTENT_TYPE));
                }

                var objectId = await collectionRepo.Create(collection, bson);

                var idDoc = new BsonDocument();
                idDoc.Add("_id", objectId);

                return(Content(idDoc.ToJson(jsonWriterSettings), JSON_CONTENT_TYPE));
            }
            catch (Exception ex)
            {
                return(BadRequest(ex));
            }
        }
        public async Task <List <BsonDocument> > List(CollectionEnum collection, DateTime?fromModified, int?count, bool includeDeleted)
        {
            count = count ?? Const.DEFAULT_COUNT;

            List <BsonDocument> list = null;
            var col     = mongoDB.GetCollection <BsonDocument>(collection.ToString());
            var builder = Builders <BsonDocument> .Filter;
            FilterDefinition <BsonDocument> filter = null;

            if (fromModified != null)
            {
                filter = AddFilter(filter, builder.Gt(Const.MODIFIED_ELEMENT, DateTimeHelper.ToEpoch(fromModified.Value)));
            }

            list = await col.Find(filter ?? new BsonDocument())
                   .SortBy(bson => bson[Const.MODIFIED_ELEMENT])
                   .Limit(count)
                   .ToListAsync();

            foreach (var item in list)
            {
                UnpackId(item);
            }

            list.AddRange(await ListFallback(collection, count, fromModified));

            if (includeDeleted)
            {
                await ListDeleted(collection, count, list, builder, filter);
            }

            return(list
                   .Take(count.Value)
                   .OrderBy(bson => bson[Const.MODIFIED_ELEMENT])
                   .ToList());
        }
Exemple #14
0
 /// <summary>
 /// 删除用户收藏
 /// </summary>
 /// <param name="userid"></param>
 /// <param name="collid"></param>
 /// <returns></returns>
 public int DeleteCollid(string userid, string collid, CollectionEnum type)
 {
     return(DAL.DeleteCollid(userid, collid, type));
 }
Exemple #15
0
 /// <summary>
 /// 统计用户收藏
 /// </summary>
 /// <param name="userid"></param>
 /// <param name="collid"></param>
 /// <returns></returns>
 public int getNum(string userid, CollectionEnum type)
 {
     return(dabase.ReadDataBase.ExecuteScalar <int>("select count(Id) FROM Sys_Collection WHERE CreaterId=@0 and Type=@1", userid, (int)type));
 }
Exemple #16
0
 /// <summary>
 /// 查询是否存在
 /// </summary>
 /// <param name="userid"></param>
 /// <param name="collid"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 public ModSysCollection Exit(string userid, string collid, CollectionEnum type)
 {
     return(dabase.ReadDataBase.FirstOrDefault <ModSysCollection>("select * FROM Sys_Collection WHERE CreaterId=@0 and CollId=@1 and Type=@2", userid, collid, (int)type));
 }
Exemple #17
0
 /// <summary>
 /// 删除用户收藏
 /// </summary>
 /// <param name="userid"></param>
 /// <param name="collid"></param>
 /// <returns></returns>
 public int DeleteCollid(string userid, string collid, CollectionEnum type)
 {
     return(dabase.WriteDataBase.Execute("DELETE FROM Sys_Collection WHERE CreaterId=@0 and CollId=@1 and Type=@2", userid, collid, (int)type));
 }
Exemple #18
0
 /// <summary>
 /// 统计用户收藏
 /// </summary>
 /// <param name="userid"></param>
 /// <param name="collid"></param>
 /// <returns></returns>
 public int getNum(string userid, CollectionEnum type)
 {
     return(DAL.getNum(userid, type));
 }
        private async Task <List <BsonDocument> > ListFallback(CollectionEnum collection, int?count, DateTime?fromModified)
        {
            List <BsonDocument> list = new List <BsonDocument>();

            try
            {
                var col = mongoDB.GetCollection <BsonDocument>(collection.ToString());

                var builder = Builders <BsonDocument> .Filter;
                FilterDefinition <BsonDocument> filterFallback = null;

                if (collection == CollectionEnum.entries)
                {
                    filterFallback = AddFilter(filterFallback, builder.Gt(Const.DATE_ELEMENT,
                                                                          DateTimeHelper.ToEpoch(fromModified)));
                }
                else
                {
                    filterFallback = AddFilter(filterFallback, builder.Gt(Const.CREATED_AT_ELEMENT,
                                                                          fromModified.Value.ToString(Const.DATE_WEB_FORMAT)));
                }
                filterFallback = AddFilter(filterFallback, builder.Exists(Const.MODIFIED_ELEMENT, exists: false));

                List <BsonDocument> listFallback = null;
                if (collection == CollectionEnum.entries)
                {
                    listFallback = await col.Find(filterFallback)
                                   .SortBy(bson => bson[Const.DATE_ELEMENT])
                                   .Limit(count)
                                   .ToListAsync();
                }
                else
                {
                    listFallback = await col.Find(filterFallback)
                                   .SortBy(bson => bson[Const.CREATED_AT_ELEMENT])
                                   .Limit(count)
                                   .ToListAsync();
                }

                foreach (var fallbackDoc in listFallback)
                {
                    try
                    {
                        UnpackId(fallbackDoc);

                        var created = GetCreatedEpoch(collection, fallbackDoc);
                        if (created.HasValue)
                        {
                            SetDate(fallbackDoc, Const.MODIFIED_ELEMENT, created);
                        }
                        list.Add(fallbackDoc);
                    }
                    catch (Exception ex)
                    {
                        // TODO warning
                    }
                }
            }
            catch (Exception ex)
            {
                // TODO warning
            }

            return(list);
        }
Exemple #20
0
 /// <summary>
 /// 查询是否存在
 /// </summary>
 /// <param name="userid"></param>
 /// <param name="collid"></param>
 /// <param name="type"></param>
 /// <returns></returns>
 public ModSysCollection Exit(string userid, string collid, CollectionEnum type)
 {
     return(DAL.Exit(userid, collid, type));
 }