Анна, участник 1 год
-"Пришла с нулевым опытом, сейчас готовлюсь к марафону. Благодаря поддержке клуба нашла друзей и полюбила бег!"
+"Пришла с нулевым опытом, сейчас готовлюсь к марафону. Благодаря поддержке клуба нашла друзей и + полюбила бег!"
diff --git a/serv_nginx/api_bb/internal/handlers/user.go b/serv_nginx/api_bb/internal/handlers/user.go index 7b308bf..36cd70e 100644 --- a/serv_nginx/api_bb/internal/handlers/user.go +++ b/serv_nginx/api_bb/internal/handlers/user.go @@ -35,7 +35,7 @@ func (h *UserHandler) Routes() chi.Router { r.Get("/profile", h.GetProfile) r.Post("/editProfile", h.UpdateProfile) - // Убрали маршрут для обслуживания аватаров - теперь это делает AvatarHandler + r.Get("/", h.GetUsers) // 👈 ДОБАВЛЯЕМ НОВЫЙ ЭНДПОЙНТ return r } @@ -54,6 +54,43 @@ type UserResponse struct { 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) { h.logger.Info("handling get profile request", diff --git a/serv_nginx/api_bb/internal/repository/user_repository.go b/serv_nginx/api_bb/internal/repository/user_repository.go index 0f1e9e1..3c8d39f 100644 --- a/serv_nginx/api_bb/internal/repository/user_repository.go +++ b/serv_nginx/api_bb/internal/repository/user_repository.go @@ -14,18 +14,19 @@ type UserRepository interface { Update(user *models.User) error Delete(id uint) 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 { - result := r.db.Model(&models.User{}).Where("id = ?", userID).Update("avatar", avatarPath) - if result.Error != nil { - return result.Error - } - if result.RowsAffected == 0 { - return fmt.Errorf("user not found") - } - return nil + result := r.db.Model(&models.User{}).Where("id = ?", userID).Update("avatar", avatarPath) + if result.Error != nil { + return result.Error + } + if result.RowsAffected == 0 { + return fmt.Errorf("user not found") + } + return nil } type userRepository struct { @@ -36,6 +37,13 @@ func NewUserRepository(db *gorm.DB) UserRepository { 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 { return r.db.Create(user).Error } diff --git a/serv_nginx/api_bb/internal/service/user_service.go b/serv_nginx/api_bb/internal/service/user_service.go index 9ae243b..abe068c 100644 --- a/serv_nginx/api_bb/internal/service/user_service.go +++ b/serv_nginx/api_bb/internal/service/user_service.go @@ -13,6 +13,7 @@ import ( type UserService interface { GetUserProfile(userID uint) (*models.User, error) UpdateProfile(user *models.User) error + GetAllUsers() ([]models.User, error) } 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 { s.logger.Info("Updating user profile", zap.Uint("user_id", user.ID), diff --git a/serv_nginx/bbvue/src/views/Members.vue b/serv_nginx/bbvue/src/views/Members.vue index e66a92f..8dce6b9 100644 --- a/serv_nginx/bbvue/src/views/Members.vue +++ b/serv_nginx/bbvue/src/views/Members.vue @@ -8,19 +8,19 @@
Более 150 участников объединены любовью к бегу и стремлением к новым достижениям
Бегуны разных уровней, объединенные общей страстью
- +
- Показано {{ filteredMembers.length }} из {{ totalMembers }} участников
+ Показано {{ filteredMembers.length }} из {{ members.length }} участников
по запросу "{{ searchQuery }}"
Загружаем участников...
+{{ error }}
+📍 {{ member.city }}
- +📧 {{ member.email }}
+Будьте первым, кто присоединится к нашему клубу!
+Попробуйте изменить параметры поиска или фильтры
@@ -230,6 +182,22 @@ 🗑️ Сбросить фильтрыПрисоединяйся к сообществу единомышленников и начни свой путь к новым достижениям
- +