import define from "../../../define.js";
import { DriveFiles, GalleryPosts } from "../../../../../models/index.js";
import { genId } from "../../../../../misc/gen-id.js";
import { GalleryPost } from "../../../../../models/entities/gallery-post.js";
import { HOUR } from "../../../../../const.js";
export const meta = {
    tags: [
        "gallery"
    ],
    requireCredential: true,
    kind: "write:gallery",
    limit: {
        duration: HOUR,
        max: 300
    },
    res: {
        type: "object",
        optional: false,
        nullable: false,
        ref: "GalleryPost"
    },
    errors: {}
};
export const paramDef = {
    type: "object",
    properties: {
        title: {
            type: "string",
            minLength: 1
        },
        description: {
            type: "string",
            nullable: true
        },
        fileIds: {
            type: "array",
            uniqueItems: true,
            minItems: 1,
            maxItems: 32,
            items: {
                type: "string",
                format: "misskey:id"
            }
        },
        isSensitive: {
            type: "boolean",
            default: false
        }
    },
    required: [
        "title",
        "fileIds"
    ]
};
export default define(meta, paramDef, async (ps, user)=>{
    const files = (await Promise.all(ps.fileIds.map((fileId)=>DriveFiles.findOneBy({
            id: fileId,
            userId: user.id
        })))).filter((file)=>file != null);
    if (files.length === 0) {
        throw new Error();
    }
    const post = await GalleryPosts.insert(new GalleryPost({
        id: genId(),
        createdAt: new Date(),
        updatedAt: new Date(),
        title: ps.title,
        description: ps.description,
        userId: user.id,
        isSensitive: ps.isSensitive,
        fileIds: files.map((file)=>file.id)
    })).then((x)=>GalleryPosts.findOneByOrFail(x.identifiers[0]));
    return await GalleryPosts.pack(post, user);
});
