Plan stuff. Log stuff.
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

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{})
})
}