Passed
Pull Request — main (#134)
by Yume
01:14
created

controllers.*AuthController.SearchKey   A

Complexity

Conditions 2

Size

Total Lines 9
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 5
nop 1
dl 0
loc 9
rs 10
c 0
b 0
f 0
1
package controllers
2
3
import (
4
	"github.com/gofiber/fiber/v2"
5
	"github.com/memnix/memnix-rest/domain"
6
	"github.com/memnix/memnix-rest/internal/auth"
7
	"github.com/memnix/memnix-rest/views"
8
	"github.com/pkg/errors"
9
	"github.com/uptrace/opentelemetry-go-extra/otelzap"
10
	"go.uber.org/zap"
11
)
12
13
// AuthController is the controller for the auth routes
14
type AuthController struct {
15
	auth auth.IUseCase
16
}
17
18
// NewAuthController creates a new auth controller
19
func NewAuthController(auth auth.IUseCase) AuthController {
20
	return AuthController{auth: auth}
21
}
22
23
// Login is the controller for the login route
24
//
25
//	@Summary		Login
26
//	@Description	Login
27
//	@Tags			Auth
28
//	@Accept			json
29
//	@Produce		json
30
//	@Param			login	body		domain.Login	true	"Login"
31
//	@Success		200		{object}	views.LoginTokenVM
32
//	@Failure		401		{object}	views.HTTPResponseVM
33
//	@Failure		500		{object}	views.HTTPResponseVM
34
//	@Router			/v2/security/login [post]
35
func (a *AuthController) Login(c *fiber.Ctx) error {
36
	var loginStruct domain.Login
37
	err := c.BodyParser(&loginStruct)
38
	if err != nil {
39
		return c.Status(fiber.StatusBadRequest).JSON(views.NewHTTPResponseVMFromError(err))
40
	}
41
42
	jwtToken, err := a.auth.Login(c.UserContext(), loginStruct.Password, loginStruct.Email)
43
	if err != nil {
44
		otelzap.Ctx(c.UserContext()).Warn("invalid credentials", zap.Error(err))
45
		return c.Status(fiber.StatusUnauthorized).JSON(views.NewLoginTokenVM("", "invalid credentials"))
46
	}
47
48
	return c.Status(fiber.StatusOK).JSON(views.NewLoginTokenVM(jwtToken, ""))
49
}
50
51
// Register is the controller for the register route
52
//
53
//	@Summary		Register
54
//	@Description	Register
55
//	@Tags			Auth
56
//	@Accept			json
57
//	@Produce		json
58
//	@Param			register	body		domain.Register	true	"Register"
59
//	@Success		201			{object}	views.RegisterVM
60
//	@Failure		400			{object}	views.HTTPResponseVM
61
//	@Failure		500			{object}	views.HTTPResponseVM
62
//	@Router			/v2/security/register [post]
63
func (a *AuthController) Register(c *fiber.Ctx) error {
64
	var registerStruct domain.Register
65
	err := c.BodyParser(&registerStruct)
66
	if err != nil {
67
		return c.Status(fiber.StatusBadRequest).JSON(views.NewHTTPResponseVMFromError(err))
68
	}
69
70
	newUser, err := a.auth.Register(c.UserContext(), registerStruct)
71
	if err != nil {
72
		return c.Status(fiber.StatusBadRequest).JSON(views.NewHTTPResponseVMFromError(errors.New("error creating user")))
73
	}
74
75
	return c.Status(fiber.StatusCreated).JSON(views.NewRegisterVM("user created", newUser.ToPublicUser()))
76
}
77
78
// Logout is the controller for the logout route
79
//
80
//	@Summary		Logout
81
//	@Description	Logout
82
//	@Tags			Auth
83
//	@Accept			json
84
//	@Produce		json
85
//	@Success		200	{object}	views.LoginTokenVM
86
//	@Failure		500	{object}	views.HTTPResponseVM
87
//	@Router			/v2/security/logout [post]
88
func (*AuthController) Logout(c *fiber.Ctx) error {
89
	return c.Status(fiber.StatusOK).JSON(views.NewLoginTokenVM("", "logged out"))
90
}
91
92
// RefreshToken is the controller for the refresh token route
93
//
94
//	@Summary		Refresh token
95
//	@Description	Refresh token
96
//	@Tags			Auth
97
//	@Accept			json
98
//	@Produce		json
99
//	@Success		200	{object}	views.LoginTokenVM
100
//	@Failure		401	{object}	views.HTTPResponseVM
101
//	@Failure		500	{object}	views.HTTPResponseVM
102
//	@Router			/v2/security/refresh [post]
103
func (a *AuthController) RefreshToken(c *fiber.Ctx) error {
104
	user, err := GetUserFromContext(c)
105
	if err != nil {
106
		return errors.Wrap(err, "user not found in RefreshToken")
107
	}
108
	newToken, err := a.auth.RefreshToken(c.UserContext(), user)
109
	if err != nil {
110
		return c.Status(fiber.StatusUnauthorized).JSON(views.NewHTTPResponseVMFromError(err))
111
	}
112
113
	return c.Status(fiber.StatusOK).JSON(views.NewLoginTokenVM(newToken, ""))
114
}
115