Files
onspring-api-sdk-javascript/src/models/ApiResponse.ts
T

515 lines
15 KiB
TypeScript
Raw Normal View History

2023-02-06 21:28:11 -06:00
import { type AxiosResponse } from 'axios';
import { FieldStatus } from '../enums/FieldStatus';
import { FieldType } from '../enums/FieldType';
import { FormulaOutputType } from '../enums/FormulaOutputType';
import { Multiplicity } from '../enums/Multiplicity';
import { App } from './App';
2023-02-02 20:24:20 -06:00
import { CollectionResponse } from './CollectionResponse';
2023-02-03 16:01:20 -06:00
import { CreatedWithIdResponse } from './CreatedWithIdResponse';
2023-02-02 21:37:40 -06:00
import { Field } from './Field';
2023-02-06 21:28:11 -06:00
import { File } from './File';
2023-02-04 15:09:13 -06:00
import { FileInfo } from './FileInfo';
import { FormulaField } from './FormulaField';
import { GetPagedAppsResponse } from './GetPagedAppsResponse';
2023-02-03 11:45:15 -06:00
import { GetPagedFieldsResponse } from './GetPagedFieldsResponse';
2023-02-11 00:16:33 -06:00
import { GetPagedRecordsResponse } from './GetPagedRecordsResponse';
import { GetPagedReportsResponse } from './GetPagedReportsResponse';
import { ListField } from './ListField';
2023-02-07 11:52:46 -06:00
import { ListItemResponse } from './ListItemResponse';
import { ListValue } from './ListValue';
import { Record } from './Record';
import { RecordValue } from './RecordValue';
import { ReferenceField } from './ReferenceField';
import { Report } from './Report';
2023-02-09 18:23:49 -06:00
import { ReportData } from './ReportData';
import { Row } from './Row';
/**
* @class ApiResponse - A generic response object for API requests.
*/
export class ApiResponse<T> {
/**
* @property {number} statusCode - The status code of the response.
*/
public statusCode: number;
/**
* @property {boolean} isSuccessful - True if the status code is less than 400; otherwise, false.
*/
public isSuccessful: boolean;
/**
* @property {string} message - The message of the response.
*/
public message: string;
/**
* @property {T} data - The data of the response.
*/
public data: T | null;
/**
* @constructor - Creates a new instance of the ApiResponse class.
* @param {number} statusCode - The status code of the response.
* @param {string} message - The message of the response.
* @param {T | null} data - The data of the response.
* @returns {ApiResponse<T>} - A new instance of the ApiResponse class.
*/
constructor(statusCode: number, message: string, data: T | null) {
this.statusCode = statusCode;
this.isSuccessful = statusCode < 400;
this.message = message;
this.data = data;
}
2023-02-01 21:35:30 -06:00
/**
* @method asGetPagedAppsResponseType - Converts the ApiResponse to an ApiResponse<GetPagedAppsResponse>.
2023-02-01 21:35:30 -06:00
* @returns {ApiResponse<GetPagedAppsResponse>} - An ApiResponse<GetPagedAppsResponse>.
*/
public asGetPagedAppsResponseType(): ApiResponse<GetPagedAppsResponse> {
2023-02-02 20:24:20 -06:00
const apiResponse = this as ApiResponse<any>;
2023-02-02 20:24:20 -06:00
const apps = apiResponse.data.items.map((item: any) => {
return new App(item.href, item.id, item.name);
});
2023-02-02 20:24:20 -06:00
const getAppsPagedResponse = new GetPagedAppsResponse(
apps,
apiResponse.data.pageNumber,
apiResponse.data.pageSize,
apiResponse.data.totalPages,
apiResponse.data.totalRecords
);
return new ApiResponse<GetPagedAppsResponse>(
apiResponse.statusCode,
apiResponse.message,
getAppsPagedResponse
);
}
2023-02-02 20:24:20 -06:00
/**
* @method asAppType - Converts the ApiResponse to an ApiResponse<App>.
2023-02-02 20:24:20 -06:00
* @returns {ApiResponse<App>} - An ApiResponse<App>.
*/
public asAppType(): ApiResponse<App> {
2023-02-02 20:24:20 -06:00
const apiResponse = this as ApiResponse<any>;
2023-02-02 20:24:20 -06:00
const app = new App(
apiResponse.data.href,
apiResponse.data.id,
apiResponse.data.name
);
return new ApiResponse<App>(
apiResponse.statusCode,
apiResponse.message,
app
);
}
2023-02-02 20:24:20 -06:00
/**
* @method asAppCollectionType - Converts the ApiResponse to an ApiResponse<CollectionResponse<App>>.
2023-02-02 20:24:20 -06:00
* @returns {ApiResponse<CollectionResponse<App>>} - An ApiResponse<CollectionResponse<App>>.
*/
public asAppCollectionType(): ApiResponse<CollectionResponse<App>> {
2023-02-02 20:24:20 -06:00
const apiResponse = this as ApiResponse<any>;
const apps = apiResponse.data.items.map((item: any) => {
return new App(item.href, item.id, item.name);
});
const collectionResponse = new CollectionResponse<App>(
apiResponse.data.count,
apps
);
return new ApiResponse<CollectionResponse<App>>(
apiResponse.statusCode,
apiResponse.message,
collectionResponse
);
}
2023-02-02 21:37:40 -06:00
2023-02-02 22:59:07 -06:00
/**
* @method asFieldType - Converts the ApiResponse to an ApiResponse<Field>.
2023-02-02 22:59:07 -06:00
* @returns {ApiResponse<Field>} - An ApiResponse<Field>.
*/
public asFieldType(): ApiResponse<Field> {
2023-02-02 21:37:40 -06:00
const apiResponse = this as ApiResponse<any>;
const field = ApiResponse.getFieldByType(apiResponse.data);
2023-02-02 21:37:40 -06:00
return new ApiResponse<Field>(
apiResponse.statusCode,
apiResponse.message,
field
);
}
2023-02-03 00:16:38 -06:00
/**
* @method asFieldCollectionType - Converts the ApiResponse to an ApiResponse<CollectionResponse<Field>>.
* @returns {ApiResponse<CollectionResponse<Field>>} - An ApiResponse<CollectionResponse<Field>>.
*/
public asFieldCollectionType(): ApiResponse<CollectionResponse<Field>> {
2023-02-03 11:17:53 -06:00
const apiResponse = this as ApiResponse<any>;
const fields = apiResponse.data.items.map((item: any) =>
ApiResponse.getFieldByType(item)
);
2023-02-03 11:17:53 -06:00
const collectionResponse = new CollectionResponse<Field>(
apiResponse.data.count,
fields
);
return new ApiResponse<CollectionResponse<Field>>(
apiResponse.statusCode,
apiResponse.message,
collectionResponse
);
2023-02-03 00:16:38 -06:00
}
2023-02-03 11:45:15 -06:00
/**
* @method asGetPagedFieldsResponseType - Converts the ApiResponse to an ApiResponse<GetPagedFieldsResponse>.
* @returns {ApiResponse<GetPagedFieldsResponse>} - An ApiResponse<GetPagedFieldsResponse>.
*/
public asGetPagedFieldsResponseType(): ApiResponse<GetPagedFieldsResponse> {
2023-02-03 11:45:15 -06:00
const apiResponse = this as ApiResponse<any>;
const fields = apiResponse.data.items.map((item: any) =>
ApiResponse.getFieldByType(item)
);
2023-02-03 11:45:15 -06:00
const getPagedFieldsResponse = new GetPagedFieldsResponse(
fields,
apiResponse.data.pageNumber,
apiResponse.data.pageSize,
apiResponse.data.totalPages,
apiResponse.data.totalRecords
);
return new ApiResponse<GetPagedFieldsResponse>(
apiResponse.statusCode,
apiResponse.message,
getPagedFieldsResponse
);
}
2023-02-03 16:01:20 -06:00
2023-02-03 22:51:02 -06:00
/**
* @method asCreatedWithIdResponseType - Converts the ApiResponse to an ApiResponse<CreatedWithIdResponse>.
* @returns {ApiResponse<CreatedWithIdResponse>} - An ApiResponse<CreatedWithIdResponse>.
*/
public asCreatedWithIdResponseType(): ApiResponse<CreatedWithIdResponse> {
2023-02-03 16:01:20 -06:00
const apiResponse = this as ApiResponse<any>;
const createdWithIdResponse = new CreatedWithIdResponse(
apiResponse.data.id
);
return new ApiResponse<CreatedWithIdResponse>(
apiResponse.statusCode,
apiResponse.message,
createdWithIdResponse
);
}
2023-02-04 15:09:13 -06:00
public asFileInfoType(): ApiResponse<FileInfo> {
2023-02-04 15:09:13 -06:00
const apiResponse = this as ApiResponse<any>;
const fileInfo = new FileInfo(
apiResponse.data.type,
apiResponse.data.contentType,
apiResponse.data.name,
apiResponse.data.createdDate,
apiResponse.data.modifiedDate,
apiResponse.data.owner,
apiResponse.data.notes,
apiResponse.data.fileHref
);
return new ApiResponse<FileInfo>(
apiResponse.statusCode,
apiResponse.message,
fileInfo
);
}
2023-02-06 21:28:11 -06:00
public asFileType(response: AxiosResponse): ApiResponse<File> {
const apiResponse = this as ApiResponse<any>;
let fileName = response.headers['content-disposition']
.split(';')[1]
.split('=')[1];
fileName = fileName.substring(1, fileName.length - 1);
const contentType =
response.headers['content-type'] ??
response.headers['Content-Type'] ??
null;
let contentLength =
response.headers['content-length'] ??
response.headers['Content-Length'] ??
0;
contentLength = parseInt(contentLength);
const file = new File(
apiResponse.data,
fileName,
contentType,
contentLength
);
return new ApiResponse<File>(
apiResponse.statusCode,
apiResponse.message,
file
);
}
2023-02-07 22:43:06 -06:00
/**
* @method asListItemResponseType - Converts the ApiResponse to an ApiResponse<ListItemResponse>.
* @returns {ApiResponse<ListItemResponse>} - An ApiResponse<ListItemResponse>.
*/
2023-02-07 11:52:46 -06:00
public asListItemResponseType(): ApiResponse<ListItemResponse> {
const apiResponse = this as ApiResponse<any>;
const listItemResponse = new ListItemResponse(apiResponse.data.id);
return new ApiResponse<ListItemResponse>(
apiResponse.statusCode,
apiResponse.message,
listItemResponse
);
}
2023-02-08 23:42:19 -06:00
/**
* @method asGetPagedReportsResponseType - Converts the ApiResponse to an ApiResponse<GetPagedReportsResponse>.
* @returns {ApiResponse<GetPagedReportsResponse>} - An ApiResponse<GetPagedReportsResponse>.
*/
public asGetPagedReportsResponseType(): ApiResponse<GetPagedReportsResponse> {
const apiResponse = this as ApiResponse<any>;
const reports = apiResponse.data.items.map((item: any) => {
return new Report(item.id, item.appId, item.name, item.description);
});
const getPagedReportsResponse = new GetPagedReportsResponse(
reports,
apiResponse.data.pageNumber,
apiResponse.data.pageSize,
apiResponse.data.totalPages,
apiResponse.data.totalRecords
);
return new ApiResponse<GetPagedReportsResponse>(
apiResponse.statusCode,
apiResponse.message,
getPagedReportsResponse
);
}
/**
* @method asReportDataType - Converts the ApiResponse to an ApiResponse<ReportData>.
* @returns {ApiResponse<ReportData>} - An ApiResponse<ReportData>.
*/
2023-02-09 18:23:49 -06:00
asReportDataType(): ApiResponse<ReportData> {
const apiResponse = this as ApiResponse<any>;
const rows = apiResponse.data.rows.map((row) => {
return new Row(row.recordId, row.cells);
});
const reportData = new ReportData(apiResponse.data.columns, rows);
return new ApiResponse<ReportData>(
apiResponse.statusCode,
apiResponse.message,
reportData
);
}
2023-02-11 00:16:33 -06:00
/**
* @method asGetPagedRecordsResponseType - Converts the ApiResponse to an ApiResponse<GetPagedRecordsResponse>.
* @returns {ApiResponse<GetPagedRecordsResponse>} - An ApiResponse<GetPagedRecordsResponse>.
*/
public asGetPagedRecordsResponseType(): ApiResponse<GetPagedRecordsResponse> {
const apiResponse = this as ApiResponse<any>;
const records = apiResponse.data.items.map((item: any) => {
const recordValues = item.fieldData.map((fieldData: any) => {
return new RecordValue(
fieldData.type,
fieldData.fieldId,
fieldData.value
);
});
return new Record(item.appId, item.recordId, recordValues);
});
const getPagedRecordsResponse = new GetPagedRecordsResponse(
records,
apiResponse.data.pageNumber,
apiResponse.data.pageSize,
apiResponse.data.totalPages,
apiResponse.data.totalRecords
);
return new ApiResponse<GetPagedRecordsResponse>(
apiResponse.statusCode,
apiResponse.message,
getPagedRecordsResponse
);
}
/**
* @method asRecordType - Converts the ApiResponse to an ApiResponse<Record>.
* @returns {ApiResponse<Record>} - An ApiResponse<Record>.
*/
public asRecordType(): ApiResponse<Record> {
const apiResponse = this as ApiResponse<any>;
const recordValues = apiResponse.data.fieldData.map((fieldData: any) => {
return new RecordValue(
fieldData.type,
fieldData.fieldId,
fieldData.value
);
});
const record = new Record(
apiResponse.data.appId,
apiResponse.data.recordId,
recordValues
);
return new ApiResponse<Record>(
apiResponse.statusCode,
apiResponse.message,
record
);
}
public asRecordCollectionType(): ApiResponse<CollectionResponse<Record>> {
const apiResponse = this as ApiResponse<any>;
const records = apiResponse.data.items.map((item: any) => {
const recordValues = item.fieldData.map((fieldData: any) => {
return new RecordValue(
fieldData.type,
fieldData.fieldId,
fieldData.value
);
});
return new Record(item.appId, item.recordId, recordValues);
});
const collectionResponse = new CollectionResponse<Record>(
apiResponse.data.count,
records
);
return new ApiResponse<CollectionResponse<Record>>(
apiResponse.statusCode,
apiResponse.message,
collectionResponse
);
}
/**
* @method asFileCollectionType - Converts the field item to the appropriate field object based upon the field item's type.
2023-02-08 23:44:18 -06:00
* @param {any} fieldItem - The field item to convert.
* @returns {Field} - The converted field object.
* @throws {Error} - If the field item's type is unknown.
*/
private static getFieldByType(fieldItem: any): Field {
const type = FieldType[fieldItem.type];
const status = FieldStatus[fieldItem.status];
if (type === undefined) {
throw new Error(`Unknown field type: ${fieldItem.type as string}`);
}
switch (type) {
case FieldType.Reference: {
const multiplicity = Multiplicity[fieldItem.multiplicity];
return new ReferenceField(
fieldItem.id,
fieldItem.appId,
fieldItem.name,
type,
status,
fieldItem.isRequired,
fieldItem.isUnique,
multiplicity,
fieldItem.referencedAppId
);
}
case FieldType.List: {
const values = ApiResponse.getListValues(fieldItem);
const multiplicity = Multiplicity[fieldItem.multiplicity];
return new ListField(
fieldItem.id,
fieldItem.appId,
fieldItem.name,
type,
status,
fieldItem.isRequired,
fieldItem.isUnique,
multiplicity,
fieldItem.listId,
values
);
}
case FieldType.Formula: {
const values = ApiResponse.getListValues(fieldItem);
const outputType = FormulaOutputType[fieldItem.outputType];
return new FormulaField(
fieldItem.id,
fieldItem.appId,
fieldItem.name,
type,
status,
fieldItem.isRequired,
fieldItem.isUnique,
outputType,
values
);
}
default: {
return new Field(
fieldItem.id,
fieldItem.appId,
fieldItem.name,
type,
status,
fieldItem.isRequired,
fieldItem.isUnique
);
}
}
}
/**
* @method getListValues - Converts the field items list values to a ListValue[].
* @param fieldItem - The field item whose values should be converted.
* @returns {ListValue[]} - The converted list values.
*/
private static getListValues(fieldItem: any): ListValue[] {
return fieldItem.values.map((listValue: any) => {
return new ListValue(
listValue.id,
listValue.name,
listValue.sortOrder,
listValue.numericValue,
listValue.color
);
});
}
}