- Remove backend Medusa.js (TypeScript) e substitui pelo backend Go (saveinmed-performance-core) - Corrige testes auth.test.ts: alinha paths de API (v1/ sem barra inicial) e campo access_token - Corrige GroupedProductCard.test.tsx: ajusta distância formatada (toFixed) e troca userEvent por fireEvent com fakeTimers - Corrige AuthContext.test.tsx: usa vi.hoisted() para mocks e corrige parênteses no waitFor Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
207 lines
4.9 KiB
Go
207 lines
4.9 KiB
Go
package handler
|
|
|
|
import (
|
|
"log"
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gofrs/uuid/v5"
|
|
"github.com/saveinmed/backend-go/internal/domain"
|
|
)
|
|
|
|
// CreateAddress godoc
|
|
// @Summary Criar novo endereço
|
|
// @Tags Endereços
|
|
// @Security BearerAuth
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param address body createAddressRequest true "Dados do endereço"
|
|
// @Success 201 {object} domain.Address
|
|
// @Failure 400 {object} map[string]string
|
|
// @Router /api/v1/enderecos [post]
|
|
func (h *Handler) CreateAddress(w http.ResponseWriter, r *http.Request) {
|
|
reqUser, err := getRequester(r)
|
|
if err != nil {
|
|
writeError(w, http.StatusUnauthorized, err)
|
|
return
|
|
}
|
|
|
|
var req createAddressRequest
|
|
if err := decodeJSON(r.Context(), r, &req); err != nil {
|
|
writeError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
// Use CompanyID if available, otherwise UserID
|
|
entityID := reqUser.ID
|
|
if reqUser.CompanyID != nil {
|
|
entityID = *reqUser.CompanyID
|
|
}
|
|
|
|
// Admin Override
|
|
if req.EntityID != nil && reqUser.Role == "Admin" {
|
|
entityID = *req.EntityID
|
|
}
|
|
|
|
addr := domain.Address{
|
|
EntityID: entityID,
|
|
Title: req.Title,
|
|
ZipCode: req.ZipCode,
|
|
Street: req.Street,
|
|
Number: req.Number,
|
|
Complement: req.Complement,
|
|
District: req.District,
|
|
City: req.City,
|
|
State: req.State,
|
|
CreatedAt: time.Now(),
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
|
|
if err := h.svc.CreateAddress(r.Context(), &addr); err != nil {
|
|
log.Printf("Failed to create address: %v", err)
|
|
writeError(w, http.StatusInternalServerError, err)
|
|
return
|
|
}
|
|
|
|
writeJSON(w, http.StatusCreated, addr)
|
|
}
|
|
|
|
// ListAddresses godoc
|
|
// @Summary Listar endereços do usuário
|
|
// @Tags Endereços
|
|
// @Security BearerAuth
|
|
// @Produce json
|
|
// @Success 200 {array} domain.Address
|
|
// @Failure 500 {object} map[string]string
|
|
// @Router /api/v1/enderecos [get]
|
|
func (h *Handler) ListAddresses(w http.ResponseWriter, r *http.Request) {
|
|
reqUser, err := getRequester(r)
|
|
if err != nil {
|
|
writeError(w, http.StatusUnauthorized, err)
|
|
return
|
|
}
|
|
|
|
entityID := reqUser.ID
|
|
if reqUser.CompanyID != nil {
|
|
entityID = *reqUser.CompanyID
|
|
}
|
|
|
|
// Admin Override
|
|
if reqUser.Role == "Admin" {
|
|
if queryID := r.URL.Query().Get("entity_id"); queryID != "" {
|
|
if id, err := uuid.FromString(queryID); err == nil {
|
|
entityID = id
|
|
}
|
|
}
|
|
}
|
|
|
|
addresses, err := h.svc.ListAddresses(r.Context(), entityID)
|
|
if err != nil {
|
|
writeError(w, http.StatusInternalServerError, err)
|
|
return
|
|
}
|
|
|
|
writeJSON(w, http.StatusOK, addresses)
|
|
}
|
|
|
|
// UpdateAddress godoc
|
|
// @Summary Atualizar endereço
|
|
// @Tags Endereços
|
|
// @Security BearerAuth
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param id path string true "ID do endereço"
|
|
// @Param address body createAddressRequest true "Dados do endereço"
|
|
// @Success 200 {object} map[string]string
|
|
// @Failure 400 {object} map[string]string
|
|
// @Router /api/v1/enderecos/{id} [put]
|
|
func (h *Handler) UpdateAddress(w http.ResponseWriter, r *http.Request) {
|
|
reqUser, err := getRequester(r)
|
|
if err != nil {
|
|
writeError(w, http.StatusUnauthorized, err)
|
|
return
|
|
}
|
|
|
|
idStr := r.PathValue("id")
|
|
id, err := uuid.FromString(idStr)
|
|
if err != nil {
|
|
writeError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
var req createAddressRequest
|
|
if err := decodeJSON(r.Context(), r, &req); err != nil {
|
|
writeError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
addr := domain.Address{
|
|
ID: id,
|
|
Title: req.Title,
|
|
ZipCode: req.ZipCode,
|
|
Street: req.Street,
|
|
Number: req.Number,
|
|
Complement: req.Complement,
|
|
District: req.District,
|
|
City: req.City,
|
|
State: req.State,
|
|
}
|
|
|
|
var companyID uuid.UUID
|
|
if reqUser.CompanyID != nil {
|
|
companyID = *reqUser.CompanyID
|
|
}
|
|
user := &domain.User{
|
|
ID: reqUser.ID,
|
|
Role: reqUser.Role,
|
|
CompanyID: companyID,
|
|
}
|
|
|
|
if err := h.svc.UpdateAddress(r.Context(), &addr, user); err != nil {
|
|
writeError(w, http.StatusInternalServerError, err)
|
|
return
|
|
}
|
|
|
|
writeJSON(w, http.StatusOK, map[string]string{"message": "address updated"})
|
|
}
|
|
|
|
// DeleteAddress godoc
|
|
// @Summary Deletar endereço
|
|
// @Tags Endereços
|
|
// @Security BearerAuth
|
|
// @Produce json
|
|
// @Param id path string true "ID do endereço"
|
|
// @Success 200 {object} map[string]string
|
|
// @Failure 400 {object} map[string]string
|
|
// @Router /api/v1/enderecos/{id} [delete]
|
|
func (h *Handler) DeleteAddress(w http.ResponseWriter, r *http.Request) {
|
|
reqUser, err := getRequester(r)
|
|
if err != nil {
|
|
writeError(w, http.StatusUnauthorized, err)
|
|
return
|
|
}
|
|
|
|
idStr := r.PathValue("id")
|
|
id, err := uuid.FromString(idStr)
|
|
if err != nil {
|
|
writeError(w, http.StatusBadRequest, err)
|
|
return
|
|
}
|
|
|
|
var companyID uuid.UUID
|
|
if reqUser.CompanyID != nil {
|
|
companyID = *reqUser.CompanyID
|
|
}
|
|
user := &domain.User{
|
|
ID: reqUser.ID,
|
|
Role: reqUser.Role,
|
|
CompanyID: companyID,
|
|
}
|
|
|
|
if err := h.svc.DeleteAddress(r.Context(), id, user); err != nil {
|
|
writeError(w, http.StatusInternalServerError, err)
|
|
return
|
|
}
|
|
|
|
writeJSON(w, http.StatusOK, map[string]string{"message": "address deleted"})
|
|
}
|