Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }