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 участников объединены любовью к бегу и стремлением к новым достижениям

-
{{ totalMembers }}
+
{{ stats.totalMembers }}
Участников
-
{{ activeMembers }}
+
{{ stats.activeMembers }}
Активных
-
{{ citiesCount }}
+
{{ stats.citiesCount }}
Городов
-
{{ totalDistance }}
+
{{ stats.totalDistance }}
Км за год
@@ -34,25 +34,20 @@

Знакомьтесь с нашей командой

Бегуны разных уровней, объединенные общей страстью

- +
- - + @@ -61,38 +56,25 @@
- - -
- -
- - + + + + + + +
- -
@@ -103,126 +85,96 @@

- Показано {{ filteredMembers.length }} из {{ totalMembers }} участников + Показано {{ filteredMembers.length }} из {{ members.length }} участников по запросу "{{ searchQuery }}"

+ +
+
+

Загружаем участников...

+
+ + +
+
⚠️
+

Ошибка загрузки

+

{{ error }}

+ +
+ -
-
+
+
- -
-
- {{ getLevelLabel(member.level) }} + +
+ {{ getExperienceLabel(member.experience) }}
-

{{ member.name }}

-

📍 {{ member.city }}

- +

{{ member.firstName }} {{ member.lastName }}

+

📧 {{ member.email }}

+
-
- 🏃 - {{ member.weeklyDistance }} км/нед +
+ 📱 + {{ member.phone }}
📅 - {{ member.memberSince }} + Участник с {{ formatDate(member.createdAt) }}
-
+
🎯 - {{ member.bestDistance }} + Опыт: {{ getExperienceLabel(member.experience) }}
-
+
- PB: {{ member.pb }} + Цели: {{ truncateText(member.goals, 30) }}
-
- - {{ interest }} +
+ + {{ getGoalCategory(member.goals) }} - - +{{ member.interests.length - 2 }} + + 📰 Рассылка
- -
- - @@ -276,7 +244,7 @@

Стань частью нашей беговой семьи!

Присоединяйся к сообществу единомышленников и начни свой путь к новым достижениям

- +
@@ -284,21 +252,23 @@

Анна, участник 1 год

-

"Пришла с нулевым опытом, сейчас готовлюсь к марафону. Благодаря поддержке клуба нашла друзей и полюбила бег!"

+

"Пришла с нулевым опытом, сейчас готовлюсь к марафону. Благодаря поддержке клуба нашла друзей и + полюбила бег!"

🏃 10км за 48:15 📈 Улучшение +12 мин
- +
Данил

Данил, участник 2 года

-

"От первых 5 км до ультрамарафона! В клубе нашел не только тренера, но и верных друзей для совместных тренировок."

+

"От первых 5 км до ультрамарафона! В клубе нашел не только тренера, но и верных друзей для совместных + тренировок."

🏔️ 120 км трейл ⭐ 5+ личных рекордов @@ -358,94 +328,66 @@