public ActionResult Edit(SubscriptionEditModel model) { var modelState = new ModelStateHelper <SubscriptionEditModel>(ModelState); // Проверка ComponentTypeId if (model.Object == SubscriptionObject.ComponentType && model.ComponentTypeId == null) { modelState.AddErrorFor(x => x.ComponentTypeId, "Выберите тип компонента"); } // Проверка ComponentId if (model.Object == SubscriptionObject.Component && model.ComponentId == null) { modelState.AddErrorFor(x => x.ComponentId, "Выберите компонент"); } // Проверка Channel if (model.Id == null && model.Channel == null) { // канал должен указываться явно только для новых подписок modelState.AddErrorFor(x => x.Channel, "Выберите канал"); } // Проверка UserId if (model.Id == null && model.UserId == null) { // Пользователь должен указываться явно только для новых подписок modelState.AddErrorFor(x => x.UserId, "Выберите пользователя"); } // проверка цвета var color = model.Color.GetSelectedOne(); if (color == null) { modelState.AddErrorFor(x => x.Color, "Укажите цвет"); } if (!ModelState.IsValid) { return(View(model)); } try { // проверка прав var isOtherUser = CurrentUser.Id != model.UserId; if (isOtherUser) { if (CurrentUser.IsAdmin() == false) { throw new UserFriendlyException("Нет прав на создание подписок другим пользователям"); } } var importance = ImportanceHelper.Get(color).Value; var client = GetDispatcherClient(); if (model.Id == null) { // создание новой подписки var createData = new CreateSubscriptionRequestData() { UserId = model.UserId.Value, Channel = model.Channel.Value, DurationMinimumInSeconds = TimeSpanHelper.GetSeconds(model.MinimumDuration), ResendTimeInSeconds = TimeSpanHelper.GetSeconds(model.ResendTime), Importance = importance, IsEnabled = model.IsEnabled, NotifyBetterStatus = model.NotifyBetterStatus, Object = model.Object }; if (model.Object == SubscriptionObject.Component) { createData.ComponentId = model.ComponentId; } if (model.Object == SubscriptionObject.ComponentType) { createData.ComponentTypeId = model.ComponentTypeId; } var response = client.CreateSubscription(CurrentUser.AccountId, createData); response.Check(); model.Id = response.Data.Id; } else { // редактирование существующей подписки var updateData = new UpdateSubscriptionRequestData() { Id = model.Id.Value, NotifyBetterStatus = model.NotifyBetterStatus, IsEnabled = model.IsEnabled, ResendTimeInSeconds = TimeSpanHelper.GetSeconds(model.ResendTime), DurationMinimumInSeconds = TimeSpanHelper.GetSeconds(model.MinimumDuration), Importance = importance }; var response = client.UpdateSubscription(CurrentUser.AccountId, updateData); response.Check(); } if (model.ModalMode) { return(GetSuccessJsonResponse(new { subscriptionId = model.Id })); } return(Redirect(model.ReturnUrl)); } catch (UserFriendlyException exception) { model.Exception = exception; } return(View(model)); }
public Subscription CreateSubscription(Guid accountId, CreateSubscriptionRequestData requestData) { if (requestData == null) { throw new ParameterRequiredException("Request.Subscription"); } if (requestData.Object == SubscriptionObject.Component && requestData.ComponentId == null) { throw new ParameterRequiredException("Request.ComponentId"); } if (requestData.Object == SubscriptionObject.ComponentType && requestData.ComponentTypeId == null) { throw new ParameterRequiredException("Request.ComponentTypeId"); } if (requestData.Object == SubscriptionObject.Default) { if (requestData.ComponentId.HasValue) { throw new UserFriendlyException("Нельзя указывать ComponentId для подписки по умолчанию"); } if (requestData.ComponentTypeId.HasValue) { throw new UserFriendlyException("Нельзя указывать ComponentTypeId для подписки по умолчанию"); } } else if (requestData.Object == SubscriptionObject.Component) { if (requestData.ComponentId == null) { throw new UserFriendlyException("Укажите ComponentId для подписки на компонент"); } if (requestData.ComponentTypeId.HasValue) { throw new UserFriendlyException("Нельзя указывать ComponentTypeId для подписки на компонент"); } } else if (requestData.Object == SubscriptionObject.ComponentType) { if (requestData.ComponentTypeId == null) { throw new UserFriendlyException("Укажите ComponentTypeId для подписки на тип компонента"); } if (requestData.ComponentId.HasValue) { throw new UserFriendlyException("Нельзя указывать ComponentId для подписки на тип компонента"); } } var lockObj = typeof(SubscriptionService); lock (lockObj) { var accountDbContext = Context.GetAccountDbContext(accountId); var subscriptionRepository = accountDbContext.GetSubscriptionRepository(); var query = subscriptionRepository .QueryAll() .Where(t => t.UserId == requestData.UserId && t.Object == requestData.Object && t.Channel == requestData.Channel); if (requestData.Object == SubscriptionObject.Component) { query = query.Where(x => x.ComponentId == requestData.ComponentId.Value); } else if (requestData.Object == SubscriptionObject.ComponentType) { query = query.Where(x => x.ComponentTypeId == requestData.ComponentTypeId.Value); } var subscription = query.FirstOrDefault(); if (subscription != null) { return(subscription); } var userRepository = accountDbContext.GetUserRepository(); var user = userRepository.GetById(requestData.UserId); ComponentType componentType = null; if (requestData.ComponentTypeId.HasValue) { var componentTypeRepository = accountDbContext.GetComponentTypeRepository(); componentType = componentTypeRepository.GetById(requestData.ComponentTypeId.Value); } subscription = new Subscription() { User = user, Object = requestData.Object, ComponentId = requestData.ComponentId, ComponentType = componentType, Channel = requestData.Channel, IsEnabled = requestData.IsEnabled, Importance = requestData.Importance, DurationMinimumInSeconds = requestData.DurationMinimumInSeconds, ResendTimeInSeconds = requestData.ResendTimeInSeconds, LastUpdated = DateTime.Now, NotifyBetterStatus = requestData.NotifyBetterStatus }; subscription = subscriptionRepository.Add(subscription); accountDbContext.SaveChanges(); return(subscription); } }
public Zidium.Core.Api.CreateSubscriptionResponse CreateSubscription(Guid accountId, CreateSubscriptionRequestData data) { var request = GetRequest <CreateSubscriptionRequest>(accountId); request.Data = data; var dispatcher = DispatcherHelper.GetDispatcherService(); return(dispatcher.CreateSubscription(request)); }