92 lines
2.4 KiB
Go
92 lines
2.4 KiB
Go
// internal/repositories/archive_repo.go
|
|
package repositories
|
|
|
|
import (
|
|
"errors"
|
|
"lost-and-found/internal/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type ArchiveRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewArchiveRepository(db *gorm.DB) *ArchiveRepository {
|
|
return &ArchiveRepository{db: db}
|
|
}
|
|
|
|
// Create creates a new archive record
|
|
func (r *ArchiveRepository) Create(archive *models.Archive) error {
|
|
return r.db.Create(archive).Error
|
|
}
|
|
|
|
// FindByID finds archive by ID
|
|
func (r *ArchiveRepository) FindByID(id uint) (*models.Archive, error) {
|
|
var archive models.Archive
|
|
err := r.db.Preload("Category").Preload("Claimer").Preload("Claimer.Role").First(&archive, id).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("archive not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &archive, nil
|
|
}
|
|
|
|
// FindAll returns all archived items with filters
|
|
func (r *ArchiveRepository) FindAll(page, limit int, reason, search string) ([]models.Archive, int64, error) {
|
|
var archives []models.Archive
|
|
var total int64
|
|
|
|
query := r.db.Model(&models.Archive{})
|
|
|
|
// Apply filters
|
|
if reason != "" {
|
|
query = query.Where("archived_reason = ?", reason)
|
|
}
|
|
if search != "" {
|
|
query = query.Where("name ILIKE ? OR location ILIKE ?", "%"+search+"%", "%"+search+"%")
|
|
}
|
|
|
|
// Count total
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// Get paginated results
|
|
offset := (page - 1) * limit
|
|
err := query.Preload("Category").Preload("Claimer").Preload("Claimer.Role").
|
|
Order("archived_at DESC").
|
|
Offset(offset).Limit(limit).Find(&archives).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return archives, total, nil
|
|
}
|
|
|
|
// FindByItemID finds archive by original item ID
|
|
func (r *ArchiveRepository) FindByItemID(itemID uint) (*models.Archive, error) {
|
|
var archive models.Archive
|
|
err := r.db.Where("item_id = ?", itemID).Preload("Category").Preload("Claimer").First(&archive).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("archive not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &archive, nil
|
|
}
|
|
|
|
// Delete permanently deletes an archive
|
|
func (r *ArchiveRepository) Delete(id uint) error {
|
|
return r.db.Unscoped().Delete(&models.Archive{}, id).Error
|
|
}
|
|
|
|
// CountByReason counts archives by reason
|
|
func (r *ArchiveRepository) CountByReason(reason string) (int64, error) {
|
|
var count int64
|
|
err := r.db.Model(&models.Archive{}).Where("archived_reason = ?", reason).Count(&count).Error
|
|
return count, err
|
|
} |