private EventMetadataVm CreateViewModelContract( EventMetadataRecord eventMeta, int?day, LoadMode mode = LoadMode.Full) { if (eventMeta == null) { throw new ArgumentNullException("eventMeta"); } var result = ViewModelFactory.CreateViewModel(eventMeta, mode, _storageProvider); result.Host = EntityService .ViewModelFactory.CreateViewModel(eventMeta.EntityRecord, mode, _storageProvider); if (mode == LoadMode.Full) { result.Venues = GetEventVenues(eventMeta, day); } return(result); }
private IList <EntityVm> GetEventVenues(EventMetadataRecord eventMeta, int?day) { var range = new Tuple <DateTime?, DateTime?>(eventMeta.StartTime, eventMeta.EndTime); var currentDay = day == null ? null : (eventMeta.IsMultiDay() && eventMeta.StartTime.HasValue ? (DateTime?)eventMeta.StartTime.Value.AddDays(day.Value) : null); var allShows = eventMeta.ShowRecords .Where(s => !s.IsDeleted && (s.IsReference || s.StartTime.IsTimeThisDay(currentDay, range))) .ToArray(); var venues = allShows .Select(s => s.EntityRecord) .Distinct() .Select(e => { var venueDetail = eventMeta .EventEntityDetailRecords .FirstOrDefault(eedr => !eedr.IsDeleted && eedr.EntityRecord.Id == e.Id); var venueVm = EntityService .ViewModelFactory .CreateViewModel(e, venueDetail, _storageProvider); venueVm.Shows = allShows .Where(s => s.EntityRecord.Id == e.Id && !s.IsReference) .OrderBy(s => s.StartTime) .Select(s => ViewModelFactory.CreateViewModel(s, _storageProvider)) .ToArray(); return(venueVm); }); EntityVm[] result; if (eventMeta.VenueOrderType == (byte)VenueOrderType.Custom) { result = venues .OrderBy(v => v.EventDetail != null && v.EventDetail.SortOrder != null ? v.EventDetail.SortOrder.Value : 0) .ToArray(); } else if (eventMeta.VenueOrderType == (byte)VenueOrderType.Name) { result = venues .OrderBy(v => v.Name, NameComparer) .ToArray(); } else { result = venues.ToArray(); } return(result); }
public EventMetadataVm SaveEvent(EventMetadataVm eventVm) { if (eventVm == null) { throw new ArgumentNullException("eventVm"); } if (eventVm.StartDate == null) { throw new ArgumentNullException("eventVm.StartDate"); } var host = _entityRepository.Get(eventVm.Host.Id); if (host == null) { throw new ArgumentOutOfRangeException("eventVm.Host"); } if (!Services.Authorizer.Authorize(Permissions.UseAllContent) && host.SmartWalkUserRecord.Id != CurrentUserRecord.Id) { throw new ArgumentOutOfRangeException("eventVm.Host", "Can't add host created by other user to the event."); } var eventMeta = _eventMetadataRepository.Get(eventVm.Id) ?? new EventMetadataRecord { SmartWalkUserRecord = CurrentUserRecord, DateCreated = DateTime.UtcNow }; var access = eventMeta.GetAccess(Services.Authorizer, CurrentUserRecord); if (access != AccessType.AllowEdit) { throw new SecurityException("Can't edit event."); } if (eventMeta.IsDeleted) { throw new InvalidOperationException("Can't edit deleted event."); } if (eventMeta.Status == (byte)EventStatus.Public && !Services.Authorizer.Authorize(Permissions.CreatePublicContent)) { throw new SecurityException("Current user can not make public events."); } ViewModelFactory.UpdateByViewModel(eventMeta, eventVm, host); var venues = CompressVenues(eventVm.Venues); var showsDict = new Dictionary <ShowRecord, ShowVm>(); foreach (var venueVm in venues) { var venue = _entityRepository.Get(venueVm.Id); if (venue == null) { continue; } SaveVenueDetail(eventMeta, venue, venueVm); foreach (var showVm in venueVm.Shows) { // ReSharper disable once AccessToForEachVariableInClosure var show = showVm.Id > 0 ? eventMeta.ShowRecords.FirstOrDefault(s => s.Id == showVm.Id) : null; if (show == null && !venueVm.Destroy) { show = new ShowRecord { EventMetadataRecord = eventMeta, EntityRecord = venue, DateCreated = DateTime.UtcNow }; eventMeta.ShowRecords.Add(show); } // if parent venue is deleted, all shows are deleted too if (show != null && venueVm.Destroy) { showVm.Destroy = true; } if (show != null) { show.EntityRecord = venue; // in case if shows moved to another venue ViewModelFactory.UpdateByViewModel(show, showVm); if (!show.IsDeleted) { showsDict.Add(show, showVm); } } } UpdateReferenceShow(eventMeta, venue, !venueVm.Destroy && venueVm.Shows.Count(s => !s.Destroy) == 0); } DestroyMissingVenues(eventMeta, venues); RecalcEventCoordinates(eventMeta); if (eventMeta.Id == 0) { _eventMetadataRepository.Create(eventMeta); } // handling uploaded pictures after event got an Id ViewModelFactory.UpdateByViewModelPicture(eventMeta, eventVm, showsDict, _storageProvider); _eventMetadataRepository.Flush(); var result = CreateViewModelContract(eventMeta, null); return(result); }