Skip to content

Commit ad83afc

Browse files
committed
feat: update resource data handling to include computed list helper fields and enhance test coverage for resource data retrieval
1 parent 8e25924 commit ad83afc

3 files changed

Lines changed: 24 additions & 15 deletions

File tree

adminforth/modules/restApi.ts

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -274,7 +274,7 @@ const getResourceDataRequestSchema: AnySchemaObject = {
274274
filters: commonFiltersSchema,
275275
columns: {
276276
type: 'array',
277-
description: 'Optional list of resource column names to include in returned rows. When set, the response is projected to exactly these resource columns and computed helper fields such as _label and _clickUrl are omitted.',
277+
description: 'Optional list of resource column names to include in returned rows. For list requests, computed row helper fields such as _label and _clickUrl are still returned when available.',
278278
minItems: 1,
279279
uniqueItems: true,
280280
items: { type: 'string' },
@@ -1316,6 +1316,7 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
13161316
}
13171317
}
13181318
const selectedColumnNameSet = selectedColumnNames ? new Set(selectedColumnNames) : undefined;
1319+
const shouldAddListHelpers = source === 'list';
13191320
const selectedDataSourceColumnNameSet = selectedColumnNames
13201321
? new Set(selectedColumnNames.filter((columnName) => resource.dataSourceColumns.some((col) => col.name === columnName)))
13211322
: undefined;
@@ -1331,7 +1332,7 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
13311332
}
13321333
}
13331334

1334-
const selectedDataSourceColumns = selectedDataSourceColumnNameSet
1335+
const selectedDataSourceColumns = selectedDataSourceColumnNameSet && !shouldAddListHelpers
13351336
? (
13361337
resource.dataSourceColumns.some((col) => selectedDataSourceColumnNameSet.has(col.name))
13371338
? resource.dataSourceColumns.filter((col) => selectedDataSourceColumnNameSet.has(col.name))
@@ -1382,7 +1383,7 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
13821383
// for foreign keys, add references
13831384
await Promise.all(
13841385
resource.columns.filter((col) => (
1385-
col.foreignResource && (!selectedColumnNameSet || selectedColumnNameSet.has(col.name))
1386+
col.foreignResource && (!selectedColumnNameSet || shouldAddListHelpers || selectedColumnNameSet.has(col.name))
13861387
)).map(async (col) => {
13871388
let targetDataMap = {};
13881389

@@ -1493,7 +1494,6 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
14931494
})
14941495
);
14951496

1496-
const pkField = resource.columns.find((col) => col.primaryKey)?.name;
14971497
// remove all columns which are not defined in resources, or defined but backendOnly
14981498
{
14991499
const ctx = {
@@ -1516,12 +1516,12 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
15161516
delete item[key];
15171517
}
15181518
}
1519-
if (!selectedColumnNameSet) {
1519+
if (!selectedColumnNameSet || shouldAddListHelpers) {
15201520
item._label = resource.recordLabel(item);
15211521
}
15221522
}
15231523
}
1524-
if (!selectedColumnNameSet && source === 'list' && resource.options.listTableClickUrl) {
1524+
if (shouldAddListHelpers && resource.options.listTableClickUrl) {
15251525
await Promise.all(
15261526
data.data.map(async (item) => {
15271527
item._clickUrl = await resource.options.listTableClickUrl(item, adminUser, resource);
@@ -1551,7 +1551,7 @@ export default class AdminForthRestAPI implements IAdminForthRestAPI {
15511551
if (selectedColumnNameSet) {
15521552
for (const item of data.data) {
15531553
for (const key of Object.keys(item)) {
1554-
if (!selectedColumnNameSet.has(key)) {
1554+
if (!selectedColumnNameSet.has(key) && key !== '_label' && key !== '_clickUrl') {
15551555
delete item[key];
15561556
}
15571557
}

tests/application/resources/cars_sl_allow_create.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ const cars_sl = carsResourseTemplate("cars_sl", "sqlite", "id");
55

66
export default {
77
...cars_sl,
8+
options: {
9+
...(cars_sl as any).options,
10+
listTableClickUrl: async (record: any, _adminUser: any, resource: any) => `/resource/${resource.resourceId}/show/${record.id}`,
11+
},
812
columns: [
913
...cars_sl.columns.filter(c => c.name !== "mileage" && c.name !== "photos" && c.name !== "generated_promo_picture"),
1014
{
@@ -33,4 +37,4 @@ export default {
3337
editReadonly: true,
3438
},
3539
],
36-
};
40+
};

tests/jest_tests/CRUD_sqlite.test.ts

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -730,9 +730,10 @@ describe('POST /get_resource_data', () => {
730730
expect(res.status).toEqual(200);
731731
expect(res.body.error).toBeUndefined();
732732
expect(res.body.data[0]._label).toBe('🚘 Abobus amogus 🚗');
733+
expect(res.body.data[0]._clickUrl).toBe(`/resource/cars_sl/show/${createdRecordId}`);
733734
});
734735

735-
it('returns exactly requested columns and omits computed helper fields', async () => {
736+
it('returns requested columns with computed list helper fields', async () => {
736737
const res = await agent
737738
.set('Cookie', authCookie)
738739
.post('/adminapi/v1/get_resource_data')
@@ -751,9 +752,9 @@ describe('POST /get_resource_data', () => {
751752
expect(res.body.data[0]).toEqual({
752753
model: 'Abobus amogus',
753754
price: 1234,
755+
_label: '🚘 Abobus amogus 🚗',
756+
_clickUrl: `/resource/cars_sl/show/${createdRecordId}`,
754757
});
755-
expect(res.body.data[0]._label).toBeUndefined();
756-
expect(res.body.data[0]._clickUrl).toBeUndefined();
757758
});
758759

759760
it('returns an error for unknown requested columns', async () => {
@@ -790,7 +791,9 @@ describe('POST /get_resource_data', () => {
790791

791792
expect(res.status).toEqual(200);
792793
expect(res.body.error).toBeUndefined();
793-
expect(res.body.data[0]).toEqual({});
794+
expect(res.body.data[0]).toEqual({
795+
_label: '👤 adminforth',
796+
});
794797
});
795798

796799
it('projects requested foreign columns after reference post-processing', async () => {
@@ -841,11 +844,12 @@ describe('POST /get_resource_data', () => {
841844

842845
expect(res.status).toEqual(200);
843846
expect(res.body.error).toBeUndefined();
844-
expect(res.body.data[0]).toEqual({
847+
expect(res.body.data[0]).toMatchObject({
845848
seller_id: {
846849
label: '👤 adminforth',
847850
pk: adminUserId,
848851
},
852+
_label: '🚘 Abobus amogus 🚗',
849853
});
850854
});
851855

@@ -881,12 +885,13 @@ describe('POST /get_resource_data', () => {
881885

882886
expect(res.status).toEqual(200);
883887
expect(res.body.error).toBeUndefined();
884-
expect(res.body.data[0]).toEqual({
888+
expect(res.body.data[0]).toMatchObject({
885889
record_id: {
886890
label: '🚘 Abobus amogus 🚗',
887891
pk: createdRecordId,
888892
},
889893
});
894+
expect(res.body.data[0]._label.startsWith('Polymorphic car refs ')).toBe(true);
890895
expect(res.body.data[0].resource_id).toBeUndefined();
891896
});
892897

@@ -1099,4 +1104,4 @@ describe('POST /delete_record', () => {
10991104
expect(res.body.error).toBe("Operation aborted by hook");
11001105
});
11011106

1102-
});
1107+
});

0 commit comments

Comments
 (0)