core/services/users/users.go
2024-07-04 10:06:46 +07:00

169 lines
4.3 KiB
Go

package users
import (
"system-trace/core/database"
"system-trace/core/parsers"
"system-trace/core/types"
"time"
"github.com/gofiber/fiber/v2"
)
// MARK: GetUsers godoc
// @Summary Get users (with pagination)
// @Description Returns array of users and count
// @Tags users
// @Produce json
// @Param count query int true "Count of rows" minimum(10) maximum(100)
// @Param offset query int true "Rows to skip" minumum(0)
// @Header 200 {string} Token "accessToken=...;refreshToken=..."
// @Success 200 {object} types.JSONPagination
// @Router /users [get]
func GetUsersHandler(c *fiber.Ctx) error {
// TODO permission validate
s := c.Query("search")
p, err := parsers.ParsePagination(c)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
ob, err := parsers.ParseOrder(c)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
users, cursor, err := database.FindUsers(s, p, ob)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(types.JSONPagination{
Data: users,
Cursor: cursor,
})
}
// MARK: GetUserByID godoc
// @Summary Get user by ID
// @Description Returns user instance
// @Tags users
// @Produce json
// @Param id path int true "User ID" minimum(1)
// @Header 200 {string} Token "accessToken=...;refreshToken=..."
// @Success 200 {object} database.User
// @Router /users/:id [get]
func GetUserByIDHandler(c *fiber.Ctx) error {
// TODO permission validate
id, err := c.ParamsInt("id")
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
user, err := database.FindUserByID(id)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
return c.Status(fiber.StatusOK).JSON(user)
}
// MARK: CreateUser godoc
// @Summary Create user
// @Description Create user with specified data
// @Tags users
// @Produce json
// @Param request body database.User true "Request body"
// @Header 200 {string} Token "accessToken=...;refreshToken=..."
// @Success 200
// @Router /users [post]
func CreateUserHandler(c *fiber.Ctx) error {
// TODO permission validate
u := new(database.User)
if err := c.BodyParser(u); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
err := database.InsertUser(u)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
return c.SendStatus(fiber.StatusOK)
}
// MARK: UpdateUser godoc
// @Summary Update user
// @Description Update user with specified data
// @Tags users
// @Produce json
// @Param request body database.User true "Request body"
// @Header 200 {string} Token "accessToken=...;refreshToken=..."
// @Success 200
// @Router /users [patch]
func UpdateUserHandler(c *fiber.Ctx) error {
// TODO permission validate
u := new(database.User)
if err := c.BodyParser(u); err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
err := database.UpdateUser(u, []string{"*"})
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
return c.SendStatus(fiber.StatusOK)
}
// MARK: DeleteUser godoc
// @Summary Delete user
// @Description Delete user by ID
// @Tags users
// @Produce json
// @Param id path int true "User ID" minimum(1)
// @Header 200 {string} Token "accessToken=...;refreshToken=..."
// @Success 200
// @Router /users/:id [delete]
func DeleteUserHandler(c *fiber.Ctx) error {
// TODO permission validate
id, err := c.ParamsInt("id")
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
err = database.DeleteUser(id)
if err != nil {
return c.Status(fiber.StatusBadRequest).JSON(types.JSONError{
Error: err.Error(),
})
}
return c.SendStatus(fiber.StatusOK)
}
func SetLoginTime(u *database.User) error {
u.LastLogin = time.Now()
return database.UpdateUser(u, []string{"last_login"})
}