1 import { isAbsolute, join } from 'path'
2 import { HttpStatusCode } from '@shared/core-utils'
3 import { root } from '../miscs/miscs'
12 } from '../requests/requests'
13 import { ServerInfo } from '../server/servers'
15 export interface OverrideCommandOptions {
17 expectedStatus?: number
20 interface InternalCommonCommandOptions extends OverrideCommandOptions {
21 // Default to server.url
25 // If we automatically send the server token if the token is not provided
26 implicitToken: boolean
27 defaultExpectedStatus: number
30 interface InternalGetCommandOptions extends InternalCommonCommandOptions {
31 query?: { [ id: string ]: any }
38 abstract class AbstractCommand {
40 private expectedStatus: HttpStatusCode
43 protected server: ServerInfo
48 setServer (server: ServerInfo) {
52 setExpectedStatus (status: HttpStatusCode) {
53 this.expectedStatus = status
56 protected getRequestBody <T> (options: InternalGetCommandOptions) {
57 return unwrapBody<T>(this.getRequest(options))
60 protected getRequestText (options: InternalGetCommandOptions) {
61 return unwrapText(this.getRequest(options))
64 protected getRawRequest (options: Omit<InternalGetCommandOptions, 'path'>) {
65 const { url, range } = options
66 const { host, protocol, pathname } = new URL(url)
68 return this.getRequest({
71 token: this.buildCommonRequestToken(options),
72 defaultExpectedStatus: this.buildStatusCodeExpected(options),
74 url: `${protocol}//${host}`,
80 protected getRequest (options: InternalGetCommandOptions) {
81 const { redirects, query, contentType, accept, range } = options
83 return makeGetRequest({
84 ...this.buildCommonRequestOptions(options),
94 protected deleteRequest (options: InternalCommonCommandOptions) {
95 return makeDeleteRequest(this.buildCommonRequestOptions(options))
98 protected putBodyRequest (options: InternalCommonCommandOptions & {
99 fields?: { [ fieldName: string ]: any }
101 const { fields } = options
103 return makePutBodyRequest({
104 ...this.buildCommonRequestOptions(options),
110 protected postBodyRequest (options: InternalCommonCommandOptions & {
111 fields?: { [ fieldName: string ]: any }
113 const { fields } = options
115 return makePostBodyRequest({
116 ...this.buildCommonRequestOptions(options),
122 protected postUploadRequest (options: InternalCommonCommandOptions & {
123 fields?: { [ fieldName: string ]: any }
126 const { fields, attaches } = options
128 return makeUploadRequest({
129 ...this.buildCommonRequestOptions(options),
137 protected putUploadRequest (options: InternalCommonCommandOptions & {
138 fields?: { [ fieldName: string ]: any }
141 const { fields, attaches } = options
143 return makeUploadRequest({
144 ...this.buildCommonRequestOptions(options),
152 protected updateImageRequest (options: InternalCommonCommandOptions & {
157 if (isAbsolute(options.fixture)) {
158 filePath = options.fixture
160 filePath = join(root(), 'server', 'tests', 'fixtures', options.fixture)
163 return this.postUploadRequest({
167 attaches: { [options.fieldname]: filePath }
171 private buildCommonRequestOptions (options: InternalCommonCommandOptions) {
172 const { url, path } = options
175 url: url ?? this.server.url,
178 token: this.buildCommonRequestToken(options),
179 statusCodeExpected: this.buildStatusCodeExpected(options)
183 private buildCommonRequestToken (options: Pick<InternalCommonCommandOptions, 'token' | 'implicitToken'>) {
184 const { token } = options
186 const fallbackToken = options.implicitToken
187 ? this.server.accessToken
190 return token !== undefined ? token : fallbackToken
193 private buildStatusCodeExpected (options: Pick<InternalCommonCommandOptions, 'expectedStatus' | 'defaultExpectedStatus'>) {
194 const { expectedStatus, defaultExpectedStatus } = options
196 return expectedStatus ?? this.expectedStatus ?? defaultExpectedStatus