145 lines
3.7 KiB
Go
145 lines
3.7 KiB
Go
package repositories
|
|
|
|
import (
|
|
"errors"
|
|
"lost-and-found/internal/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type ClaimRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewClaimRepository(db *gorm.DB) *ClaimRepository {
|
|
return &ClaimRepository{db: db}
|
|
}
|
|
|
|
// Create creates a new claim
|
|
func (r *ClaimRepository) Create(claim *models.Claim) error {
|
|
return r.db.Create(claim).Error
|
|
}
|
|
|
|
// FindByID finds claim by ID
|
|
func (r *ClaimRepository) FindByID(id uint) (*models.Claim, error) {
|
|
var claim models.Claim
|
|
err := r.db.Preload("Item").Preload("Item.Category").
|
|
Preload("User").Preload("User.Role").
|
|
Preload("Verifier").Preload("Verifier.Role").
|
|
Preload("Verification").
|
|
First(&claim, id).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("claim not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &claim, nil
|
|
}
|
|
|
|
// FindAll returns all claims with filters
|
|
func (r *ClaimRepository) FindAll(page, limit int, status string, itemID, userID *uint) ([]models.Claim, int64, error) {
|
|
var claims []models.Claim
|
|
var total int64
|
|
|
|
query := r.db.Model(&models.Claim{})
|
|
|
|
// Apply filters
|
|
if status != "" {
|
|
query = query.Where("status = ?", status)
|
|
}
|
|
if itemID != nil {
|
|
query = query.Where("item_id = ?", *itemID)
|
|
}
|
|
if userID != nil {
|
|
query = query.Where("user_id = ?", *userID)
|
|
}
|
|
|
|
// Count total
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// Get paginated results
|
|
offset := (page - 1) * limit
|
|
err := query.Preload("Item").Preload("Item.Category").
|
|
Preload("User").Preload("User.Role").
|
|
Preload("Verifier").Preload("Verifier.Role").
|
|
Preload("Verification").
|
|
Order("created_at DESC").
|
|
Offset(offset).Limit(limit).Find(&claims).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return claims, total, nil
|
|
}
|
|
|
|
// Update updates claim data
|
|
func (r *ClaimRepository) Update(claim *models.Claim) error {
|
|
return r.db.Save(claim).Error
|
|
}
|
|
|
|
// Delete soft deletes a claim
|
|
func (r *ClaimRepository) Delete(id uint) error {
|
|
return r.db.Delete(&models.Claim{}, id).Error
|
|
}
|
|
|
|
// CheckExistingClaim checks if user already claimed an item
|
|
func (r *ClaimRepository) CheckExistingClaim(userID, itemID uint) (bool, error) {
|
|
var count int64
|
|
err := r.db.Model(&models.Claim{}).
|
|
Where("user_id = ? AND item_id = ? AND status != ?", userID, itemID, models.ClaimStatusRejected).
|
|
Count(&count).Error
|
|
if err != nil {
|
|
return false, err
|
|
}
|
|
return count > 0, nil
|
|
}
|
|
|
|
// FindByItem finds claims for an item
|
|
func (r *ClaimRepository) FindByItem(itemID uint) ([]models.Claim, error) {
|
|
var claims []models.Claim
|
|
err := r.db.Where("item_id = ?", itemID).
|
|
Preload("User").Preload("User.Role").
|
|
Preload("Verification").
|
|
Order("created_at DESC").Find(&claims).Error
|
|
return claims, err
|
|
}
|
|
|
|
// FindByUser finds claims by user
|
|
func (r *ClaimRepository) FindByUser(userID uint, page, limit int) ([]models.Claim, int64, error) {
|
|
var claims []models.Claim
|
|
var total int64
|
|
|
|
query := r.db.Model(&models.Claim{}).Where("user_id = ?", userID)
|
|
|
|
// Count total
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
// Get paginated results
|
|
offset := (page - 1) * limit
|
|
err := query.Preload("Item").Preload("Item.Category").
|
|
Preload("Verification").
|
|
Order("created_at DESC").
|
|
Offset(offset).Limit(limit).Find(&claims).Error
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return claims, total, nil
|
|
}
|
|
|
|
// CountByStatus counts claims by status
|
|
func (r *ClaimRepository) CountByStatus(status string) (int64, error) {
|
|
var count int64
|
|
err := r.db.Model(&models.Claim{}).Where("status = ?", status).Count(&count).Error
|
|
return count, err
|
|
}
|
|
|
|
// FindPendingClaims finds all pending claims
|
|
func (r *ClaimRepository) FindPendingClaims(page, limit int) ([]models.Claim, int64, error) {
|
|
return r.FindAll(page, limit, models.ClaimStatusPending, nil, nil)
|
|
} |