using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using PARR.DAL.Context; using PARR.DAL.DomainModels; using PARR.DAL.Models.Base; using PARR.DAL.Services.Interfaces.Base; namespace PARR.DAL.Services.Abstracts { internal abstract class BaseService : IBaseService where T : class, IBase { private readonly ILogger> logger; protected abstract DbSet EntitySet { get; } protected abstract DataContext EntitiContext { get; } public BaseService(ILogger> logger) { this.logger = logger; } public virtual async Task AddRangeAsync(List objs) { objs.ForEach(item => item.DateCreated = DateTimeOffset.UtcNow); try { await EntitySet.AddRangeAsync(objs); return true; } catch (Exception ex) { logger.LogError(ex, "Ошибка при добавлении диапазона в БД."); return false; } } public async Task CommitAsync() { try { await EntitiContext.SaveChangesAsync(); return true; } catch (Exception ex) { logger.LogError(ex, "Ошибка при Commit"); return false; } } public virtual async Task CreateAsync(T obj) { obj.DateCreated = DateTimeOffset.UtcNow; try { await EntitySet.AddAsync(obj); return true; } catch (Exception ex) { logger.LogError(ex, "Ошибка при добавлении в БД."); return false; } } public virtual bool Delete(T obj) { try { EntitySet.Remove(obj); return true; } catch (Exception ex) { logger.LogError(ex, "Ошибка при удалении из БД."); return false; } } public virtual async Task DeleteAsync(Guid id) { try { var exist = await GetAsync(id); if (exist == null) { logger.LogError($"Ошибка при удалении из БД. Не найдена запись в БД с id: {id}"); return false; } EntitySet.Remove(exist); return true; } catch (Exception ex) { logger.LogError(ex, "Ошибка при удалении из БД."); return false; } } public virtual IQueryable Get() { return EntitySet; } public virtual async Task GetAsync(Guid id) { return await EntitySet.FirstOrDefaultAsync(t => t.Id == id); } public virtual IQueryable GetPage(IQueryable query, PaginationFilter paginationFilter) { int skip = (paginationFilter.PageNumber - 1) * paginationFilter.PageSize; return query.Skip(skip).Take(paginationFilter.PageSize); } } }