Issue #004 Pagination - Guide de Complétion (85% → 100%)
Status Actuel: 85% complété Temps restant estimé: 15-20 minutes
✅ Déjà Fait (85%)
Infrastructure Complète
✅ DTOs (
pagination.rs,filters.rs) avec 12 tests unitaires✅ 4 traits repository mis à jour
✅ BuildingRepository pagination (100%)
✅ ExpenseRepository pagination (100%)
Pattern Établi
Chaque repository suit exactement le même pattern:
Import
PageRequestetXxxFiltersMéthode
find_all_paginated()avec:Validation page request
Construction WHERE clause dynamique
Whitelist colonnes de tri (SQL injection prevention)
COUNT query pour total_items
SELECT query avec LIMIT/OFFSET
Mapping rows → entities
⏳ Reste à Faire (15%)
1. UnitRepository Pagination (~5 min)
Fichier: backend/src/infrastructure/database/repositories/unit_repository_impl.rs
Étape 1: Ajouter imports
use crate::application::dto::{PageRequest, UnitFilters};
Étape 2: Copier-coller find_all_paginated() depuis ExpenseRepository
Étape 3: Adapter les filtres (UnitFilters):
// Filtres Unit
if filters.building_id.is_some() { ... }
if filters.floor.is_some() { ... }
if filters.has_owner.is_some() {
// owner_id IS NULL ou IS NOT NULL
}
Étape 4: Adapter colonnes de tri:
let allowed_columns = vec!["unit_number", "floor", "surface_area", "created_at"];
let sort_column = page_request.sort_by.as_deref().unwrap_or("unit_number");
Étape 5: Adapter SELECT et mapping:
let data_query = format!(
"SELECT id, building_id, unit_number, unit_type, floor, surface_area, quota, owner_id, created_at, updated_at \
FROM units {} ORDER BY {} {} LIMIT ${} OFFSET ${}",
// ...
);
// Mapping row → Unit (copier depuis find_by_building)
2. OwnerRepository Pagination (~5 min)
Fichier: backend/src/infrastructure/database/repositories/owner_repository_impl.rs
Même processus que Unit:
Imports
PageRequest, OwnerFiltersCopier
find_all_paginated()Adapter filtres (email, phone, last_name, first_name avec ILIKE)
Colonnes tri:
["last_name", "email", "created_at"]SELECT from
ownerstable
3. Tests Optionnels (~5 min)
Fichier: backend/tests/integration/pagination_tests.rs (créer si nécessaire)
#[actix_rt::test]
async fn test_expense_pagination() {
// GET /api/v1/expenses?page=2&per_page=10&sort_by=amount&order=desc
// Assert pagination.total_pages, has_next, etc.
}
🚀 Commande Rapide de Complétion
# 1. Copier pattern ExpenseRepository vers Unit
# Fichier: backend/src/infrastructure/database/repositories/unit_repository_impl.rs
# Adapter: UnitFilters, allowed_columns, SELECT units
# 2. Copier pattern ExpenseRepository vers Owner
# Fichier: backend/src/infrastructure/database/repositories/owner_repository_impl.rs
# Adapter: OwnerFilters, allowed_columns, SELECT owners
# 3. Commit
git add backend/src/infrastructure/database/repositories/*.rs
git commit -m "feat(pagination): Complete pagination for Unit & Owner repositories (#004) ✅"
git push
📋 Checklist Finale
UnitRepository.find_all_paginated() implémenté
OwnerRepository.find_all_paginated() implémenté
Compilation OK (
cargo check)Tests optionnels (recommandés mais pas bloquants)
Commit & push
🎯 Pattern de Référence (ExpenseRepository)
Utiliser backend/src/infrastructure/database/repositories/expense_repository_impl.rs lignes 168-347 comme template exact.
Les seules différences par repository:
Filtres: Adapter selon
XxxFiltersstructColonnes: Adapter
allowed_columnsselon tableSELECT: Adapter colonnes de la table
Mapping: Copier depuis méthode
find_by_xxx()existante
Temps total estimé: 15-20 minutes pour 100% complétion Issue #004 ✅
Dernière mise à jour: 2025-10-23