예제 #1
0
        private async Task <bool> PopulateGamePointAttributes(Models.NormalPoint normalPoint,
                                                              NormalPointCreateOrUpdateOneRequestDto requestDto, bool isKeylolOperator, bool keepSteamAppId = false)
        {
            if (requestDto.DisplayAliases == null)
            {
                ModelState.AddModelError("vm.DisplayAliases", "游戏据点必须填写别名");
                return(false);
            }
            if (requestDto.CoverImage == null)
            {
                ModelState.AddModelError("vm.CoverImage", "游戏据点必须填写封面图片");
                return(false);
            }
            if (!Helpers.IsTrustedUrl(requestDto.CoverImage))
            {
                ModelState.AddModelError("vm.CoverImage", "不允许使用可不信图片来源");
                return(false);
            }
            if (requestDto.DeveloperPointsId == null)
            {
                ModelState.AddModelError("vm.DeveloperPointsId", "游戏据点必须填写开发商据点");
                return(false);
            }
            if (requestDto.PublisherPointsId == null)
            {
                ModelState.AddModelError("vm.PublisherPointsId", "游戏据点必须填写发行商据点");
                return(false);
            }
            if (requestDto.GenrePointsId == null)
            {
                ModelState.AddModelError("vm.GenrePointsId", "游戏据点必须填写类型据点");
                return(false);
            }
            if (requestDto.TagPointsId == null)
            {
                ModelState.AddModelError("vm.TagPointsId", "游戏据点必须填写特性据点");
                return(false);
            }
            if (requestDto.MajorPlatformPointsId == null)
            {
                ModelState.AddModelError("vm.MajorPlatformPointsId", "游戏据点必须填写主要平台据点");
                return(false);
            }
            if (requestDto.MinorPlatformPointsId == null)
            {
                ModelState.AddModelError("vm.MinorPlatformPointsId", "游戏据点必须填写次要平台据点");
                return(false);
            }
            if (requestDto.SeriesPointsId == null)
            {
                ModelState.AddModelError("vm.SeriesPointsId", "游戏据点必须填写系列据点");
                return(false);
            }
            if (isKeylolOperator)
            {
                if (!keepSteamAppId)
                {
                    if (requestDto.SteamAppId == null)
                    {
                        ModelState.AddModelError("vm.SteamAppId", "游戏据点的 App ID 不能为空");
                        return(false);
                    }
                    normalPoint.SteamAppId = requestDto.SteamAppId.Value;
                }
                if (requestDto.ReleaseDate == null)
                {
                    ModelState.AddModelError("vm.ReleaseDate", "游戏据点的面世日期不能为空");
                    return(false);
                }
                normalPoint.ReleaseDate = requestDto.ReleaseDate.Value;
            }
            normalPoint.DisplayAliases = requestDto.DisplayAliases;
            normalPoint.CoverImage     = requestDto.CoverImage;

            normalPoint.DeveloperPoints = await _dbContext.NormalPoints
                                          .Where(
                p =>
                p.Type == NormalPointType.Manufacturer &&
                requestDto.DeveloperPointsId.Contains(p.Id))
                                          .ToListAsync();

            normalPoint.PublisherPoints = await _dbContext.NormalPoints
                                          .Where(
                p =>
                p.Type == NormalPointType.Manufacturer &&
                requestDto.PublisherPointsId.Contains(p.Id))
                                          .ToListAsync();

            normalPoint.GenrePoints = await _dbContext.NormalPoints
                                      .Where(p => p.Type == NormalPointType.Genre && requestDto.GenrePointsId.Contains(p.Id))
                                      .ToListAsync();

            normalPoint.TagPoints = await _dbContext.NormalPoints
                                    .Where(p => p.Type == NormalPointType.Genre && requestDto.TagPointsId.Contains(p.Id))
                                    .ToListAsync();

            normalPoint.MajorPlatformPoints = await _dbContext.NormalPoints
                                              .Where(
                p =>
                p.Type == NormalPointType.Platform &&
                requestDto.MajorPlatformPointsId.Contains(p.Id))
                                              .ToListAsync();

            normalPoint.MinorPlatformForPoints = await _dbContext.NormalPoints
                                                 .Where(
                p =>
                p.Type == NormalPointType.Platform &&
                requestDto.MinorPlatformPointsId.Contains(p.Id))
                                                 .ToListAsync();

            normalPoint.SeriesPoints = await _dbContext.NormalPoints
                                       .Where(p => p.Type == NormalPointType.Genre && requestDto.SeriesPointsId.Contains(p.Id))
                                       .ToListAsync();

            return(true);
        }
