- Add per-collection row cap (default 10k, env EXPORT_ROW_CAP) via Prisma take on all findMany calls - Add total size cap (default 100MB, env EXPORT_SIZE_CAP_MB); throws PayloadTooLargeException (413) when exceeded - Convert response to Node.js Readable stream piped via NestJS StreamableFile to avoid large in-memory buffers - Export ExportUserDataResult interface (stream + truncated flag) from handler - Update controller to set Content-Type/Content-Disposition headers and return StreamableFile - Document EXPORT_ROW_CAP and EXPORT_SIZE_CAP_MB env vars in Swagger - Extend tests: row-cap assertion (take arg), size-cap 413 path, stream assertions Fixes GOO-223 (M-1 from GOO-200 audit). Co-Authored-By: Paperclip <noreply@paperclip.ing>
94 lines
2.8 KiB
JSON
94 lines
2.8 KiB
JSON
{
|
|
"name": "@goodgo/api",
|
|
"version": "0.0.1",
|
|
"private": true,
|
|
"scripts": {
|
|
"dev": "nest start --watch",
|
|
"build": "nest build",
|
|
"start": "node dist/main",
|
|
"start:prod": "node dist/main",
|
|
"lint": "eslint src/",
|
|
"test": "vitest run",
|
|
"test:integration": "vitest run --config vitest.integration.config.ts",
|
|
"typecheck": "tsc --noEmit"
|
|
},
|
|
"dependencies": {
|
|
"@anthropic-ai/sdk": "^0.89.0",
|
|
"@aws-sdk/client-s3": "^3.1026.0",
|
|
"@aws-sdk/s3-request-presigner": "^3.1026.0",
|
|
"@goodgo/mcp-servers": "workspace:*",
|
|
"@goodgo/contracts-events": "workspace:*",
|
|
"@nest-lab/throttler-storage-redis": "^1.2.0",
|
|
"@nestjs/bullmq": "^11.0.4",
|
|
"@nestjs/common": "^11.0.0",
|
|
"@nestjs/config": "^4.0.4",
|
|
"@nestjs/core": "^11.0.0",
|
|
"@nestjs/cqrs": "^11.0.0",
|
|
"@nestjs/event-emitter": "^3.0.0",
|
|
"@nestjs/jwt": "^11.0.2",
|
|
"@nestjs/passport": "^11.0.5",
|
|
"@nestjs/platform-express": "^11.0.0",
|
|
"@nestjs/platform-socket.io": "^11.1.19",
|
|
"@nestjs/schedule": "^6.1.1",
|
|
"@nestjs/swagger": "^11.2.7",
|
|
"@nestjs/terminus": "^11.1.1",
|
|
"@nestjs/throttler": "^6.5.0",
|
|
"@nestjs/websockets": "^11.1.19",
|
|
"@paralleldrive/cuid2": "^3.3.0",
|
|
"@prisma/adapter-pg": "^7.7.0",
|
|
"@prisma/client": "^7.7.0",
|
|
"@sentry/nestjs": "^10.47.0",
|
|
"@sentry/profiling-node": "^10.47.0",
|
|
"@socket.io/redis-adapter": "^8.3.0",
|
|
"@willsoto/nestjs-prometheus": "^6.1.0",
|
|
"bcrypt": "^6.0.0",
|
|
"bullmq": "^5.74.1",
|
|
"class-transformer": "^0.5.1",
|
|
"class-validator": "^0.15.1",
|
|
"cookie-parser": "^1.4.7",
|
|
"firebase-admin": "^13.7.0",
|
|
"handlebars": "^4.7.9",
|
|
"helmet": "^8.1.0",
|
|
"ioredis": "^5.4.0",
|
|
"nodemailer": "^8.0.5",
|
|
"otplib": "^13.4.0",
|
|
"passport": "^0.7.0",
|
|
"passport-google-oauth20": "^2.0.0",
|
|
"passport-jwt": "^4.0.1",
|
|
"passport-local": "^1.0.0",
|
|
"pg": "^8.20.0",
|
|
"pino": "^10.3.1",
|
|
"pino-pretty": "^13.0.0",
|
|
"prom-client": "^15.1.3",
|
|
"puppeteer": "^24.41.0",
|
|
"qrcode": "^1.5.4",
|
|
"reflect-metadata": "^0.2.0",
|
|
"rxjs": "^7.8.0",
|
|
"sanitize-html": "^2.17.2",
|
|
"socket.io": "^4.8.3",
|
|
"swagger-ui-express": "^5.0.1",
|
|
"typesense": "^3.0.5"
|
|
},
|
|
"devDependencies": {
|
|
"@nestjs/cli": "^11.0.0",
|
|
"@nestjs/schematics": "^11.0.0",
|
|
"@nestjs/testing": "^11.0.0",
|
|
"@types/bcrypt": "^6.0.0",
|
|
"@types/cookie-parser": "^1.4.10",
|
|
"@types/express": "^5.0.0",
|
|
"@types/node": "^25.5.2",
|
|
"@types/nodemailer": "^8.0.0",
|
|
"@types/passport-google-oauth20": "^2.0.17",
|
|
"@types/passport-jwt": "^4.0.1",
|
|
"@types/passport-local": "^1.0.38",
|
|
"@types/pg": "^8.20.0",
|
|
"@types/qrcode": "^1.5.6",
|
|
"@types/sanitize-html": "^2.16.1",
|
|
"@types/supertest": "^7.2.0",
|
|
"prisma": "^7.7.0",
|
|
"supertest": "^7.2.2",
|
|
"typescript": "^6.0.2",
|
|
"vitest": "^4.1.3"
|
|
}
|
|
}
|