Files
triggerssmith/api/user/handle.go
2026-01-18 22:02:06 +02:00

104 lines
3.0 KiB
Go

package api_user
import (
"encoding/json"
"log/slog"
"net/http"
"strconv"
"git.oblat.lv/alex/triggerssmith/internal/config"
"git.oblat.lv/alex/triggerssmith/internal/server"
"git.oblat.lv/alex/triggerssmith/internal/user"
"github.com/go-chi/chi/v5"
)
type userHandler struct {
cfg *config.Config
u *user.Service
}
func MustRoute(config *config.Config, userService *user.Service) func(chi.Router) {
if config == nil {
panic("config is nil")
}
if userService == nil {
panic("userService is nil")
}
h := &userHandler{
cfg: config,
u: userService,
}
return func(r chi.Router) {
r.Get("/", h.getUsers) // /users
r.Get("/{userId}", h.GetUser) // /users/{userId}
//r.Post("/", h.createUser) // /users
//r.Patch("/{userId}", h.updateUser) // /users/{userId}
//r.Delete("/{userId}", h.deleteUser) // /users/{userId}
}
}
type getUserResponseUnit struct {
UserId uint `json:"userId"`
UserName string `json:"name"`
}
type getUsersResponse []getUserResponseUnit
// @Summary Get all user list
// @Tags users
// @Produce json
// @Success 200 {object} getUsersResponse
// @Failure 500 {object} server.ProblemDetails
// @Router /api/users [get]
func (h *userHandler) getUsers(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
users, err := h.u.GetUsers()
if err != nil {
slog.Error("failed get users", "err", err.Error())
server.WriteProblem(w, http.StatusInternalServerError, "/errors/internal-server-error", "Internal Server Error", "Failed to get all user list", r)
}
var resp_users getUsersResponse
for _, user := range users {
resp_users = append(resp_users, getUserResponseUnit{
UserId: user.ID,
UserName: user.Username,
})
}
json.NewEncoder(w).Encode(resp_users)
}
// @Summary Get user by ID
// @Tags users
// @Produce json
// @Param userId path int true "User ID"
// @Success 200 {object} getUserResponseUnit
// @Failure 400 {object} server.ProblemDetails
// @Failure 404 {object} server.ProblemDetails
// @Failure 500 {object} server.ProblemDetails
// @Router /api/users/{userId} [get]
func (h *userHandler) GetUser(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
userIdStr := chi.URLParam(r, "userId")
userId, err := strconv.Atoi(userIdStr)
if err != nil || userId < 0 {
server.WriteProblem(w, http.StatusBadRequest, "/errors/acl/invalid-user-id", "Invalid user ID", "User ID must be positive integer", r)
return
}
user, err := h.u.GetBy("id", userIdStr)
if err != nil {
slog.Error("failed get user by id", "err", err.Error())
server.WriteProblem(w, http.StatusInternalServerError, "/errors/internal-server-error", "Internal Server Error", "Failed to get user by ID, may not found", r)
return
}
if user == nil {
server.WriteProblem(w, http.StatusNotFound, "/errors/not-found", "Not Found", "User not found", r)
return
}
resp_user := getUserResponseUnit{
UserId: user.ID,
UserName: user.Username,
}
json.NewEncoder(w).Encode(resp_user)
}