Пример #1
0
        public async Task UserAvatar(IFormFile avatar)
        {
            var userId = userManager.GetUserId(User);
            var user   = await userManager.FindByIdAsync(userId);

            if (avatar == null)
            {
                throw new BadRequestException("文件格式不正确");
            }

            if (!avatar.ContentType.StartsWith("image/"))
            {
                throw new BadRequestException("文件格式不正确");
            }

            if (avatar.Length > 1048576)
            {
                throw new BadRequestException("文件大小不能超过 1 Mb");
            }

            await using var stream = new System.IO.MemoryStream();

            await avatar.CopyToAsync(stream);

            stream.Seek(0, System.IO.SeekOrigin.Begin);
            var buffer = new byte[stream.Length];
            await stream.ReadAsync(buffer);

            user.Avatar = buffer;
            await userManager.UpdateAsync(user);
        }
Пример #2
0
        public async Task VoteProblem([FromBody] ProblemVoteModel model)
        {
            var userId = userManager.GetUserId(User);
            var result = model.VoteType switch
            {
                1 => await voteService.UpvoteProblemAsync(userId, model.ProblemId),
                2 => await voteService.DownvoteProblemAsync(userId, model.ProblemId),
                _ => false
            };

            if (!result)
            {
                throw new BadRequestException("评价失败");
            }
        }
Пример #3
0
        private async Task <UserInfoModel> GetCurrentUserInfo()
        {
            var userInfoRet = new UserInfoModel
            {
                SignedIn = signInManager.IsSignedIn(User)
            };
            var userId = userManager.GetUserId(User);
            var user   = await userManager.FindByIdAsync(userId);

            if (user == null)
            {
                return(new UserInfoModel());
            }
            userInfoRet.Name       = user.Name;
            userInfoRet.UserId     = user.Id;
            userInfoRet.UserName   = user.UserName;
            userInfoRet.Privilege  = user.Privilege;
            userInfoRet.Coins      = user.Coins;
            userInfoRet.Experience = user.Experience;

            if (userInfoRet.SignedIn)
            {
                userInfoRet.EmailConfirmed       = user.EmailConfirmed;
                userInfoRet.PhoneNumberConfirmed = user.PhoneNumberConfirmed;
                userInfoRet.Email       = user.Email;
                userInfoRet.PhoneNumber = user.PhoneNumber;
                userInfoRet.OtherInfo   = IdentityHelper.GetOtherUserInfo(string.IsNullOrEmpty(user.OtherInfo) ? "{}" : user.OtherInfo);
            }

            return(userInfoRet);
        }
Пример #4
0
        public async Task <ContestListModel> ContestList([FromBody] ContestListQueryModel model)
        {
            var userId = userManager.GetUserId(User);

            var ret = new ContestListModel();

            IQueryable <Contest> contests;

            try
            {
                contests = await(model.GroupId switch
                {
                    0 => contestService.QueryContestAsync(userId),
                    _ => contestService.QueryContestAsync(userId, model.GroupId)
                });
            }
Пример #5
0
        public async Task <ProblemListModel> ProblemList([FromBody] ProblemListQueryModel model)
        {
            var userId = userManager.GetUserId(User);

            var ret = new ProblemListModel();

            // use an invalid value when userId is empty or null
            var judges = await judgeService.QueryJudgesAsync(string.IsNullOrEmpty(userId)? "-1" : userId, model.GroupId == 0?null : (int?)model.GroupId, model.ContestId == 0?null : (int?)model.ContestId);

            IQueryable <Problem> problems;

            try
            {
                problems = await(model switch
                {
                    { ContestId: 0, GroupId: 0 } => problemService.QueryProblemAsync(userId),
                    { GroupId: 0 } => problemService.QueryProblemAsync(userId, model.ContestId),
Пример #6
0
        public async Task <GroupListModel> GroupList([FromBody] GroupListQueryModel model)
        {
            var userId = userManager.GetUserId(User);
            var groups = await groupService.QueryGroupAsync(userId);

            var ret = new GroupListModel();

            if (model.Filter.Id != 0)
            {
                groups = groups.Where(i => i.Id == model.Filter.Id);
            }

            if (!string.IsNullOrEmpty(model.Filter.Name))
            {
                groups = groups.Where(i => i.Name.Contains(model.Filter.Name));
            }

            var groupJoin = await groupService.QueryGroupJoinRecordsAsync();

            if (model.Filter.Status.Count < 2)
            {
                if (!string.IsNullOrEmpty(userId))
                {
                    foreach (var status in allStatus)
                    {
                        if (!model.Filter.Status.Contains(status))
                        {
                            groups = status switch
                            {
                                0 => groups.Where(i => groupJoin.Any(j => j.GroupId == i.Id && j.UserId == userId)),
                                1 => groups.Where(i => !groupJoin.Any(j => j.GroupId == i.Id && j.UserId == userId)),
                                _ => groups
                            };
                        }
                    }
                }
            }

            if (model.RequireTotalCount)
            {
                ret.TotalCount = await groups.Select(i => i.Id) /*.Cacheable()*/.CountAsync();
            }

            groups = groups.OrderByDescending(i => i.Id);
            if (model.StartId == 0)
            {
                groups = groups.Skip(model.Start);
            }
            else
            {
                groups = groups.Where(i => i.Id <= model.StartId);
            }

            ret.Groups = await groups.Take(model.Count).Select(i => new GroupListModel.GroupListItemModel
            {
                Id           = i.Id,
                CreationTime = i.CreationTime,
                IsPrivate    = i.IsPrivate,
                Name         = i.Name,
                UserId       = i.UserId,
                UserName     = i.UserInfo.UserName
            }) /*.Cacheable()*/.ToListAsync();

            return(ret);
        }