예제 #2
0
        public async Task <IHttpActionResult> UpdateOneById(string id,
                                                            [NotNull] NormalPointCreateOrUpdateOneRequestDto requestDto)
        {
            var normalPoint = await _dbContext.NormalPoints
                              .Include(p => p.DeveloperPoints)
                              .Include(p => p.PublisherPoints)
                              .Include(p => p.SeriesPoints)
                              .Include(p => p.GenrePoints)
                              .Include(p => p.TagPoints)
                              .Include(p => p.MajorPlatformPoints)
                              .Include(p => p.MinorPlatformPoints)
                              .Include(p => p.SteamStoreNames)
                              .SingleOrDefaultAsync(p => p.Id == id);

            if (normalPoint == null)
            {
                return(NotFound());
            }

            if (!Helpers.IsTrustedUrl(requestDto.BackgroundImage))
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.BackgroundImage), Errors.Invalid));
            }

            if (!Helpers.IsTrustedUrl(requestDto.AvatarImage))
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.AvatarImage), Errors.Invalid));
            }

            var isKeylolOperator = User.IsInRole(KeylolRoles.Operator);

            if (isKeylolOperator)
            {
                if (string.IsNullOrWhiteSpace(requestDto.EnglishName))
                {
                    return(this.BadRequest(nameof(requestDto), nameof(requestDto.EnglishName), Errors.Required));
                }

                if (requestDto.PreferredName == null)
                {
                    return(this.BadRequest(nameof(requestDto), nameof(requestDto.PreferredName), Errors.Required));
                }

                if (string.IsNullOrWhiteSpace(requestDto.IdCode))
                {
                    return(this.BadRequest(nameof(requestDto), nameof(requestDto.IdCode), Errors.Required));
                }

                if (!Regex.IsMatch(requestDto.IdCode, @"^[A-Z0-9]{5}$"))
                {
                    return(this.BadRequest(nameof(requestDto), nameof(requestDto.IdCode), Errors.Invalid));
                }

                if (requestDto.IdCode != normalPoint.IdCode &&
                    await _dbContext.NormalPoints.AnyAsync(u => u.IdCode == requestDto.IdCode))
                {
                    return(this.BadRequest(nameof(requestDto), nameof(requestDto.IdCode), Errors.Duplicate));
                }

                normalPoint.EnglishName   = requestDto.EnglishName;
                normalPoint.IdCode        = requestDto.IdCode;
                normalPoint.PreferredName = requestDto.PreferredName.Value;
                if (normalPoint.Type == NormalPointType.Genre || normalPoint.Type == NormalPointType.Manufacturer)
                {
                    if (requestDto.NameInSteamStore == null)
                    {
                        return(this.BadRequest(nameof(requestDto), nameof(requestDto.NameInSteamStore), Errors.Required));
                    }

                    var nameStrings =
                        requestDto.NameInSteamStore.Split(';')
                        .Select(n => n.Trim())
                        .Where(n => !string.IsNullOrWhiteSpace(n));
                    var names = new List <SteamStoreName>();
                    foreach (var nameString in nameStrings)
                    {
                        var name =
                            await _dbContext.SteamStoreNames.Where(n => n.Name == nameString).SingleOrDefaultAsync() ??
                            _dbContext.SteamStoreNames.Create();

                        name.Name = nameString;
                        names.Add(name);
                    }
                    normalPoint.SteamStoreNames = names;
                }
            }

            normalPoint.BackgroundImage = requestDto.BackgroundImage;
            normalPoint.AvatarImage     = requestDto.AvatarImage;
            normalPoint.ChineseName     = requestDto.ChineseName;
            normalPoint.ChineseAliases  = requestDto.ChineseAliases;
            normalPoint.EnglishAliases  = requestDto.EnglishAliases;
            normalPoint.Description     = requestDto.Description.Length > 256
                ? requestDto.Description.Substring(0, 256)
                : requestDto.Description;

            if ((normalPoint.Type == NormalPointType.Game || normalPoint.Type == NormalPointType.Hardware) &&
                !await PopulateGamePointAttributes(normalPoint, requestDto, isKeylolOperator, true))
            {
                return(BadRequest(ModelState));
            }
            await _dbContext.SaveChangesAsync();

            return(Ok());
        }
        public async Task <IHttpActionResult> CreateOneManually(
            [NotNull] NormalPointCreateOrUpdateOneRequestDto requestDto)
        {
            if (string.IsNullOrWhiteSpace(requestDto.IdCode))
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.IdCode), Errors.Required));
            }

            if (!Regex.IsMatch(requestDto.IdCode, @"^[A-Z0-9]{5}$"))
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.IdCode), Errors.Invalid));
            }

            if (await _dbContext.NormalPoints.AnyAsync(u => u.IdCode == requestDto.IdCode))
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.IdCode), Errors.Duplicate));
            }

            if (string.IsNullOrWhiteSpace(requestDto.EnglishName))
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.EnglishName), Errors.Required));
            }

            if (requestDto.PreferredName == null)
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.PreferredName), Errors.Required));
            }

            if (requestDto.Type == null)
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.Type), Errors.Required));
            }

            if (!Helpers.IsTrustedUrl(requestDto.BackgroundImage))
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.BackgroundImage), Errors.Invalid));
            }

            if (!Helpers.IsTrustedUrl(requestDto.AvatarImage))
            {
                return(this.BadRequest(nameof(requestDto), nameof(requestDto.AvatarImage), Errors.Invalid));
            }

            var normalPoint = _dbContext.NormalPoints.Create();

            normalPoint.IdCode          = requestDto.IdCode;
            normalPoint.BackgroundImage = requestDto.BackgroundImage;
            normalPoint.AvatarImage     = requestDto.AvatarImage;
            normalPoint.ChineseName     = requestDto.ChineseName;
            normalPoint.EnglishName     = requestDto.EnglishName;
            normalPoint.PreferredName   = requestDto.PreferredName.Value;
            normalPoint.ChineseAliases  = requestDto.ChineseAliases;
            normalPoint.EnglishAliases  = requestDto.EnglishAliases;
            normalPoint.Type            = requestDto.Type.Value;
            normalPoint.Description     = requestDto.Description;
            if (requestDto.Type.Value == NormalPointType.Genre ||
                requestDto.Type.Value == NormalPointType.Manufacturer)
            {
                if (requestDto.NameInSteamStore == null)
                {
                    return(this.BadRequest(nameof(requestDto), nameof(requestDto.NameInSteamStore), Errors.Required));
                }
                var nameStrings =
                    requestDto.NameInSteamStore.Split(';')
                    .Select(n => n.Trim())
                    .Where(n => !string.IsNullOrWhiteSpace(n));
                var names = new List <SteamStoreName>();
                foreach (var nameString in nameStrings)
                {
                    var name =
                        await _dbContext.SteamStoreNames.Where(n => n.Name == nameString).SingleOrDefaultAsync() ??
                        _dbContext.SteamStoreNames.Create();

                    name.Name = nameString;
                    names.Add(name);
                }
                normalPoint.SteamStoreNames = names;
            }
            if ((normalPoint.Type == NormalPointType.Game || normalPoint.Type == NormalPointType.Hardware) &&
                !await PopulateGamePointAttributes(normalPoint, requestDto, User.IsInRole(KeylolRoles.Operator)))
            {
                return(BadRequest(ModelState));
            }
            _dbContext.NormalPoints.Add(normalPoint);
            await _dbContext.SaveChangesAsync();

            return(Created($"normal-point/{normalPoint.Id}", new NormalPointDto(normalPoint)));
        }