import define from "../../../define.js";
import { publishDriveStream } from "../../../../../services/stream.js";
import { ApiError } from "../../../error.js";
import { DriveFolders, DriveFiles } from "../../../../../models/index.js";
export const meta = {
    tags: [
        "drive"
    ],
    requireCredential: true,
    kind: "write:drive",
    errors: {
        noSuchFolder: {
            message: "No such folder.",
            code: "NO_SUCH_FOLDER",
            id: "1069098f-c281-440f-b085-f9932edbe091"
        },
        hasChildFilesOrFolders: {
            message: "This folder has child files or folders.",
            code: "HAS_CHILD_FILES_OR_FOLDERS",
            id: "b0fc8a17-963c-405d-bfbc-859a487295e1"
        }
    }
};
export const paramDef = {
    type: "object",
    properties: {
        folderId: {
            type: "string",
            format: "misskey:id"
        }
    },
    required: [
        "folderId"
    ]
};
export default define(meta, paramDef, async (ps, user)=>{
    // Get folder
    const folder = await DriveFolders.findOneBy({
        id: ps.folderId,
        userId: user.id
    });
    if (folder == null) {
        throw new ApiError(meta.errors.noSuchFolder);
    }
    const [childFoldersCount, childFilesCount] = await Promise.all([
        DriveFolders.countBy({
            parentId: folder.id
        }),
        DriveFiles.countBy({
            folderId: folder.id
        })
    ]);
    if (childFoldersCount !== 0 || childFilesCount !== 0) {
        throw new ApiError(meta.errors.hasChildFilesOrFolders);
    }
    await DriveFolders.delete(folder.id);
    // Publish folderCreated event
    publishDriveStream(user.id, "folderDeleted", folder.id);
});
