using Microsoft.EntityFrameworkCore; using DramaLing.Api.Data; using DramaLing.Api.Models.Entities; using DramaLing.Api.Contracts.Repositories; namespace DramaLing.Api.Repositories; /// /// User Repository 實作 /// public class UserRepository : BaseRepository, IUserRepository { public UserRepository(DramaLingDbContext context, ILogger logger) : base(context, logger) { } #region 用戶查詢 public async Task GetByEmailAsync(string email) { try { return await _dbSet .AsNoTracking() .FirstOrDefaultAsync(u => u.Email == email); } catch (Exception ex) { _logger.LogError(ex, "Error getting user by email: {Email}", email); throw; } } public async Task GetByUsernameAsync(string username) { try { return await _dbSet .AsNoTracking() .FirstOrDefaultAsync(u => u.Username == username); } catch (Exception ex) { _logger.LogError(ex, "Error getting user by username: {Username}", username); throw; } } public async Task ExistsByEmailAsync(string email) { try { return await _dbSet.AnyAsync(u => u.Email == email); } catch (Exception ex) { _logger.LogError(ex, "Error checking user existence by email: {Email}", email); throw; } } public async Task ExistsByUsernameAsync(string username) { try { return await _dbSet.AnyAsync(u => u.Username == username); } catch (Exception ex) { _logger.LogError(ex, "Error checking user existence by username: {Username}", username); throw; } } #endregion #region 用戶設定相關 public async Task GetUserWithSettingsAsync(Guid userId) { try { return await _dbSet .AsNoTracking() .Include(u => u.Settings) .FirstOrDefaultAsync(u => u.Id == userId); } catch (Exception ex) { _logger.LogError(ex, "Error getting user with settings: {UserId}", userId); throw; } } public async Task GetUserWithStatsAsync(Guid userId) { try { return await _dbSet .AsNoTracking() .Include(u => u.DailyStats!) .FirstOrDefaultAsync(u => u.Id == userId); } catch (Exception ex) { _logger.LogError(ex, "Error getting user with stats: {UserId}", userId); throw; } } #endregion #region 學習進度統計 public Task> GetUserLearningStatsAsync(Guid userId) { try { var stats = new Dictionary { ["TotalFlashcards"] = 0, ["MasteredFlashcards"] = 0, ["MasteryRate"] = 0.0, ["StudyDaysThisMonth"] = 0, ["TotalStudyTimeSeconds"] = 0 }; return Task.FromResult(stats); } catch (Exception ex) { _logger.LogError(ex, "Error getting user learning stats: {UserId}", userId); throw; } } public Task GetTotalStudyTimeAsync(Guid userId) { try { return Task.FromResult(0); } catch (Exception ex) { _logger.LogError(ex, "Error getting total study time: {UserId}", userId); throw; } } public Task GetLastActivityDateAsync(Guid userId) { try { return Task.FromResult(DateTime.UtcNow); } catch (Exception ex) { _logger.LogError(ex, "Error getting last activity date: {UserId}", userId); throw; } } #endregion #region 用戶活躍度 public async Task> GetActiveUsersAsync(int days) { try { return await _dbSet .AsNoTracking() .Take(10) // 簡化實作 .ToListAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error getting active users for {Days} days", days); throw; } } public async Task> GetNewUsersAsync(DateTime since) { try { return await _dbSet .AsNoTracking() .Where(u => u.CreatedAt >= since) .OrderByDescending(u => u.CreatedAt) .ToListAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error getting new users since: {Since}", since); throw; } } #endregion }