init
This commit is contained in:
224
controllers/userController.go
Normal file
224
controllers/userController.go
Normal file
@@ -0,0 +1,224 @@
|
||||
package controllers
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
|
||||
"github.com/gin-gonic/gin"
|
||||
_ "github.com/swaggo/swag/example/celler/httputil"
|
||||
"gorm.io/gorm"
|
||||
|
||||
"git.dynamicdiscord.de/harakat/backend/models"
|
||||
"git.dynamicdiscord.de/harakat/backend/repositories"
|
||||
"git.dynamicdiscord.de/harakat/backend/services"
|
||||
)
|
||||
|
||||
type UserController struct{}
|
||||
|
||||
func NewUserController() UserController {
|
||||
return UserController{}
|
||||
}
|
||||
|
||||
type EmptyResponse struct{}
|
||||
|
||||
type LoginRequest struct {
|
||||
Email string `json:"email" binding:"required"`
|
||||
Password string `json:"password" binding:"required"`
|
||||
}
|
||||
|
||||
type RegisterRequest struct {
|
||||
LoginRequest
|
||||
Name string `json:"name" binding:"required"`
|
||||
}
|
||||
|
||||
// Register godoc
|
||||
// @Summary Register user with invite token
|
||||
// @Description register user with invite token
|
||||
// @Tags user
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param token path string false "invite token"
|
||||
// @Param user body RegisterRequest true "user data"
|
||||
// @Success 200 {object} EmptyResponse
|
||||
// @Failure 400 {object} httputil.HTTPError
|
||||
// @Failure 404 {object} httputil.HTTPError
|
||||
// @Failure 500 {object} httputil.HTTPError
|
||||
// @Router /user/register/{token} [post]
|
||||
func (uc *UserController) Register(c *gin.Context) {
|
||||
var body RegisterRequest
|
||||
err := c.BindJSON(&body)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("Error: ", err)
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
name := body.Name
|
||||
email := body.Email
|
||||
password := body.Password
|
||||
|
||||
//first registered user is admin
|
||||
isEmpty, _ := repositories.Users.IsEmpty()
|
||||
if isEmpty {
|
||||
_, err := services.Users.Register(name, email, password, true)
|
||||
if err != nil {
|
||||
fmt.Println("Error: ", err)
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Failed to create user",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{})
|
||||
return
|
||||
}
|
||||
|
||||
//for any other user token is required
|
||||
token := c.PostForm("token")
|
||||
|
||||
if token == "" {
|
||||
c.JSON(http.StatusForbidden, gin.H{
|
||||
"error": "No valid token was given.",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
tokenExists, err := repositories.Tokens.Exists(token)
|
||||
|
||||
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
if !tokenExists {
|
||||
c.JSON(http.StatusForbidden, gin.H{
|
||||
"error": "No valid token was given.",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
_, err = services.Users.Register(name, email, password, false)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Registration failed",
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
err = repositories.Tokens.Delete(token)
|
||||
|
||||
if err != nil {
|
||||
fmt.Println("Could not delete RegisterToken: ", err)
|
||||
}
|
||||
|
||||
c.JSON(http.StatusOK, gin.H{})
|
||||
}
|
||||
|
||||
// Login godoc
|
||||
// @Summary Login user
|
||||
// @Description Login user
|
||||
// @Tags user
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param user body LoginRequest true "user data"
|
||||
// @Success 200 {object} EmptyResponse
|
||||
// @Failure 400 {object} httputil.HTTPError
|
||||
// @Failure 401 {object} httputil.HTTPError
|
||||
// @Failure 500 {object} httputil.HTTPError
|
||||
// @Router /user/login [post]
|
||||
func (uc *UserController) Login(c *gin.Context) {
|
||||
//Get the email/passwd off req body
|
||||
var body LoginRequest
|
||||
err := c.Bind(&body)
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Login Failed",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
tokenString, err := services.Users.Login(body.Email, body.Password)
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": "Login Failed",
|
||||
})
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
user, _ := repositories.Users.GetByEmail(body.Email)
|
||||
c.Set("user", user)
|
||||
|
||||
// send it back
|
||||
c.SetSameSite(http.SameSiteLaxMode)
|
||||
c.SetCookie("Authorization", tokenString, 3600*24, "", "", false, true)
|
||||
c.JSON(http.StatusOK, gin.H{})
|
||||
}
|
||||
|
||||
// Login godoc
|
||||
// @Summary User Status
|
||||
// @Description Get user status of current session
|
||||
// @Tags user
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {object} EmptyResponse
|
||||
// @Failure 400 {object} httputil.HTTPError
|
||||
// @Failure 500 {object} httputil.HTTPError
|
||||
// @Router /user/status [get]
|
||||
func (uc *UserController) Status(c *gin.Context) {
|
||||
user, exists := c.Get("user")
|
||||
|
||||
if exists {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": fmt.Sprintf("Logged in with userID: %d", user.(models.User).ID),
|
||||
})
|
||||
} else {
|
||||
c.JSON(http.StatusOK, gin.H{
|
||||
"message": "Currently not logged in.",
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func CreateSessionData(c *gin.Context, extra any) gin.H {
|
||||
user, exists := c.Get("user")
|
||||
userImpl, _ := user.(models.User)
|
||||
|
||||
return gin.H{
|
||||
"loggedIn": exists,
|
||||
"isAdmin": userImpl.IsAdmin,
|
||||
"data": extra,
|
||||
}
|
||||
}
|
||||
|
||||
func (rc *UserController) InitAdmin(c *gin.Context) {
|
||||
isEmpty, err := repositories.Users.IsEmpty()
|
||||
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{
|
||||
"error": err.Error(),
|
||||
})
|
||||
return
|
||||
}
|
||||
|
||||
fmt.Println("FOOO")
|
||||
if !isEmpty {
|
||||
c.JSON(http.StatusForbidden, gin.H{
|
||||
"error": "Registration is closed",
|
||||
})
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
fmt.Println("FOOO")
|
||||
rc.Register(c)
|
||||
}
|
||||
Reference in New Issue
Block a user