using AutoMapper; using MagicCarpetContracts.DataModels; using MagicCarpetContracts.Exceptions; using MagicCarpetContracts.Mapper; using MagicCarpetContracts.Resources; using MagicCarpetContracts.StoragesContracts; using MagicCarpetDatabase.Models; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Localization; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace MagicCarpetDatabase.Implementations; internal class SalaryStorageContract(MagicCarpetDbContext dbContext, IStringLocalizer localizer) : ISalaryStorageContract { private readonly MagicCarpetDbContext _dbContext = dbContext; private readonly IStringLocalizer _localizer = localizer; public List GetList(DateTime? startDate, DateTime? endDate, string? employeeId = null) { try { var query = _dbContext.Salaries.Include(d => d.Employee).AsQueryable(); if (startDate.HasValue) query = query.Where(x => x.SalaryDate >= DateTime.SpecifyKind(startDate ?? DateTime.UtcNow, DateTimeKind.Utc)); if (endDate.HasValue) query = query.Where(x => x.SalaryDate <= DateTime.SpecifyKind(endDate ?? DateTime.UtcNow, DateTimeKind.Utc)); if (employeeId != null) query = query.Where(x => x.EmployeeId == employeeId); return [.. query.Select(x => CustomMapper.MapObject(x))]; } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex, _localizer); } } public async Task> GetListAsync(DateTime startDate, DateTime endDate, CancellationToken ct) { try { return [.. await _dbContext.Salaries.Include(x => x.Employee).Where(x => x.SalaryDate >= DateTime.SpecifyKind(startDate, DateTimeKind.Utc) && x.SalaryDate <= DateTime.SpecifyKind(endDate, DateTimeKind.Utc)) .Select(x => CustomMapper.MapObject < SalaryDataModel >(x)).ToListAsync(ct)]; } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex, _localizer); } } public void AddElement(SalaryDataModel salaryDataModel) { try { var salary = MapToEntity(salaryDataModel); _dbContext.Salaries.Add(salary); _dbContext.SaveChanges(); } catch (Exception ex) { _dbContext.ChangeTracker.Clear(); throw new StorageException(ex, _localizer); } } private Salary MapToEntity(SalaryDataModel dataModel) { var salary = CustomMapper.MapObject(dataModel); salary.EmployeeSalary = dataModel.Salary; return salary; } }