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