MIF_E31222379_BE/internal/services/product.go

110 lines
3.5 KiB
Go

package services
import (
"github.com/pahmiudahgede/senggoldong/domain"
"github.com/pahmiudahgede/senggoldong/dto"
"github.com/pahmiudahgede/senggoldong/internal/repositories"
"github.com/pahmiudahgede/senggoldong/utils"
)
func GetProductsByUserID(userID string, limit, page int) ([]dto.ProductResponseDTO, error) {
offset := (page - 1) * limit
products, err := repositories.GetProductsByUserID(userID, limit, offset)
if err != nil {
return nil, err
}
var productResponses []dto.ProductResponseDTO
for _, product := range products {
var images []dto.ProductImageDTO
for _, img := range product.ProductImages {
images = append(images, dto.ProductImageDTO{ImageURL: img.ImageURL})
}
productResponses = append(productResponses, dto.ProductResponseDTO{
ID: product.ID,
UserID: product.UserID,
ProductTitle: product.ProductTitle,
ProductImages: images,
TrashDetail: dto.TrashDetailResponseDTO{
ID: product.TrashDetail.ID,
Description: product.TrashDetail.Description,
Price: product.TrashDetail.Price,
},
SalePrice: product.SalePrice,
Quantity: product.Quantity,
ProductDescribe: product.ProductDescribe,
Sold: product.Sold,
CreatedAt: utils.FormatDateToIndonesianFormat(product.CreatedAt),
UpdatedAt: utils.FormatDateToIndonesianFormat(product.UpdatedAt),
})
}
return productResponses, nil
}
func GetProductByIDAndUserID(productID, userID string) (dto.ProductResponseDTO, error) {
product, err := repositories.GetProductByIDAndUserID(productID, userID)
if err != nil {
return dto.ProductResponseDTO{}, err
}
var images []dto.ProductImageDTO
for _, img := range product.ProductImages {
images = append(images, dto.ProductImageDTO{ImageURL: img.ImageURL})
}
return dto.ProductResponseDTO{
ID: product.ID,
UserID: product.UserID,
ProductTitle: product.ProductTitle,
ProductImages: images,
TrashDetail: dto.TrashDetailResponseDTO{
ID: product.TrashDetail.ID,
Description: product.TrashDetail.Description,
Price: product.TrashDetail.Price,
},
SalePrice: product.SalePrice,
Quantity: product.Quantity,
ProductDescribe: product.ProductDescribe,
Sold: product.Sold,
CreatedAt: utils.FormatDateToIndonesianFormat(product.CreatedAt),
UpdatedAt: utils.FormatDateToIndonesianFormat(product.UpdatedAt),
}, nil
}
func CreateProduct(input dto.CreateProductRequestDTO, userID string) (dto.CreateProductResponseDTO, error) {
if err := dto.GetValidator().Struct(input); err != nil {
return dto.CreateProductResponseDTO{}, err
}
product := &domain.Product{
UserID: userID,
ProductTitle: input.ProductTitle,
TrashDetailID: input.TrashDetailID,
SalePrice: input.SalePrice,
Quantity: input.Quantity,
ProductDescribe: input.ProductDescribe,
}
var images []domain.ProductImage
for _, imageURL := range input.ProductImages {
images = append(images, domain.ProductImage{ImageURL: imageURL})
}
if err := repositories.CreateProduct(product, images); err != nil {
return dto.CreateProductResponseDTO{}, err
}
return dto.CreateProductResponseDTO{
ID: product.ID,
UserID: product.UserID,
ProductTitle: product.ProductTitle,
ProductImages: input.ProductImages,
TrashDetailID: product.TrashDetailID,
SalePrice: product.SalePrice,
Quantity: product.Quantity,
ProductDescribe: product.ProductDescribe,
}, nil
}