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)); }
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)); }