2024-07-01 11:32:19 +10:00
|
|
|
|
using Microsoft.EntityFrameworkCore;
|
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
2026-04-14 16:27:27 +10:00
|
|
|
|
using PARR.Core.Common.Interfaces;
|
2026-04-30 10:35:31 +10:00
|
|
|
|
using PARR.Core.Repositories.Interfaces;
|
2024-07-01 11:32:19 +10:00
|
|
|
|
using PARR.DAL.Context;
|
2026-04-14 09:56:31 +10:00
|
|
|
|
using PARR.DAL.Repositories.Base;
|
2026-04-30 10:35:31 +10:00
|
|
|
|
using PARR.Domain.Entities;
|
2026-05-04 11:55:07 +10:00
|
|
|
|
using PARR.Domain.Settings;
|
2024-07-01 11:32:19 +10:00
|
|
|
|
|
2026-04-30 10:35:31 +10:00
|
|
|
|
namespace PARR.DAL.Repositories
|
2024-07-01 11:32:19 +10:00
|
|
|
|
{
|
2026-04-30 10:35:31 +10:00
|
|
|
|
internal class WeekendDayRepository : BaseRepository<WeekendDay>, IWeekendDayRepository
|
2024-07-01 11:32:19 +10:00
|
|
|
|
{
|
2024-09-16 17:01:04 +10:00
|
|
|
|
private readonly IRedisCacheService redisCacheService;
|
2024-09-17 11:55:55 +10:00
|
|
|
|
private readonly SettingsFromDb settings;
|
2024-07-01 11:32:19 +10:00
|
|
|
|
|
2026-04-30 10:35:31 +10:00
|
|
|
|
public WeekendDayRepository(
|
2024-09-16 17:01:04 +10:00
|
|
|
|
DataContext dataContext,
|
2026-04-30 10:35:31 +10:00
|
|
|
|
ILogger<WeekendDayRepository> logger,
|
2024-09-16 17:01:04 +10:00
|
|
|
|
IRedisCacheService redisCacheService,
|
2024-09-17 11:55:55 +10:00
|
|
|
|
SettingsFromDb settings
|
2026-04-14 09:56:31 +10:00
|
|
|
|
) : base(logger, dataContext)
|
2024-07-01 11:32:19 +10:00
|
|
|
|
{
|
2024-09-16 17:01:04 +10:00
|
|
|
|
this.redisCacheService = redisCacheService;
|
2024-09-17 11:55:55 +10:00
|
|
|
|
this.settings = settings;
|
2024-07-01 11:32:19 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public IQueryable<DateOnly> GetWeekends(DateOnly start, DateOnly end)
|
|
|
|
|
|
{
|
2025-12-22 17:03:41 +10:00
|
|
|
|
return EntitySet.Where(t => t.Date >= start && t.Date <= end).AsNoTracking().Select(t => t.Date);
|
2024-07-01 11:32:19 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-09-16 17:01:04 +10:00
|
|
|
|
|
|
|
|
|
|
public async Task<bool> IsWorkDayAsync(DateOnly date, bool useCache = false)
|
|
|
|
|
|
{
|
|
|
|
|
|
if (useCache)
|
|
|
|
|
|
{
|
|
|
|
|
|
// смотрим, есть ли в кэше рабочий день
|
|
|
|
|
|
var workdayInCache = await redisCacheService.GetCachedDataAsync<DateOnly?>(GetWorkDayKey(date));
|
|
|
|
|
|
if (workdayInCache != null)
|
|
|
|
|
|
return true;
|
|
|
|
|
|
|
|
|
|
|
|
// смотрим, есть ли в кэше выходной день
|
|
|
|
|
|
var weekendInCache = await redisCacheService.GetCachedDataAsync<DateOnly?>(GetWeekendKey(date));
|
|
|
|
|
|
if (weekendInCache != null)
|
|
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var weekendInDb = await EntitySet.FirstOrDefaultAsync(t => t.Date == date);
|
|
|
|
|
|
|
|
|
|
|
|
var isWorkday = weekendInDb == null;
|
|
|
|
|
|
|
|
|
|
|
|
//сохраняем всегда в КЭШ значение выходного и рабочего дня
|
|
|
|
|
|
var cacheKey = isWorkday ? GetWorkDayKey(date) : GetWeekendKey(date);
|
2024-09-17 11:55:55 +10:00
|
|
|
|
await redisCacheService.SetCachedDataAsync(cacheKey, date, settings.WeekendCacheTtl);
|
2024-09-16 17:01:04 +10:00
|
|
|
|
|
|
|
|
|
|
return isWorkday;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-09-17 11:55:55 +10:00
|
|
|
|
public override async Task<bool> CreateAsync(WeekendDay obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
// При создании выходного дня, смотрим, был ли он в кэше, если был, удаляем
|
|
|
|
|
|
await redisCacheService.DeleteCachedDataAsync(GetWeekendKey(obj.Date));
|
|
|
|
|
|
await redisCacheService.DeleteCachedDataAsync(GetWorkDayKey(obj.Date));
|
|
|
|
|
|
|
|
|
|
|
|
return await base.CreateAsync(obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public override bool Delete(WeekendDay obj)
|
|
|
|
|
|
{
|
|
|
|
|
|
// При создании выходного дня, смотрим, был ли он в кэше, если был, удаляем
|
|
|
|
|
|
redisCacheService.DeleteCachedData(GetWeekendKey(obj.Date));
|
|
|
|
|
|
redisCacheService.DeleteCachedData(GetWorkDayKey(obj.Date));
|
|
|
|
|
|
|
|
|
|
|
|
return base.Delete(obj);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public override async Task<bool> DeleteAsync(Guid id)
|
|
|
|
|
|
{
|
|
|
|
|
|
var exist = await GetAsync(id);
|
|
|
|
|
|
if (exist == null)
|
|
|
|
|
|
{
|
2026-07-23 10:48:59 +10:00
|
|
|
|
_logger.LogError($"Ошибка при удалении из БД. Не найдена запись в БД с id: {id}");
|
2024-09-17 11:55:55 +10:00
|
|
|
|
return false;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return Delete(exist);
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
2024-09-16 17:01:04 +10:00
|
|
|
|
private string GetWeekendKey(DateOnly day)
|
|
|
|
|
|
{
|
2026-04-14 09:56:31 +10:00
|
|
|
|
// return $"weekend_{day.ToString("yyyy-MM-dd")}";
|
|
|
|
|
|
return redisCacheService.GetKey(new[] { "weekend", day.ToString("yyyy-MM-dd") });
|
2024-09-16 17:01:04 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private string GetWorkDayKey(DateOnly day)
|
|
|
|
|
|
{
|
2026-04-14 09:56:31 +10:00
|
|
|
|
//return $"workday_{day.ToString("yyyy-MM-dd")}";
|
|
|
|
|
|
return redisCacheService.GetKey(new[] { "workday", day.ToString("yyyy-MM-dd") });
|
2024-09-16 17:01:04 +10:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-07-01 11:32:19 +10:00
|
|
|
|
}
|
|
|
|
|
|
}
|