@@ -5,6 +5,7 @@ import type { ApiPerson, PeopleApiClient } from '@equinor/fusion-framework-modul
55import { isApiPerson } from '@equinor/fusion-framework-module-services/people/utils' ;
66import type { ApiResponse as GetPersonApiResponse } from '@equinor/fusion-framework-module-services/people/get' ;
77import type { ApiResponse as QueryPersonApiResponse } from '@equinor/fusion-framework-module-services/people/query' ;
8+ import type { ApiResponse as SuggestPersonApiResponse } from '@equinor/fusion-framework-module-services/people/suggest' ;
89import { Query } from '@equinor/fusion-query' ;
910import { queryValue } from '@equinor/fusion-query/operators' ;
1011
@@ -25,26 +26,27 @@ type ResolverArgs<T> = T extends object
2526
2627const personMatcher =
2728 ( args : MatcherArgs ) =>
28- < T extends { azureUniqueId ?: string ; upn ?: string } > ( value : T ) : value is T => {
29- const { azureId, upn } = args ;
30- if ( azureId && upn ) {
31- return (
32- value . upn ?. toLocaleLowerCase ( ) === upn . toLocaleLowerCase ( ) &&
33- value . azureUniqueId === azureId
34- ) ;
35- } else if ( azureId ) {
36- return value . azureUniqueId === azureId ;
37- } else if ( upn ) {
38- return value . upn ?. toLocaleLowerCase ( ) === upn . toLocaleLowerCase ( ) ;
39- }
40- return false ;
41- } ;
29+ < T extends { azureUniqueId ?: string ; upn ?: string } > ( value : T ) : value is T => {
30+ const { azureId, upn } = args ;
31+ if ( azureId && upn ) {
32+ return (
33+ value . upn ?. toLocaleLowerCase ( ) === upn . toLocaleLowerCase ( ) &&
34+ value . azureUniqueId === azureId
35+ ) ;
36+ } else if ( azureId ) {
37+ return value . azureUniqueId === azureId ;
38+ } else if ( upn ) {
39+ return value . upn ?. toLocaleLowerCase ( ) === upn . toLocaleLowerCase ( ) ;
40+ }
41+ return false ;
42+ } ;
4243
4344export interface IPersonController {
4445 getPerson ( args : ResolverArgs < MatcherArgs > ) : Observable < GetPersonResult > ;
4546 getPersonInfo ( args : ResolverArgs < MatcherArgs > ) : Observable < ApiPerson < 'v2' > > ;
4647 getPhoto ( args : ResolverArgs < MatcherArgs > ) : Observable < string > ;
4748 search ( args : ResolverArgs < { search : string } > ) : Observable < PersonSearchResult > ;
49+ suggest ( args : ResolverArgs < { search : string } > ) : Observable < SuggestPersonApiResponse > ;
4850}
4951
5052export type PersonControllerOptions = {
@@ -55,6 +57,7 @@ export class PersonController implements IPersonController {
5557 #personQuery: Query < GetPersonResult , ResolverArgs < { azureId : string } > > ;
5658 #personSearchQuery: Query < PersonSearchResult , ResolverArgs < { search : string } > > ;
5759 #personPhotoQuery: Query < Blob , ResolverArgs < { azureId : string } > > ;
60+ #personSuggestQuery: Query < SuggestPersonApiResponse , ResolverArgs < { search : string } > > ;
5861
5962 constructor ( client : PeopleApiClient , options ?: PersonControllerOptions ) {
6063 const expire = 3 * 60 * 1000 ;
@@ -112,9 +115,25 @@ export class PersonController implements IPersonController {
112115 } ,
113116 } ,
114117 } ) ;
118+ this . #personSuggestQuery = new Query ( {
119+ expire,
120+ queueOperator : 'merge' ,
121+ key : ( { search } ) => search ,
122+ client : {
123+ fn : ( { search } , signal ) => {
124+ return client . suggest ( 'json$' , { method : 'POST' , body : JSON . stringify ( { queryString : search } ) , signal } ) ;
125+ } ,
126+ } ,
127+ } ) ;
128+ }
129+
130+ public suggest ( args : ResolverArgs < { search : string } > ) : Observable < SuggestPersonApiResponse > {
131+ const { search, signal } = args ;
132+ return this . #personSuggestQuery. query ( { search } , { signal } ) . pipe ( queryValue ) ;
115133 }
116134
117135 public search ( args : { search : string ; signal ?: AbortSignal } ) : Observable < PersonSearchResult > {
136+
118137 const { search, signal } = args ;
119138 return this . #personSearchQuery. query ( { search } , { signal } ) . pipe ( queryValue ) ;
120139 }
0 commit comments