package handlers import ( "net/http" "strconv" "github.com/labstack/echo/v4" "github.com/treytartt/honeydue-api/internal/apperrors" "github.com/treytartt/honeydue-api/internal/middleware" "github.com/treytartt/honeydue-api/internal/services" ) // UserHandler handles user-related HTTP requests type UserHandler struct { userService *services.UserService } // NewUserHandler creates a new user handler func NewUserHandler(userService *services.UserService) *UserHandler { return &UserHandler{ userService: userService, } } // ListUsers handles GET /api/users/ func (h *UserHandler) ListUsers(c echo.Context) error { user, err := middleware.MustGetAuthUser(c) if err != nil { return err } // Only allow listing users that share residences with the current user users, err := h.userService.ListUsersInSharedResidences(user.ID) if err != nil { return err } return c.JSON(http.StatusOK, map[string]interface{}{ "count": len(users), "results": users, }) } // GetUser handles GET /api/users/:id/ func (h *UserHandler) GetUser(c echo.Context) error { user, err := middleware.MustGetAuthUser(c) if err != nil { return err } userID, err := strconv.ParseUint(c.Param("id"), 10, 32) if err != nil { return apperrors.BadRequest("error.invalid_user_id") } // Can only view users that share a residence targetUser, err := h.userService.GetUserIfSharedResidence(uint(userID), user.ID) if err != nil { return err } return c.JSON(http.StatusOK, targetUser) } // ListProfiles handles GET /api/users/profiles/ func (h *UserHandler) ListProfiles(c echo.Context) error { user, err := middleware.MustGetAuthUser(c) if err != nil { return err } // List profiles of users in shared residences profiles, err := h.userService.ListProfilesInSharedResidences(user.ID) if err != nil { return err } return c.JSON(http.StatusOK, map[string]interface{}{ "count": len(profiles), "results": profiles, }) }