mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
275 lines
6.5 KiB
275 lines
6.5 KiB
2 years ago
|
import { UITypes } from 'nocodb-sdk';
|
||
|
import request from 'supertest';
|
||
|
import Column from '../../../src/models/Column';
|
||
|
import FormViewColumn from '../../../src/models/FormViewColumn';
|
||
|
import GalleryViewColumn from '../../../src/models/GalleryViewColumn';
|
||
|
import GridViewColumn from '../../../src/models/GridViewColumn';
|
||
|
import Model from '../../../src/models/Model';
|
||
|
import Project from '../../../src/models/Project';
|
||
|
import View from '../../../src/models/View';
|
||
|
import { isSqlite, isPg } from '../init/db';
|
||
|
|
||
|
const defaultColumns = function (context) {
|
||
|
return [
|
||
|
{
|
||
|
column_name: 'id',
|
||
|
title: 'Id',
|
||
|
uidt: 'ID',
|
||
|
},
|
||
|
{
|
||
|
column_name: 'title',
|
||
|
title: 'Title',
|
||
|
uidt: 'SingleLineText',
|
||
|
},
|
||
|
{
|
||
|
cdf: isPg(context) ? 'now()' : 'CURRENT_TIMESTAMP',
|
||
|
column_name: 'created_at',
|
||
|
title: 'CreatedAt',
|
||
|
dtxp: '',
|
||
|
dtxs: '',
|
||
|
uidt: 'DateTime',
|
||
|
dt: isPg(context) ? 'timestamp without time zone' : undefined,
|
||
|
},
|
||
|
{
|
||
|
cdf: isSqlite(context)
|
||
|
? 'CURRENT_TIMESTAMP'
|
||
|
: isPg(context)
|
||
|
? 'now()'
|
||
|
: 'CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP',
|
||
|
column_name: 'updated_at',
|
||
|
title: 'UpdatedAt',
|
||
|
dtxp: '',
|
||
|
dtxs: '',
|
||
|
uidt: 'DateTime',
|
||
|
dt: isPg(context) ? 'timestamp without time zone' : undefined,
|
||
|
},
|
||
|
];
|
||
|
};
|
||
|
|
||
|
const createColumn = async (context, table, columnAttr) => {
|
||
|
await request(context.app)
|
||
|
.post(`/api/v1/db/meta/tables/${table.id}/columns`)
|
||
|
.set('xc-auth', context.token)
|
||
|
.send({
|
||
|
...columnAttr,
|
||
|
});
|
||
|
|
||
|
const column: Column = (await table.getColumns()).find(
|
||
|
(column) => column.title === columnAttr.title
|
||
|
);
|
||
|
return column;
|
||
|
};
|
||
|
|
||
|
const createRollupColumn = async (
|
||
|
context,
|
||
|
{
|
||
|
project,
|
||
|
title,
|
||
|
rollupFunction,
|
||
|
table,
|
||
|
relatedTableName,
|
||
|
relatedTableColumnTitle,
|
||
|
}: {
|
||
|
project: Project;
|
||
|
title: string;
|
||
|
rollupFunction: string;
|
||
|
table: Model;
|
||
|
relatedTableName: string;
|
||
|
relatedTableColumnTitle: string;
|
||
|
}
|
||
|
) => {
|
||
|
const childBases = await project.getBases();
|
||
|
const childTable = await Model.getByIdOrName({
|
||
|
project_id: project.id,
|
||
|
base_id: childBases[0].id!,
|
||
|
table_name: relatedTableName,
|
||
|
});
|
||
|
const childTableColumns = await childTable.getColumns();
|
||
|
const childTableColumn = await childTableColumns.find(
|
||
|
(column) => column.title === relatedTableColumnTitle
|
||
|
);
|
||
|
|
||
|
const ltarColumn = (await table.getColumns()).find(
|
||
|
(column) =>
|
||
|
column.uidt === UITypes.LinkToAnotherRecord &&
|
||
|
column.colOptions?.fk_related_model_id === childTable.id
|
||
|
);
|
||
|
|
||
|
const rollupColumn = await createColumn(context, table, {
|
||
|
title: title,
|
||
|
uidt: UITypes.Rollup,
|
||
|
fk_relation_column_id: ltarColumn?.id,
|
||
|
fk_rollup_column_id: childTableColumn?.id,
|
||
|
rollup_function: rollupFunction,
|
||
|
table_name: table.table_name,
|
||
|
column_name: title,
|
||
|
});
|
||
|
|
||
|
return rollupColumn;
|
||
|
};
|
||
|
|
||
|
const createLookupColumn = async (
|
||
|
context,
|
||
|
{
|
||
|
project,
|
||
|
title,
|
||
|
table,
|
||
|
relatedTableName,
|
||
|
relatedTableColumnTitle,
|
||
|
}: {
|
||
|
project: Project;
|
||
|
title: string;
|
||
|
table: Model;
|
||
|
relatedTableName: string;
|
||
|
relatedTableColumnTitle: string;
|
||
|
}
|
||
|
) => {
|
||
|
const childBases = await project.getBases();
|
||
|
const childTable = await Model.getByIdOrName({
|
||
|
project_id: project.id,
|
||
|
base_id: childBases[0].id!,
|
||
|
table_name: relatedTableName,
|
||
|
});
|
||
|
const childTableColumns = await childTable.getColumns();
|
||
|
const childTableColumn = await childTableColumns.find(
|
||
|
(column) => column.title === relatedTableColumnTitle
|
||
|
);
|
||
|
|
||
|
if (!childTableColumn) {
|
||
|
throw new Error(
|
||
|
`Could not find column ${relatedTableColumnTitle} in ${relatedTableName}`
|
||
|
);
|
||
|
}
|
||
|
|
||
|
const ltarColumn = (await table.getColumns()).find(
|
||
|
(column) =>
|
||
|
column.uidt === UITypes.LinkToAnotherRecord &&
|
||
|
column.colOptions?.fk_related_model_id === childTable.id
|
||
|
);
|
||
|
const lookupColumn = await createColumn(context, table, {
|
||
|
title: title,
|
||
|
uidt: UITypes.Lookup,
|
||
|
fk_relation_column_id: ltarColumn?.id,
|
||
|
fk_lookup_column_id: childTableColumn?.id,
|
||
|
table_name: table.table_name,
|
||
|
column_name: title,
|
||
|
});
|
||
|
|
||
|
return lookupColumn;
|
||
|
};
|
||
|
|
||
|
const createQrCodeColumn = async (
|
||
|
context,
|
||
|
{
|
||
|
title,
|
||
|
table,
|
||
|
referencedQrValueTableColumnTitle,
|
||
|
}: {
|
||
|
title: string;
|
||
|
table: Model;
|
||
|
referencedQrValueTableColumnTitle: string;
|
||
|
}
|
||
|
) => {
|
||
|
const referencedQrValueTableColumnId = await table
|
||
|
.getColumns()
|
||
|
.then(
|
||
|
(cols) =>
|
||
|
cols.find(
|
||
|
(column) => column.title == referencedQrValueTableColumnTitle
|
||
|
)['id']
|
||
|
);
|
||
|
|
||
|
const qrCodeColumn = await createColumn(context, table, {
|
||
|
title: title,
|
||
|
uidt: UITypes.QrCode,
|
||
|
column_name: title,
|
||
|
fk_qr_value_column_id: referencedQrValueTableColumnId,
|
||
|
});
|
||
|
return qrCodeColumn;
|
||
|
};
|
||
|
|
||
|
const createBarcodeColumn = async (
|
||
|
context,
|
||
|
{
|
||
|
title,
|
||
|
table,
|
||
|
referencedBarcodeValueTableColumnTitle,
|
||
|
}: {
|
||
|
title: string;
|
||
|
table: Model;
|
||
|
referencedBarcodeValueTableColumnTitle: string;
|
||
|
}
|
||
|
) => {
|
||
|
const referencedBarcodeValueTableColumnId = await table
|
||
|
.getColumns()
|
||
|
.then(
|
||
|
(cols) =>
|
||
|
cols.find(
|
||
|
(column) => column.title == referencedBarcodeValueTableColumnTitle
|
||
|
)['id']
|
||
|
);
|
||
|
|
||
|
const barcodeColumn = await createColumn(context, table, {
|
||
|
title: title,
|
||
|
uidt: UITypes.Barcode,
|
||
|
column_name: title,
|
||
|
fk_barcode_value_column_id: referencedBarcodeValueTableColumnId,
|
||
|
});
|
||
|
return barcodeColumn;
|
||
|
};
|
||
|
|
||
|
const createLtarColumn = async (
|
||
|
context,
|
||
|
{
|
||
|
title,
|
||
|
parentTable,
|
||
|
childTable,
|
||
|
type,
|
||
|
}: {
|
||
|
title: string;
|
||
|
parentTable: Model;
|
||
|
childTable: Model;
|
||
|
type: string;
|
||
|
}
|
||
|
) => {
|
||
|
const ltarColumn = await createColumn(context, parentTable, {
|
||
|
title: title,
|
||
|
column_name: title,
|
||
|
uidt: UITypes.LinkToAnotherRecord,
|
||
|
parentId: parentTable.id,
|
||
|
childId: childTable.id,
|
||
|
type: type,
|
||
|
});
|
||
|
|
||
|
return ltarColumn;
|
||
|
};
|
||
|
|
||
|
const updateViewColumn = async (
|
||
|
context,
|
||
|
{ view, column, attr }: { column: Column; view: View; attr: any }
|
||
|
) => {
|
||
|
const res = await request(context.app)
|
||
|
.patch(`/api/v1/db/meta/views/${view.id}/columns/${column.id}`)
|
||
|
.set('xc-auth', context.token)
|
||
|
.send({
|
||
|
...attr,
|
||
|
});
|
||
|
|
||
|
const updatedColumn: FormViewColumn | GridViewColumn | GalleryViewColumn = (
|
||
|
await view.getColumns()
|
||
|
).find((column) => column.id === column.id)!;
|
||
|
|
||
|
return updatedColumn;
|
||
|
};
|
||
|
|
||
|
export {
|
||
|
defaultColumns,
|
||
|
createColumn,
|
||
|
createQrCodeColumn,
|
||
|
createBarcodeColumn,
|
||
|
createRollupColumn,
|
||
|
createLookupColumn,
|
||
|
createLtarColumn,
|
||
|
updateViewColumn,
|
||
|
};
|