@ministryofjustice/hmpps-digital-prison-reporting-frontend
Version:
The Digital Prison Reporting Frontend contains templates and code to help display data effectively in UI applications.
247 lines (217 loc) • 6.93 kB
text/typescript
import ReportQuery from '../types/ReportQuery'
import logger from '../utils/logger'
import RestClient from './restClient'
import Dict = NodeJS.Dict
import { components, operations } from '../types/api'
import { ApiConfig, Count, FieldValuesRequest, ListWithWarnings } from './types'
import type { ResultWithHeaders } from './restClient'
export default class ReportingClient {
restClient: RestClient
constructor(config: ApiConfig) {
this.restClient = new RestClient('Reporting API Client', config)
}
getCount(resourceName: string, token: string, countRequest: ReportQuery): Promise<number> {
logger.info(`Reporting client: Get count. { resourceName: ${resourceName} }`)
return this.restClient
.get({
path: `/${resourceName}/count`,
query: countRequest.toRecordWithFilterPrefix(true),
token,
})
.then((response) => (<Count>response).count)
}
getList(resourceName: string, token: string, listRequest: ReportQuery): Promise<Array<Dict<string>>> {
return this.getListWithWarnings(resourceName, token, listRequest).then((response) => response.data)
}
getListWithWarnings(resourceName: string, token: string, listRequest: ReportQuery): Promise<ListWithWarnings> {
logger.info(`Reporting client: Get list. { resourceName: ${resourceName} }`)
return this.restClient
.getWithHeaders<Array<Dict<string>>>({
path: `/${resourceName}`,
query: listRequest.toRecordWithFilterPrefix(true),
token,
})
.then((response: ResultWithHeaders<Array<Dict<string>>>) => ({
data: response.data,
warnings: {
noDataAvailable: response.headers['x-no-data-warning'],
},
}))
}
getDefinitions(
token: string,
definitionsPath?: string,
): Promise<Array<components['schemas']['ReportDefinitionSummary']>> {
this.logInfo('Get definitions')
const params: operations['definitions_1']['parameters'] = {
query: {
renderMethod: 'HTML',
dataProductDefinitionsPath: definitionsPath,
},
}
return this.restClient
.get({
path: '/definitions',
query: params.query,
token,
})
.then((response) => <Array<components['schemas']['ReportDefinitionSummary']>>response)
}
getDefinition(
token: string,
reportId: string,
variantId: string,
definitionsPath?: string,
): Promise<components['schemas']['SingleVariantReportDefinition']> {
const query = {
dataProductDefinitionsPath: definitionsPath,
}
this.logInfo('Get definition', { reportId, variantId })
return this.restClient
.get({
path: `/definitions/${reportId}/${variantId}`,
query,
token,
})
.then((response) => <components['schemas']['SingleVariantReportDefinition']>response)
}
getFieldValues({
token,
definitionName,
variantName,
fieldName,
prefix,
definitionsPath,
}: FieldValuesRequest): Promise<Array<string>> {
const query = {
dataProductDefinitionsPath: definitionsPath,
prefix,
}
this.logInfo('Get field values', { definitionName, variantName, fieldName, prefix })
return this.restClient
.get({
path: `/reports/${definitionName}/${variantName}/${fieldName}`,
token,
query,
})
.then((response) => <Array<string>>response)
}
requestAsyncReport(
token: string,
reportId: string,
variantId: string,
query: Record<string, string | boolean | number>,
): Promise<Dict<string>> {
this.logInfo('Request report', { reportId, variantId })
return this.restClient
.get({
path: `/async/reports/${reportId}/${variantId}`,
token,
query,
})
.then((response) => <Dict<string>>response)
}
cancelAsyncRequest(
token: string,
reportId: string,
variantId: string,
executionId: string,
dataProductDefinitionsPath?: string,
): Promise<Dict<string>> {
this.logInfo('Cancel Request', { reportId, variantId, executionId })
return this.restClient
.delete({
path: `/reports/${reportId}/${variantId}/statements/${executionId}`,
token,
query: {
dataProductDefinitionsPath,
},
})
.then((response) => <Dict<string>>response)
}
getAsyncReport(
token: string,
reportId: string,
variantId: string,
tableId: string,
query: Dict<string | number>,
): Promise<Array<Dict<string>>> {
this.logInfo('Get Data', { reportId, variantId, tableId })
return this.restClient
.get({
path: `/reports/${reportId}/${variantId}/tables/${tableId}/result`,
token,
query,
})
.then((response) => <Array<Dict<string>>>response)
}
getAsyncSummaryReport(
token: string,
reportId: string,
variantId: string,
tableId: string,
summaryId: string,
query: Dict<string | number>,
): Promise<Array<Dict<string>>> {
this.logInfo('Get summary data', { reportId, variantId, tableId, summaryId })
return this.restClient
.get({
path: `/reports/${reportId}/${variantId}/tables/${tableId}/result/summary/${summaryId}`,
token,
query,
})
.then((response) => <Array<Dict<string>>>response)
}
getAsyncReportStatus(
token: string,
reportId: string,
variantId: string,
executionId: string,
dataProductDefinitionsPath?: string,
tableId?: string,
): Promise<Dict<string>> {
this.logInfo('Get status', { reportId, variantId, tableId, executionId })
return this.restClient
.get({
path: `/reports/${reportId}/${variantId}/statements/${executionId}/status`,
token,
query: {
dataProductDefinitionsPath,
tableId,
},
})
.then((response) => <Dict<string>>response)
}
getAsyncCount(token: string, tableId: string, dataProductDefinitionsPath?: string): Promise<number> {
this.logInfo('Get count', { tableId })
return this.restClient
.get({
path: `/report/tables/${tableId}/count`,
token,
query: {
dataProductDefinitionsPath,
},
})
.then((response) => (<Count>response).count)
}
getAsyncInteractiveCount(
token: string,
tableId: string,
reportId: string,
id: string,
filters: ReportQuery,
): Promise<number> {
this.logInfo('Get interactive count', { tableId, reportId, id })
return this.restClient
.get({
path: `/reports/${reportId}/${id}/tables/${tableId}/count`,
token,
query: filters.toRecordWithFilterPrefix(true),
})
.then((response) => (<Count>response).count)
}
logInfo(title: string, args?: Dict<string>) {
logger.info(`Reporting Client: ${title}:`)
if (args && Object.keys(args).length) logger.info(JSON.stringify(args, null, 2))
}
}