offline_email_job_repository.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. package repository
  2. import (
  3. "time"
  4. "github.com/2930134478/AI-CS/backend/models"
  5. "gorm.io/gorm"
  6. )
  7. // OfflineEmailJobRepository 离线邮件任务仓储
  8. type OfflineEmailJobRepository struct {
  9. db *gorm.DB
  10. }
  11. func NewOfflineEmailJobRepository(db *gorm.DB) *OfflineEmailJobRepository {
  12. return &OfflineEmailJobRepository{db: db}
  13. }
  14. func (r *OfflineEmailJobRepository) Create(job *models.OfflineEmailJob) error {
  15. return r.db.Create(job).Error
  16. }
  17. func (r *OfflineEmailJobRepository) Save(job *models.OfflineEmailJob) error {
  18. return r.db.Save(job).Error
  19. }
  20. func (r *OfflineEmailJobRepository) GetPendingByConversationID(conversationID uint) (*models.OfflineEmailJob, error) {
  21. var job models.OfflineEmailJob
  22. err := r.db.Where("conversation_id = ? AND status = ?", conversationID, "pending").
  23. Order("id DESC").
  24. First(&job).Error
  25. if err == gorm.ErrRecordNotFound {
  26. return nil, nil
  27. }
  28. if err != nil {
  29. return nil, err
  30. }
  31. return &job, nil
  32. }
  33. func (r *OfflineEmailJobRepository) ListDuePending(before time.Time, limit int) ([]models.OfflineEmailJob, error) {
  34. var jobs []models.OfflineEmailJob
  35. q := r.db.Where("status = ? AND scheduled_at <= ?", "pending", before).
  36. Order("scheduled_at ASC")
  37. if limit > 0 {
  38. q = q.Limit(limit)
  39. }
  40. if err := q.Find(&jobs).Error; err != nil {
  41. return nil, err
  42. }
  43. return jobs, nil
  44. }