Esempio n. 1
0
        /// <summary>
        /// Loads the relations from the database.
        /// </summary>
        private static async Task <IReadOnlyDictionary <Guid, IReadOnlyList <RelationExcerpt> > > LoadRelationsAsync(AppDbContext db, RelationContextOptions opts)
        {
            if (opts.PagesOnly)
            {
                return(null);
            }

            var query = db.Relations
                        .Where(x => x.Source.IsDeleted == false &&
                               x.Destination.IsDeleted == false &&
                               x.IsDeleted == false);

            if (opts.PeopleOnly)
            {
                query = query.Where(x => x.Source.Type == PageType.Person &&
                                    x.Destination.Type == PageType.Person);
            }

            var data = await query.Select(x => new RelationExcerpt
            {
                Id              = x.Id,
                SourceId        = x.SourceId,
                DestinationId   = x.DestinationId,
                EventId         = x.Event != null && x.Event.IsDeleted == false ? x.EventId : null,
                Duration        = FuzzyRange.TryParse(x.Duration),
                Type            = x.Type,
                IsComplementary = x.IsComplementary
            })
                       .ToListAsync();

            return(data.GroupBy(x => x.SourceId).ToDictionary(x => x.Key, x => (IReadOnlyList <RelationExcerpt>)x.ToList()));
        }
Esempio n. 2
0
 public void Configure(IProfileExpression profile)
 {
     profile.CreateMap <Relation, RelationTitleVM>()
     .MapMember(x => x.Id, x => x.Id)
     .MapMember(x => x.Type, x => x.Type)
     .MapMemberDynamic(x => x.Source, x => x.Source)
     .MapMemberDynamic(x => x.Destination, x => x.Destination)
     .MapMemberDynamic(x => x.Event, x => x.Event)
     .MapMember(x => x.Duration, x => FuzzyRange.TryParse(x.Duration));
 }
Esempio n. 3
0
 /// <summary>
 /// Maps the relation to an excerpt.
 /// </summary>
 private RelationContext.RelationExcerpt CreateExcerpt(Relation rel)
 {
     return(new RelationContext.RelationExcerpt
     {
         Id = rel.Id,
         SourceId = rel.SourceId,
         DestinationId = rel.DestinationId,
         Duration = FuzzyRange.TryParse(rel.Duration),
         EventId = rel.EventId,
         IsComplementary = rel.IsComplementary,
         Type = rel.Type
     });
 }
Esempio n. 4
0
        /// <summary>
        /// Checks if the create/update request contains valid data.
        /// </summary>
        private async Task ValidateRequestAsync(RelationEditorVM vm, bool isNew)
        {
            var val = new Validator();

            vm.SourceIds = vm.SourceIds ?? new Guid[0];

            var pageIds = vm.SourceIds
                          .Concat(new [] { vm.DestinationId ?? Guid.Empty, vm.EventId ?? Guid.Empty })
                          .ToList();

            var pages = await _db.Pages
                        .Where(x => pageIds.Contains(x.Id))
                        .ToDictionaryAsync(x => x.Id, x => x.Type);

            var sourceTypes = vm.SourceIds.Select(x => pages.TryGetNullableValue(x)).ToList();
            var destType    = pages.TryGetNullableValue(vm.DestinationId ?? Guid.Empty);
            var eventType   = pages.TryGetNullableValue(vm.EventId ?? Guid.Empty);

            if (vm.SourceIds == null || vm.SourceIds.Length == 0)
            {
                val.Add(nameof(vm.SourceIds), "Выберите страницу");
            }
            else if (isNew == false && vm.SourceIds.Length > 1)
            {
                val.Add(nameof(vm.SourceIds), "При редактировании может быть указана только одна страница");
            }
            else if (sourceTypes.Any(x => x == null))
            {
                val.Add(nameof(vm.SourceIds), "Страница не найдена");
            }

            if (vm.DestinationId == null)
            {
                val.Add(nameof(vm.DestinationId), "Выберите страницу");
            }
            else if (destType == null)
            {
                val.Add(nameof(vm.DestinationId), "Страница не найдена");
            }

            if (destType != null && sourceTypes.Any(x => x != null && !RelationHelper.IsRelationAllowed(x.Value, destType.Value, vm.Type)))
            {
                val.Add(nameof(vm.Type), "Тип связи недопустимм для данных страниц");
            }

            if (vm.EventId != null)
            {
                if (eventType == null)
                {
                    val.Add(nameof(vm.EventId), "Страница не найдена");
                }
                else if (eventType != PageType.Event)
                {
                    val.Add(nameof(vm.EventId), "Требуется страница события");
                }
                else if (!RelationHelper.IsRelationEventReferenceAllowed(vm.Type))
                {
                    val.Add(nameof(vm.EventId), "Событие нельзя привязать к данному типу связи");
                }
            }

            if (!string.IsNullOrEmpty(vm.DurationStart) || !string.IsNullOrEmpty(vm.DurationEnd))
            {
                if (!RelationHelper.IsRelationDurationAllowed(vm.Type))
                {
                    val.Add(nameof(vm.DurationStart), "Дату нельзя указать для данного типа связи");
                }
                else
                {
                    var from = FuzzyDate.TryParse(vm.DurationStart);
                    var to   = FuzzyDate.TryParse(vm.DurationEnd);

                    if (from > to)
                    {
                        val.Add(nameof(vm.DurationStart), "Дата начала не может быть больше даты конца");
                    }
                    else if (FuzzyRange.TryParse(FuzzyRange.TryCombine(vm.DurationStart, vm.DurationEnd)) == null)
                    {
                        val.Add(nameof(vm.DurationStart), "Введите дату в корректном формате");
                    }
                }
            }

            var existingRelation = await _db.Relations
                                   .AnyAsync(x => vm.SourceIds.Contains(x.SourceId) &&
                                             x.DestinationId == vm.DestinationId &&
                                             x.Type == vm.Type &&
                                             x.Id != vm.Id);

            if (existingRelation)
            {
                val.Add(nameof(vm.DestinationId), "Такая связь уже существует!");
            }

            val.ThrowIfInvalid();
        }