diff --git a/api/router.go b/api/router.go index c040963..bf04428 100644 --- a/api/router.go +++ b/api/router.go @@ -62,7 +62,7 @@ func NewRouter(deps RouterDependencies) *Router { cfg: deps.Configuration, authService: deps.AuthService, aclService: deps.ACLService, - userService: deps.UserService, + userService: deps.UserService, } } diff --git a/api/user/handle.go b/api/user/handle.go index a4442d8..49df3d2 100644 --- a/api/user/handle.go +++ b/api/user/handle.go @@ -4,6 +4,7 @@ import ( "encoding/json" "log/slog" "net/http" + "strconv" "git.oblat.lv/alex/triggerssmith/internal/config" "git.oblat.lv/alex/triggerssmith/internal/server" @@ -29,8 +30,8 @@ func MustRoute(config *config.Config, userService *user.Service) func(chi.Router } return func(r chi.Router) { - r.Get("/", h.getUsers) // /users - //r.Get("/{userId}", h.GetUser) // /users/{userId} + 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} @@ -66,3 +67,37 @@ func (h *userHandler) getUsers(w http.ResponseWriter, r *http.Request) { } 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) +}