onasty/internal/transport/http/apiv1/auth.go(view raw)
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 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 |
package apiv1
import (
"net/http"
"time"
"github.com/gin-gonic/gin"
"github.com/olexsmir/onasty/internal/dtos"
"github.com/olexsmir/onasty/internal/models"
)
type signUpRequest struct {
Username string `json:"username"`
Email string `json:"email"`
Password string `json:"password"`
}
func (a *APIV1) signUpHandler(c *gin.Context) {
var req signUpRequest
if err := c.ShouldBindJSON(&req); err != nil {
newError(c, http.StatusBadRequest, "invalid request")
return
}
user := models.User{
Username: req.Username,
Email: req.Email,
Password: req.Password,
CreatedAt: time.Now(),
LastLoginAt: time.Now(),
}
if err := user.Validate(); err != nil {
// TODO: find a way to return all errors at once
newErrorStatus(c, http.StatusBadRequest, err.Error())
return
}
if _, err := a.usersrv.SignUp(c.Request.Context(), dtos.CreateUserDTO{
Username: user.Username,
Email: user.Email,
Password: user.Password,
CreatedAt: user.CreatedAt,
LastLoginAt: user.LastLoginAt,
}); err != nil {
errorResponse(c, err)
return
}
c.Status(http.StatusCreated)
}
type signInRequest struct {
Email string `json:"email"`
Password string `json:"password"`
}
type signInResponse struct {
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
}
func (a *APIV1) signInHandler(c *gin.Context) {
var req signInRequest
if err := c.ShouldBindJSON(&req); err != nil {
newError(c, http.StatusBadRequest, "invalid request")
return
}
toks, err := a.usersrv.SignIn(c.Request.Context(), dtos.SignInDTO{
Email: req.Email,
Password: req.Password,
})
if err != nil {
errorResponse(c, err)
return
}
c.JSON(http.StatusOK, signInResponse{
AccessToken: toks.Access,
RefreshToken: toks.Refresh,
})
}
type refreshTokenRequest struct {
RefreshToken string `json:"refresh_token"`
}
func (a *APIV1) refreshTokensHandler(c *gin.Context) {
var req refreshTokenRequest
if err := c.ShouldBindJSON(&req); err != nil {
newError(c, http.StatusBadRequest, "invalid request")
return
}
toks, err := a.usersrv.RefreshTokens(c.Request.Context(), req.RefreshToken)
if err != nil {
errorResponse(c, err)
return
}
c.JSON(http.StatusOK, signInResponse{
AccessToken: toks.Access,
RefreshToken: toks.Refresh,
})
}
func (a *APIV1) logOutHandler(c *gin.Context) {
if err := a.usersrv.Logout(c.Request.Context(), getUserID(c)); err != nil {
errorResponse(c, err)
return
}
c.Status(http.StatusNoContent)
}
|