103 lines
2.7 KiB
Go
103 lines
2.7 KiB
Go
package handlers
|
||
|
||
import (
|
||
"context"
|
||
"encoding/json"
|
||
"messenger/internal/api/middleware"
|
||
"messenger/internal/api/responses"
|
||
"messenger/internal/models"
|
||
"messenger/internal/service"
|
||
"net/http"
|
||
"strconv"
|
||
)
|
||
|
||
type UserHandler struct {
|
||
userService *service.UserService
|
||
}
|
||
|
||
func NewUserHandler(userService *service.UserService) *UserHandler {
|
||
return &UserHandler{userService: userService}
|
||
}
|
||
|
||
type UpdateProfileRequest struct {
|
||
DisplayName *string `json:"display_name,omitempty"`
|
||
Bio *string `json:"bio,omitempty"`
|
||
}
|
||
|
||
func (h *UserHandler) GetProfile(w http.ResponseWriter, r *http.Request) {
|
||
user := middleware.GetUserFromContext(r.Context())
|
||
if user == nil {
|
||
responses.Unauthorized(w, "user not found")
|
||
return
|
||
}
|
||
|
||
profile, err := h.userService.GetProfile(r.Context(), user.ID)
|
||
if err != nil {
|
||
responses.NotFound(w, err.Error())
|
||
return
|
||
}
|
||
|
||
responses.Success(w, http.StatusOK, profile)
|
||
}
|
||
|
||
func (h *UserHandler) UpdateProfile(w http.ResponseWriter, r *http.Request) {
|
||
user := middleware.GetUserFromContext(r.Context())
|
||
if user == nil {
|
||
responses.Unauthorized(w, "user not found")
|
||
return
|
||
}
|
||
|
||
var req UpdateProfileRequest
|
||
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||
responses.BadRequest(w, "invalid request body")
|
||
return
|
||
}
|
||
|
||
if err := h.userService.UpdateProfile(r.Context(), user.ID, req.DisplayName, req.Bio); err != nil {
|
||
responses.BadRequest(w, err.Error())
|
||
return
|
||
}
|
||
|
||
responses.Success(w, http.StatusOK, map[string]string{"message": "profile updated"})
|
||
}
|
||
|
||
func (h *UserHandler) SearchUsers(w http.ResponseWriter, r *http.Request) {
|
||
query := r.URL.Query().Get("q")
|
||
if query == "" {
|
||
responses.BadRequest(w, "search query required")
|
||
return
|
||
}
|
||
|
||
limit := 20
|
||
if l := r.URL.Query().Get("limit"); l != "" {
|
||
if parsed, err := strconv.Atoi(l); err == nil && parsed > 0 && parsed <= 100 {
|
||
limit = parsed
|
||
}
|
||
}
|
||
|
||
users, err := h.userService.SearchUsers(r.Context(), query, limit)
|
||
if err != nil {
|
||
responses.InternalServerError(w, err.Error())
|
||
return
|
||
}
|
||
|
||
responses.Success(w, http.StatusOK, users)
|
||
}
|
||
|
||
func (h *UserHandler) GetUserByID(w http.ResponseWriter, r *http.Request) {
|
||
// Реализация с chi.URLParam будет в main.go
|
||
// Пока заглушка
|
||
responses.Success(w, http.StatusOK, nil)
|
||
}
|
||
|
||
// GetUserByLoginFromContext - метод для получения пользователя по логину (используется в других хендлерах)
|
||
func (h *UserHandler) GetUserByLogin(ctx context.Context, login string) (*models.SafeUser, error) {
|
||
user, err := h.userService.GetUserByLogin(ctx, login)
|
||
if err != nil {
|
||
return nil, err
|
||
}
|
||
if user == nil {
|
||
return nil, nil
|
||
}
|
||
return user.ToSafe(), nil
|
||
} |