Files
galaxy-game/mail/internal/api/internalhttp/handler.go
T
2026-04-17 18:39:16 +02:00

64 lines
2.1 KiB
Go

package internalhttp
import (
"context"
"encoding/json"
"errors"
"net/http"
"galaxy/mail/internal/service/acceptauthdelivery"
)
// AcceptLoginCodeDeliveryUseCase accepts one auth login-code delivery request.
type AcceptLoginCodeDeliveryUseCase interface {
// Execute durably accepts one normalized auth login-code delivery command.
Execute(context.Context, acceptauthdelivery.Input) (acceptauthdelivery.Result, error)
}
func newAcceptLoginCodeDeliveryHandler(useCase AcceptLoginCodeDeliveryUseCase) http.HandlerFunc {
return func(writer http.ResponseWriter, request *http.Request) {
ctx := request.Context()
command, err := DecodeLoginCodeDeliveryCommand(request)
if err != nil {
writeErrorResponse(writer, http.StatusBadRequest, ErrorCodeInvalidRequest, err.Error())
return
}
result, err := useCase.Execute(ctx, acceptauthdelivery.Input{
IdempotencyKey: command.IdempotencyKey,
Email: command.Email,
Code: command.Code,
Locale: command.Locale,
})
if err != nil {
switch {
case errors.Is(err, acceptauthdelivery.ErrConflict):
writeErrorResponse(writer, http.StatusConflict, ErrorCodeConflict, "request conflicts with current state")
case errors.Is(err, acceptauthdelivery.ErrServiceUnavailable):
writeErrorResponse(writer, http.StatusServiceUnavailable, ErrorCodeServiceUnavailable, "service is unavailable")
default:
writeErrorResponse(writer, http.StatusInternalServerError, ErrorCodeInternalError, "internal server error")
}
return
}
if err := result.Validate(); err != nil {
writeErrorResponse(writer, http.StatusInternalServerError, ErrorCodeInternalError, "internal server error")
return
}
response := LoginCodeDeliveryResponse{
Outcome: LoginCodeDeliveryOutcome(result.Outcome),
}
if err := response.Validate(); err != nil {
writeErrorResponse(writer, http.StatusInternalServerError, ErrorCodeInternalError, "internal server error")
return
}
writer.Header().Set("Content-Type", "application/json")
writer.WriteHeader(http.StatusOK)
_ = json.NewEncoder(writer).Encode(response)
}
}