public async Task <IActionResult> Edit([FromForm] VenueEditModel model, CancellationToken cancellationToken) { var venueEntity = (await _appDb.VenueRepository.GetVenuesAsync( new PredicateExpression(VenueFields.Id == model.Venue?.Id), cancellationToken)).FirstOrDefault(); if (venueEntity == null) { return(NotFound()); } var venueTeams = await _appDb.VenueRepository.GetVenueTeamRowsAsync(new PredicateExpression(VenueTeamFields.VenueId == venueEntity.Id), cancellationToken); if (!(await _authorizationService.AuthorizeAsync(User, venueTeams, Authorization.VenueOperations.EditVenue)).Succeeded) { return(Forbid()); } model = GetEditModel(false, venueEntity, null, venueTeams.Select(vt => vt.TeamName).Distinct().OrderBy(n => n).ToList(), model.ReturnUrl); model.Venue.MapEntityToFormFields(model.VenueEntity); // sync input with new model instance if (!await TryUpdateModelAsync(model)) { return(View(ViewNames.Venue.EditVenue, model)); } ModelState.Clear(); model.Venue.MapFormFieldsToEntity(model.VenueEntity); var geoResponse = new GoogleGeo.GeoResponse { Success = false }; if (model.ShouldAutoUpdateLocation()) { geoResponse = await SetupModelForGeoLocation(model, cancellationToken); } if (!await model.ValidateAsync( new VenueValidator(model.VenueEntity, (geoResponse, model.VenuesForDistance)), ModelState, cancellationToken)) { return(View(ViewNames.Venue.EditVenue, model)); } if (await _appDb.GenericRepository.SaveEntityAsync <VenueEntity>(model.VenueEntity, false, false, cancellationToken)) { return(Redirect(SetAdjustedReturnResult(nameof(Edit), model.ReturnUrl, true))); } return(View(ViewNames.Venue.EditVenue, model)); }
public JsonResult SubmitEditVenue([FromBody] VenueEditModel venue) { if (venue != null) { var currentUserId = this.User.FindFirst(ClaimTypes.NameIdentifier).Value; var currentUser = _dbContext.Users.SingleOrDefault(x => x.Id == currentUserId); if (currentUser != null) { var company = _dbContext.Company.SingleOrDefault(x => x.CompanyId == currentUser.CompanyId); if (company != null) { var existing = _dbContext.Venue.SingleOrDefault(x => x.VenueId == venue.Id); if (existing != null) { bool saved = true; string error = string.Empty; try { existing.Capacity = venue.Capacity; existing.VenueName = venue.Name; existing.VenueLocation = venue.Location; _dbContext.Entry(existing).State = EntityState.Modified; _dbContext.SaveChanges(); } catch (Exception ex) { saved = false; error = ex.Message; } if (!saved) { return(Json(new { Message = "Failed to edit Venue " + error })); } else { return(Json(new { Message = "Edited new Venue" })); } } else { return(Json(new { Message = "Can't find venue to be edited" })); } } } } return(Json(new { Message = "Error finding user Info" })); }
private async Task <GoogleGeo.GeoResponse> SetupModelForGeoLocation(VenueEditModel model, CancellationToken cancellationToken) { var geoResponse = await model.TrySetGeoLocation(_googleConfig.ServiceApiKey, _regionInfo.TwoLetterISORegionName, TimeSpan.FromSeconds(10)); if (!geoResponse.Success) { _logger.LogError(geoResponse.Exception, "{0} failed. Response status text: {1}", $"{nameof(VenueEditModel)}.{nameof(VenueEditModel.TrySetGeoLocation)}()", geoResponse.StatusText); } else { model.VenuesForDistance = await _appDb.VenueRepository.GetVenuesForDistanceAsync(geoResponse.GeoLocation.LocationType == GoogleGeo.LocationType.RoofTop? .5 : 2.0, geoResponse.GeoLocation.Longitude.TotalDegrees, geoResponse.GeoLocation.Latitude.TotalDegrees, cancellationToken); } return(geoResponse); }
public async Task <IActionResult> Create([FromForm] VenueEditModel model, CancellationToken cancellationToken) { TeamEntity teamEntity = null; if (model.TeamId.HasValue) { teamEntity = await _appDb.TeamRepository.GetTeamEntityAsync(new PredicateExpression(TeamFields.Id == model.TeamId.Value), cancellationToken); if (teamEntity == null) { return(NotFound()); } } if (!await CreateIsAuthorized(model.TeamId)) { return(Forbid()); } model = GetEditModel(true, new VenueEntity(), teamEntity, new string[] { }, model.ReturnUrl); model.Venue.MapEntityToFormFields(model.VenueEntity); // sync input with new model instance if (!await TryUpdateModelAsync(model)) { return(View(ViewNames.Venue.EditVenue, model)); } ModelState.Clear(); model.Venue.MapFormFieldsToEntity(model.VenueEntity); var geoResponse = new GoogleGeo.GeoResponse { Success = false }; if (model.ShouldAutoUpdateLocation()) { geoResponse = await SetupModelForGeoLocation(model, cancellationToken); } if (!await model.ValidateAsync( // with parameter geoResponse == NULL, there is no geo validation new VenueValidator(model.VenueEntity, (geoResponse, model.VenuesForDistance)), ModelState, cancellationToken)) { return(View(ViewNames.Venue.EditVenue, model)); } try { if (teamEntity != null) { // Save the new venue for an existing team teamEntity.Venue = model.VenueEntity; return(await _appDb.GenericRepository.SaveEntityAsync <TeamEntity>(teamEntity, false, true, cancellationToken) ? Redirect(SetAdjustedReturnResult(nameof(Create), model.ReturnUrl, true)) : Redirect(SetAdjustedReturnResult(nameof(Create), model.ReturnUrl, false))); } else { // Save the venue (only) return(await _appDb.GenericRepository.SaveEntityAsync <VenueEntity>(model.VenueEntity, false, false, cancellationToken) ? Redirect(SetAdjustedReturnResult(nameof(Create), model.ReturnUrl, true)) : Redirect(SetAdjustedReturnResult(nameof(Create), model.ReturnUrl, false))); } } catch (Exception e) { _logger.LogCritical(e, "Failed to save venue."); return(Redirect(SetAdjustedReturnResult(nameof(Create), model.ReturnUrl, false))); } }
public async Task <IActionResult> EditVenue([FromForm] VenueEditModel venueEditModel, CancellationToken cancellationToken) { var sessionModel = await GetModelFromSession(cancellationToken); if (!sessionModel.IsFromSession) { return(RedirectToAction(nameof(SelectTeam), new { Organization = _tenantContext.SiteContext.UrlSegmentValue })); } ViewData["TournamentName"] = sessionModel.TournamentName; var venueEntity = new VenueEntity(); if (!venueEditModel.Venue.IsNew) { venueEntity = (await _appDb.VenueRepository.GetVenuesAsync( new PredicateExpression(VenueFields.Id == venueEditModel.Venue?.Id), cancellationToken)).FirstOrDefault(); if (venueEntity == null) { return(RedirectToAction(nameof(SelectVenue), new { Organization = _tenantContext.SiteContext.UrlSegmentValue })); } } var venueTeams = await _appDb.VenueRepository.GetVenueTeamRowsAsync(new PredicateExpression(VenueTeamFields.VenueId == venueEntity.Id), cancellationToken); venueEditModel = GetVenueEditModel(venueEntity, null, venueTeams.Select(vt => vt.TeamName).Distinct().OrderBy(n => n).ToList()); venueEditModel.Venue.MapEntityToFormFields(venueEditModel.VenueEntity); // sync input with new model instance if (!await TryUpdateModelAsync(venueEditModel)) { return(View(ViewNames.TeamApplication.EditVenue, venueEditModel)); } ModelState.Clear(); venueEditModel.Venue.MapFormFieldsToEntity(venueEditModel.VenueEntity); var geoResponse = new GoogleGeo.GeoResponse { Success = false }; if (venueEditModel.ShouldAutoUpdateLocation()) { geoResponse = await SetupVenueModelForGeoLocation(venueEditModel, cancellationToken); } if (!await venueEditModel.ValidateAsync( new VenueValidator(venueEditModel.VenueEntity, (geoResponse, venueEditModel.VenuesForDistance)), ModelState, cancellationToken)) { return(View(ViewNames.TeamApplication.EditVenue, venueEditModel)); } sessionModel.Venue.MapEntityToFormFields(venueEditModel.VenueEntity); SaveModelToSession(sessionModel); sessionModel.VenueIsSet = true; return(RedirectToAction(nameof(Confirm), new { Organization = _tenantContext.SiteContext.UrlSegmentValue })); }