64 lines
2.1 KiB
Go
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)
|
|
}
|
|
}
|