NAPPDesafio/api/application/products/service.go
2024-07-21 00:15:14 -03:00

113 lines
3.8 KiB
Go

package productsmodule
import (
productdto "api/application/products/dto"
"api/libs/logger"
"api/libs/postgres"
"api/models/api"
"api/models/products"
"context"
"github.com/gofiber/fiber/v2"
"github.com/jackc/pgx/v5"
)
type ProductsService interface {
CreateProduct(userId string, data *productdto.ProductDto) (*api.Response, int, error)
UpdateProduct(userId string, data *productdto.ProductDto) (*api.Response, int, error)
VerifyCode(data *productdto.ValidateCodeDto) (*api.Response, int, error)
GetProducts() (*api.Response, int, error)
DeleteProduct(data *productdto.DeleteProductDto) (*api.Response, int, error)
}
type productsService struct {
productsRepository *products.Queries
ctx context.Context
}
func newService() ProductsService {
return &productsService{
productsRepository: products.New(postgres.Pool),
ctx: context.Background(),
}
}
func (p *productsService) CreateProduct(userId string, data *productdto.ProductDto) (*api.Response, int, error) {
estoqueDisponivel := data.EstoqueTotal - data.EstoqueCorte
newProduct, err := p.productsRepository.CreateProduct(p.ctx, userId, products.CreateProductParams{
Nome: data.Nome,
Codigo: data.Codigo,
EstoqueTotal: data.EstoqueTotal,
EstoqueCorte: data.EstoqueCorte,
EstoqueDisponivel: estoqueDisponivel,
PrecoDe: data.PrecoDe,
PrecoPor: data.PrecoPor,
})
if err != nil {
logger.Production.Info(err.Error())
return &api.Response{Error: true, ErrorMessage: err.Error(), Payload: "error insert product"}, fiber.StatusInternalServerError, err
}
return &api.Response{Error: false, Payload: newProduct}, fiber.StatusOK, nil
}
func (p *productsService) VerifyCode(data *productdto.ValidateCodeDto) (*api.Response, int, error) {
_, err := p.productsRepository.GetProduct(p.ctx, data.Codigo)
if err != nil {
if err == pgx.ErrNoRows {
return &api.Response{Error: false, Payload: false}, fiber.StatusOK, nil
}
logger.Production.Info(err.Error())
return &api.Response{Error: true, ErrorMessage: err.Error(), Payload: "error verify code product"}, fiber.StatusInternalServerError, err
}
return &api.Response{Error: false, Payload: true}, fiber.StatusOK, nil
}
func (p *productsService) UpdateProduct(userId string, data *productdto.ProductDto) (*api.Response, int, error) {
estoqueDisponivel := data.EstoqueTotal - data.EstoqueCorte
err := p.productsRepository.UpdateProduct(p.ctx, userId, products.UpdateProductParams{
Nome: data.Nome,
Codigo: data.Codigo,
EstoqueTotal: data.EstoqueTotal,
EstoqueCorte: data.EstoqueCorte,
EstoqueDisponivel: estoqueDisponivel,
PrecoDe: data.PrecoDe,
PrecoPor: data.PrecoPor,
})
if err != nil {
logger.Production.Info(err.Error())
return &api.Response{Error: true, ErrorMessage: err.Error(), Payload: "error update product"}, fiber.StatusInternalServerError, err
}
return &api.Response{Error: false, Payload: nil}, fiber.StatusOK, nil
}
func (p *productsService) GetProducts() (*api.Response, int, error) {
products, err := p.productsRepository.ListProducts(p.ctx)
if err != nil {
logger.Production.Info(err.Error())
return &api.Response{Error: true, ErrorMessage: err.Error(), Payload: "error get products"}, fiber.StatusInternalServerError, err
}
return &api.Response{Error: false, Payload: products}, fiber.StatusOK, nil
}
func (p *productsService) DeleteProduct(data *productdto.DeleteProductDto) (*api.Response, int, error) {
err := p.productsRepository.DeleteProduct(p.ctx, data.Codigo)
if err != nil {
logger.Production.Info(err.Error())
return &api.Response{Error: true, ErrorMessage: err.Error(), Payload: "error delete product"}, fiber.StatusInternalServerError, err
}
return &api.Response{Error: false, Payload: nil}, fiber.StatusOK, nil
}