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