feat : #12 recherche et filtre

This commit is contained in:
styve Lioumba
2025-11-28 15:15:33 +01:00
parent 4716e82628
commit 4ed6d812db
30 changed files with 308 additions and 487 deletions

View File

@@ -5,19 +5,24 @@ import { Injectable } from '@angular/core';
import PocketBase from 'pocketbase';
import { environment } from '@env/environment';
import { ProfileDTO } from '@app/domain/profiles/dto/create-profile.dto';
import { SearchFilters } from '@app/domain/search/search-filters';
@Injectable({ providedIn: 'root' })
export class PbProfileRepository implements ProfileRepository {
private pb = new PocketBase(environment.baseUrl);
list(): Observable<Profile[]> {
const options = {
sort: 'profession',
expand: 'utilisateur',
filter:
"utilisateur.verified=true && utilisateur.name !='' && profession!='Profession non renseignée' && secteur!='' ",
private defaultOptions = {
expand: 'utilisateur',
};
list(params?: SearchFilters): Observable<Profile[]> {
const requestOptions = {
...this.defaultOptions,
sort: this.onSortSetting(params),
filter: this.onFilterSetting(params).join(' && '),
};
return from(this.pb.collection('profiles').getFullList<Profile>(options));
return from(this.pb.collection('profiles').getFullList<Profile>(requestOptions));
}
getByUserId(userId: string): Observable<Profile> {
@@ -33,4 +38,57 @@ export class PbProfileRepository implements ProfileRepository {
update(id: string, data: Partial<Profile>): Observable<Profile> {
return from(this.pb.collection('profiles').update<Profile>(id, data));
}
private onFilterSetting(params?: SearchFilters): string[] {
const filters: string[] = [
'utilisateur.verified = true',
"utilisateur.name != ''",
"profession != 'Profession non renseignée'",
"secteur != ''",
];
if (params) {
if (params.secteur) {
filters.push(`secteur ~ '${params.secteur}'`);
}
if (params.profession) {
filters.push(`profession ~ '${params.profession}'`);
}
if (params.search) {
filters.push(`utilisateur.name ~ '${params.search}'`);
}
if (params.verified) {
filters.push('estVerifier = true');
}
}
return filters;
}
private onSortSetting(params?: SearchFilters): string {
let sortSetting = '-created';
if (params?.sort) {
switch (params.sort) {
case 'recent':
sortSetting = '-created'; // Du plus récent au plus vieux
break;
case 'name-asc':
sortSetting = '+utilisateur.name'; // Alphabétique A-Z
break;
case 'name-desc':
sortSetting = '-utilisateur.name'; // Alphabétique Z-A
break;
case 'verified':
sortSetting = '-estVerifier,-created';
break;
default:
sortSetting = '-created';
}
}
return sortSetting;
}
}