log.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. package repository
  2. import (
  3. "context"
  4. "fmt"
  5. "time"
  6. "github.com/go-nunu/nunu-layout-advanced/internal/model"
  7. )
  8. type LogRepository interface {
  9. GetLog(ctx context.Context, id int64) (*model.Log, error)
  10. GetLogsByTimeRange(ctx context.Context, start, end *time.Time) ([]*model.Log, error)
  11. AddLog(ctx context.Context, log *model.Log) error
  12. EditLog(ctx context.Context, log *model.Log) error
  13. }
  14. func NewLogRepository(
  15. repository *Repository,
  16. ) LogRepository {
  17. return &logRepository{
  18. Repository: repository,
  19. }
  20. }
  21. type logRepository struct {
  22. *Repository
  23. }
  24. func (r *logRepository) GetLog(ctx context.Context, id int64) (*model.Log, error) {
  25. var log model.Log
  26. // 获取可能的表名(查询最近3个月)
  27. existingTables := r.Manager.GetTableNamesWithExistenceCheck(r.DBWithName(ctx, "admin"), "log", nil, nil)
  28. // 在各个分表中查找
  29. for _, tableName := range existingTables {
  30. err := r.DBWithName(ctx, "admin").Table(tableName).Where("id = ?", id).First(&log).Error
  31. if err == nil {
  32. log.SetTableName(tableName)
  33. return &log, nil
  34. }
  35. }
  36. return nil, fmt.Errorf("未找到ID为 %d 的日志记录", id)
  37. }
  38. func (r *logRepository) GetLogsByTimeRange(ctx context.Context, start, end *time.Time) ([]*model.Log, error) {
  39. var logs []*model.Log
  40. // 检查存在的表
  41. existingTables := r.Manager.GetTableNamesWithExistenceCheck(r.DBWithName(ctx, "admin"), "log", start, end)
  42. if len(existingTables) == 0 {
  43. return logs, nil // 没有分表,返回空结果
  44. }
  45. // 联合查询所有分表
  46. for _, tableName := range existingTables {
  47. var tableLogs []*model.Log
  48. query := r.DBWithName(ctx, "admin").Table(tableName)
  49. // 添加时间范围过滤
  50. if start != nil {
  51. query = query.Where("created_at >= ?", *start)
  52. }
  53. if end != nil {
  54. query = query.Where("created_at <= ?", *end)
  55. }
  56. err := query.Find(&tableLogs).Error
  57. if err != nil {
  58. return nil, err
  59. }
  60. // 设置表名
  61. for _, log := range tableLogs {
  62. log.SetTableName(tableName)
  63. }
  64. logs = append(logs, tableLogs...)
  65. }
  66. return logs, nil
  67. }
  68. func (r *logRepository) AddLog(ctx context.Context, log *model.Log) error {
  69. // 设置创建时间
  70. if log.CreatedAt.IsZero() {
  71. log.CreatedAt = time.Now()
  72. }
  73. // 获取最优的写入表(自动根据表名获取阈值)
  74. tableName, err := r.Manager.GetOptimalWriteTable(ctx, r.DBWithName(ctx, "admin"), log)
  75. if err != nil {
  76. return fmt.Errorf("获取写入表失败: %v", err)
  77. }
  78. log.SetTableName(tableName)
  79. // 确保表存在
  80. err = r.Manager.EnsureTableExists(ctx, r.DBWithName(ctx, "admin"), tableName, &model.Log{})
  81. if err != nil {
  82. return err
  83. }
  84. // 写入数据
  85. return r.DBWithName(ctx, "admin").Table(tableName).Create(log).Error
  86. }
  87. func (r *logRepository) EditLog(ctx context.Context, log *model.Log) error {
  88. // 如果已经指定了表名,直接更新该表
  89. if log.TableName() != "log" {
  90. return r.DBWithName(ctx, "admin").Table(log.TableName()).Updates(log).Error
  91. }
  92. // 确定表名
  93. tableName := r.Manager.GetWriteTableName(log)
  94. log.SetTableName(tableName)
  95. // 确保表存在
  96. err := r.Manager.EnsureTableExists(ctx, r.DBWithName(ctx, "admin"), tableName, &model.Log{})
  97. if err != nil {
  98. return err
  99. }
  100. return r.DBWithName(ctx, "admin").Table(tableName).Updates(log).Error
  101. }