110 lines
3.5 KiB
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
|
|
}
|