Skip to content
This repository has been archived by the owner on Jan 8, 2022. It is now read-only.

refactor: rename attachment to file #98

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions packages/rest/__tests__/DiscordAPIError.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ test('Unauthorized', () => {
'PATCH',
'https://discord.com/api/v9/guilds/:id',
{
attachments: undefined,
files: undefined,
body: undefined,
},
);
Expand All @@ -19,7 +19,7 @@ test('Unauthorized', () => {
expect(error.name).toBe('DiscordAPIError[0]');
expect(error.status).toBe(401);
expect(error.url).toBe('https://discord.com/api/v9/guilds/:id');
expect(error.requestBody.attachments).toBe(undefined);
expect(error.requestBody.files).toBe(undefined);
expect(error.requestBody.json).toBe(undefined);
});

Expand All @@ -37,7 +37,7 @@ test('Invalid Form Body Error (error.{property}._errors.{index})', () => {
'PATCH',
'https://discord.com/api/v9/users/@me',
{
attachments: undefined,
files: undefined,
body: {
username: 'a',
},
Expand All @@ -52,7 +52,7 @@ test('Invalid Form Body Error (error.{property}._errors.{index})', () => {
expect(error.name).toBe('DiscordAPIError[50035]');
expect(error.status).toBe(400);
expect(error.url).toBe('https://discord.com/api/v9/users/@me');
expect(error.requestBody.attachments).toBe(undefined);
expect(error.requestBody.files).toBe(undefined);
expect(error.requestBody.json).toStrictEqual({ username: 'a' });
});

Expand Down
38 changes: 19 additions & 19 deletions packages/rest/__tests__/REST.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ nock(`${DefaultRestOptions.api}/v${DefaultRestOptions.version}`)
.reply(200, (_, body) => body)
.post('/postEcho')
.reply(200, (_, body) => body)
.post('/postAttachment')
.post('/postFile')
.times(5)
.reply(200, (_, body) => ({
body: body
Expand Down Expand Up @@ -109,16 +109,16 @@ test('getReason encoded', async () => {
expect(await api.get('/getReason', { reason: '😄' })).toStrictEqual({ reason: '%F0%9F%98%84' });
});

test('postAttachment empty', async () => {
expect(await api.post('/postAttachment', { attachments: [] })).toStrictEqual({
test('postFile empty', async () => {
expect(await api.post('/postFile', { files: [] })).toStrictEqual({
body: '',
});
});

test('postAttachment attachment', async () => {
test('postFile file', async () => {
expect(
await api.post('/postAttachment', {
attachments: [{ fileName: 'out.txt', rawBuffer: Buffer.from('Hello') }],
await api.post('/postFile', {
files: [{ fileName: 'out.txt', rawBuffer: Buffer.from('Hello') }],
}),
).toStrictEqual({
body: [
Expand All @@ -130,10 +130,10 @@ test('postAttachment attachment', async () => {
});
});

test('postAttachment attachment and JSON', async () => {
test('postFile file and JSON', async () => {
expect(
await api.post('/postAttachment', {
attachments: [{ fileName: 'out.txt', rawBuffer: Buffer.from('Hello') }],
await api.post('/postFile', {
files: [{ fileName: 'out.txt', rawBuffer: Buffer.from('Hello') }],
body: { foo: 'bar' },
}),
).toStrictEqual({
Expand All @@ -149,14 +149,14 @@ test('postAttachment attachment and JSON', async () => {
});
});

test('postAttachment attachments and JSON', async () => {
test('postFile files and JSON', async () => {
expect(
await api.post('/postAttachment', {
attachments: [
await api.post('/postFile', {
files: [
{ fileName: 'out.txt', rawBuffer: Buffer.from('Hello') },
{ fileName: 'out.txt', rawBuffer: Buffer.from('Hi') },
],
body: { attachments: [{ id: 0, description: 'test' }] },
body: { files: [{ id: 0, description: 'test' }] },
}),
).toStrictEqual({
body: [
Expand All @@ -170,15 +170,15 @@ test('postAttachment attachments and JSON', async () => {
'Hi',
'Content-Disposition: form-data; name="payload_json"',
'',
'{"attachments":[{"id":0,"description":"test"}]}',
'{"files":[{"id":0,"description":"test"}]}',
].join('\n'),
});
});

test('postAttachment sticker and JSON', async () => {
test('postFile sticker and JSON', async () => {
expect(
await api.post('/postAttachment', {
attachments: [{ key: 'file', fileName: 'sticker.png', rawBuffer: Buffer.from('Sticker') }],
await api.post('/postFile', {
files: [{ key: 'file', fileName: 'sticker.png', rawBuffer: Buffer.from('Sticker') }],
body: { foo: 'bar' },
appendToFormData: true,
}),
Expand Down Expand Up @@ -242,7 +242,7 @@ test('Request and Response Events', async () => {
method: 'get',
path: '/request',
route: '/request',
data: { attachments: undefined, body: undefined },
data: { files: undefined, body: undefined },
retries: 0,
}) as APIRequest,
);
Expand All @@ -251,7 +251,7 @@ test('Request and Response Events', async () => {
method: 'get',
path: '/request',
route: '/request',
data: { attachments: undefined, body: undefined },
data: { files: undefined, body: undefined },
retries: 0,
}) as APIRequest,
expect.objectContaining({ status: 200, statusText: 'OK' }) as Response,
Expand Down
2 changes: 1 addition & 1 deletion packages/rest/src/lib/REST.ts
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,7 @@ export interface APIRequest {
/**
* The data that was used to form the body of this request
*/
data: Pick<InternalRequest, 'attachments' | 'body'>;
data: Pick<InternalRequest, 'files' | 'body'>;
/**
* The number of times this request has been attempted
*/
Expand Down
30 changes: 15 additions & 15 deletions packages/rest/src/lib/RequestManager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,21 @@ import { DefaultRestOptions, DefaultUserAgent } from './utils/constants';
let agent: Agent | null = null;

/**
* Represents an attachment to be added to the request
* Represents a file to be added to the request
*/
export interface RawAttachment {
export interface RawFile {
/**
* The name of the file
*/
fileName: string;
/**
* An explicit key to use for key of the formdata field for this attachment.
* When not provided, the index of the file in the attachments array is used in the form `files[${index}]`.
* An explicit key to use for key of the formdata field for this file.
* When not provided, the index of the file in the files array is used in the form `files[${index}]`.
* If you wish to alter the placeholder snowflake, you must provide this property in the same form (`files[${placeholder}]`)
*/
key?: string;
/**
* The actual data for the attachment
* The actual data for the file
*/
rawBuffer: Buffer;
}
Expand All @@ -36,13 +36,9 @@ export interface RawAttachment {
*/
export interface RequestData {
/**
* Whether to append JSON data to form data instead of `payload_json` when sending attachments
* Whether to append JSON data to form data instead of `payload_json` when sending files
*/
appendToFormData?: boolean;
/**
* Files to be attached to this request
*/
attachments?: RawAttachment[] | undefined;
/**
* If this request needs the `Authorization` header
* @default true
Expand All @@ -58,13 +54,17 @@ export interface RequestData {
* If providing as BodyInit, set `passThroughBody: true`
*/
body?: BodyInit | unknown;
/**
* Files to be attached to this request
*/
files?: RawFile[] | undefined;
/**
* Additional headers to add to this request
*/
headers?: Record<string, string>;
/**
* Whether to pass-through the body property directly to `fetch()`.
* <warn>This only applies when attachments is NOT present</warn>
* <warn>This only applies when files is NOT present</warn>
*/
passThroughBody?: boolean;
/**
Expand Down Expand Up @@ -212,7 +212,7 @@ export class RequestManager extends EventEmitter {
const { url, fetchOptions } = this.resolveRequest(request);

// Queue the request
return handler.queueRequest(routeId, url, fetchOptions, { body: request.body, attachments: request.attachments });
return handler.queueRequest(routeId, url, fetchOptions, { body: request.body, files: request.files });
}

/**
Expand Down Expand Up @@ -275,12 +275,12 @@ export class RequestManager extends EventEmitter {
let finalBody: RequestInit['body'];
let additionalHeaders: Record<string, string> = {};

if (request.attachments?.length) {
if (request.files?.length) {
const formData = new FormData();

// Attach all files to the request
for (const [index, attachment] of request.attachments.entries()) {
formData.append(attachment.key ?? `files[${index}]`, attachment.rawBuffer, attachment.fileName);
for (const [index, file] of request.files.entries()) {
formData.append(file.key ?? `files[${index}]`, file.rawBuffer, file.fileName);
}

// If a JSON body was added as well, attach it to the form data, using payload_json unless otherwise specified
Expand Down
8 changes: 4 additions & 4 deletions packages/rest/src/lib/errors/DiscordAPIError.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import type { InternalRequest, RawAttachment } from '../RequestManager';
import type { InternalRequest, RawFile } from '../RequestManager';

interface DiscordErrorFieldInformation {
code: string;
Expand All @@ -23,7 +23,7 @@ export interface OAuthErrorData {
}

export interface RequestBody {
attachments: RawAttachment[] | undefined;
files: RawFile[] | undefined;
json: unknown | undefined;
}

Expand Down Expand Up @@ -56,11 +56,11 @@ export class DiscordAPIError extends Error {
public status: number,
public method: string,
public url: string,
bodyData: Pick<InternalRequest, 'attachments' | 'body'>,
bodyData: Pick<InternalRequest, 'files' | 'body'>,
) {
super(DiscordAPIError.getMessage(rawError));

this.requestBody = { attachments: bodyData.attachments, json: bodyData.body };
this.requestBody = { files: bodyData.files, json: bodyData.body };
}

/**
Expand Down
4 changes: 2 additions & 2 deletions packages/rest/src/lib/errors/HTTPError.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ export class HTTPError extends Error {
public status: number,
public method: string,
public url: string,
bodyData: Pick<InternalRequest, 'attachments' | 'body'>,
bodyData: Pick<InternalRequest, 'files' | 'body'>,
) {
super(message);

this.requestBody = { attachments: bodyData.attachments, json: bodyData.body };
this.requestBody = { files: bodyData.files, json: bodyData.body };
}
}
2 changes: 1 addition & 1 deletion packages/rest/src/lib/handlers/IHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@ export interface IHandler {
routeId: RouteData,
url: string,
options: RequestInit,
bodyData: Pick<InternalRequest, 'attachments' | 'body'>,
bodyData: Pick<InternalRequest, 'files' | 'body'>,
): Promise<unknown>;
}
4 changes: 2 additions & 2 deletions packages/rest/src/lib/handlers/SequentialHandler.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,7 +168,7 @@ export class SequentialHandler {
routeId: RouteData,
url: string,
options: RequestInit,
bodyData: Pick<InternalRequest, 'attachments' | 'body'>,
bodyData: Pick<InternalRequest, 'files' | 'body'>,
): Promise<unknown> {
let queue = this.#asyncQueue;
let queueType = QueueType.Standard;
Expand Down Expand Up @@ -225,7 +225,7 @@ export class SequentialHandler {
routeId: RouteData,
url: string,
options: RequestInit,
bodyData: Pick<InternalRequest, 'attachments' | 'body'>,
bodyData: Pick<InternalRequest, 'files' | 'body'>,
retries = 0,
): Promise<unknown> {
/*
Expand Down