import { HttpStatusCode } from '@shared/core-utils' import { makeDeleteRequest, makeGetRequest, makePostBodyRequest, makePutBodyRequest, makeUploadRequest, unwrapBody, unwrapText } from '../requests/requests' import { ServerInfo } from '../server/servers' export interface OverrideCommandOptions { token?: string expectedStatus?: number } interface CommonCommandOptions extends OverrideCommandOptions { path: string defaultExpectedStatus: number } interface GetCommandOptions extends CommonCommandOptions { query?: { [ id: string ]: any } contentType?: string accept?: string redirects?: number } abstract class AbstractCommand { private expectedStatus: HttpStatusCode constructor ( protected server: ServerInfo ) { } setServer (server: ServerInfo) { this.server = server } setExpectedStatus (status: HttpStatusCode) { this.expectedStatus = status } protected getRequestBody (options: GetCommandOptions) { return unwrapBody(this.getRequest(options)) } protected getRequestText (options: GetCommandOptions) { return unwrapText(this.getRequest(options)) } protected getRequest (options: GetCommandOptions) { const { redirects, query, contentType, accept } = options return makeGetRequest({ ...this.buildCommonRequestOptions(options), redirects, query, contentType, accept }) } protected deleteRequest (options: CommonCommandOptions) { return makeDeleteRequest(this.buildCommonRequestOptions(options)) } protected putBodyRequest (options: CommonCommandOptions & { fields?: { [ fieldName: string ]: any } }) { const { fields } = options return makePutBodyRequest({ ...this.buildCommonRequestOptions(options), fields }) } protected postBodyRequest (options: CommonCommandOptions & { fields?: { [ fieldName: string ]: any } }) { const { fields } = options return makePostBodyRequest({ ...this.buildCommonRequestOptions(options), fields }) } protected postUploadRequest (options: CommonCommandOptions & { fields?: { [ fieldName: string ]: any } attaches?: any }) { const { fields, attaches } = options return makeUploadRequest({ ...this.buildCommonRequestOptions(options), method: 'POST', fields, attaches }) } protected putUploadRequest (options: CommonCommandOptions & { fields?: { [ fieldName: string ]: any } attaches?: any }) { const { fields, attaches } = options return makeUploadRequest({ ...this.buildCommonRequestOptions(options), method: 'PUT', fields, attaches }) } private buildCommonRequestOptions (options: CommonCommandOptions) { const { token, expectedStatus, defaultExpectedStatus, path } = options return { url: this.server.url, path, // Token can be null if we don't want to add it token: token !== undefined ? token : this.server.accessToken, statusCodeExpected: expectedStatus ?? this.expectedStatus ?? defaultExpectedStatus } } } export { AbstractCommand }