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