124 lines
3.6 KiB
Go
124 lines
3.6 KiB
Go
package repository
|
|
|
|
import (
|
|
"time"
|
|
|
|
"homework-manager/internal/database"
|
|
"homework-manager/internal/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type RecurringAssignmentRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewRecurringAssignmentRepository() *RecurringAssignmentRepository {
|
|
return &RecurringAssignmentRepository{db: database.GetDB()}
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) Create(recurring *models.RecurringAssignment) error {
|
|
return r.db.Create(recurring).Error
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) FindByID(id uint) (*models.RecurringAssignment, error) {
|
|
var recurring models.RecurringAssignment
|
|
err := r.db.First(&recurring, id).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &recurring, nil
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) FindByUserID(userID uint) ([]models.RecurringAssignment, error) {
|
|
var recurrings []models.RecurringAssignment
|
|
err := r.db.Where("user_id = ?", userID).Order("created_at DESC").Find(&recurrings).Error
|
|
return recurrings, err
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) FindActiveByUserID(userID uint) ([]models.RecurringAssignment, error) {
|
|
var recurrings []models.RecurringAssignment
|
|
err := r.db.Where("user_id = ? AND is_active = ?", userID, true).Order("created_at DESC").Find(&recurrings).Error
|
|
return recurrings, err
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) Update(recurring *models.RecurringAssignment) error {
|
|
return r.db.Save(recurring).Error
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) Delete(id uint) error {
|
|
return r.db.Delete(&models.RecurringAssignment{}, id).Error
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) FindDueForGeneration() ([]models.RecurringAssignment, error) {
|
|
var recurrings []models.RecurringAssignment
|
|
|
|
err := r.db.Where("is_active = ? AND recurrence_type != ?", true, models.RecurrenceNone).
|
|
Find(&recurrings).Error
|
|
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var result []models.RecurringAssignment
|
|
now := time.Now()
|
|
for _, rec := range recurrings {
|
|
shouldGenerate := true
|
|
|
|
switch rec.EndType {
|
|
case models.EndTypeCount:
|
|
if rec.EndCount != nil && rec.GeneratedCount >= *rec.EndCount {
|
|
shouldGenerate = false
|
|
}
|
|
case models.EndTypeDate:
|
|
if rec.EndDate != nil && now.After(*rec.EndDate) {
|
|
shouldGenerate = false
|
|
}
|
|
}
|
|
|
|
if shouldGenerate {
|
|
result = append(result, rec)
|
|
}
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) GetLatestAssignmentByRecurringID(recurringID uint) (*models.Assignment, error) {
|
|
var assignment models.Assignment
|
|
err := r.db.Where("recurring_assignment_id = ?", recurringID).
|
|
Order("due_date DESC").
|
|
First(&assignment).Error
|
|
if err != nil {
|
|
if err == gorm.ErrRecordNotFound {
|
|
return nil, nil
|
|
}
|
|
return nil, err
|
|
}
|
|
return &assignment, nil
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) GetAssignmentsByRecurringID(recurringID uint) ([]models.Assignment, error) {
|
|
var assignments []models.Assignment
|
|
err := r.db.Where("recurring_assignment_id = ?", recurringID).
|
|
Order("due_date ASC").
|
|
Find(&assignments).Error
|
|
return assignments, err
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) GetFutureAssignmentsByRecurringID(recurringID uint, fromDate time.Time) ([]models.Assignment, error) {
|
|
var assignments []models.Assignment
|
|
err := r.db.Where("recurring_assignment_id = ? AND due_date >= ?", recurringID, fromDate).
|
|
Order("due_date ASC").
|
|
Find(&assignments).Error
|
|
return assignments, err
|
|
}
|
|
|
|
func (r *RecurringAssignmentRepository) CountPendingByRecurringID(recurringID uint) (int64, error) {
|
|
var count int64
|
|
err := r.db.Model(&models.Assignment{}).
|
|
Where("recurring_assignment_id = ? AND is_completed = ?", recurringID, false).
|
|
Count(&count).Error
|
|
return count, err
|
|
}
|