ProductAPI
237 строк · 11.5 Кб
1namespace ProductAPI.Service.Implementations2{
3public class CategoryService : BaseService<CategoryService, CategoryDTO>, ICategoryService4{5private readonly ICategoryRepository _categoryRep;6private readonly IImageAccessorService _imageAccessorSer;7public CategoryService(ICategoryRepository categoryRep, IImageAccessorService imageAccessorSer, IMapper mapper, ILogger<CategoryService> logger)8: base(mapper, logger, new())9{10_categoryRep = categoryRep;11_imageAccessorSer = imageAccessorSer;12}13
14#region Create15/// <summary>16/// Создание категории.17/// </summary>18/// <param name="createModel"></param>19/// <returns>Базовый ответ.</returns>20public async Task<IBaseResponse<CategoryDTO>> CreateServiceAsync(CreateCategoryDTO createModel)21{22_logger.LogInformation($"Создание категории. / method: CreateServiceAsync");23if (await _categoryRep.GetByAsync(x => x.CategoryName == createModel.CategoryName) != null)24{25_logger.LogWarning("Категория с таким наименованием существует.");26_baseResponse.DisplayMessage = "Категория с таким наименованием существует.";27_baseResponse.Status = Status.ExistsName;28return _baseResponse!;29}30
31var category = _mapper.Map<Category>(createModel);32
33if (createModel.Image != null)34{35var image = await _imageAccessorSer.AddImageAsync(createModel.Image).ConfigureAwait(true);36if (image is null) _logger.LogInformation("Изображение не создано.");37else38{39_logger.LogInformation("Изображение создано.");40category.ImageUrl = image.Url;41category.ImageId = image.PublicId;42};43};44
45var categoryRep = await _categoryRep.CreateAsync(category);46if (categoryRep != null)47{48_logger.LogInformation("Категория создана.");49}50else51{52_logger.LogInformation("Категория не создана.");53_baseResponse.DisplayMessage = "Категория не создана.";54_baseResponse.Status = Status.NotCreate;55}56_baseResponse.Result = _mapper.Map<CategoryDTO>(categoryRep);57_logger.LogInformation($"Ответ отправлен контролеру/method: CreateServiceAsync");58return _baseResponse!;59}60#endregion61
62#region Delete63/// <summary>64/// Удаление категории65/// </summary>66/// <param name="id"></param>67/// <returns>Базовый ответ.</returns>68public async Task<IBaseResponse<bool>> DeleteServiceAsync(int id)69{70_logger.LogInformation($"Удаление категории. / method: DeleteServiceAsync");71var baseResponse = new BaseResponse<bool>();72_logger.LogInformation($"Поиск категории по id: {id}. / method: DeleteServiceAsync");73Category category = await _categoryRep.GetByAsync(x => x.CategoryId == id, true);74if (category is null)75{76_logger.LogWarning($"Категория c id: {id} не найдена.");77baseResponse.DisplayMessage = $"Категория c id: {id} не найдена.";78baseResponse.Result = false;79_logger.LogInformation($"Ответ отправлен контролеру (false)/ method: DeleteServiceAsync");80return baseResponse;81}82
83if (category.ImageId != null) await _imageAccessorSer.DeleteImageAsync(category.ImageId);84
85await _categoryRep.DeleteAsync(category);86baseResponse.DisplayMessage = "Категория удалена.";87baseResponse.Result = true;88_logger.LogInformation($"Ответ отправлен контролеру (true)/ method: DeleteServiceAsync");89return baseResponse;90}91#endregion92
93#region GetById94/// <summary>95/// Вывод категории96/// </summary>97/// <param name="id"></param>98/// <returns>Базовый ответ.</returns>99public async Task<IBaseResponse<CategoryDTO>> GetByIdServiceAsync(int id)100{101_logger.LogInformation($"Поиск категории по id: {id}. / method: GetByIdServiceAsync");102Category category = await _categoryRep.GetByAsync(x => x.CategoryId == id);103if (category is null)104{105_logger.LogWarning($"Категория по id [{id}] не найдена");106_baseResponse.DisplayMessage = $"Категория по id [{id}] не найдена";107_baseResponse.Status = Status.NotFound;108}109else110{111_logger.LogInformation($"Вывод категории по id [{id}]");112}113_baseResponse.Result = _mapper.Map<CategoryDTO>(category);114_logger.LogInformation($"Ответ отправлен контролеру/ method: GetByIdServiceAsync");115return _baseResponse!;116}117#endregion118
119#region Get120/// <summary>121/// Список категорий (возможно приминение фильра и поиска)122/// </summary>123/// <param name="filter"></param>124/// <param name="search"></param>125/// <returns>Базовый ответ.</returns>126public async Task<IBaseResponse<List<CategoryDTO>>> GetServiceAsync(string? filter = null, string? search = null)127{128_logger.LogInformation($"Список категорий. / method: GetServiceAsync");129var bResponse = new BaseResponse<List<CategoryDTO>>();130IEnumerable<Category>? categorys = null;131if (!string.IsNullOrEmpty(filter) && !string.IsNullOrEmpty(search))132{133var result = await FilterAndSearchAsync(categorys, filter, search);134categorys = result.Item1;135_baseResponse.DisplayMessage = result.Item2;136}137if (!string.IsNullOrEmpty(filter) && string.IsNullOrEmpty(search))138{139var result = await FilterAndSearchAsync(categorys, filter);140categorys = result.Item1;141_baseResponse.DisplayMessage = result.Item2;142}143if (string.IsNullOrEmpty(filter) && string.IsNullOrEmpty(search))144{145categorys = await _categoryRep.GetAsync(search: search);146}147if (categorys is null)148{149_logger.LogInformation("Список категорий пуст.");150_baseResponse.DisplayMessage = "Список категорий пуст.";151}152else153{154_logger.LogInformation("Список категорий.");155IEnumerable<CategoryDTO> listCategorys = _mapper.Map<IEnumerable<CategoryDTO>>(categorys);156bResponse.Result = listCategorys.ToList();157}158_logger.LogInformation($"Ответ отправлен контролеру/ method: GetServiceAsync");159return bResponse;160}161#endregion162
163#region Update164/// <summary>165/// Обновление категории.166/// </summary>167/// <param name="updateModel"></param>168/// <returns>Базовый ответ.</returns>169/// <exception cref="NullReferenceException"></exception>170public async Task<IBaseResponse<CategoryDTO>> UpdateServiceAsync(UpdateCategoryDTO updateModel)171{172_logger.LogInformation($"Обновление категории.");173var carent = await _categoryRep.GetByAsync(x => x.CategoryId == updateModel.CategoryId);174if (carent is null)175{176_logger.LogWarning("Попытка обновить объект, которого нет в хранилище.");177_baseResponse.Status = Status.NotFound;178_baseResponse.DisplayMessage = "Попытка обновить объект, которого нет в хранилище.";179}180else181{182var category = _mapper.Map<Category>(updateModel);183if (updateModel.Image != null)184{185var image = await _imageAccessorSer.AddImageAsync(updateModel.Image, updateModel.ImageId).ConfigureAwait(true);186if (image is null) _logger.LogInformation("Изображение не создано.");187else188{189_logger.LogInformation("Изображение создано.");190category.ImageUrl = image.Url;191category.ImageId = image.PublicId;192};193}194var categoryRep = await _categoryRep.UpdateAsync(category, carent); ;195_baseResponse.DisplayMessage = "Категория обновилась.";196_baseResponse.Result = _mapper.Map<CategoryDTO>(categoryRep);197}198_logger.LogInformation($"Ответ отправлен контролеру/ method: UpdateServiceAsync");199return _baseResponse!;200}201#endregion202
203#region Filter204/// <summary>205/// Фильтр и поиск категорий по значению206/// </summary>207/// <param name="categorys"></param>208/// <param name="filter"></param>209/// <returns>Отфильтрованный список и сообщение</returns>210private async Task<(IEnumerable<Category>?, string)> FilterAndSearchAsync(IEnumerable<Category>? categorys, string filter, string? search = null)211{212_logger.LogInformation($"Поиск категории по фильтру: {filter}. / method: FilterAsync");213Uri? uri;214if (Uri.TryCreate(filter, UriKind.Absolute, out uri)215&& (uri.Scheme == Uri.UriSchemeHttp || uri.Scheme == Uri.UriSchemeHttps))216{217categorys = await _categoryRep.GetAsync(x => x.ImageUrl == uri.ToString(), search);218
219if (categorys is null)220message = Message.FilterAndSearch(_logger, true, "категорий", filter, search);221else222message = Message.FilterAndSearch(_logger, false, "категорий", filter, search);223}224else225{226categorys = await _categoryRep.GetAsync(x => x.CategoryName == filter, search);227if (categorys is null)228message = Message.FilterAndSearch(_logger, true, "категорий", filter, search);229else230message = Message.FilterAndSearch(_logger, false, "категорий", filter, search);231}232_logger.LogInformation($"Ответ отправлен GetServiceAsync/ method: FilterAsync");233return (categorys, message);234}235#endregion236}237}
238