Skip to content

feat(core): Add Data Store Backend API (no-changelog) #17824

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 119 commits into from
Aug 12, 2025
Merged
Show file tree
Hide file tree
Changes from 16 commits
Commits
Show all changes
119 commits
Select commit Hold shift + click to select a range
046b88e
initial module commit
CharlieKolb Jul 22, 2025
454db2f
Add functional backend skeleton
CharlieKolb Jul 23, 2025
ada6537
untested wip code
CharlieKolb Jul 24, 2025
cc24e98
add working tests
CharlieKolb Jul 24, 2025
973c1c9
Working list API
CharlieKolb Jul 25, 2025
cf6df74
expose endpoints
CharlieKolb Jul 25, 2025
507bcd0
add test for joining columns
CharlieKolb Jul 25, 2025
309e5d8
test pagination
CharlieKolb Jul 25, 2025
3e11e93
add sort by tests
CharlieKolb Jul 25, 2025
9318e6e
Add row-based operations
CharlieKolb Jul 29, 2025
8b469ff
expose apis
CharlieKolb Jul 29, 2025
0e7d5ac
also expose getColumns
CharlieKolb Jul 29, 2025
9fcbb9f
fix file casing
CharlieKolb Jul 29, 2025
0695ed0
Rename API, adjust dtos and include project scopes
CharlieKolb Jul 30, 2025
01900d5
self review
CharlieKolb Jul 30, 2025
331fc9b
wip commit
CharlieKolb Jul 31, 2025
85a6230
fix build and add tests for shiftColumns
CharlieKolb Jul 31, 2025
0f8e2b1
implement column moving
CharlieKolb Jul 31, 2025
cb0455a
throw errors instead of returning strings
CharlieKolb Jul 31, 2025
b4a10a3
rename endpoints, modify update dto, fix flaky test
dariacodes Jul 31, 2025
0ff50cf
fix sql utils test
dariacodes Aug 1, 2025
33f7afe
apply interface and more types
CharlieKolb Aug 1, 2025
1e8a78f
fix tests
CharlieKolb Aug 1, 2025
461d23c
fix import for sql utils test
dariacodes Aug 1, 2025
2b26741
improve insert rows endpoint and tests
dariacodes Aug 1, 2025
70cb3b6
prevent SQL injection by quoting column names and using parameter bin…
dariacodes Aug 1, 2025
b1a2b05
Add upsert endpoint
dariacodes Aug 4, 2025
fa33743
Merge remote-tracking branch 'origin/master' into ADO-3851
CharlieKolb Aug 4, 2025
ade6eba
clean up Do The Thing button and adjust api
CharlieKolb Aug 4, 2025
8434c5a
fix build
CharlieKolb Aug 4, 2025
e8146a6
captalize file name correctly
CharlieKolb Aug 4, 2025
7967864
Fix permissions type errors
dariacodes Aug 4, 2025
8e6811d
self review
CharlieKolb Aug 4, 2025
e13746d
attempt to fix db issues
CharlieKolb Aug 4, 2025
eb5b4b8
lint
CharlieKolb Aug 4, 2025
a0a4ac0
fix tests
CharlieKolb Aug 4, 2025
8ba6878
try catch instead
CharlieKolb Aug 4, 2025
1453658
remove experiments
CharlieKolb Aug 4, 2025
96e7f6e
Merge remote-tracking branch 'origin/master' into ADO-3851
CharlieKolb Aug 4, 2025
9d37427
Merge remote-tracking branch 'origin/master' into ADO-3851
CharlieKolb Aug 4, 2025
419f517
fix query and type
CharlieKolb Aug 4, 2025
23d6a84
Merge remote-tracking branch 'origin/master' into ADO-3851
CharlieKolb Aug 4, 2025
c0c8eac
fix(core): Fix some DataStore backend API issues (#17978)
ivov Aug 5, 2025
5124f2b
fix import on frontend
dariacodes Aug 5, 2025
3201399
fix permissions test
dariacodes Aug 5, 2025
305e321
add transactions for column operations
CharlieKolb Aug 5, 2025
0079c9c
add transactions to data store operations
CharlieKolb Aug 5, 2025
0ad74e4
refactor existing table check
CharlieKolb Aug 5, 2025
815688b
remove unused code
CharlieKolb Aug 5, 2025
205078f
remove IDataStoreService interface and use RegExp
CharlieKolb Aug 5, 2025
7f0655e
Add dataStoreShared endpoint and readd start/shutdown
CharlieKolb Aug 5, 2025
43c00c7
fix lint and unit tests
CharlieKolb Aug 5, 2025
1663e6f
avoid nested transaction
CharlieKolb Aug 5, 2025
21b12eb
use entityManager in transaction
CharlieKolb Aug 5, 2025
9490926
ai feedback
CharlieKolb Aug 5, 2025
b4c4be8
fix local build
CharlieKolb Aug 5, 2025
70e0485
use DSL for table creation
dariacodes Aug 5, 2025
f05e13f
use rows instead of using api directly
CharlieKolb Aug 5, 2025
c96dcca
remove data-store from defaultModules
CharlieKolb Aug 5, 2025
fe24022
fix module test
dariacodes Aug 5, 2025
946aa47
improve create table tests
dariacodes Aug 6, 2025
b756b04
use DSL for table deletion
dariacodes Aug 6, 2025
aa3fb84
Merge branch 'master' into ADO-3851
dariacodes Aug 6, 2025
82fe47b
fix import on frontend
dariacodes Aug 6, 2025
c41af20
use DSL for deleteDataStoreAll
dariacodes Aug 6, 2025
543ff08
Merge branch 'master' into ADO-3851
dariacodes Aug 6, 2025
0aa67ca
put data-stores back to registry for tests to pass
dariacodes Aug 6, 2025
7796b75
use the right quoting identifier
dariacodes Aug 6, 2025
f31d530
switch back to raw create table
dariacodes Aug 6, 2025
5acd853
switch to timestamp for postgres, update test with hasTable
dariacodes Aug 6, 2025
20c75e0
improve tests
dariacodes Aug 7, 2025
7c8a9ed
Merge branch 'master' into ADO-3851
dariacodes Aug 7, 2025
fe7a8f7
hide module from the registry
dariacodes Aug 7, 2025
14def7a
add columns on create, user table on add column, quote table names, i…
dariacodes Aug 7, 2025
954a174
fix orderBy statement for postgres, fix sorting tests for sqlite, ski…
dariacodes Aug 7, 2025
3dbf414
update sql utils test
dariacodes Aug 7, 2025
3194867
fix type errors
dariacodes Aug 7, 2025
1841914
return loadModules back
dariacodes Aug 7, 2025
3da0eda
another attempt to fix types
dariacodes Aug 7, 2025
4c8b074
wait 1 sec for date ops for all the dbs
dariacodes Aug 7, 2025
98598b9
order columns by columnIndex for getColumns to ensure the same result…
dariacodes Aug 8, 2025
f0d5ac1
fix orderBy query
dariacodes Aug 8, 2025
4821a7f
add order by columnIndex to join query
dariacodes Aug 8, 2025
5e8f65d
sort columns manually
dariacodes Aug 8, 2025
59fee3a
fix insert functionality, normalize rows
dariacodes Aug 8, 2025
ac57b61
fix build update query, unify style
dariacodes Aug 8, 2025
045b0e1
transform dates for sqlite and mariadb
dariacodes Aug 8, 2025
26a036a
update sql-utils test
dariacodes Aug 8, 2025
61e72e3
fix value normalization
dariacodes Aug 8, 2025
edcf020
use quoted fields and table name for upsert
dariacodes Aug 8, 2025
b580cba
stop checking order for test failing for mariadb
dariacodes Aug 8, 2025
9bbcfd9
rename shared data store service, add a test
dariacodes Aug 11, 2025
3ed0dc4
remove unused repositories from test
dariacodes Aug 11, 2025
9adb2f5
return only data stores user has access to, add more tests
dariacodes Aug 11, 2025
515fee9
remove type warnings
dariacodes Aug 11, 2025
2d0d9b8
remove unused dtos
dariacodes Aug 11, 2025
8527674
use explicit project scopes
dariacodes Aug 11, 2025
91069c1
refactor(core): Avoid type casts
Cadiac Aug 11, 2025
4551e64
add a project scope to data store aggregate
dariacodes Aug 11, 2025
205a612
remove migration
dariacodes Aug 11, 2025
bc9ff11
Merge branch 'master' into ADO-3851
dariacodes Aug 11, 2025
8afdfce
rename columnIndex to index
dariacodes Aug 11, 2025
44a8c93
remove entity from data store table names
dariacodes Aug 11, 2025
933a47d
rename entities
dariacodes Aug 11, 2025
62a5f37
include data-store as module
dariacodes Aug 12, 2025
7270296
discard migration changes
dariacodes Aug 12, 2025
e0cae29
add createdAt and updatedAt to column entity
dariacodes Aug 12, 2025
a05ecf7
test(core): Expect data-store to be missing from eligibleModules by d…
Cadiac Aug 12, 2025
e9e51b4
move create user table logic to rows repository
dariacodes Aug 12, 2025
c647a90
Merge branch 'master' into ADO-3851
dariacodes Aug 12, 2025
3c5e814
rename data store entity for new files
dariacodes Aug 12, 2025
2ef3816
move drop column from table to rows repository
dariacodes Aug 12, 2025
526a676
clean up
dariacodes Aug 12, 2025
fe8935d
remove getPrimaryKeyAutoIncrement
dariacodes Aug 12, 2025
f4ee35b
fix(core): Fix data store read rows endpoint
Cadiac Aug 12, 2025
81004be
populate data store create with project
dariacodes Aug 12, 2025
a43e4d2
fix(core): Parse row read filters from query params correctly
Cadiac Aug 12, 2025
69842f5
fix ts errors in test
dariacodes Aug 12, 2025
79af2d2
fix(editor): change the delete column endpoint to not take request body
Cadiac Aug 12, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
import { Z } from 'zod-class';

import { dataStoreCreateColumnSchema } from '../../schemas/data-store.schema';

export class AddDataStoreColumnDto extends Z.class(dataStoreCreateColumnSchema.shape) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
import { z } from 'zod';
import { Z } from 'zod-class';

export class AddDatastoreRecordsDto extends Z.class({
records: z.array(z.record(z.string(), z.any())),
}) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { Z } from 'zod-class';

import {
dataStoreColumnNameSchema,
dataStoreColumnTypeSchema,
} from '../../schemas/data-store.schema';

export class CreateDataStoreColumnDto extends Z.class({
name: dataStoreColumnNameSchema,
type: dataStoreColumnTypeSchema,
}) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { z } from 'zod';
import { Z } from 'zod-class';

import { CreateDataStoreColumnDto } from './create-data-store-column.dto';
import { dataStoreNameSchema } from '../../schemas/data-store.schema';

export class CreateDataStoreDto extends Z.class({
name: dataStoreNameSchema,
columns: z.array(CreateDataStoreColumnDto),
}) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { Z } from 'zod-class';

import { dataStoreColumnNameSchema } from '../../schemas/data-store.schema';

export class DeleteDataStoreColumnDto extends Z.class({
columnName: dataStoreColumnNameSchema,
}) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { Z } from 'zod-class';

import { dataStoreIdSchema } from '../../schemas/data-store.schema';

export class DeleteDataStoreDto extends Z.class({
id: dataStoreIdSchema,
}) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
import { z } from 'zod';
import { Z } from 'zod-class';

import { dataStoreColumnNameSchema } from '../../schemas/data-store.schema';
import { paginationSchema } from '../pagination/pagination.dto';

const FilterConditionSchema = z.union([z.literal('eq'), z.literal('neq')]);
export type ListDataStoreContentFilterConditionType = z.infer<typeof FilterConditionSchema>;

const filterRecord = z.object({
columnName: dataStoreColumnNameSchema,
condition: FilterConditionSchema.default('eq'),
value: z.union([z.string(), z.number(), z.boolean(), z.date()]),
});

const chainedFilterSchema = z.union([z.literal('and'), z.literal('or')]);

export type ListDataStoreContentFilter = z.infer<typeof filterValidator>;

// ---------------------
// Parameter Validators
// ---------------------

// Filter parameter validation
const filterValidator = z.object({
type: chainedFilterSchema.default('and'),
filters: z.array(filterRecord).default([]),
});

// SortBy parameter validation
const sortByValidator = z
.string()
.optional()
.transform((val, ctx) => {
if (val === undefined) return val;

if (!val.includes(':')) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'Invalid sort format, expected <columnName>:<asc/desc>',
path: ['sort'],
});
return z.NEVER;
}

