示例#1
0
        public static EventMetadataVm CreateViewModel(EventMetadataRecord record, LoadMode mode,
                                                      IStorageProvider storageProvider)
        {
            if (record == null)
            {
                throw new ArgumentNullException("record");
            }

            var result = new EventMetadataVm {
                Id = record.Id
            };

            if (mode == LoadMode.Compact || mode == LoadMode.Full)
            {
                result.Title     = record.Title;
                result.StartDate = record.StartTime;
                result.EndDate   = record.EndTime;
                result.Picture   = FileUtil.GetPictureUrl(record.Picture, storageProvider);
            }

            if (mode == LoadMode.Full)
            {
                result.CombineType          = (CombineType)record.CombineType;
                result.VenueOrderType       = (VenueOrderType)record.VenueOrderType;
                result.VenueTitleFormatType = (VenueTitleFormatType)record.VenueTitleFormatType;
                result.Latitude             = record.Latitude;
                result.Longitude            = record.Longitude;
                result.Status      = (EventStatus)record.Status;
                result.Description = record.Description;
            }

            return(result);
        }
示例#2
0
        public static string DisplayNumber(this EntityVm venue, EventMetadataVm eventMeta)
        {
            var number = eventMeta.VenueTitleFormatType == VenueTitleFormatType.NameAndNumber
                ? eventMeta.Venues.IndexOf(venue) + 1
                : (int?)null;
            var result = number.HasValue ? string.Format("{0}. ", number) : string.Empty;

            return(result);
        }
示例#3
0
        public ActionResult SaveEvent(EventMetadataVm eventVm)
        {
            var errors = _validator.ValidateEvent(eventVm);

            if (errors.Count > 0)
            {
                HttpContext.Response.StatusCode = (int)HttpStatusCode.BadRequest;
                return(Json(new ErrorResultVm(errors)));
            }

            var result = _eventService.SaveEvent(eventVm);

            return(Json(result));
        }
示例#4
0
        public static void UpdateByViewModel(EventMetadataRecord record, EventMetadataVm eventVm, EntityRecord host)
        {
            if (!eventVm.StartDate.HasValue)
            {
                throw new ArgumentNullException("eventVm.StartDate");
            }

            record.DateModified = DateTime.UtcNow;

            record.EntityRecord         = host;
            record.Title                = eventVm.Title.TrimIt().StripTags();
            record.Description          = eventVm.Description.TrimIt().StripTags();
            record.StartTime            = eventVm.StartDate.Value;
            record.EndTime              = eventVm.EndDate;
            record.CombineType          = (byte)eventVm.CombineType;
            record.Status               = (byte)eventVm.Status;
            record.VenueOrderType       = (byte)eventVm.VenueOrderType;
            record.VenueTitleFormatType = (byte)eventVm.VenueTitleFormatType;
        }
示例#5
0
        public static void UpdateByViewModelPicture(EventMetadataRecord record, EventMetadataVm eventVm,
                                                    Dictionary <ShowRecord, ShowVm> shows, IStorageProvider storageProvider)
        {
            var previousPictureUrl = FileUtil.GetPictureUrl(record.Picture, storageProvider);

            if (previousPictureUrl != eventVm.Picture)
            {
                record.Picture = FileUtil.ProcessUploadedPicture(record.Picture, eventVm.Picture,
                                                                 Path.Combine("event", record.Id.ToString(CultureInfo.InvariantCulture)),
                                                                 storageProvider);
            }

            foreach (var showRec in record.ShowRecords
                     .Where(s => !s.IsReference && !s.IsDeleted)
                     .ToArray())
            {
                ShowVm showVm;
                if (shows.TryGetValue(showRec, out showVm))
                {
                    UpdateByViewModelPicture(record, showRec, showVm, storageProvider);
                }
            }
        }
