139 lines
4.2 KiB
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
|
|
}
|