You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
75 lines
1.6 KiB
75 lines
1.6 KiB
package api
|
|
|
|
import (
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gisle/stufflog/models"
|
|
"github.com/gisle/stufflog/services"
|
|
"github.com/gisle/stufflog/slerrors"
|
|
)
|
|
|
|
func User(g *gin.RouterGroup, auth *services.AuthService) {
|
|
type loginRegisterRequest struct {
|
|
Username string `json:"username"`
|
|
Password string `json:"password"`
|
|
}
|
|
type resObj struct {
|
|
User *models.User `json:"user,omitempty"`
|
|
}
|
|
|
|
g.Use(auth.GinSessionMiddleware(false))
|
|
|
|
// GET / – Check session
|
|
g.GET("/", func(c *gin.Context) {
|
|
c.JSON(200, resObj{
|
|
User: auth.UserFromContext(c.Request.Context()),
|
|
})
|
|
})
|
|
|
|
g.POST("/register", func(c *gin.Context) {
|
|
data := loginRegisterRequest{}
|
|
err := c.BindJSON(&data)
|
|
if err != nil {
|
|
slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()})
|
|
return
|
|
}
|
|
|
|
user, err := auth.Register(c.Request.Context(), data.Username, data.Password)
|
|
if err != nil {
|
|
slerrors.GinRespond(c, err)
|
|
return
|
|
}
|
|
|
|
c.JSON(200, resObj{User: user})
|
|
})
|
|
|
|
g.POST("/login", func(c *gin.Context) {
|
|
data := loginRegisterRequest{}
|
|
err := c.BindJSON(&data)
|
|
if err != nil {
|
|
slerrors.GinRespond(c, &slerrors.SLError{Code: 400, Text: err.Error()})
|
|
return
|
|
}
|
|
|
|
user, session, err := auth.Login(c.Request.Context(), data.Username, data.Password)
|
|
if err != nil {
|
|
slerrors.GinRespond(c, err)
|
|
return
|
|
}
|
|
|
|
auth.GinSaveSession(c, *session)
|
|
|
|
c.JSON(200, resObj{User: user})
|
|
})
|
|
|
|
g.POST("/logout", func(c *gin.Context) {
|
|
err := auth.Logout(c.Request.Context())
|
|
if err != nil {
|
|
slerrors.GinRespond(c, err)
|
|
return
|
|
}
|
|
|
|
auth.GinClearSession(c)
|
|
|
|
c.JSON(200, resObj{})
|
|
})
|
|
}
|