102 lines
2.7 KiB
Go
102 lines
2.7 KiB
Go
// internal/repositories/category_repo.go
|
|
package repositories
|
|
|
|
import (
|
|
"errors"
|
|
"lost-and-found/internal/models"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type CategoryRepository struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewCategoryRepository(db *gorm.DB) *CategoryRepository {
|
|
return &CategoryRepository{db: db}
|
|
}
|
|
|
|
// Create creates a new category
|
|
func (r *CategoryRepository) Create(category *models.Category) error {
|
|
return r.db.Create(category).Error
|
|
}
|
|
|
|
// FindByID finds category by ID
|
|
func (r *CategoryRepository) FindByID(id uint) (*models.Category, error) {
|
|
var category models.Category
|
|
err := r.db.First(&category, id).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("category not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &category, nil
|
|
}
|
|
|
|
// FindBySlug finds category by slug
|
|
func (r *CategoryRepository) FindBySlug(slug string) (*models.Category, error) {
|
|
var category models.Category
|
|
err := r.db.Where("slug = ?", slug).First(&category).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return nil, errors.New("category not found")
|
|
}
|
|
return nil, err
|
|
}
|
|
return &category, nil
|
|
}
|
|
|
|
// FindAll returns all categories
|
|
func (r *CategoryRepository) FindAll() ([]models.Category, error) {
|
|
var categories []models.Category
|
|
err := r.db.Order("name ASC").Find(&categories).Error
|
|
return categories, err
|
|
}
|
|
|
|
// Update updates category data
|
|
func (r *CategoryRepository) Update(category *models.Category) error {
|
|
return r.db.Save(category).Error
|
|
}
|
|
|
|
// Delete soft deletes a category
|
|
func (r *CategoryRepository) Delete(id uint) error {
|
|
return r.db.Delete(&models.Category{}, id).Error
|
|
}
|
|
|
|
// GetCategoryWithItemCount gets category with item count
|
|
func (r *CategoryRepository) GetCategoryWithItemCount(id uint) (*models.Category, int64, error) {
|
|
category, err := r.FindByID(id)
|
|
if err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
var count int64
|
|
if err := r.db.Model(&models.Item{}).Where("category_id = ?", id).Count(&count).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return category, count, nil
|
|
}
|
|
|
|
// GetAllWithItemCount gets all categories with item counts
|
|
func (r *CategoryRepository) GetAllWithItemCount() ([]models.CategoryResponse, error) {
|
|
var categories []models.Category
|
|
if err := r.db.Order("name ASC").Find(&categories).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
var responses []models.CategoryResponse
|
|
for _, cat := range categories {
|
|
var count int64
|
|
if err := r.db.Model(&models.Item{}).Where("category_id = ?", cat.ID).Count(&count).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
response := cat.ToResponse()
|
|
response.ItemCount = count
|
|
responses = append(responses, response)
|
|
}
|
|
|
|
return responses, nil
|
|
} |