/// <summary> /// 获取特定被操作实体的满足特定条件的操作人id集合 /// </summary> /// <param name="operatedId">被操作实体的id</param> /// <param name="page">页数</param> /// <param name="pagesize">每页数量</param> /// <param name="operatedType">被操作实体类型</param> /// <param name="operation">操作类型</param> /// <returns>操作者id集合</returns> public List <Guid> GetOperatorIds(Guid operatedId, int page = 0, int pagesize = 10, OperatedType operatedType = OperatedType.Article, Operation operation = Operation.Star) { return(collection.AsQueryable().Where(a => a.OperatedObjectInfo.type == operatedType & a.Operation == operation & a.OperatedObjectInfo.Id == operatedId) .Select(a => a.Operator.Id).Skip(page * pagesize).Take(pagesize).ToList()); }
public OperatedObjectInfo(Guid id, OperatedType opType, Dictionary <string, object> _infos, Guid?userid = null) { OperatedUserId = userid.GetValueOrDefault(Guid.Empty); type = opType; Id = id; Infos = _infos ?? new Dictionary <string, object>(); }
/// <summary> /// 获取对当前实例的推荐实例 /// </summary> /// <param name="articleId"></param> /// <param name="op"></param> /// <param name="operatedType"></param> /// <param name="num"></param> /// <returns></returns> public IEnumerable <Guid> GetRecEntities(Guid articleId, Operation op, OperatedType operatedType, int num = 10) { var ids = collection.AsQueryable().Where(l => l.OperatedObjectInfo.Id == articleId && l.Operation == op && l.OperatedObjectInfo.type == operatedType && l.IsDeleted == false).Select(a => a.OperatedObjectInfo).GroupBy(a => a.OperatedUserId) .OrderByDescending(g => g.Count()).Take(num).AsEnumerable().Select(g => g.Key); return(ids); }
/// <summary> /// 获取某人满足特定条件的操作中被操作物体的id的集合 /// </summary> /// <param name="id">操作者id</param> /// <param name="page">页数</param> /// <param name="pagesize">每页数量</param> /// <param name="operatedType">被操作实体类型</param> /// <param name="operation">操作类型</param> /// <param name="exFilter"></param> /// <returns>被操作实体的id集合</returns> public async ValueTask <IEnumerable <Guid> > GetXXXedIds(Guid id, int page = 0, int?pagesize = 10, OperatedType operatedType = OperatedType.Article, Operation operation = Operation.Star, FilterDefinition <Auditlog <TUserBrief> > exFilter = null) { return(await GetAsync(a => a.OperatedObjectInfo.Id, page, pagesize, orderBy : "CreateTime", true, filterBuilder.Eq(a => a.OperatedObjectInfo.type, operatedType) & filterBuilder.Eq(a => a.Operation, operation) & filterBuilder.Eq(a => a.Operator.Id, id) & (exFilter ?? filterBuilder.Empty))); }
public async ValueTask <Guid> GetLastXXXedGuid(string userid, Operation op, OperatedType operatedType) { try { return(await FindFirstAsync(l => l.Operator.Id == Guid.Parse(userid) && l.Operation == op && l.OperatedObjectInfo.type == operatedType && l.IsDeleted == false, a => a.OperatedObjectInfo.Id, Builders <Auditlog <TUserBrief> > .Sort.Descending(a => a.CreateTime))); } catch (Exception) { return(Guid.Empty); } }
public async ValueTask UnXXXAsync(string userid, Guid id, Operation op, OperatedType operatedType) { await Task.Yield(); var ids = collection.AsQueryable().Where(a => a.OperatedObjectInfo.type == operatedType & a.Operation == op & a.Operator.Id == Guid.Parse(userid) & a.OperatedObjectInfo.Id == id).Select(a => a.Id).ToList(); if (ids.Count == 0) { throw new _400Exception("Have not stared before!"); } await collection.DeleteManyAsync(Builders <Auditlog <TUserBrief> > .Filter.In(a => a.Id, ids)); }
/// <summary> /// 检验某特定操作(eg:收藏/点赞)是否之前被执行过 /// </summary> /// <param name="userid"></param> /// <param name="id">被操作物体的id</param> /// <param name="op">操作类型</param> /// <param name="operatedType">被操作物体类型</param> /// <param name="exFilter"></param> /// <returns></returns> public async ValueTask <bool> IsXXXBefore(string userid, Guid id, Operation op, OperatedType operatedType, FilterDefinition <Auditlog <TUserBrief> > exFilter = null) { return(await AnyAsync(filterBuilder.Eq(a => a.OperatedObjectInfo.type, operatedType) & filterBuilder.Eq(a => a.Operation, op) & filterBuilder.Eq(a => a.OperatedObjectInfo.Id, id) & filterBuilder.Eq(a => a.Operator.Id, Guid.Parse(userid)) & (exFilter ?? filterBuilder.Empty))); }
public async ValueTask <IEnumerable <string> > GetCollectionNames(Guid userid, Operation op, OperatedType operatedType, int num = 10) { var re = collection.Distinct(l => l.OperatedObjectInfo.Infos["colname"], l => l.Operator.Id == userid && l.Operation == op && l.OperatedObjectInfo.type == operatedType && l.IsDeleted == false); return((await re.ToListAsync()).Cast <string>()); }
public async ValueTask LogEntityAsync(string userId, Guid entityId, Operation operation, OperatedType operatedType = OperatedType.Article, Guid?operatedUserId = null, Dictionary <string, object> infos = null) => await LogAsync(Guid.Parse(userId), operation, new OperatedObjectInfo(entityId, operatedType, infos, operatedUserId));