using DotNext; using LinqToDB; using LinqToDB.Data; namespace Database; public class ExamManager { private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger(); private readonly AppDataConnection _db; public ExamManager(AppDataConnection db) { this._db = db; } /// /// 创建新实验 /// /// 实验ID /// 实验名称 /// 实验描述 /// 实验标签 /// 实验难度 /// 普通用户是否可见 /// 创建的实验 public Result CreateExam(string id, string name, string description, string[]? tags = null, int difficulty = 1, bool isVisibleToUsers = true) { try { // 检查实验ID是否已存在 var existingExam = _db.ExamTable.Where(e => e.ID == id).FirstOrDefault(); if (existingExam != null) { logger.Error($"实验ID已存在: {id}"); return new(new Exception($"实验ID已存在: {id}")); } var exam = new Exam { ID = id, Name = name, Description = description, Difficulty = Math.Max(1, Math.Min(5, difficulty)), IsVisibleToUsers = isVisibleToUsers, CreatedTime = DateTime.Now, UpdatedTime = DateTime.Now }; if (tags != null) { exam.SetTagsList(tags); } _db.Insert(exam); logger.Info($"新实验已创建: {id} ({name})"); return new(exam); } catch (Exception ex) { logger.Error($"创建实验时出错: {ex.Message}"); return new(ex); } } /// /// 更新实验信息 /// /// 实验ID /// 实验名称 /// 实验描述 /// 实验标签 /// 实验难度 /// 普通用户是否可见 /// 更新的记录数 public Result UpdateExam(string id, string? name = null, string? description = null, string[]? tags = null, int? difficulty = null, bool? isVisibleToUsers = null) { try { int result = 0; if (name != null) { result += _db.ExamTable.Where(e => e.ID == id).Set(e => e.Name, name).Update(); } if (description != null) { result += _db.ExamTable.Where(e => e.ID == id).Set(e => e.Description, description).Update(); } if (tags != null) { var tagsString = string.Join(",", tags.Where(tag => !string.IsNullOrWhiteSpace(tag)).Select(tag => tag.Trim())); result += _db.ExamTable.Where(e => e.ID == id).Set(e => e.Tags, tagsString).Update(); } if (difficulty.HasValue) { result += _db.ExamTable.Where(e => e.ID == id).Set(e => e.Difficulty, Math.Max(1, Math.Min(5, difficulty.Value))).Update(); } if (isVisibleToUsers.HasValue) { result += _db.ExamTable.Where(e => e.ID == id).Set(e => e.IsVisibleToUsers, isVisibleToUsers.Value).Update(); } // 更新时间 _db.ExamTable.Where(e => e.ID == id).Set(e => e.UpdatedTime, DateTime.Now).Update(); logger.Info($"实验已更新: {id},更新记录数: {result}"); return new(result); } catch (Exception ex) { logger.Error($"更新实验时出错: {ex.Message}"); return new(ex); } } /// /// 获取所有实验信息 /// /// 所有实验的数组 public Exam[] GetAllExams() { var exams = _db.ExamTable.OrderBy(e => e.ID).ToArray(); logger.Debug($"获取所有实验,共 {exams.Length} 个"); return exams; } /// /// 根据实验ID获取实验信息 /// /// 实验ID /// 包含实验信息的结果,如果未找到则返回空 public Result> GetExamByID(string examId) { var exams = _db.ExamTable.Where(exam => exam.ID == examId).ToArray(); if (exams.Length > 1) { logger.Error($"数据库中存在多个相同ID的实验: {examId}"); return new(new Exception($"数据库中存在多个相同ID的实验: {examId}")); } if (exams.Length == 0) { logger.Info($"未找到ID对应的实验: {examId}"); return new(Optional.None); } logger.Debug($"成功获取实验信息: {examId}"); return new(exams[0]); } }