using Microsoft.Extensions.Logging; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Text.Json; using System.Text.RegularExpressions; using System.Threading.Tasks; using TheButcherShopContracts.BusinessLogicContracts; using TheButcherShopContracts.DataModels; using TheButcherShopContracts.Exceptions; using TheButcherShopContracts.Extensions; using TheButcherShopContracts.StoragesContracts; namespace ButcherShopBusinessLogic.Implementations; internal class WorkerBusinessLogicContract(IWorkerStorageContract workerStorageContract, ILogger logger) : IWorkerBusinessLogicContract { private readonly ILogger _logger = logger; private readonly IWorkerStorageContract _workerStorageContract = workerStorageContract; //5 из 5 пройдено public List GetAllWorkers(bool onlyActive = true) { _logger.LogInformation("GetAllWorkers params: {onlyActive}", onlyActive); return _workerStorageContract.GetList(onlyActive) ?? throw new NullListException(); } //6 из 6 пройдено public List GetAllWorkersByPost(string postId, bool onlyActive = true) { _logger.LogInformation("GetAllWorkers params: {postId}, {onlyActive},", postId, onlyActive); if (postId.IsEmpty()) { throw new ArgumentNullException(nameof(postId)); } if (!postId.IsGuid()) { throw new ValidationException("The value in the field postId is not a unique identifier."); } if (Regex.IsMatch(postId, @"^\+7[\s-]?\d{3}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$")) { return new List { _workerStorageContract.GetElementByPhoneNumber(postId) ?? throw new ElementNotFoundException(postId) }; } return _workerStorageContract.GetList(onlyActive, postId) ?? throw new NullListException(); } //5 из 5 пройдено public List GetAllWorkersByBirthDate(DateTime fromDate, DateTime toDate, bool onlyActive = true) { _logger.LogInformation("GetAllWorkers params: {onlyActive}, {fromDate}, {toDate}", onlyActive, fromDate, toDate); if (fromDate.IsDateNotOlder(toDate)) { throw new IncorrectDatesException(fromDate, toDate); } return _workerStorageContract.GetList(onlyActive, fromBirthDate: fromDate, toBirthDate: toDate) ?? throw new NullListException(); } //5 из 5 пройдено public List GetAllWorkersByEmploymentDate(DateTime fromDate, DateTime toDate, bool onlyActive = true) { _logger.LogInformation("GetAllWorkers params: {onlyActive}, {fromDate}, {toDate}", onlyActive, fromDate, toDate); if (fromDate.IsDateNotOlder(toDate)) { throw new IncorrectDatesException(fromDate, toDate); } return _workerStorageContract.GetList(onlyActive, fromEmploymentDate: fromDate, toEmploymentDate: toDate) ?? throw new NullListException(); } //5 из 8 пройдено public WorkerDataModel GetWorkerByData(string data) { _logger.LogInformation("Get element by data: {data}", data); if (data.IsEmpty()) { throw new ArgumentNullException(nameof(data)); } if (data.IsGuid()) { return _workerStorageContract.GetElementById(data) ?? throw new ElementNotFoundException(data); } if (Regex.IsMatch(data, @"^\+7[\s-]?\d{3}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$")) { return _workerStorageContract.GetElementByPhoneNumber(data) ?? throw new ElementNotFoundException(data); } return _workerStorageContract.GetElementByFIO(data) ?? throw new ElementNotFoundException(data); } //5 из 5 пройдено public void InsertWorker(WorkerDataModel workerDataModel) { _logger.LogInformation("New data: {json}", JsonSerializer.Serialize(workerDataModel)); ArgumentNullException.ThrowIfNull(workerDataModel); workerDataModel.Validate(); _workerStorageContract.AddElement(workerDataModel); } //5 из 5 пройдено public void UpdateWorker(WorkerDataModel workerDataModel) { _logger.LogInformation("Update data: {json}", JsonSerializer.Serialize(workerDataModel)); ArgumentNullException.ThrowIfNull(workerDataModel); workerDataModel.Validate(); _workerStorageContract.UpdElement(workerDataModel); } //5 из 5 пройдено public void DeleteWorker(string id) { _logger.LogInformation("Delete by id: {id}", id); if (id.IsEmpty()) { throw new ArgumentNullException(nameof(id)); } if (!id.IsGuid()) { throw new ValidationException("Id is not a unique identifier"); } _workerStorageContract.DelElement(id); } }