MIF_E31222379_BE/internal/repositories/product_repo.go

139 lines
4.2 KiB
Go

package repositories
import (
"fmt"
"github.com/pahmiudahgede/senggoldong/model"
"gorm.io/gorm"
)
type ProductRepository interface {
CountProductsByStoreID(storeID string) (int64, error)
CreateProduct(product *model.Product) error
GetProductByID(productID string) (*model.Product, error)
GetProductsByStoreID(storeID string) ([]model.Product, error)
FindProductsByStoreID(storeID string, page, limit int) ([]model.Product, error)
FindProductImagesByProductID(productID string) ([]model.ProductImage, error)
GetProductImageByID(imageID string) (*model.ProductImage, error)
UpdateProduct(product *model.Product) error
DeleteProduct(productID string) error
DeleteProductsByID(productIDs []string) error
AddProductImages(images []model.ProductImage) error
DeleteProductImagesByProductID(productID string) error
DeleteProductImagesByID(imageIDs []string) error
DeleteProductImageByID(imageID string) error
}
type productRepository struct {
DB *gorm.DB
}
func NewProductRepository(DB *gorm.DB) ProductRepository {
return &productRepository{DB}
}
func (r *productRepository) CreateProduct(product *model.Product) error {
return r.DB.Create(product).Error
}
func (r *productRepository) CountProductsByStoreID(storeID string) (int64, error) {
var count int64
if err := r.DB.Model(&model.Product{}).Where("store_id = ?", storeID).Count(&count).Error; err != nil {
return 0, err
}
return count, nil
}
func (r *productRepository) GetProductByID(productID string) (*model.Product, error) {
var product model.Product
if err := r.DB.Preload("ProductImages").Where("id = ?", productID).First(&product).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return nil, nil
}
return nil, err
}
return &product, nil
}
func (r *productRepository) GetProductsByStoreID(storeID string) ([]model.Product, error) {
var products []model.Product
if err := r.DB.Where("store_id = ?", storeID).Preload("ProductImages").Find(&products).Error; err != nil {
return nil, err
}
return products, nil
}
func (r *productRepository) FindProductsByStoreID(storeID string, page, limit int) ([]model.Product, error) {
var products []model.Product
offset := (page - 1) * limit
if err := r.DB.
Where("store_id = ?", storeID).
Limit(limit).
Offset(offset).
Find(&products).Error; err != nil {
return nil, err
}
return products, nil
}
func (r *productRepository) FindProductImagesByProductID(productID string) ([]model.ProductImage, error) {
var productImages []model.ProductImage
if err := r.DB.Where("product_id = ?", productID).Find(&productImages).Error; err != nil {
return nil, err
}
return productImages, nil
}
func (r *productRepository) GetProductImageByID(imageID string) (*model.ProductImage, error) {
var productImage model.ProductImage
if err := r.DB.Where("id = ?", imageID).First(&productImage).Error; err != nil {
if err == gorm.ErrRecordNotFound {
return nil, nil
}
return nil, err
}
return &productImage, nil
}
func (r *productRepository) UpdateProduct(product *model.Product) error {
return r.DB.Save(product).Error
}
func (r *productRepository) DeleteProduct(productID string) error {
return r.DB.Delete(&model.Product{}, "id = ?", productID).Error
}
func (r *productRepository) DeleteProductsByID(productIDs []string) error {
if err := r.DB.Where("id IN ?", productIDs).Delete(&model.Product{}).Error; err != nil {
return fmt.Errorf("failed to delete products: %v", err)
}
return nil
}
func (r *productRepository) AddProductImages(images []model.ProductImage) error {
if len(images) == 0 {
return nil
}
return r.DB.Create(&images).Error
}
func (r *productRepository) DeleteProductImagesByProductID(productID string) error {
return r.DB.Where("product_id = ?", productID).Delete(&model.ProductImage{}).Error
}
func (r *productRepository) DeleteProductImagesByID(imageIDs []string) error {
if err := r.DB.Where("id IN ?", imageIDs).Delete(&model.ProductImage{}).Error; err != nil {
return fmt.Errorf("failed to delete product images: %v", err)
}
return nil
}
func (r *productRepository) DeleteProductImageByID(imageID string) error {
if err := r.DB.Where("id = ?", imageID).Delete(&model.ProductImage{}).Error; err != nil {
return fmt.Errorf("failed to delete product image: %v", err)
}
return nil
}