velody/backend/scripts/generate-openapi.ts
2026-07-02 13:38:20 +02:00

57 lines
1.9 KiB
TypeScript

import 'reflect-metadata';
import { mkdir, writeFile } from 'node:fs/promises';
import { join } from 'node:path';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
async function generate(): Promise<void> {
process.env.NODE_ENV ??= 'development';
process.env.PORT ??= '3007';
process.env.DATABASE_URL ??=
'postgresql://velody:velody@localhost:5432/velody?schema=public';
process.env.STORAGE_ROOT ??= join(process.cwd(), '..', 'runtime', 'storage');
process.env.PUBLIC_BASE_URL ??= 'http://localhost:3007';
process.env.DEVICE_BOOTSTRAP_SECRET ??= 'openapi-placeholder-secret';
process.env.ACCOUNT_ACCESS_TOKEN_SECRET ??=
'openapi-placeholder-account-access-secret';
process.env.ACCOUNT_ACCESS_TOKEN_TTL_SECONDS ??= '900';
process.env.MAX_UPLOAD_SIZE_BYTES ??= '524288000';
process.env.PADDLE_ENVIRONMENT ??= 'sandbox';
process.env.PADDLE_API_KEY ??= 'openapi-placeholder-paddle-api-key';
process.env.PADDLE_WEBHOOK_SECRET ??=
'openapi-placeholder-paddle-webhook-secret';
process.env.PADDLE_PRO_MONTHLY_PRICE_ID ??=
'openapi-placeholder-paddle-monthly-price-id';
process.env.PADDLE_PRO_YEARLY_PRICE_ID ??=
'openapi-placeholder-paddle-yearly-price-id';
const { createApp } = await import('../src/app.factory');
const app = await createApp();
const document = SwaggerModule.createDocument(
app,
new DocumentBuilder()
.setTitle('Velody API')
.setDescription('Velody Phase 1 foundation API')
.setVersion('1.0.0')
.addBearerAuth(
{
type: 'http',
scheme: 'bearer',
bearerFormat: 'Bearer',
description: 'Device access token',
},
'bearer',
)
.build(),
);
const outputDir = join(process.cwd(), 'openapi');
await mkdir(outputDir, { recursive: true });
await writeFile(
join(outputDir, 'velody.openapi.json'),
JSON.stringify(document, null, 2),
);
await app.close();
}
void generate();