diff --git a/app/server/lib/ExportTableSchema.ts b/app/server/lib/ExportTableSchema.ts index 79c1f29b78..edc0466085 100644 --- a/app/server/lib/ExportTableSchema.ts +++ b/app/server/lib/ExportTableSchema.ts @@ -1,7 +1,7 @@ import * as express from 'express'; import {ApiError} from 'app/common/ApiError'; import {ActiveDoc} from 'app/server/lib/ActiveDoc'; -import {DownloadOptions, ExportColumn, exportTable} from 'app/server/lib/Export'; +import {DownloadOptions, ExportColumn, ExportHeader, exportTable} from 'app/server/lib/Export'; interface FrictionlessFormat { name: string; @@ -51,21 +51,21 @@ export async function collectTableSchemaInFrictionlessFormat( } const data = await exportTable(activeDoc, tableRef, req); - const tableSchema = columnsToTableSchema(tableId, data, settings.locale); + const tableSchema = columnsToTableSchema(tableId, data, {locale: settings.locale, header: options.header}); return tableSchema; } function columnsToTableSchema( tableId: string, {tableName, columns}: {tableName: string, columns: ExportColumn[]}, - locale: string, + {locale, header = "label"}: {locale: string, header?: ExportHeader}, ): FrictionlessFormat { return { name: tableId.toLowerCase().replace(/_/g, '-'), title: tableName, schema: { fields: columns.map(col => ({ - name: col.label, + name: col[header], ...(col.description ? {description: col.description} : {}), ...buildTypeField(col, locale), })), diff --git a/test/server/lib/DocApi.ts b/test/server/lib/DocApi.ts index 0779834577..57c40413c3 100644 --- a/test/server/lib/DocApi.ts +++ b/test/server/lib/DocApi.ts @@ -2695,6 +2695,43 @@ function testDocApi() { assert.equal(resp2.data, 'A,B\nSanta,1\nBob,11\nAlice,2\nFelix,22\n'); }); + it("GET /docs/{did}/download/table-schema serves table-schema-encoded document with header=colId", async function () { + const { docUrl, tableUrl } = await generateDocAndUrl('tableSchemaWithColIdAsHeader'); + const columns = [ + { + id: 'Some_ID', + fields: { + label: 'Some Label', + type: 'Text', + } + }, + ]; + const setupColResp = await axios.put(`${tableUrl}/columns`, { columns }, {...chimpy, params: { replaceall: true }}); + assert.equal(setupColResp.status, 200); + + const resp = await axios.get(`${docUrl}/download/table-schema?tableId=Table1&header=colId`, chimpy); + assert.equal(resp.status, 200); + const expected = { + format: "csv", + mediatype: "text/csv", + encoding: "utf-8", + dialect: { + delimiter: ",", + doubleQuote: true, + }, + name: 'table1', + title: 'Table1', + schema: { + fields: [{ + name: 'Some_ID', + type: 'string', + format: 'default', + }] + } + }; + assert.deepInclude(resp.data, expected); + }); + it("GET /docs/{did}/download/table-schema respects permissions", async function () { // kiwi has no access to TestDoc const resp = await axios.get(`${serverUrl}/api/docs/${docIds.TestDoc}/download/table-schema?tableId=Table1`, kiwi);