Initial commit: Эфир мессенджер
This commit is contained in:
103
internal/api/handlers/users.go
Normal file
103
internal/api/handlers/users.go
Normal file
@@ -0,0 +1,103 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user