using Core.Blueprint.DAL.SQLServer; using Core.Blueprint.DAL.SQLServer.Context; using Core.Blueprint.DAL.SQLServer.Contracts; using Core.Blueprint.DAL.SQLServer.Entities; using Core.Blueprint.DAL.SQLServer.Entities.Request; using Core.Blueprint.Redis; using Core.Blueprint.Redis.Helpers; using Mapster; using Microsoft.Extensions.Options; public class UserProjectService : IUserProjectService { private readonly IEntityRepository _userProjectRepository; private readonly CacheSettings cacheSettings; private readonly IRedisCacheProvider cacheProvider; public UserProjectService(IEntityRepository userProjectRepository, IRedisCacheProvider cacheProvider, IOptions cacheSettings) { _userProjectRepository = userProjectRepository; this.cacheSettings = cacheSettings.Value; this.cacheProvider = cacheProvider; } public async Task> GetAllUserProjects() { var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetAllUserProjects"); var cachedData = await cacheProvider.GetAsync>(cacheKey) ?? []; if (cachedData.Any()) return cachedData; var userProjects = await _userProjectRepository.GetAllAsync(); await cacheProvider.SetAsync(cacheKey, userProjects); return userProjects; } public async Task GetUserProjectById(int id) { var cacheKey = CacheKeyHelper.GenerateCacheKey(this, "GetUserProjectById", id); var cachedData = await cacheProvider.GetAsync(cacheKey); if (cachedData is not null) { return cachedData; } var userProject = await _userProjectRepository.GetByIdAsync(id); await cacheProvider.SetAsync(cacheKey, userProject); return userProject; } public async Task AddUserProject(UserProjectRequest newUserProject) { var userProject = newUserProject.Adapt(); await _userProjectRepository.AddAsync(userProject); await _userProjectRepository.SaveAsync(); return userProject; } public async Task UpdateUserProject(UserProject userProject) { var existingEntity = await _userProjectRepository.GetByIdAsync(userProject.Id); if (existingEntity is null) return existingEntity; _userProjectRepository.Update(userProject); await _userProjectRepository.SaveAsync(); return userProject; } public async Task DeleteUserProject(int id) { var userProject = await _userProjectRepository.GetByIdAsync(id); if (userProject == null) return null; _userProjectRepository.Delete(userProject); await _userProjectRepository.SaveAsync(); return userProject; } }