From 8e176f2c366882a0420dec74ec2a93ef4786bcda Mon Sep 17 00:00:00 2001 From: mkovalua Date: Tue, 4 Nov 2025 22:47:54 +0200 Subject: [PATCH 1/3] add search by guid for contributors and moderators add modal --- .../features/moderation/services/moderators.service.ts | 5 +++-- .../moderation/store/moderators/moderators.state.ts | 9 ++++++++- src/app/shared/services/contributors.service.ts | 5 +++-- .../shared/stores/contributors/contributors.state.ts | 10 +++++++++- 4 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/app/features/moderation/services/moderators.service.ts b/src/app/features/moderation/services/moderators.service.ts index 7c32d8461..016c8b313 100644 --- a/src/app/features/moderation/services/moderators.service.ts +++ b/src/app/features/moderation/services/moderators.service.ts @@ -84,8 +84,9 @@ export class ModeratorsService { return this.jsonApiService.delete(baseUrl); } - searchUsers(value: string, page = 1): Observable> { - const baseUrl = `${this.apiUrl}/users/?filter[full_name]=${value}&page=${page}`; + searchUsers(value: string, page = 1, findById = false): Observable> { + const filterParamName = findById ? 'id' : 'full_name'; + const baseUrl = `${this.apiUrl}/users/?filter[${filterParamName}]=${value}&page=${page}`; return this.jsonApiService .get>(baseUrl) diff --git a/src/app/features/moderation/store/moderators/moderators.state.ts b/src/app/features/moderation/store/moderators/moderators.state.ts index 27d4aee17..7e27c00b9 100644 --- a/src/app/features/moderation/store/moderators/moderators.state.ts +++ b/src/app/features/moderation/store/moderators/moderators.state.ts @@ -1,6 +1,6 @@ import { Action, State, StateContext } from '@ngxs/store'; -import { catchError, of, tap } from 'rxjs'; +import { catchError, iif, of, switchMap, tap } from 'rxjs'; import { inject, Injectable } from '@angular/core'; @@ -142,6 +142,13 @@ export class ModeratorsState { } return this.moderatorsService.searchUsers(action.searchValue, action.page).pipe( + switchMap((users) => + iif( + () => users.data.length === 0 && action.searchValue?.length === 5, + this.moderatorsService.searchUsers(action.searchValue || '', 1, true), + of(users) + ) + ), tap((users) => { ctx.patchState({ users: { diff --git a/src/app/shared/services/contributors.service.ts b/src/app/shared/services/contributors.service.ts index 97c0fdcfb..9cd19e453 100644 --- a/src/app/shared/services/contributors.service.ts +++ b/src/app/shared/services/contributors.service.ts @@ -94,8 +94,9 @@ export class ContributorsService { ); } - searchUsers(value: string, page = 1): Observable> { - const baseUrl = `${this.apiUrl}/users/?filter[full_name]=${value}&page=${page}`; + searchUsers(value: string, page = 1, findById = false): Observable> { + const filterParamName = findById ? 'id' : 'full_name'; + const baseUrl = `${this.apiUrl}/users/?filter[${filterParamName}]=${value}&page=${page}`; return this.jsonApiService .get>(baseUrl) diff --git a/src/app/shared/stores/contributors/contributors.state.ts b/src/app/shared/stores/contributors/contributors.state.ts index 0e738afec..abf6f3394 100644 --- a/src/app/shared/stores/contributors/contributors.state.ts +++ b/src/app/shared/stores/contributors/contributors.state.ts @@ -1,6 +1,6 @@ import { Action, State, StateContext } from '@ngxs/store'; -import { catchError, of, tap } from 'rxjs'; +import { catchError, iif, of, switchMap, tap } from 'rxjs'; import { inject, Injectable } from '@angular/core'; @@ -296,7 +296,15 @@ export class ContributorsState { } return this.contributorsService.searchUsers(action.searchValue, action.page).pipe( + switchMap((users) => + iif( + () => users.data.length === 0 && action.searchValue?.length === 5, + this.contributorsService.searchUsers(action.searchValue || '', 1, true), + of(users) + ) + ), tap((users) => { + alert(JSON.stringify(users)); const addedContributorsIds = state.contributorsList.data.map((contributor) => contributor.userId); ctx.patchState({ From 19a83428a71e2d504c7b0ff77c66afe67d1d9eef Mon Sep 17 00:00:00 2001 From: mkovalua Date: Tue, 4 Nov 2025 22:58:37 +0200 Subject: [PATCH 2/3] remove redundant alert() --- src/app/shared/stores/contributors/contributors.state.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/app/shared/stores/contributors/contributors.state.ts b/src/app/shared/stores/contributors/contributors.state.ts index abf6f3394..8d6ef4847 100644 --- a/src/app/shared/stores/contributors/contributors.state.ts +++ b/src/app/shared/stores/contributors/contributors.state.ts @@ -304,7 +304,6 @@ export class ContributorsState { ) ), tap((users) => { - alert(JSON.stringify(users)); const addedContributorsIds = state.contributorsList.data.map((contributor) => contributor.userId); ctx.patchState({ From cbf10e958719c50d5a1785629bd22d1905b301bb Mon Sep 17 00:00:00 2001 From: mkovalua Date: Wed, 5 Nov 2025 16:38:20 +0200 Subject: [PATCH 3/3] use search?q= with * to speed up performance in comparison with filter when there are many records --- .../features/moderation/services/moderators.service.ts | 5 ++--- .../moderation/store/moderators/moderators.state.ts | 9 +-------- src/app/shared/services/contributors.service.ts | 6 ++---- src/app/shared/stores/contributors/contributors.state.ts | 9 +-------- 4 files changed, 6 insertions(+), 23 deletions(-) diff --git a/src/app/features/moderation/services/moderators.service.ts b/src/app/features/moderation/services/moderators.service.ts index 016c8b313..420251188 100644 --- a/src/app/features/moderation/services/moderators.service.ts +++ b/src/app/features/moderation/services/moderators.service.ts @@ -84,9 +84,8 @@ export class ModeratorsService { return this.jsonApiService.delete(baseUrl); } - searchUsers(value: string, page = 1, findById = false): Observable> { - const filterParamName = findById ? 'id' : 'full_name'; - const baseUrl = `${this.apiUrl}/users/?filter[${filterParamName}]=${value}&page=${page}`; + searchUsers(value: string, page = 1): Observable> { + const baseUrl = `${this.apiUrl}/search/users/?q=${value}*&page=${page}`; return this.jsonApiService .get>(baseUrl) diff --git a/src/app/features/moderation/store/moderators/moderators.state.ts b/src/app/features/moderation/store/moderators/moderators.state.ts index 7e27c00b9..27d4aee17 100644 --- a/src/app/features/moderation/store/moderators/moderators.state.ts +++ b/src/app/features/moderation/store/moderators/moderators.state.ts @@ -1,6 +1,6 @@ import { Action, State, StateContext } from '@ngxs/store'; -import { catchError, iif, of, switchMap, tap } from 'rxjs'; +import { catchError, of, tap } from 'rxjs'; import { inject, Injectable } from '@angular/core'; @@ -142,13 +142,6 @@ export class ModeratorsState { } return this.moderatorsService.searchUsers(action.searchValue, action.page).pipe( - switchMap((users) => - iif( - () => users.data.length === 0 && action.searchValue?.length === 5, - this.moderatorsService.searchUsers(action.searchValue || '', 1, true), - of(users) - ) - ), tap((users) => { ctx.patchState({ users: { diff --git a/src/app/shared/services/contributors.service.ts b/src/app/shared/services/contributors.service.ts index 9cd19e453..c441b9ca0 100644 --- a/src/app/shared/services/contributors.service.ts +++ b/src/app/shared/services/contributors.service.ts @@ -94,10 +94,8 @@ export class ContributorsService { ); } - searchUsers(value: string, page = 1, findById = false): Observable> { - const filterParamName = findById ? 'id' : 'full_name'; - const baseUrl = `${this.apiUrl}/users/?filter[${filterParamName}]=${value}&page=${page}`; - + searchUsers(value: string, page = 1): Observable> { + const baseUrl = `${this.apiUrl}/search/users/?q=${value}*&page=${page}`; return this.jsonApiService .get>(baseUrl) .pipe(map((response) => ContributorsMapper.getPaginatedUsers(response))); diff --git a/src/app/shared/stores/contributors/contributors.state.ts b/src/app/shared/stores/contributors/contributors.state.ts index 8d6ef4847..0e738afec 100644 --- a/src/app/shared/stores/contributors/contributors.state.ts +++ b/src/app/shared/stores/contributors/contributors.state.ts @@ -1,6 +1,6 @@ import { Action, State, StateContext } from '@ngxs/store'; -import { catchError, iif, of, switchMap, tap } from 'rxjs'; +import { catchError, of, tap } from 'rxjs'; import { inject, Injectable } from '@angular/core'; @@ -296,13 +296,6 @@ export class ContributorsState { } return this.contributorsService.searchUsers(action.searchValue, action.page).pipe( - switchMap((users) => - iif( - () => users.data.length === 0 && action.searchValue?.length === 5, - this.contributorsService.searchUsers(action.searchValue || '', 1, true), - of(users) - ) - ), tap((users) => { const addedContributorsIds = state.contributorsList.data.map((contributor) => contributor.userId);