Merge pull request 'more robust recursive folder check' (#12) from folder-recursive into develop
All checks were successful
Lint / pnpm_install (push) Successful in 1m57s
Publish Docker image / Build (push) Successful in 4m50s
Test (production install and build) / production (20.16.0) (push) Successful in 1m10s
Test (backend) / unit (20.16.0) (push) Successful in 7m26s
Lint / lint (backend) (push) Successful in 2m9s
Lint / lint (frontend) (push) Successful in 2m12s
Lint / lint (frontend-embed) (push) Successful in 2m14s
Lint / lint (frontend-shared) (push) Successful in 2m12s
Test (backend) / e2e (20.16.0) (push) Successful in 10m38s
Lint / lint (misskey-bubble-game) (push) Successful in 2m27s
Lint / lint (misskey-js) (push) Successful in 2m22s
Lint / lint (misskey-reversi) (push) Successful in 2m13s
Lint / lint (sw) (push) Successful in 2m31s
Lint / typecheck (misskey-js) (push) Successful in 1m26s
Lint / typecheck (backend) (push) Successful in 2m11s
Lint / typecheck (sw) (push) Successful in 1m28s

Reviewed-on: #12
This commit is contained in:
ゆめ 2024-11-10 18:23:10 -06:00
commit 77b333dbdb
3 changed files with 15 additions and 9 deletions

View file

@ -30,7 +30,8 @@ export class DriveFolderEntityService {
public async pack( public async pack(
src: MiDriveFolder['id'] | MiDriveFolder, src: MiDriveFolder['id'] | MiDriveFolder,
options?: { options?: {
detail: boolean detail: boolean,
maxDepth?: number,
}, },
): Promise<Packed<'DriveFolder'>> { ): Promise<Packed<'DriveFolder'>> {
const opts = Object.assign({ const opts = Object.assign({
@ -55,7 +56,8 @@ export class DriveFolderEntityService {
...(folder.parentId ? { ...(folder.parentId ? {
parent: this.pack(folder.parentId, { parent: this.pack(folder.parentId, {
detail: true, detail: (options?.maxDepth ? options.maxDepth > 0 : true),
maxDepth: options?.maxDepth || 32,
}), }),
} : {}), } : {}),
} : {}), } : {}),

View file

@ -32,7 +32,7 @@ export const meta = {
}, },
recursiveNesting: { recursiveNesting: {
message: 'It can not be structured like nesting folders recursively.', message: 'Folders are linked recursively or too deeply.',
code: 'RECURSIVE_NESTING', code: 'RECURSIVE_NESTING',
id: 'dbeb024837894013aed44279f9199740', id: 'dbeb024837894013aed44279f9199740',
}, },
@ -94,7 +94,10 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
} }
// Check if the circular reference will occur // Check if the circular reference will occur
const checkCircle = async (folderId: string): Promise<boolean> => { const checkCircle = async (folderId: string, limit: number = 32): Promise<boolean> => {
if (limit <= 0) {
return false;
}
const folder2 = await this.driveFoldersRepository.findOneByOrFail({ const folder2 = await this.driveFoldersRepository.findOneByOrFail({
id: folderId, id: folderId,
}); });
@ -102,7 +105,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
if (folder2.id === folder.id) { if (folder2.id === folder.id) {
return true; return true;
} else if (folder2.parentId) { } else if (folder2.parentId) {
return await checkCircle(folder2.parentId); return await checkCircle(folder2.parentId, limit - 1);
} else { } else {
return false; return false;
} }

View file

@ -927,14 +927,15 @@ describe('Endpoints', () => {
const folderC = (await api('drive/folders/create', { const folderC = (await api('drive/folders/create', {
name: 'test', name: 'test',
}, alice)).body; }, alice)).body;
await api('drive/folders/update', { assert.ok(folderA.id && folderB.id && folderC.id);
assert.strictEqual((await api('drive/folders/update', {
folderId: folderB.id, folderId: folderB.id,
parentId: folderA.id, parentId: folderA.id,
}, alice); }, alice)).status, 200);
await api('drive/folders/update', { assert.strictEqual((await api('drive/folders/update', {
folderId: folderC.id, folderId: folderC.id,
parentId: folderB.id, parentId: folderB.id,
}, alice); }, alice)).status, 200);
const res = await api('drive/folders/update', { const res = await api('drive/folders/update', {
folderId: folderA.id, folderId: folderA.id,