- Adiciona tabela `disponibilidade_profissionais` no schema - Adiciona coluna `posicao` para mapa de profissionais no evento - Implementa Service e Handler para gerenciar Disponibilidade (Set/Get) - Implementa lógica de Escalonamento: listar disponíveis e atribuir posição - Atualiza rotas da API e serviço do frontend feat(frontend): implementa modal de detalhes e updates otimistas na equipe - Adiciona componente ProfessionalDetailsModal para exibir dados completos do profissional - Implementa update otimista em DataContext para adição/removação instantânea da equipe - Corrige bug crítico de sintaxe e estrutura na Dashboard.tsx - Adiciona badges de status (Pendente/Confirmado/Rejeitado) na listagem de equipe - Corrige erro de referência de variável (professionalId) no fluxo de atribuição
83 lines
2.3 KiB
Go
83 lines
2.3 KiB
Go
package availability
|
|
|
|
import (
|
|
"net/http"
|
|
"time"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
type Handler struct {
|
|
service *Service
|
|
}
|
|
|
|
func NewHandler(service *Service) *Handler {
|
|
return &Handler{service: service}
|
|
}
|
|
|
|
// SetAvailability godoc
|
|
// @Summary Set availability for a date
|
|
// @Tags availability
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param request body SetAvailabilityInput true "Availability Input"
|
|
// @Success 200 {object} map[string]string
|
|
// @Router /availability [post]
|
|
func (h *Handler) SetAvailability(c *gin.Context) {
|
|
var req SetAvailabilityInput
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
userID := c.GetString("userID") // From middleware
|
|
if userID == "" {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "unauthorized"})
|
|
return
|
|
}
|
|
|
|
if err := h.service.SetAvailability(c.Request.Context(), userID, req); err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
c.JSON(http.StatusOK, gin.H{"message": "availability updated"})
|
|
}
|
|
|
|
// ListAvailability godoc
|
|
// @Summary List my availability for a month with ?start=YYYY-MM-DD&end=YYYY-MM-DD
|
|
// @Tags availability
|
|
// @Produce json
|
|
// @Param start query string true "Start Date"
|
|
// @Param end query string true "End Date"
|
|
// @Success 200 {array} map[string]interface{}
|
|
// @Router /availability [get]
|
|
func (h *Handler) ListAvailability(c *gin.Context) {
|
|
userId := c.GetString("userID")
|
|
start := c.Query("start")
|
|
end := c.Query("end")
|
|
|
|
if start == "" || end == "" {
|
|
// Default to current month
|
|
now := time.Now()
|
|
start = time.Date(now.Year(), now.Month(), 1, 0, 0, 0, 0, time.UTC).Format("2006-01-02")
|
|
end = time.Date(now.Year(), now.Month()+1, 0, 0, 0, 0, 0, time.UTC).Format("2006-01-02")
|
|
}
|
|
|
|
availabilities, err := h.service.ListMyAvailability(c.Request.Context(), userId, start, end)
|
|
if err != nil {
|
|
c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
|
|
return
|
|
}
|
|
|
|
// Map to simplify response
|
|
var response []map[string]interface{}
|
|
for _, a := range availabilities {
|
|
response = append(response, map[string]interface{}{
|
|
"date": a.Data.Time.Format("2006-01-02"),
|
|
"status": a.Status,
|
|
})
|
|
}
|
|
|
|
c.JSON(http.StatusOK, response)
|
|
}
|