import define from "../../define.js";
import { Apps } from "../../../../models/index.js";
import { genId } from "../../../../misc/gen-id.js";
import { unique } from "../../../../prelude/array.js";
import { secureRndstr } from "../../../../misc/secure-rndstr.js";
export const meta = {
    tags: [
        "app"
    ],
    requireCredential: false,
    res: {
        type: "object",
        optional: false,
        nullable: false,
        ref: "App"
    }
};
export const paramDef = {
    type: "object",
    properties: {
        name: {
            type: "string"
        },
        description: {
            type: "string"
        },
        permission: {
            type: "array",
            uniqueItems: true,
            items: {
                type: "string"
            }
        },
        callbackUrl: {
            type: "string",
            nullable: true
        }
    },
    required: [
        "name",
        "description",
        "permission"
    ]
};
export default define(meta, paramDef, async (ps, user)=>{
    if (user?.movedToUri != null) return await Apps.pack("", null, {
        detail: true,
        includeSecret: true
    });
    // Generate secret
    const secret = secureRndstr(32);
    // for backward compatibility
    const permission = unique(ps.permission.map((v)=>v.replace(/^(.+)(\/|-)(read|write)$/, "$3:$1")));
    // Create account
    const app = await Apps.insert({
        id: genId(),
        createdAt: new Date(),
        userId: user ? user.id : null,
        name: ps.name,
        description: ps.description,
        permission,
        callbackUrl: ps.callbackUrl,
        secret: secret
    }).then((x)=>Apps.findOneByOrFail(x.identifiers[0]));
    return await Apps.pack(app, null, {
        detail: true,
        includeSecret: true
    });
});
