From a65ee2d9a1c9e2a00ba0bada346c642117fa06c0 Mon Sep 17 00:00:00 2001 From: Pranav C Date: Sun, 9 Apr 2023 23:14:59 +0530 Subject: [PATCH] feat: export data apis Signed-off-by: Pranav C --- .../data-alias-export.controller.ts | 58 ++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/packages/nocodb-nest/src/modules/datas/data-alias-export/data-alias-export.controller.ts b/packages/nocodb-nest/src/modules/datas/data-alias-export/data-alias-export.controller.ts index 3595a3774d..4f3205fb88 100644 --- a/packages/nocodb-nest/src/modules/datas/data-alias-export/data-alias-export.controller.ts +++ b/packages/nocodb-nest/src/modules/datas/data-alias-export/data-alias-export.controller.ts @@ -1,4 +1,58 @@ -import { Controller } from '@nestjs/common'; +import { Controller, Get, Request, Response } from '@nestjs/common'; +import { getViewAndModelFromRequestByAliasOrId } from '../../../../../nocodb/src/lib/controllers/dbData/helpers'; +import { Acl } from '../../../middlewares/extract-project-id/extract-project-id.middleware'; +import { View } from '../../../models'; +import { extractCsvData, extractXlsxData } from '../helpers'; +import * as XLSX from 'xlsx'; @Controller('data-alias-export') -export class DataAliasExportController {} +export class DataAliasExportController { + @Get([ + '/api/v1/db/data/:orgs/:projectName/:tableName/export/excel', + '/api/v1/db/data/:orgs/:projectName/:tableName/views/:viewName/export/excel', + ]) + @Acl('exportExcel') + async excelDataExport(@Request() req, @Response() res) { + const { model, view } = await getViewAndModelFromRequestByAliasOrId(req); + let targetView = view; + if (!targetView) { + targetView = await View.getDefaultView(model.id); + } + const { offset, elapsed, data } = await extractXlsxData(targetView, req); + const wb = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(wb, data, targetView.title); + const buf = XLSX.write(wb, { type: 'base64', bookType: 'xlsx' }); + res.set({ + 'Access-Control-Expose-Headers': 'nc-export-offset', + 'nc-export-offset': offset, + 'nc-export-elapsed-time': elapsed, + 'Content-Disposition': `attachment; filename="${encodeURI( + targetView.title, + )}-export.xlsx"`, + }); + res.end(buf); + } + @Get([ + '/api/v1/db/data/:orgs/:projectName/:tableName/views/:viewName/export/csv', + '/api/v1/db/data/:orgs/:projectName/:tableName/export/csv', + ]) + @Acl('exportCsv') + async csvDataExport(@Request() req, @Response() res) { + const { model, view } = await getViewAndModelFromRequestByAliasOrId(req); + let targetView = view; + if (!targetView) { + targetView = await View.getDefaultView(model.id); + } + const { offset, elapsed, data } = await extractCsvData(targetView, req); + + res.set({ + 'Access-Control-Expose-Headers': 'nc-export-offset', + 'nc-export-offset': offset, + 'nc-export-elapsed-time': elapsed, + 'Content-Disposition': `attachment; filename="${encodeURI( + targetView.title, + )}-export.csv"`, + }); + res.send(data); + } +}