@glue42/search-api
Version:
Glue42 Search API
84 lines (63 loc) • 3.09 kB
text/typescript
import { Glue42Core } from "@glue42/core";
import { nanoid } from "nanoid";
import { Glue42Search } from "../../search";
import { ProviderController } from "../controllers/provider";
import { nonEmptyStringDecoder, queryResultDecoder } from "../shared/decoders";
import { QueryIdentification } from "../shared/types";
import { extractErrorMsg } from "../shared/utils";
export class ProviderQueryModel {
constructor(
private readonly myData: Glue42Search.QueryConfig,
private readonly controller: ProviderController,
private readonly logger: Glue42Core.Logger.API,
private readonly identification: QueryIdentification
) {}
private get id(): string {
return this.identification.queryId;
}
private get search(): string {
return this.myData.search;
}
private get providers(): Glue42Search.ProviderData[] | undefined {
return this.myData.providers;
}
private get types(): Glue42Search.SearchType[] | undefined {
return this.myData.types;
}
private get providerLimits(): Glue42Search.ProviderLimits | undefined {
return this.myData.providerLimits;
}
public get myQueryData(): Glue42Search.QueryConfig {
return Object.assign({}, this.myData);
}
public exposeFacade(): Glue42Search.ProviderQuery {
const providerQueryFacade: Glue42Search.ProviderQuery = {
id: this.id,
search: this.search,
providers: this.providers,
types: this.types,
providerLimits: this.providerLimits,
sendResult: this.sendResult.bind(this),
error: this.error.bind(this),
done: this.done.bind(this)
};
return Object.freeze(providerQueryFacade);
}
private sendResult(result: Glue42Search.QueryResult): void {
queryResultDecoder.runWithException(result);
const commandId = nanoid(10);
this.logger.trace(`[${commandId}] Received a valid result, forwarding to the controller`);
return this.controller.processProviderQueryResult({ identification: this.identification, result, commandId });
}
private error(error: string): void {
const commandId = nanoid(10);
nonEmptyStringDecoder.runWithException(error);
this.logger.trace(`[${commandId}] Received a valid error, forwarding to the controller`);
this.controller.processProviderQueryError({ identification: this.identification, error, commandId }).catch((error) => this.logger.warn(`Error processing the error signal for this provider: ${this.id}, error: ${extractErrorMsg(error)}`));
}
private done(): void {
const commandId = nanoid(10);
this.logger.trace(`[${commandId}] Received a valid done, forwarding to the controller`);
this.controller.processProviderQueryDone({ identification: this.identification, commandId }).catch((error) => this.logger.warn(`Error processing the done signal for this provider: ${this.identification.providerId}, error: ${extractErrorMsg(error)}`));
}
}