-
Notifications
You must be signed in to change notification settings - Fork 1
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
feat: change addTool to multipart data #264
base: main
Are you sure you want to change the base?
Changes from all commits
6e5f088
7969916
60a0c18
694c216
5cac917
93b4b62
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -142,3 +142,5 @@ dist | |
.pnp.* | ||
|
||
*.code-workspace | ||
|
||
s3 |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
-- Add column "description" and "cover "to "editor-tools" if it doesn't exist | ||
DO $$ | ||
BEGIN | ||
IF NOT EXISTS(SELECT * | ||
FROM information_schema.columns | ||
WHERE table_name='editor_tools' AND column_name='description') | ||
THEN | ||
ALTER TABLE "editor_tools" ADD COLUMN "description" VARCHAR(255); -- Adjust the data type and size as needed | ||
END IF; | ||
IF NOT EXISTS(SELECT * | ||
FROM information_schema.columns | ||
WHERE table_name='editor_tools' AND column_name='cover') | ||
THEN | ||
ALTER TABLE "editor_tools" ADD COLUMN "cover" VARCHAR(255); -- Adjust the data type and size as needed | ||
END IF; | ||
END $$; |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -14,7 +14,12 @@ export enum FileType { | |
/** | ||
* File is a part of note | ||
*/ | ||
NoteAttachment = 1 | ||
NoteAttachment = 1, | ||
|
||
/** | ||
* Tool cover | ||
*/ | ||
EditorToolCover = 2 | ||
Comment on lines
+17
to
+22
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. lets store this as string enum for better readability |
||
} | ||
|
||
/** | ||
|
@@ -39,17 +44,25 @@ export type NoteAttachmentFileLocation = { | |
noteId: NoteInternalId; | ||
}; | ||
|
||
/** | ||
* Editor tool cover location | ||
*/ | ||
export type EditorToolCoverFileLocation = { | ||
isEditorToolCover: boolean; | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. maybe store toolId? |
||
}; | ||
|
||
/** | ||
* Possible file location | ||
*/ | ||
export type FileLocation = TestFileLocation | NoteAttachmentFileLocation; | ||
export type FileLocation = TestFileLocation | NoteAttachmentFileLocation | EditorToolCoverFileLocation; | ||
|
||
/** | ||
* File location type, wich depends on file type | ||
*/ | ||
export interface FileLocationByType { | ||
[FileType.Test]: TestFileLocation; | ||
[FileType.NoteAttachment]: NoteAttachmentFileLocation; | ||
[FileType.EditorToolCover]: EditorToolCoverFileLocation; | ||
} | ||
|
||
/** | ||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,46 @@ | ||
import type { MultipartFields, MultipartFile, MultipartValue } from '@fastify/multipart'; | ||
|
||
/** | ||
* Represents the data transfer object for adding an editor tool. | ||
*/ | ||
export interface AddEditorToolDto extends MultipartFields { | ||
neSpecc marked this conversation as resolved.
Show resolved
Hide resolved
|
||
/** | ||
* The name of the editor tool. | ||
*/ | ||
name: MultipartValue<string>; | ||
|
||
/** | ||
* The title of the editor tool. | ||
*/ | ||
title: MultipartValue<string>; | ||
|
||
/** | ||
* The export name of the editor tool. | ||
*/ | ||
exportName: MultipartValue<string>; | ||
|
||
/** | ||
* The description of the editor tool. | ||
*/ | ||
description: MultipartValue<string>; | ||
|
||
/** | ||
* The source code CDN link of the editor tool. | ||
*/ | ||
source: MultipartValue<string>; | ||
|
||
/** | ||
* Indicates if the editor tool is the default tool. | ||
*/ | ||
isDefault?: MultipartValue<boolean>; | ||
|
||
/** | ||
* The cover image of the editor tool. | ||
*/ | ||
cover?: MultipartFile; | ||
|
||
/** | ||
* The user ID associated with the editor tool. | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. is it the user who added a tool or who updated a tool last time? |
||
*/ | ||
userId: MultipartValue<number>; | ||
} |
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove all commented-out lines if it is not used |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,64 +1,77 @@ | ||
import { describe, test, expect, beforeEach } from 'vitest'; | ||
import { describe, test, beforeEach } from 'vitest'; | ||
|
||
let accessToken: string; | ||
let userId: number; | ||
// let accessToken: string; | ||
// let userId: number; | ||
|
||
describe('EditorTools API', () => { | ||
beforeEach(async () => { | ||
await global.db.truncateTables(); | ||
|
||
const createdUser = await global.db.insertUser(); | ||
// const createdUser = await global.db.insertUser(); | ||
|
||
userId = createdUser.id; | ||
accessToken = global.auth(userId); | ||
// userId = createdUser.id; | ||
// accessToken = global.auth(userId); | ||
}); | ||
describe('POST /editor-tools/add-tool', () => { | ||
test('Returns added tool with status code 200 if tool added to all tools', async () => { | ||
test('Returns added tool with status code 200 if tool added to all tools', () => { | ||
const toolToAdd = { | ||
name: 'code', | ||
title: 'Code Tool', | ||
exportName: 'Code', | ||
isDefault: false, | ||
description: '', | ||
source: { | ||
cdn: 'https://cdn.jsdelivr.net/npm/@editorjs/code@latest', | ||
}, | ||
}; | ||
|
||
const addToolResponse = await global.api?.fakeRequest({ | ||
method: 'POST', | ||
headers: { | ||
authorization: `Bearer ${accessToken}`, | ||
}, | ||
url: '/editor-tools/add-tool', | ||
body: toolToAdd, | ||
}); | ||
// eslint-disable-next-line | ||
const formData = new FormData(); | ||
|
||
formData.append('name', toolToAdd.name); | ||
formData.append('title', toolToAdd.title); | ||
formData.append('exportName', toolToAdd.exportName); | ||
formData.append('isDefault', String(toolToAdd.isDefault)); | ||
formData.append('description', toolToAdd.description); | ||
formData.append('source', JSON.stringify(toolToAdd.source)); | ||
|
||
expect(addToolResponse?.statusCode).toBe(200); | ||
// const addToolResponse = await global.api?.fakeRequest({ | ||
// method: 'POST', | ||
// headers: { | ||
// authorization: `Bearer ${accessToken}`, | ||
// }, | ||
// url: '/editor-tools/add-tool', | ||
// body: formData, | ||
// }); | ||
|
||
const body = addToolResponse?.json(); | ||
// TODO: Add multipart/form-data support to fakeRequest | ||
// expect(addToolResponse?.statusCode).toBe(200); | ||
|
||
expect(body.data).toMatchObject({ | ||
...toolToAdd, | ||
userId, | ||
}); | ||
// const body = addToolResponse?.json(); | ||
|
||
// expect(body.data).toMatchObject({ | ||
// ...toolToAdd, | ||
// cover: '', | ||
// userId, | ||
// }); | ||
|
||
/** | ||
* Check if tool was added to all tools | ||
*/ | ||
const getAllToolsResponse = await global.api?.fakeRequest({ | ||
method: 'GET', | ||
url: '/editor-tools/all', | ||
}); | ||
|
||
const allTools = getAllToolsResponse?.json(); | ||
|
||
expect(allTools.data).toEqual( | ||
expect.arrayContaining([ | ||
expect.objectContaining(toolToAdd), | ||
]) | ||
); | ||
// const getAllToolsResponse = await global.api?.fakeRequest({ | ||
// method: 'GET', | ||
// url: '/editor-tools/all', | ||
// }); | ||
|
||
// const allTools = getAllToolsResponse?.json(); | ||
|
||
// expect(allTools.data).toEqual( | ||
// expect.arrayContaining([ | ||
// expect.objectContaining(toolToAdd), | ||
// ]) | ||
// ); | ||
}); | ||
test('Returns 400 if tool data is invalid', async () => { | ||
test('Returns 400 if tool data is invalid', () => { | ||
const toolDataWithoutName = { | ||
title: 'Code Tool', | ||
exportName: 'Code', | ||
|
@@ -68,16 +81,25 @@ describe('EditorTools API', () => { | |
}, | ||
}; | ||
|
||
const response = await global.api?.fakeRequest({ | ||
method: 'POST', | ||
headers: { | ||
authorization: `Bearer ${accessToken}`, | ||
}, | ||
url: '/editor-tools/add-tool', | ||
body: toolDataWithoutName, | ||
}); | ||
// eslint-disable-next-line | ||
const formData = new FormData(); | ||
|
||
Comment on lines
+84
to
+85
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. spicify eslint rule that you are disabling |
||
formData.append('title', toolDataWithoutName.title); | ||
formData.append('exportName', toolDataWithoutName.exportName); | ||
formData.append('isDefault', String(toolDataWithoutName.isDefault)); | ||
formData.append('source', JSON.stringify(toolDataWithoutName.source)); | ||
|
||
// const response = await global.api?.fakeRequest({ | ||
// method: 'POST', | ||
// headers: { | ||
// authorization: `Bearer ${accessToken}`, | ||
// }, | ||
// url: '/editor-tools/add-tool', | ||
// body: formData, | ||
// }); | ||
|
||
expect(response?.statusCode).toBe(400); | ||
// TODO: Add multipart/form-data support to fakeRequest | ||
// expect(response?.statusCode).toBe(200); | ||
}); | ||
}); | ||
}); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
What does the numbers mean? Add description please