/
auth.go
67 lines (55 loc) · 1.91 KB
/
auth.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package controller
import (
"net/http"
"github.com/rs/zerolog"
"github.com/rs/zerolog/hlog"
"github.com/helder-jaspion/go-springfield-bank/pkg/domain/usecase"
"github.com/helder-jaspion/go-springfield-bank/pkg/gateway/http/io"
)
// AuthController is the interface that wraps http handle methods related to authentication.
type AuthController interface {
Login(w http.ResponseWriter, r *http.Request)
//Logout(w http.ResponseWriter, r *http.Request)
//RefreshToken(w http.ResponseWriter, r *http.Request)
}
type authController struct {
authUC usecase.AuthUseCase
}
//NewAuthController instantiates a new auth controller.
func NewAuthController(authUC usecase.AuthUseCase) AuthController {
return &authController{
authUC: authUC,
}
}
// @Summary Login
// @Description Authenticates the user/account
// @tags Authentication
// @Accept json
// @Produce json
// @Param credentials body usecase.AuthLoginInput true "Credentials"
// @Success 200 {object} usecase.AuthTokenOutput
// @failure 400 {object} io.ErrorOutput
// @failure 401 {object} io.ErrorOutput
// @Router /login [post]
func (authCtrl authController) Login(w http.ResponseWriter, r *http.Request) {
logger := hlog.FromRequest(r)
var input usecase.AuthLoginInput
if err := io.ReadInput(r, logger, &input); err != nil {
logger.Error().Stack().Err(err).Msg("error decoding login input")
io.WriteErrorMsg(w, logger, http.StatusBadRequest, "error reading input")
return
}
result, err := authCtrl.authUC.Login(logger.WithContext(r.Context()), input)
if err != nil {
authCtrl.writeError(w, logger, http.StatusInternalServerError, err)
return
}
io.WriteSuccess(w, logger, http.StatusOK, result)
}
func (authCtrl authController) writeError(w http.ResponseWriter, logger *zerolog.Logger, statusCode int, err error) {
switch err {
case usecase.ErrAuthInvalidCredentials:
statusCode = http.StatusUnauthorized
}
io.WriteErrorMsg(w, logger, statusCode, err.Error())
}