- Added GET /tracks/search route in setupTrackRoutes - Initialized TrackSearchService and set it in TrackHandler - Handler SearchTracks and TrackSearchService already existed - Supports query params: q, genre, artist, page, limit - Service handles pagination, filtering, and returns tracks with pagination metadata Phase: PHASE-2 Priority: P1 Progress: 18/267 (6.7%)
68 lines
1.9 KiB
Go
68 lines
1.9 KiB
Go
package services
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"veza-backend-api/internal/models"
|
|
)
|
|
|
|
// SearchUsersParams représente les paramètres de recherche d'utilisateurs
|
|
// BE-API-008: Implement user search endpoint
|
|
type SearchUsersParams struct {
|
|
Query string // Recherche par username, email, first_name, last_name
|
|
Page int // Numéro de page (défaut: 1)
|
|
Limit int // Nombre de résultats par page (défaut: 20, max: 100)
|
|
}
|
|
|
|
// SearchUsers recherche des utilisateurs selon les critères fournis
|
|
// BE-API-008: Implement user search endpoint
|
|
func (s *UserService) SearchUsers(ctx context.Context, params SearchUsersParams) ([]*models.User, int64, error) {
|
|
if s.db == nil {
|
|
return nil, 0, errors.New("database connection not available")
|
|
}
|
|
|
|
// Appliquer la pagination
|
|
if params.Limit <= 0 {
|
|
params.Limit = 20
|
|
}
|
|
if params.Limit > 100 {
|
|
params.Limit = 100
|
|
}
|
|
if params.Page < 1 {
|
|
params.Page = 1
|
|
}
|
|
offset := (params.Page - 1) * params.Limit
|
|
|
|
// Construire la requête de recherche
|
|
query := s.db.WithContext(ctx).Model(&models.User{})
|
|
|
|
// Recherche par query (username, email, first_name, last_name)
|
|
if params.Query != "" {
|
|
searchPattern := "%" + params.Query + "%"
|
|
query = query.Where(
|
|
"username ILIKE ? OR email ILIKE ? OR first_name ILIKE ? OR last_name ILIKE ?",
|
|
searchPattern, searchPattern, searchPattern, searchPattern,
|
|
)
|
|
}
|
|
|
|
// Compter le total avant pagination
|
|
var total int64
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, fmt.Errorf("failed to count users: %w", err)
|
|
}
|
|
|
|
// Appliquer pagination et récupérer les résultats
|
|
var users []*models.User
|
|
if err := query.Offset(offset).Limit(params.Limit).Find(&users).Error; err != nil {
|
|
return nil, 0, fmt.Errorf("failed to search users: %w", err)
|
|
}
|
|
|
|
// Exclure les mots de passe des résultats
|
|
for _, user := range users {
|
|
user.PasswordHash = ""
|
|
}
|
|
|
|
return users, total, nil
|
|
}
|