public async Task <IActionResult> Update([FromBody] ProviderUpdateModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadModelResponse(ModelState));
            }

            return(Ok(await _providerManager.Update(model)));
        }
Exemple #2
0
        public async Task <IActionResult> Update([FromBody] ProviderUpdateModel model)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest());
            }

            return(Json(await _managerProvider.Update(model)));
        }
        /// <summary>
        /// Create new provider
        /// </summary>
        /// <param name="model">new provider model</param>
        /// <returns></returns>
        public async Task <IdNameModel> Create(ProviderUpdateModel model)
        {
            if (model == null)
            {
                throw new ModelDamagedException(nameof(model), "can not be empty");
            }

            var user = await GetCurrentUser();

            if (!(await _appUserManager.IsInRoleAsync(user, "MANAGER")) && !(await _appUserManager.IsInRoleAsync(user, "ADMIN")))
            {
                throw new NotEnoughRightsException();
            }

            if (string.IsNullOrWhiteSpace(model.Slug))
            {
                throw new ModelDamagedException(nameof(model.Slug), "can not be empty");
            }

            model.Slug = model.Slug.ToLower();

            if (string.IsNullOrWhiteSpace(model.Category))
            {
                throw new ModelDamagedException(nameof(model.Category), "can not be empty");
            }

            if (model.Translations == null || !model.Translations.Any())
            {
                throw new ModelDamagedException(nameof(model.Translations), "can not be null or empty");
            }

            var isSlugExists = (await _providerRepository.Count(x => x.Slug == model.Slug && x.State == MREntityState.Active)) > 0;

            if (isSlugExists)
            {
                throw new MRSystemException($"Provider with slug {model.Slug} already exists");
            }

            var category = await _providerCategoryRepository.GetFirst(x => x.Slug == model.Category);

            if (category == null)
            {
                throw new EntityNotFoundException(model.Category, typeof(ProviderCategory));
            }

            var entity = _mapper.Map <Provider>(model);

            entity.Owner    = _mapper.Map <ProviderOwner>(user);
            entity.Category = new ProviderProviderCategory
            {
                CategoryId = category.Id,
                Slug       = category.Slug
            };
            entity.Tags = new List <ProviderProviderTag>();

            entity.Workers = new List <ProviderWorker>
            {
                new ProviderWorker
                {
                    Roles = new List <ProviderWorkerRole>
                    {
                        ProviderWorkerRole.ANALYTICS,
                        ProviderWorkerRole.DEVELOPER,
                        ProviderWorkerRole.MANAGER,
                        ProviderWorkerRole.OWNER,
                        ProviderWorkerRole.USER_MANAGER
                    },
                    UserEmail = _userEmail,
                    UserId    = _userId
                }
            };

            // set avatar
            if (entity.Avatar != null)
            {
                var image = await _imageOriginBucket.MoveFrom(_imageTmpBucket.BucketFullPath, model.Avatar.Key);

                if (image != null && image.IsSuccess)
                {
                    entity.Avatar.Url = image.Url;
                }
            }

            // set background
            if (entity.Background != null)
            {
                var image = await _imageOriginBucket.MoveFrom(_imageTmpBucket.BucketFullPath, model.Background.Key);

                if (image != null && image.IsSuccess)
                {
                    entity.Background.Url = image.Url;
                }
            }

            var result = await _providerRepository.Insert(entity);

            return(new IdNameModel
            {
                Id = result.Id,
                Name = result.Name
            });
        }
        /// <summary>
        /// Updates provider model
        /// </summary>
        /// <param name="model">Provider to update</param>
        /// <returns>Provider updpate model</returns>
        public async Task <ProviderUpdateModel> Update(ProviderUpdateModel model)
        {
            if (model == null)
            {
                throw new BadRequestException();
            }

            var user = await GetCurrentUser();

            if (!(await _appUserManager.IsInRoleAsync(user, "MANAGER")) && !(await _appUserManager.IsInRoleAsync(user, "ADMIN")))
            {
                throw new NotEnoughRightsException();
            }

            if (string.IsNullOrWhiteSpace(model.Slug))
            {
                throw new ModelDamagedException(nameof(model.Slug), "can not be null");
            }

            model.Slug = model.Slug.ToLower();

            if (string.IsNullOrWhiteSpace(model.Category))
            {
                throw new ModelDamagedException(nameof(model.Category), "can not be null");
            }

            if (model.Translations == null || !model.Translations.Any())
            {
                throw new ModelDamagedException(nameof(model.Translations), "can not be null or empty");
            }

            if (model.Translations.Count(x => x.IsDefault) != 1)
            {
                throw new ModelDamagedException(nameof(model.Translations), "default is required");
            }

            var entity = await _providerRepository.Get(model.Id);

            if (entity == null)
            {
                throw new EntityNotFoundException(model.Id, typeof(Provider));
            }

            if (entity.Owner.Id != (await GetCurrentUser()).Id)
            {
                throw new AccessDeniedException(model.Id, typeof(Provider));
            }

            var category = await _providerCategoryRepository.GetFirst(x => x.Slug == model.Category);

            if (category == null)
            {
                throw new EntityNotFoundException(model.Category, typeof(ProviderCategory));
            }

            var newEntity = _mapper.Map <Provider>(model);

            newEntity.Owner    = entity.Owner;
            newEntity.Category = new ProviderProviderCategory
            {
                CategoryId = category.Id,
                Slug       = category.Slug
            };

            bool removeAvatar     = false;
            bool removeBackground = false;

            if (newEntity.Avatar.Key != entity.Avatar.Key)
            {
                var aMoveResponse = await _imageOriginBucket.MoveFrom(_imageTmpBucket.BucketFullPath, newEntity.Avatar.Key);

                if (!aMoveResponse.IsSuccess)
                {
                    throw new MRSystemException("Can not transfer image");
                }

                newEntity.Avatar.Url = aMoveResponse.Url;
                removeAvatar         = true;
            }

            if (newEntity.Background.Key != entity.Background.Key)
            {
                var bMoveResponse = await _imageOriginBucket.MoveFrom(_imageTmpBucket.BucketFullPath, newEntity.Avatar.Key);

                if (!bMoveResponse.IsSuccess)
                {
                    throw new MRSystemException("Can not transfer image");
                }

                newEntity.Background.Key = bMoveResponse.Key;
                removeBackground         = true;
            }

            if (removeAvatar)
            {
                await _imageOriginBucket.Delete(entity.Avatar.Key);

                await _imageTmpBucket.Delete(newEntity.Avatar.Key);
            }

            if (removeBackground)
            {
                await _imageOriginBucket.Delete(entity.Background.Key);

                await _imageTmpBucket.Delete(newEntity.Background.Key);
            }

            if (newEntity.Workers == null)
            {
                newEntity.Workers = new List <ProviderWorker>();
            }

            var replaceResponse = await _providerRepository.Replace(newEntity);

            if (replaceResponse == null)
            {
                throw new MRSystemException();
            }

            return(_mapper.Map <ProviderUpdateModel>(newEntity));
        }
        public async Task <ProviderUpdateModel> Update(ProviderUpdateModel model)
        {
            if (model == null)
            {
                throw new MRException <ProviderUpdateModel>((int)ExceptionCode.BAD_REQUEST);
            }

            if (model.Name?.SelectTranslation(null) == null || model.Description?.SelectTranslation(null) == null)
            {
                throw new MRException <ProviderUpdateModel>((int)ExceptionCode.BAD_MODEL, "Default translations not found");
            }

            model.Slug = model.Slug.ToLowerInvariant().Replace(" ", "_");
            var existsWithSlug = await _repositoryProvider.GetFirst(x => x.Slug == model.Slug && x.State == MREntityState.Active);

            if (existsWithSlug != null)
            {
                if (string.IsNullOrWhiteSpace(model.Id) || existsWithSlug.Id != model.Id)
                {
                    throw new MRException <ProviderUpdateModel>((int)ExceptionCode.BAD_MODEL, "Provider with this slug already exists");
                }
            }

            Provider      entity         = null;
            List <string> imagesToDelete = new List <string>();

            if (string.IsNullOrWhiteSpace(model.Id))
            {
                entity            = _mapper.Map <Provider>(model);
                entity.CreateTime = DateTime.UtcNow;
                if (model.Categories == null)
                {
                    entity.Categories = new List <ProviderCategory>();
                }
                else
                {
                    var dbCategories = (await _repositoryCategory
                                        .GetIn(x => x.Id, model.Categories))
                                       .Where(x => x.State == MREntityState.Active);

                    entity.Categories = _mapper.Map <List <ProviderCategory> >(dbCategories);
                }
                // set images
                if (entity.Avatar != null && !string.IsNullOrWhiteSpace(entity.Avatar.Key))
                {
                    imagesToDelete.Add(entity.Avatar.Key);
                    entity.Avatar = await CopyToRBucket(entity.Avatar.Key);
                }

                if (entity.Background != null && !string.IsNullOrWhiteSpace(entity.Background.Key))
                {
                    imagesToDelete.Add(entity.Background.Key);
                    entity.Background = await CopyToRBucket(entity.Background.Key);
                }

                entity.Users = new List <ProviderUser>
                {
                    new ProviderUser
                    {
                        CreatedBy  = _userId,
                        CreateTime = DateTime.UtcNow,
                        Roles      = new List <ProviderUserRole>
                        {
                            ProviderUserRole.OWNER
                        },
                        UserEmail = _userEmail,
                        UserId    = _userId
                    }
                };

                try
                {
                    entity = await _repositoryProvider.Insert(entity);
                }
                catch (Exception ex)
                {
                    var e = ex;
                }
            }
            else
            {
                entity = await _repositoryProvider.GetFirst(x => x.Id == model.Id && x.State == MREntityState.Active);

                if (entity == null)
                {
                    throw _eNotFound <ProviderUpdateModel>("Provider not found");
                }

                var oldAvatar     = entity.Avatar;
                var oldBackground = entity.Background;

                _mapper.Map(model, entity);

                if (model.Categories == null)
                {
                    entity.Categories = new List <ProviderCategory>();
                }
                else
                {
                    var dbCategories = (await _repositoryCategory
                                        .GetIn(x => x.Id, model.Categories))
                                       .Where(x => x.State == MREntityState.Active);

                    entity.Categories = _mapper.Map <List <ProviderCategory> >(dbCategories);
                }

                imagesToDelete.Add(await UpdateEntityImage(oldAvatar, entity.Avatar));
                imagesToDelete.Add(await UpdateEntityImage(oldBackground, entity.Background));

                imagesToDelete    = imagesToDelete.Where(x => x != null).ToList();
                entity.UpdateTime = DateTime.UtcNow;
            }

            ProviderUpdateModel result = null;

            try
            {
                result = _mapper.Map <ProviderUpdateModel>(entity);
            }
            catch (Exception ex)
            {
                var e = ex;
            }

            if (imagesToDelete != null && imagesToDelete.Any())
            {
                foreach (var imageToDelete in imagesToDelete)
                {
                    try
                    {
                        await _connectorBucketImageD.Delete(imageToDelete);
                    }
                    catch (Exception ex)
                    {
                        try
                        {
                            await _connectorBucketImageR.Delete(imageToDelete);
                        }
                        catch (Exception eex) { }
                    }
                }
            }

            return(result);
        }