示例#6
0
        private void ResizePicture(EventMetadataVm eventMetaVm, PictureSize size)
        {
            FileUtil.ResizePicture(eventMetaVm, size, _imageProfileManager, Logger);
            FileUtil.ResizePicture(eventMetaVm.Host, size, _imageProfileManager, Logger);

            if (eventMetaVm.Venues == null)
            {
                return;
            }
            foreach (var venueVm in eventMetaVm.Venues)
            {
                FileUtil.ResizePicture(venueVm, PictureSize.Small, _imageProfileManager, Logger);

                if (venueVm.Shows == null)
                {
                    continue;
                }
                foreach (var showVm in venueVm.Shows)
                {
                    FileUtil.ResizePicture(showVm, PictureSize.Small, _imageProfileManager, Logger);
                }
            }
        }
示例#7
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);
        }
示例#8
0
 public static string DisplayName(this EventMetadataVm eventMeta)
 {
     return(eventMeta.Title ?? (eventMeta.Host != null ? eventMeta.Host.Name : null));
 }
示例#9
0
 public static string DisplayPicture(this EventMetadataVm eventMeta)
 {
     return(eventMeta.Picture ?? (eventMeta.Host != null ? eventMeta.Host.Picture : null));
 }
示例#10
0
 public static IList <AddressVm> Addresses(this EventMetadataVm eventMeta)
 {
     return(eventMeta.Venues == null ? null : eventMeta.Venues.SelectMany(v => v.Addresses).ToList());
 }
示例#11
0
 public static string DisplayDate(this EventMetadataVm eventMeta, CultureInfo culture)
 {
     return(eventMeta.StartDate.ToString("D", culture) +
            (eventMeta.EndDate.HasValue ? " - " + eventMeta.EndDate.ToString("D", culture) : string.Empty));
 }
示例#12
0
 public static bool IsMultiDay(this EventMetadataVm eventMetadata)
 {
     return(DateTimeExtensions.IsMultiDay(eventMetadata.StartDate, eventMetadata.EndDate));
 }
示例#13
0
        // TODO: To validate if there are duplicated venues
        public IList <ValidationError> ValidateEvent(EventMetadataVm model)
        {
            var result = new List <ValidationError>();

            var titleProperty = model.GetPropertyName(p => p.Title);

            if (!string.IsNullOrEmpty(model.Title))
            {
                if (model.Title.Length > 255)
                {
                    result.Add(new ValidationError(
                                   titleProperty,
                                   T("Title can not be longer than 255 characters.").Text));
                }
            }

            var startDateProperty = model.GetPropertyName(p => p.StartDate);

            if (!model.StartDate.HasValue)
            {
                result.Add(new ValidationError(
                               startDateProperty,
                               T("Start date can not be empty.").Text));
            }

            if (model.StartDate.HasValue && model.EndDate.HasValue &&
                model.StartDate.Value > model.EndDate.Value)
            {
                result.Add(new ValidationError(
                               startDateProperty,
                               T("Start date has to be less than or equal to the end date.").Text));
            }

            var pictureProperty = model.GetPropertyName(p => p.Picture);

            if (!string.IsNullOrEmpty(model.Picture))
            {
                if (model.Picture.Length > 255)
                {
                    result.Add(new ValidationError(
                                   pictureProperty,
                                   T("Picture URL can not be longer than 255 characters.").Text));
                }
            }

            var descriptionProperty = model.GetPropertyName(p => p.Description);

            if (!string.IsNullOrEmpty(model.Description))
            {
                if (model.Description.Length > 3000)
                {
                    result.Add(new ValidationError(
                                   descriptionProperty,
                                   T("Description can not be longer than 3000 characters.").Text));
                }
            }

            if (model.Host == null)
            {
                result.Add(new ValidationError(
                               model.GetPropertyName(p => p.Host),
                               T("Event organizer can not be empty.").Text));
            }

            var venuesProperty = model.GetPropertyName(p => p.Venues);
            var showsProperty  = Reflection <EntityVm> .GetProperty(p => p.Shows).Name;

            var venues = model.Venues != null
                ? model.Venues.Where(v => !v.Destroy).ToArray()
                : new EntityVm[]
            {
            };

            if (model.Status == EventStatus.Public && venues.Length < 1)
            {
                result.Add(new ValidationError(
                               venuesProperty,
                               T("At least one venue is required for public events.").Text));
            }

            for (var i = 0; i < venues.Length; i++)
            {
                var venueVm = venues[i];
                if (venueVm.Id <= 0)
                {
                    result.Add(new ValidationError(
                                   string.Format("{0}[{1}]", venuesProperty, i + 1),
                                   T("The venue should be selected.").Text));
                }

                if (venueVm.EventDetail != null &&
                    venueVm.EventDetail.Description != null &&
                    venueVm.EventDetail.Description.Length > 3000)
                {
                    result.Add(new ValidationError(
                                   string.Format("{0}[{1}]", venuesProperty, i + 1),
                                   T("Venue description can not be longer than 3000 characters.").Text));
                }

                var shows = venueVm.Shows != null
                    ? venueVm.Shows.Where(v => !v.Destroy).ToArray()
                    : new ShowVm[]
                {
                };
                for (var j = 0; j < shows.Length; j++)
                {
                    var showVm = shows[j];
                    result.AddRange(ValidateShow(
                                        showVm,
                                        model,
                                        string.Format(
                                            "{0}[{1}].{2}[{3}].",
                                            venuesProperty,
                                            i + 1,
                                            showsProperty,
                                            j + 1)));
                }
            }

            return(result);
        }
