Shioriko/pkg/app/user_routes.go
2021-05-10 09:45:32 +07:00

125 lines
2.7 KiB
Go

package app
import (
"net/http"
"github.com/Damillora/Shioriko/pkg/config"
"github.com/Damillora/Shioriko/pkg/database"
"github.com/Damillora/Shioriko/pkg/middleware"
"github.com/Damillora/Shioriko/pkg/models"
"github.com/Damillora/Shioriko/pkg/services"
"github.com/gin-gonic/gin"
"github.com/go-playground/validator/v10"
)
func InitializeUserRoutes(g *gin.Engine) {
g.POST("/api/user/register", registerUser)
protected := g.Group("/api/user").Use(middleware.AuthMiddleware())
{
protected.GET("/profile", userProfile)
protected.POST("/update", userUpdate)
}
}
func registerUser(c *gin.Context) {
var disableRegistration = config.CurrentConfig.DisableRegistration
if disableRegistration == "true" {
c.JSON(http.StatusForbidden, models.ErrorResponse{
Code: http.StatusForbidden,
Message: "Registration is disabled",
})
c.Abort()
return
}
var model models.UserCreateModel
err := c.ShouldBindJSON(&model)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
c.Abort()
return
}
validate := validator.New()
err = validate.Struct(model)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
c.Abort()
return
}
user, err := services.CreateUser(model)
if err != nil {
c.JSON(http.StatusInternalServerError, models.ErrorResponse{
Code: http.StatusInternalServerError,
Message: "Cannot create user",
})
c.Abort()
return
}
c.JSON(http.StatusOK, models.UserProfileResponse{
Email: user.Email,
Username: user.Username,
})
}
func userProfile(c *gin.Context) {
result, ok := c.Get("user")
if ok {
user := result.(*database.User)
c.JSON(http.StatusOK, models.UserProfileResponse{
Email: user.Email,
Username: user.Username,
})
} else {
c.JSON(http.StatusBadRequest, models.ErrorResponse{
Code: http.StatusBadRequest,
Message: "User does not exist",
})
}
}
func userUpdate(c *gin.Context) {
var model models.UserUpdateModel
err := c.ShouldBindJSON(&model)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
c.Abort()
return
}
validate := validator.New()
err = validate.Struct(model)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse{
Code: http.StatusBadRequest,
Message: err.Error(),
})
c.Abort()
return
}
result, ok := c.Get("user")
if ok {
user := result.(*database.User)
services.UpdateUser(user.ID, model)
} else {
c.JSON(http.StatusBadRequest, models.ErrorResponse{
Code: http.StatusBadRequest,
Message: "User does not exist",
})
}
}