import { DriveFiles } from "../../../../../models/index.js";
import define from "../../../define.js";
import { ApiError } from "../../../error.js";
export const meta = {
    tags: [
        "drive"
    ],
    requireCredential: true,
    kind: "read:drive",
    description: "Show the properties of a drive file.",
    res: {
        type: "object",
        optional: false,
        nullable: false,
        ref: "DriveFile"
    },
    errors: {
        noSuchFile: {
            message: "No such file.",
            code: "NO_SUCH_FILE",
            id: "067bc436-2718-4795-b0fb-ecbe43949e31"
        },
        accessDenied: {
            message: "Access denied.",
            code: "ACCESS_DENIED",
            id: "25b73c73-68b1-41d0-bad1-381cfdf6579f"
        }
    }
};
export const paramDef = {
    type: "object",
    anyOf: [
        {
            properties: {
                fileId: {
                    type: "string",
                    format: "misskey:id"
                }
            },
            required: [
                "fileId"
            ]
        },
        {
            properties: {
                url: {
                    type: "string"
                }
            },
            required: [
                "url"
            ]
        }
    ]
};
export default define(meta, paramDef, async (ps, user)=>{
    let file = null;
    if (ps.fileId) {
        file = await DriveFiles.findOneBy({
            id: ps.fileId
        });
    } else if (ps.url) {
        file = await DriveFiles.findOne({
            where: [
                {
                    url: ps.url
                },
                {
                    webpublicUrl: ps.url
                },
                {
                    thumbnailUrl: ps.url
                }
            ]
        });
    }
    if (file == null) {
        throw new ApiError(meta.errors.noSuchFile);
    }
    if (!(user.isAdmin || user.isModerator) && file.userId !== user.id) {
        throw new ApiError(meta.errors.accessDenied);
    }
    return await DriveFiles.pack(file, {
        detail: true,
        withUser: true,
        self: true
    });
});