let [column, direction] = val.split(':');

try {
column = dataStoreColumnNameSchema.parse(column);
} catch {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'Invalid sort columnName',
path: ['sort'],
});
return z.NEVER;
}

direction = direction?.toUpperCase();
if (direction !== 'ASC' && direction !== 'DESC') {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'Invalid sort direction',
path: ['sort'],
});

return z.NEVER;
}
return [column, direction] as const;
});

export class ListDataStoreContentQueryDto extends Z.class({
...paginationSchema,
filter: filterValidator,
sortBy: sortByValidator,
}) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { jsonParse } from 'n8n-workflow';
import { z } from 'zod';
import { Z } from 'zod-class';

import { paginationSchema } from '../pagination/pagination.dto';

const VALID_SORT_OPTIONS = [
'name:asc',
'name:desc',
'createdAt:asc',
'createdAt:desc',
'updatedAt:asc',
'updatedAt:desc',
'sizeBytes:asc',
'sizeBytes:desc',
] as const;

export type ListDataStoreQuerySortOptions = (typeof VALID_SORT_OPTIONS)[number];

const FILTER_OPTIONS = {
id: z.union([z.string(), z.array(z.string())]).optional(),
name: z.union([z.string(), z.array(z.string())]).optional(),
// todo: can probably include others here as well?
};

