Exemplo n.º 1
0
        public async Task <IActionResult> Create(ChallengesDetailViewModel model)
        {
            var site = await GetCurrentSiteAsync();

            if (site.MaxPointsPerChallengeTask.HasValue && model.Challenge.TasksToComplete.HasValue &&
                model.Challenge.TasksToComplete != 0)
            {
                double pointsPerChallenge = (double)model.Challenge.PointsAwarded / model.Challenge.TasksToComplete.Value;
                if (pointsPerChallenge > site.MaxPointsPerChallengeTask)
                {
                    ModelState.AddModelError("Challenge.PointsAwarded", $"Too many points awarded.");
                }
            }
            if (model.BadgeUploadImage != null &&
                (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker))
            {
                if (Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpg" &&
                    Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".jpeg" &&
                    Path.GetExtension(model.BadgeUploadImage.FileName).ToLower() != ".png")
                {
                    ModelState.AddModelError("BadgeUploadImage", "Please use a .jpg or .png image");
                }
            }
            if (ModelState.IsValid)
            {
                try
                {
                    var challenge = model.Challenge;
                    if (model.BadgeUploadImage != null ||
                        !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                    {
                        byte[] badgeBytes;
                        string filename;
                        if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                            (model.BadgeUploadImage != null || model.UseBadgeMaker))
                        {
                            var badgeString = model.BadgeMakerImage.Split(',').Last();
                            badgeBytes = Convert.FromBase64String(badgeString);
                            filename   = "badge.png";
                        }
                        else
                        {
                            using (var fileStream = model.BadgeUploadImage.OpenReadStream())
                            {
                                using (var ms = new MemoryStream())
                                {
                                    fileStream.CopyTo(ms);
                                    badgeBytes = ms.ToArray();
                                }
                            }
                            filename = Path.GetFileName(model.BadgeUploadImage.FileName);
                        }
                        Badge newBadge = new Badge()
                        {
                            Filename = filename
                        };
                        var badge = await _badgeService.AddBadgeAsync(newBadge, badgeBytes);

                        challenge.BadgeId = badge.Id;
                    }
                    challenge = await _challengeService.AddChallengeAsync(challenge);

                    AlertSuccess = $"Challenge '<strong>{challenge.Name}</strong>' was successfully created";
                    return(RedirectToAction("Edit", new { id = challenge.Id }));
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to add challenge: ", gex.Message);
                }
            }
            PageTitle = "Create Challenge";
            model     = await GetDetailLists(model);

            return(View(model));
        }
Exemplo n.º 2
0
        public async Task <IActionResult> Create(ChallengesDetailViewModel model)
        {
            byte[] badgeBytes = null;

            model.IgnorePointLimits = UserHasPermission(Permission.IgnorePointLimits);
            model.MaxPointLimit     = await _challengeService
                                      .GetMaximumAllowedPointsAsync(GetCurrentSiteId());

            if (!model.IgnorePointLimits &&
                model.Challenge.TasksToComplete.HasValue &&
                model.Challenge.TasksToComplete != 0)
            {
                double pointsPerChallenge = (double)model.Challenge.PointsAwarded / model.Challenge.TasksToComplete.Value;
                if (pointsPerChallenge > model.MaxPointLimit)
                {
                    ModelState.AddModelError("Challenge.PointsAwarded",
                                             $"A challenge with {model.Challenge.TasksToComplete} tasks may award a maximum of {model.MaxPointLimit * model.Challenge.TasksToComplete} points.");
                }
            }
            if (model.BadgeUploadImage != null &&
                (string.IsNullOrWhiteSpace(model.BadgeMakerImage) || !model.UseBadgeMaker))
            {
                if (!ValidImageExtensions.Contains(Path
                                                   .GetExtension(model.BadgeUploadImage.FileName)
                                                   .ToLowerInvariant()))
                {
                    ModelState.AddModelError("BadgeUploadImage", $"Image must be one of the following types: {string.Join(", ", ValidImageExtensions)}");
                }

                try
                {
                    using (var ms = new MemoryStream())
                    {
                        await model.BadgeUploadImage.CopyToAsync(ms);

                        badgeBytes = ms.ToArray();
                    }
                    await _badgeService.ValidateBadgeImageAsync(badgeBytes);
                }
                catch (GraException gex)
                {
                    ModelState.AddModelError("BadgeUploadImage", gex.Message);
                }
            }
            if (ModelState.IsValid)
            {
                try
                {
                    var challenge = model.Challenge;
                    if (model.BadgeUploadImage != null ||
                        !string.IsNullOrWhiteSpace(model.BadgeMakerImage))
                    {
                        string filename;
                        if (!string.IsNullOrWhiteSpace(model.BadgeMakerImage) &&
                            (model.BadgeUploadImage == null || model.UseBadgeMaker))
                        {
                            var badgeString = model.BadgeMakerImage.Split(',').Last();
                            badgeBytes = Convert.FromBase64String(badgeString);
                            filename   = "badge.png";
                        }
                        else
                        {
                            if (badgeBytes == null)
                            {
                                using (var ms = new MemoryStream())
                                {
                                    await model.BadgeUploadImage.CopyToAsync(ms);

                                    badgeBytes = ms.ToArray();
                                }
                            }
                            filename = Path.GetFileName(model.BadgeUploadImage.FileName);
                        }
                        var newBadge = new Badge
                        {
                            Filename = filename
                        };
                        var badge = await _badgeService.AddBadgeAsync(newBadge, badgeBytes);

                        challenge.BadgeId = badge.Id;
                    }
                    var serviceResult = await _challengeService.AddChallengeAsync(challenge);

                    if (serviceResult.Status == ServiceResultStatus.Warning &&
                        !string.IsNullOrWhiteSpace(serviceResult.Message))
                    {
                        ShowAlertWarning(serviceResult.Message);
                    }
                    AlertSuccess = $"Challenge '<strong>{serviceResult.Data.Name}</strong>' was successfully created";
                    return(RedirectToAction("Edit", new { id = serviceResult.Data.Id }));
                }
                catch (GraException gex)
                {
                    ShowAlertWarning("Unable to add challenge: ", gex.Message);
                }
            }

            PageTitle = "Create Challenge";
            model     = await GetDetailLists(model);

            if (model.MaxPointLimit.HasValue)
            {
                model.MaxPointsMessage = $"(Up to {model.MaxPointLimit.Value} points per required task)";
            }

            return(View(model));
        }