/
Airat
/
ASP.NET
Обзор
Документация
Войти
/
Airat
/
ASP.NET
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
NoSQL/src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Controllers/CustomersController.cs
137 строк
5 KB
Айрат Измаилов
modified: src/Pcf.GivingToCustomer/Pcf.GivingToCustomer.WebHost/Controllers/CustomersController.cs
29 ноя 2024, 22:00
29 ноя 2024, 22:00
8a81cc1
Код
Авторство
О чём код?
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Mvc; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson; using Pcf.GivingToCustomer.Core.Abstractions.Repositories; using Pcf.GivingToCustomer.Core.Domain; using Pcf.GivingToCustomer.WebHost.Mappers; using Pcf.GivingToCustomer.WebHost.Models; namespace Pcf.GivingToCustomer.WebHost.Controllers { /// <summary> /// Клиенты /// </summary> [ApiController] [Route("api/v1/[controller]")] public class CustomersController : ControllerBase { private readonly IRepository<Customer> _customerRepository; private readonly IRepository<Preference> _preferenceRepository; private readonly IRepository<PromoCode> _promoCodesRepository; public CustomersController(IRepository<Customer> customerRepository, IRepository<Preference> preferenceRepository, IRepository<PromoCode> promoCodesRepository) { _customerRepository = customerRepository; _preferenceRepository = preferenceRepository; _promoCodesRepository = promoCodesRepository; } /// <summary> /// Получить список клиентов /// </summary> /// <returns></returns> [HttpGet] public async Task<ActionResult<List<CustomerShortResponse>>> GetCustomersAsync() { var customers = await _customerRepository.GetAllAsync(); var response = customers.Select(x => new CustomerShortResponse() { Id = x.Id, Email = x.Email, FirstName = x.FirstName, LastName = x.LastName }).ToList(); return Ok(response); } /// <summary> /// Получить клиента по id /// </summary> /// <param name="id">Id клиента, например <example>a6c8c6b1-4349-45b0-ab31-244740aaf0f0</example></param> /// <returns></returns> [HttpGet("{id:guid}")] public async Task<ActionResult<CustomerResponse>> GetCustomerAsync(Guid id) { var customer = await _customerRepository.GetByIdAsync(id); if (customer == null) return Ok(new CustomerResponse()); if (customer.Preferences != null) foreach (var item in customer.Preferences) item.Preference = await _preferenceRepository.GetByIdAsync(item.PreferenceId); if(customer.PromoCodes != null) foreach (var item in customer.PromoCodes) item.PromoCode = await _promoCodesRepository.GetByIdAsync(item.PromoCodeId); var response = new CustomerResponse(customer); return Ok(response); } /// <summary> /// Создать нового клиента /// </summary> /// <returns></returns> [HttpPost] public async Task<ActionResult<CustomerResponse>> CreateCustomerAsync(CreateOrEditCustomerRequest request) { //Получаем предпочтения из бд и сохраняем большой объект var preferences = await _preferenceRepository .GetRangeByIdsAsync(request.PreferenceIds); Customer customer = CustomerMapper.MapFromModel(request, preferences); await _customerRepository.AddAsync(customer); return CreatedAtAction(nameof(GetCustomerAsync), new {id = customer.Id}, customer.Id); } /// <summary> /// Обновить клиента /// </summary> /// <param name="id">Id клиента, например <example>a6c8c6b1-4349-45b0-ab31-244740aaf0f0</example></param> /// <param name="request">Данные запроса></param> [HttpPut("{id:guid}")] public async Task<IActionResult> EditCustomersAsync(Guid id, CreateOrEditCustomerRequest request) { var customer = await _customerRepository.GetByIdAsync(id); if (customer == null) return NotFound(); var preferences = await _preferenceRepository.GetRangeByIdsAsync(request.PreferenceIds); CustomerMapper.MapFromModel(request, preferences, customer); await _customerRepository.UpdateAsync(customer); return NoContent(); } /// <summary> /// Удалить клиента /// </summary> /// <param name="id">Id клиента, например <example>a6c8c6b1-4349-45b0-ab31-244740aaf0f0</example></param> [HttpDelete("{id:guid}")] public async Task<IActionResult> DeleteCustomerAsync(Guid id) { var customer = await _customerRepository.GetByIdAsync(id); if (customer == null) return NotFound(); await _customerRepository.DeleteAsync(customer); return NoContent(); } } }