saveinmed/backend/internal/http/handler/address_handler.go
Gabbriiel 90467db1ec refactor: substitui backend Medusa por backend Go e corrige testes do marketplace
- 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>
2026-02-17 04:56:37 -06:00

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"})
}