modified: serv_nginx/api_bb/internal/handlers/user.go
modified: serv_nginx/api_bb/internal/repository/user_repository.go modified: serv_nginx/api_bb/internal/service/user_service.go modified: serv_nginx/bbvue/src/views/Members.vue set new page for members frontend add new rounter path getAllUsers into backend
This commit is contained in:
@@ -35,7 +35,7 @@ func (h *UserHandler) Routes() chi.Router {
|
|||||||
|
|
||||||
r.Get("/profile", h.GetProfile)
|
r.Get("/profile", h.GetProfile)
|
||||||
r.Post("/editProfile", h.UpdateProfile)
|
r.Post("/editProfile", h.UpdateProfile)
|
||||||
// Убрали маршрут для обслуживания аватаров - теперь это делает AvatarHandler
|
r.Get("/", h.GetUsers) // 👈 ДОБАВЛЯЕМ НОВЫЙ ЭНДПОЙНТ
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -54,6 +54,43 @@ type UserResponse struct {
|
|||||||
UpdatedAt time.Time `json:"updated_at"`
|
UpdatedAt time.Time `json:"updated_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetUsers возвращает список всех пользователей
|
||||||
|
func (h *UserHandler) GetUsers(w http.ResponseWriter, r *http.Request) {
|
||||||
|
h.logger.Info("handling get users request",
|
||||||
|
zap.String("method", r.Method),
|
||||||
|
zap.String("path", r.URL.Path),
|
||||||
|
zap.String("remote_addr", r.RemoteAddr),
|
||||||
|
)
|
||||||
|
|
||||||
|
// Получаем пользователя из контекста для проверки аутентификации
|
||||||
|
_, ok := middleware.GetUserFromContext(r.Context())
|
||||||
|
if !ok {
|
||||||
|
h.logger.Warn("get users failed - authentication required")
|
||||||
|
utils.RespondWithError(w, http.StatusUnauthorized, "Authentication required")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Получаем список пользователей из сервиса
|
||||||
|
users, err := h.userService.GetAllUsers()
|
||||||
|
if err != nil {
|
||||||
|
h.logger.Error("failed to get users from service", zap.Error(err))
|
||||||
|
utils.RespondWithError(w, http.StatusInternalServerError, "Failed to get users: "+err.Error())
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Преобразуем в response формат
|
||||||
|
var userResponses []UserResponse
|
||||||
|
for _, user := range users {
|
||||||
|
userResponses = append(userResponses, toUserResponse(&user))
|
||||||
|
}
|
||||||
|
|
||||||
|
h.logger.Info("users list retrieved successfully",
|
||||||
|
zap.Int("users_count", len(userResponses)),
|
||||||
|
)
|
||||||
|
|
||||||
|
utils.RespondWithJSON(w, http.StatusOK, userResponses)
|
||||||
|
}
|
||||||
|
|
||||||
func (h *UserHandler) GetProfile(w http.ResponseWriter, r *http.Request) {
|
func (h *UserHandler) GetProfile(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
h.logger.Info("handling get profile request",
|
h.logger.Info("handling get profile request",
|
||||||
|
|||||||
@@ -14,18 +14,19 @@ type UserRepository interface {
|
|||||||
Update(user *models.User) error
|
Update(user *models.User) error
|
||||||
Delete(id uint) error
|
Delete(id uint) error
|
||||||
UpdateExcludeEmail(userUpdate *models.User) error
|
UpdateExcludeEmail(userUpdate *models.User) error
|
||||||
UpdateAvatar(userID uint, avatarPath string) error
|
UpdateAvatar(userID uint, avatarPath string) error
|
||||||
|
FindAll() ([]models.User, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *userRepository) UpdateAvatar(userID uint, avatarPath string) error {
|
func (r *userRepository) UpdateAvatar(userID uint, avatarPath string) error {
|
||||||
result := r.db.Model(&models.User{}).Where("id = ?", userID).Update("avatar", avatarPath)
|
result := r.db.Model(&models.User{}).Where("id = ?", userID).Update("avatar", avatarPath)
|
||||||
if result.Error != nil {
|
if result.Error != nil {
|
||||||
return result.Error
|
return result.Error
|
||||||
}
|
}
|
||||||
if result.RowsAffected == 0 {
|
if result.RowsAffected == 0 {
|
||||||
return fmt.Errorf("user not found")
|
return fmt.Errorf("user not found")
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
type userRepository struct {
|
type userRepository struct {
|
||||||
@@ -36,6 +37,13 @@ func NewUserRepository(db *gorm.DB) UserRepository {
|
|||||||
return &userRepository{db: db}
|
return &userRepository{db: db}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add to userRepository implementation
|
||||||
|
func (r *userRepository) FindAll() ([]models.User, error) {
|
||||||
|
var users []models.User
|
||||||
|
err := r.db.Find(&users).Error
|
||||||
|
return users, err
|
||||||
|
}
|
||||||
|
|
||||||
func (r *userRepository) Create(user *models.User) error {
|
func (r *userRepository) Create(user *models.User) error {
|
||||||
return r.db.Create(user).Error
|
return r.db.Create(user).Error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import (
|
|||||||
type UserService interface {
|
type UserService interface {
|
||||||
GetUserProfile(userID uint) (*models.User, error)
|
GetUserProfile(userID uint) (*models.User, error)
|
||||||
UpdateProfile(user *models.User) error
|
UpdateProfile(user *models.User) error
|
||||||
|
GetAllUsers() ([]models.User, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type userService struct {
|
type userService struct {
|
||||||
@@ -37,6 +38,23 @@ func NewUserService(userRepo repository.UserRepository, jwtService JWTService, l
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *userService) GetAllUsers() ([]models.User, error) {
|
||||||
|
s.logger.Info("Fetching all users")
|
||||||
|
|
||||||
|
users, err := s.userRepo.FindAll()
|
||||||
|
if err != nil {
|
||||||
|
s.logger.Error("Failed to fetch users",
|
||||||
|
zap.Error(err),
|
||||||
|
)
|
||||||
|
return nil, fmt.Errorf("failed to get users: %w", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
s.logger.Debug("Successfully fetched users",
|
||||||
|
zap.Int("count", len(users)),
|
||||||
|
)
|
||||||
|
return users, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (s *authService) UpdateProfile(user *models.User) error {
|
func (s *authService) UpdateProfile(user *models.User) error {
|
||||||
s.logger.Info("Updating user profile",
|
s.logger.Info("Updating user profile",
|
||||||
zap.Uint("user_id", user.ID),
|
zap.Uint("user_id", user.ID),
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user