{"version":3,"file":"ExportApiControllerFactory.cjs","sources":["../../../../../packages/engine-http/src/transfer/ExportApiControllerFactory.ts"],"sourcesContent":["import { HttpController } from '../application'\nimport { HttpErrorResponse } from '../common'\nimport { Readable } from 'node:stream'\nimport { toBuffer } from './CommandStream'\nimport { ExportExecutor, ExportRequest } from './ExportExecutor'\nimport { ParseError } from '@contember/typesafe'\nimport { ProjectGroupResolver } from '../projectGroup/ProjectGroupResolver'\nimport { ProjectContainer } from '../project'\nimport { emptySchema } from '@contember/schema-utils'\n\nexport class ExportApiControllerFactory {\n\tconstructor(\n\t\tprivate readonly projectGroupResolver: ProjectGroupResolver,\n\t\tprivate readonly exportExecutor: ExportExecutor,\n\t) {\n\t}\n\n\tcreate(): HttpController {\n\t\treturn async ctx => {\n\t\t\tconst { timer, projectGroup, authResult, koa } = ctx\n\t\t\tconst { request, response } = koa\n\t\t\tif (!authResult) {\n\t\t\t\treturn new HttpErrorResponse(401, 'Authentication required')\n\t\t\t}\n\n\t\t\tlet exportRequest: ExportRequest\n\n\t\t\ttry {\n\t\t\t\texportRequest = ExportRequest(request.body)\n\n\t\t\t} catch (e) {\n\t\t\t\tif (e instanceof ParseError) {\n\t\t\t\t\treturn new HttpErrorResponse(400, `Invalid request body: ${e.message}`)\n\t\t\t\t} else {\n\t\t\t\t\tthrow e\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst projectContainers: Record<string, ProjectContainer> = {}\n\n\t\t\tfor (const project of exportRequest.projects) {\n\t\t\t\tconst projectContainer = await projectGroup.projectContainerResolver.getProjectContainer(project.slug, { alias: true })\n\n\t\t\t\tif (projectContainer === undefined) {\n\t\t\t\t\tthrow new HttpErrorResponse(400, `Project ${project.slug} NOT found`)\n\t\t\t\t}\n\n\t\t\t\tconst systemContext = projectContainer.systemReadDatabaseContext\n\t\t\t\tconst schemaWithMeta = await projectContainer.contentSchemaResolver.getSchema({ db: systemContext, normalize: true })\n\t\t\t\tconst schema = schemaWithMeta?.schema ?? emptySchema\n\t\t\t\tconst { effective: memberships } = await timer('MembershipFetch', () => projectGroup.projectMembershipResolver.resolveMemberships({\n\t\t\t\t\trequest: { get: () => '' },\n\t\t\t\t\tacl: schema.acl,\n\t\t\t\t\tprojectSlug: project.slug,\n\t\t\t\t\tidentity: {\n\t\t\t\t\t\tidentityId: authResult.identityId,\n\t\t\t\t\t\troles: authResult.roles,\n\t\t\t\t\t},\n\t\t\t\t}))\n\n\t\t\t\tconst projectRoles = memberships.map(it => it.role)\n\n\t\t\t\tif (!projectRoles.some(role => schema.acl.roles[role]?.content?.export)) {\n\t\t\t\t\tthrow new HttpErrorResponse(403, `Not allowed`)\n\t\t\t\t}\n\n\t\t\t\tif (project.system && !projectRoles.some(role => schema.acl.roles[role]?.system?.export)) {\n\t\t\t\t\tthrow new HttpErrorResponse(403, `Not allowed`)\n\t\t\t\t}\n\n\t\t\t\tprojectContainers[project.slug] = projectContainer\n\t\t\t}\n\n\t\t\tkoa.compress = true\n\t\t\tresponse.status = 200\n\t\t\tresponse.res.setHeader('Content-Type', 'application/x-ndjson') // https://github.com/ndjson/ndjson-spec\n\t\t\tresponse.body = Readable.from(toBuffer(this.exportExecutor.export(exportRequest, projectContainers)))\n\t\t}\n\t}\n}\n"],"names":["HttpErrorResponse","ExportRequest","ParseError","emptySchema","Readable","toBuffer"],"mappings":";;;;;;;;AAUO,MAAM,2BAA2B;AAAA,EACvC,YACkB,sBACA,gBAChB;AAFgB,SAAA,uBAAA;AACA,SAAA,iBAAA;AAAA,EAAA;AAAA,EAIlB,SAAyB;AACxB,WAAO,OAAM,QAAO;AACnB,YAAM,EAAE,OAAO,cAAc,YAAY,IAAQ,IAAA;AAC3C,YAAA,EAAE,SAAS,SAAA,IAAa;AAC9B,UAAI,CAAC,YAAY;AACT,eAAA,IAAIA,aAAAA,kBAAkB,KAAK,yBAAyB;AAAA,MAAA;AAGxD,UAAA;AAEA,UAAA;AACa,wBAAAC,eAAAA,cAAc,QAAQ,IAAI;AAAA,eAElC,GAAG;AACX,YAAI,aAAaC,SAAAA,YAAY;AAC5B,iBAAO,IAAIF,aAAkB,kBAAA,KAAK,yBAAyB,EAAE,OAAO,EAAE;AAAA,QAAA,OAChE;AACA,gBAAA;AAAA,QAAA;AAAA,MACP;AAGD,YAAM,oBAAsD,CAAC;AAElD,iBAAA,WAAW,cAAc,UAAU;AACvC,cAAA,mBAAmB,MAAM,aAAa,yBAAyB,oBAAoB,QAAQ,MAAM,EAAE,OAAO,MAAM;AAEtH,YAAI,qBAAqB,QAAW;AACnC,gBAAM,IAAIA,aAAkB,kBAAA,KAAK,WAAW,QAAQ,IAAI,YAAY;AAAA,QAAA;AAGrE,cAAM,gBAAgB,iBAAiB;AACjC,cAAA,iBAAiB,MAAM,iBAAiB,sBAAsB,UAAU,EAAE,IAAI,eAAe,WAAW,MAAM;AAC9G,cAAA,SAAS,gBAAgB,UAAUG,YAAA;AACnC,cAAA,EAAE,WAAW,YAAA,IAAgB,MAAM,MAAM,mBAAmB,MAAM,aAAa,0BAA0B,mBAAmB;AAAA,UACjI,SAAS,EAAE,KAAK,MAAM,GAAG;AAAA,UACzB,KAAK,OAAO;AAAA,UACZ,aAAa,QAAQ;AAAA,UACrB,UAAU;AAAA,YACT,YAAY,WAAW;AAAA,YACvB,OAAO,WAAW;AAAA,UAAA;AAAA,QACnB,CACA,CAAC;AAEF,cAAM,eAAe,YAAY,IAAI,CAAA,OAAM,GAAG,IAAI;AAE9C,YAAA,CAAC,aAAa,KAAK,CAAQ,SAAA,OAAO,IAAI,MAAM,IAAI,GAAG,SAAS,MAAM,GAAG;AAClE,gBAAA,IAAIH,aAAkB,kBAAA,KAAK,aAAa;AAAA,QAAA;AAG/C,YAAI,QAAQ,UAAU,CAAC,aAAa,KAAK,CAAA,SAAQ,OAAO,IAAI,MAAM,IAAI,GAAG,QAAQ,MAAM,GAAG;AACnF,gBAAA,IAAIA,aAAkB,kBAAA,KAAK,aAAa;AAAA,QAAA;AAG7B,0BAAA,QAAQ,IAAI,IAAI;AAAA,MAAA;AAGnC,UAAI,WAAW;AACf,eAAS,SAAS;AACT,eAAA,IAAI,UAAU,gBAAgB,sBAAsB;AACpD,eAAA,OAAOI,qBAAS,KAAKC,cAAS,SAAA,KAAK,eAAe,OAAO,eAAe,iBAAiB,CAAC,CAAC;AAAA,IACrG;AAAA,EAAA;AAEF;;"}