using Application.Abstractions.Interfaces;
using Entities.Models;
using Microsoft.EntityFrameworkCore;
namespace Infrastructure.Repository;
///
/// Repository implementation for AdminKey entity
///
public class AdminKeyRepository : GenericRepository, IAdminKeyRepository
{
public AdminKeyRepository(MyDbContext context) : base(context)
{
}
public async Task GetByIdAsync(int id)
{
return await _context.AdminKeys
.Include(ak => ak.CreatedByAdmin)
.Include(ak => ak.UsedByUser)
.FirstOrDefaultAsync(ak => ak.Id == id);
}
public async Task GetByKeyCodeAsync(string keyCode)
{
return await _context.AdminKeys
.Include(ak => ak.CreatedByAdmin)
.Include(ak => ak.UsedByUser)
.FirstOrDefaultAsync(ak => ak.KeyCode == keyCode);
}
public async Task> GetAllAsync()
{
return await _context.AdminKeys
.Include(ak => ak.CreatedByAdmin)
.Include(ak => ak.UsedByUser)
.OrderByDescending(ak => ak.CreatedAt)
.ToListAsync();
}
public async Task> GetUnusedKeysAsync()
{
return await _context.AdminKeys
.Include(ak => ak.CreatedByAdmin)
.Where(ak => !ak.IsUsed)
.OrderByDescending(ak => ak.CreatedAt)
.ToListAsync();
}
public async Task> GetKeysByAdminAsync(int adminId)
{
return await _context.AdminKeys
.Include(ak => ak.UsedByUser)
.Where(ak => ak.CreatedByAdminId == adminId)
.OrderByDescending(ak => ak.CreatedAt)
.ToListAsync();
}
public async Task IsKeyValidAsync(string keyCode)
{
var key = await _context.AdminKeys
.FirstOrDefaultAsync(ak => ak.KeyCode == keyCode);
if (key == null || key.IsUsed)
return false;
// Check if key is expired
if (key.ExpiresAt.HasValue && key.ExpiresAt.Value < DateTime.UtcNow)
return false;
return true;
}
public async Task AddAsync(AdminKey adminKey)
{
await _context.AdminKeys.AddAsync(adminKey);
}
public async Task UpdateAsync(AdminKey adminKey)
{
_context.AdminKeys.Update(adminKey);
}
public async Task DeleteAsync(int id)
{
var key = await _context.AdminKeys.FindAsync(id);
if (key != null)
{
_context.AdminKeys.Remove(key);
await _context.SaveChangesAsync();
}
}
public async Task SaveChangesAsync()
{
await _context.SaveChangesAsync();
}
}