Passed
Pull Request — main (#166)
by Yume
02:09
created

controllers.*AuthController.Logout   A

Complexity

Conditions 1

Size

Total Lines 2
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

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