// Filter schema - only allow specific properties
const filterSchema = z.object(FILTER_OPTIONS).strict();
// ---------------------
// Parameter Validators
// ---------------------

// Filter parameter validation
const filterValidator = z
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Note for later: we really need to find a way to factorize all those filter validator (same in list-folder-query.dto and users-list-filter.dto)

.string()
.optional()
.transform((val, ctx) => {
if (!val) return undefined;
try {
const parsed: unknown = jsonParse(val);
try {
return filterSchema.parse(parsed);
} catch (e) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'Invalid filter fields',
path: ['filter'],
});
return z.NEVER;
}
} catch (e) {
ctx.addIssue({
code: z.ZodIssueCode.custom,
message: 'Invalid filter format',
path: ['filter'],
});
return z.NEVER;
}
});

// SortBy parameter validation
const sortByValidator = z
.enum(VALID_SORT_OPTIONS, { message: `sortBy must be one of: ${VALID_SORT_OPTIONS.join(', ')}` })
.optional();

export class ListDataStoreQueryDto extends Z.class({
...paginationSchema,
filter: filterValidator,
sortBy: sortByValidator,
}) {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import { Z } from 'zod-class';

import { dataStoreNameSchema } from '../../schemas/data-store.schema';

export class RenameDataStoreDto extends Z.class({
name: dataStoreNameSchema,
}) {}
9 changes: 9 additions & 0 deletions packages/@n8n/api-types/src/dto/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,3 +79,12 @@ export {
} from './user/users-list-filter.dto';

export { OidcConfigDto } from './oidc/config.dto';

export { CreateDataStoreDto } from './data-store/create-data-store.dto';
export { RenameDataStoreDto } from './data-store/rename-data-store.dto';
export { ListDataStoreQueryDto } from './data-store/list-data-store-query.dto';
export { ListDataStoreContentQueryDto } from './data-store/list-data-store-content-query.dto';
export { CreateDataStoreColumnDto } from './data-store/create-data-store-column.dto';
export { AddDatastoreRecordsDto } from './data-store/add-data-store-records.dto';
export { AddDataStoreColumnDto } from './data-store/add-data-store-column.dto';
export { DeleteDataStoreColumnDto } from './data-store/delete-data-store-column.dto';
2 changes: 2 additions & 0 deletions packages/@n8n/api-types/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,3 +45,5 @@ export {
type UsersList,
usersListSchema,
} from './schemas/user.schema';

export type { DataStore, DataStoreColumn } from './schemas/data-store.schema';
40 changes: 40 additions & 0 deletions packages/@n8n/api-types/src/schemas/data-store.schema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import { z } from 'zod';

export const dataStoreNameSchema = z.string().trim().min(1).max(128);
export const dataStoreIdSchema = z.string().max(36);

export const DATA_STORE_COLUMN_REGEX = /^[a-zA-Z0-9][a-zA-Z0-9-]*$/;

export const dataStoreColumnNameSchema = z
.string()
.trim()
.min(1)
.max(128)
.regex(
DATA_STORE_COLUMN_REGEX,
'Only alphanumeric characters and non-leading dashes are allowed for column names',
);
export const dataStoreColumnTypeSchema = z.enum(['string', 'number', 'boolean', 'date']);

export const dataStoreCreateColumnSchema = z.object({
name: dataStoreColumnNameSchema,
type: dataStoreColumnTypeSchema,
columnIndex: z.number().optional(),
});
export type DataStoreCreateColumnSchema = z.infer<typeof dataStoreCreateColumnSchema>;

export const dataStoreColumnSchema = dataStoreCreateColumnSchema.extend({
createdAt: z.string().datetime(),
updatedAt: z.string().datetime(),
dataStoreId: dataStoreIdSchema,
});

export const dataStoreSchema = z.object({
id: dataStoreIdSchema,
name: dataStoreNameSchema,
columns: z.array(dataStoreColumnSchema),
createdAt: z.string().datetime(),
updatedAt: z.string().datetime(),
});
export type DataStore = z.infer<typeof dataStoreSchema>;
export type DataStoreColumn = z.infer<typeof dataStoreColumnSchema>;
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ export class ModuleRegistry {
private readonly modulesConfig: ModulesConfig,
) {}

private readonly defaultModules: ModuleName[] = ['insights', 'external-secrets'];
private readonly defaultModules: ModuleName[] = ['insights', 'external-secrets', 'data-store'];
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[nit] Shall we make it plural for consistency?


private readonly activeModules: string[] = [];

Expand Down
2 changes: 1 addition & 1 deletion packages/@n8n/backend-common/src/modules/modules.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { CommaSeparatedStringArray, Config, Env } from '@n8n/config';

import { UnknownModuleError } from './errors/unknown-module.error';

export const MODULE_NAMES = ['insights', 'external-secrets'] as const;
export const MODULE_NAMES = ['insights', 'external-secrets', 'data-store'] as const;

export type ModuleName = (typeof MODULE_NAMES)[number];

Expand Down
8 changes: 7 additions & 1 deletion packages/@n8n/backend-test-utils/src/test-db.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,13 @@ export async function terminate() {
dbConnection.connectionState.connected = false;
}

type EntityName = keyof typeof entities | 'InsightsRaw' | 'InsightsByPeriod' | 'InsightsMetadata';
type EntityName =
| keyof typeof entities
| 'InsightsRaw'
| 'InsightsByPeriod'
| 'InsightsMetadata'
| 'DataStoreEntity'
| 'DataStoreColumnEntity';

/**
* Truncate specific DB tables in a test DB.
Expand Down
1 change: 1 addition & 0 deletions packages/@n8n/config/src/configs/logging.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ export const LOG_SCOPES = [
'insights',
'workflow-activation',
'ssh-client',
'data-store',
] as const;

export type LogScope = (typeof LOG_SCOPES)[number];
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import type { MigrationContext, ReversibleMigration } from '../migration-types';

const dataStoreTableName = 'data_store_entity';
const dataStoreColumnTableName = 'data_store_column_entity';

export class CreateDataStoreTables1747814180618 implements ReversibleMigration {
async up({ schemaBuilder: { createTable, column } }: MigrationContext) {
await createTable(dataStoreTableName)
.withColumns(
column('id').varchar(36).primary.notNull,
column('name').varchar(128).notNull,
column('projectId').varchar(36).notNull,
column('sizeBytes').int.notNull,
)
.withForeignKey('projectId', {
tableName: 'project', // @Review: this hardcodes a dependency on the project table, is this cool?
columnName: 'id',
onDelete: 'CASCADE',
})
.withIndexOn(['projectId', 'name'], true).withTimestamps; // @Review: The intention here is to ensure each name can only be used once per project, so [projectId, name] needs to be unique, right?...

await createTable(dataStoreColumnTableName)
.withColumns(
column('id').varchar(36).primary.notNull,
column('name').varchar(128).notNull,
column('type').varchar(32).notNull,
column('columnIndex').int.notNull,
column('dataStoreId').varchar(36).notNull,
)
.withForeignKey('dataStoreId', {
tableName: dataStoreTableName,
columnName: 'id',
onDelete: 'CASCADE',
})
.withIndexOn(['dataStoreId', 'name'], true).withTimestamps;
}

async down({ schemaBuilder: { dropTable } }: MigrationContext) {
await dropTable(dataStoreTableName);
await dropTable(dataStoreColumnTableName);

// @Review: Should we also drop all created user tables here?
}
}
2 changes: 2 additions & 0 deletions packages/@n8n/db/src/migrations/sqlite/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ import { ClearEvaluation1745322634000 } from '../common/1745322634000-CleanEvalu
import { AddWorkflowStatisticsRootCount1745587087521 } from '../common/1745587087521-AddWorkflowStatisticsRootCount';
import { AddWorkflowArchivedColumn1745934666076 } from '../common/1745934666076-AddWorkflowArchivedColumn';
import { DropRoleTable1745934666077 } from '../common/1745934666077-DropRoleTable';
import { CreateDataStoreTables1747814180618 } from '../common/1747814180618-CreateDataStoreTables';
import { AddProjectDescriptionColumn1747824239000 } from '../common/1747824239000-AddProjectDescriptionColumn';
import { AddLastActiveAtColumnToUser1750252139166 } from '../common/1750252139166-AddLastActiveAtColumnToUser';
import type { Migration } from '../migration-types';
Expand Down Expand Up @@ -172,6 +173,7 @@ const sqliteMigrations: Migration[] = [
AddWorkflowArchivedColumn1745934666076,
DropRoleTable1745934666077,
ClearEvaluation1745322634000,
CreateDataStoreTables1747814180618,
AddProjectDescriptionColumn1747824239000,
AddLastActiveAtColumnToUser1750252139166,
];
Expand Down
1 change: 1 addition & 0 deletions packages/@n8n/permissions/src/constants.ee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ export const RESOURCES = {
folder: [...DEFAULT_OPERATIONS, 'move'] as const,
insights: ['list'] as const,
oidc: ['manage'] as const,
dataStore: [...DEFAULT_OPERATIONS, 'readRow', 'writeRow'] as const,
} as const;

export const API_KEY_RESOURCES = {
Expand Down
10 changes: 10 additions & 0 deletions packages/@n8n/permissions/src/roles/scopes/global-scopes.ee.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,13 @@ export const GLOBAL_OWNER_SCOPES: Scope[] = [
'insights:list',
'folder:move',
'oidc:manage',
'dataStore:create',
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

these are for personal projects also, right?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It should be for all projects I think

'dataStore:delete',
'dataStore:read',
'dataStore:update',
'dataStore:list',
'dataStore:readRow',
'dataStore:writeRow',
];

export const GLOBAL_ADMIN_SCOPES = GLOBAL_OWNER_SCOPES.concat();
Expand All @@ -98,4 +105,7 @@ export const GLOBAL_MEMBER_SCOPES: Scope[] = [
'user:list',
'variable:list',
'variable:read',
'dataStore:read',
'dataStore:list',
'dataStore:readRow',
];
Loading