示例#14
0
        private IEnumerable <ValidationError> ValidateShow(ShowVm model, EventMetadataVm eventVm, string prefix = "")
        {
            var result = new List <ValidationError>();

            var titleProperty = model.GetPropertyName(p => p.Title);

            if (string.IsNullOrEmpty(model.Title))
            {
                result.Add(new ValidationError(
                               prefix + titleProperty,
                               T("Title can not be empty!").Text));
            }
            else if (model.Title.Length > 255)
            {
                result.Add(new ValidationError(
                               prefix + titleProperty,
                               T("Title can not be larger than 255 characters!").Text));
            }

            var pictureProperty = model.GetPropertyName(p => p.Picture);

            if (!string.IsNullOrEmpty(model.Picture))
            {
                if (model.Picture.Length > 255)
                {
                    result.Add(new ValidationError(
                                   prefix + pictureProperty,
                                   T("Picture url can not be larger than 255 characters!").Text));
                }
                else if (!model.Picture.IsUrlValid())
                {
                    result.Add(new ValidationError(
                                   prefix + pictureProperty,
                                   T("Picture url is in bad format!").Text));
                }
            }

            var detailsUrlProperty = model.GetPropertyName(p => p.DetailsUrl);

            if (!string.IsNullOrEmpty(model.DetailsUrl))
            {
                if (model.DetailsUrl.Length > 255)
                {
                    result.Add(new ValidationError(
                                   prefix + detailsUrlProperty,
                                   T("Details url can not be larger than 255 characters!").Text));
                }
                else if (!model.DetailsUrl.IsUrlValid())
                {
                    result.Add(new ValidationError(
                                   prefix + detailsUrlProperty,
                                   T("Details url is in bad format!").Text));
                }
            }

            var startTimeProperty = model.GetPropertyName(p => p.StartTime);

            if (model.StartTime.HasValue && model.EndTime.HasValue &&
                model.StartTime.Value > model.EndTime.Value)
            {
                result.Add(new ValidationError(
                               prefix + startTimeProperty,
                               T("Show start time has to be less than or equal to the end time.").Text));
            }

            var eventStartDate = eventVm.StartDate;
            var eventEndDate   = eventVm.EndDate ?? eventVm.StartDate;

            if (model.StartTime.HasValue && eventStartDate.HasValue &&
                (model.StartTime.Value < eventStartDate.Value.AddDays(-1) ||
                 (eventEndDate.HasValue && model.StartTime.Value > eventEndDate.Value.AddDays(1))))
            {
                result.Add(new ValidationError(
                               prefix + startTimeProperty,
                               T("Show start time has to be between event start and end dates.").Text));
            }

            var endTimeProperty = model.GetPropertyName(p => p.EndTime);

            if (model.EndTime.HasValue && eventStartDate.HasValue &&
                (model.EndTime.Value < eventStartDate.Value.AddDays(-1) ||
                 (eventEndDate.HasValue && model.EndTime.Value > eventEndDate.Value.AddDays(2))))
            {
                result.Add(new ValidationError(
                               prefix + endTimeProperty,
                               T("Show end time has to be between event start and end dates.").Text));
            }

            return(result);
        }