From 2d382666090e851d95e3e0f2b3701360aad6825f Mon Sep 17 00:00:00 2001 From: Zhihe Li Date: Tue, 19 Aug 2025 14:12:46 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Add=20sqlite=20support?= =?UTF-8?q?=20for=20roles=20(#2965)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-17414 --- addons/api/addon/services/sqlite.js | 9 ++++- addons/api/addon/workers/utils/schema.js | 34 +++++++++++++++++++ .../tests/acceptance/roles/create-test.js | 2 ++ .../acceptance/roles/global-scope-test.js | 2 ++ ui/admin/tests/acceptance/roles/list-test.js | 2 ++ ui/admin/tests/acceptance/roles/read-test.js | 2 ++ .../scopes/scope/roles/index-test.js | 2 ++ 7 files changed, 52 insertions(+), 1 deletion(-) diff --git a/addons/api/addon/services/sqlite.js b/addons/api/addon/services/sqlite.js index 310e9536d..636757409 100644 --- a/addons/api/addon/services/sqlite.js +++ b/addons/api/addon/services/sqlite.js @@ -35,10 +35,17 @@ export const modelMapping = { scope_id: 'scope.scope_id', created_time: 'created_time', }, + role: { + id: 'id', + name: 'name', + description: 'description', + scope_id: 'scope.scope_id', + created_time: 'created_time', + }, }; // A list of tables that we support searching using FTS5 in SQLite. -export const searchTables = new Set(['target', 'alias']); +export const searchTables = new Set(['target', 'alias', 'role']); export default class SqliteDbService extends Service { // =attributes diff --git a/addons/api/addon/workers/utils/schema.js b/addons/api/addon/workers/utils/schema.js index 8dd749715..78a563afd 100644 --- a/addons/api/addon/workers/utils/schema.js +++ b/addons/api/addon/workers/utils/schema.js @@ -92,6 +92,39 @@ CREATE TRIGGER IF NOT EXISTS alias_ad AFTER DELETE ON alias BEGIN VALUES('delete', old.rowid, old.id, old.type, old.name, old.description, old.destination_id, old.value, old.scope_id, old.created_time); END;`; +const createRoleTables = ` +CREATE TABLE IF NOT EXISTS role ( + id TEXT NOT NULL PRIMARY KEY, + name TEXT, + description TEXT, + scope_id TEXT NOT NULL, + created_time TEXT NOT NULL, + data TEXT NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_role_scope_id_created_time ON role(scope_id, created_time DESC); + +CREATE VIRTUAL TABLE IF NOT EXISTS role_fts USING fts5( + id, + name, + description, + scope_id, + created_time, + content='', +); + +CREATE TRIGGER IF NOT EXISTS role_ai AFTER INSERT ON role BEGIN + INSERT INTO role_fts( + id, name, description, scope_id, created_time + ) VALUES ( + new.id, new.name, new.description, new.scope_id, new.created_time + ); +END; + +CREATE TRIGGER IF NOT EXISTS role_ad AFTER DELETE ON role BEGIN + INSERT INTO role_fts(role_fts, rowid, id, name, description, scope_id, created_time) + VALUES('delete', old.rowid, old.id, old.name, old.description, old.scope_id, old.created_time); +END;`; + export const CREATE_TABLES = (version) => ` BEGIN; @@ -104,6 +137,7 @@ CREATE TABLE IF NOT EXISTS token ( ${createTargetTables} ${createAliasTables} +${createRoleTables} CREATE TABLE IF NOT EXISTS "group" ( id TEXT NOT NULL PRIMARY KEY, diff --git a/ui/admin/tests/acceptance/roles/create-test.js b/ui/admin/tests/acceptance/roles/create-test.js index 3a8f391c0..ee62e57aa 100644 --- a/ui/admin/tests/acceptance/roles/create-test.js +++ b/ui/admin/tests/acceptance/roles/create-test.js @@ -8,6 +8,7 @@ import { visit, currentURL, click, fillIn } from '@ember/test-helpers'; import { setupApplicationTest } from 'admin/tests/helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; +import { setupSqlite } from 'api/test-support/helpers/sqlite'; import { Response } from 'miragejs'; import { authenticateSession } from 'ember-simple-auth/test-support'; import * as selectors from './selectors'; @@ -16,6 +17,7 @@ import * as commonSelectors from 'admin/tests/helpers/selectors'; module('Acceptance | roles | create', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); let getRolesCount; diff --git a/ui/admin/tests/acceptance/roles/global-scope-test.js b/ui/admin/tests/acceptance/roles/global-scope-test.js index 5164e0004..13f03c515 100644 --- a/ui/admin/tests/acceptance/roles/global-scope-test.js +++ b/ui/admin/tests/acceptance/roles/global-scope-test.js @@ -16,6 +16,7 @@ import { import { setupApplicationTest } from 'admin/tests/helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; +import { setupSqlite } from 'api/test-support/helpers/sqlite'; import { authenticateSession } from 'ember-simple-auth/test-support'; import { GRANT_SCOPE_THIS, @@ -30,6 +31,7 @@ import { setRunOptions } from 'ember-a11y-testing/test-support'; module('Acceptance | roles | global-scope', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); let confirmService; diff --git a/ui/admin/tests/acceptance/roles/list-test.js b/ui/admin/tests/acceptance/roles/list-test.js index 05d19aa66..d5df48c46 100644 --- a/ui/admin/tests/acceptance/roles/list-test.js +++ b/ui/admin/tests/acceptance/roles/list-test.js @@ -16,6 +16,7 @@ import { import { setupApplicationTest } from 'admin/tests/helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; +import { setupSqlite } from 'api/test-support/helpers/sqlite'; import { authenticateSession } from 'ember-simple-auth/test-support'; import { GRANT_SCOPE_THIS } from 'api/models/role'; import * as selectors from './selectors'; @@ -26,6 +27,7 @@ import { setRunOptions } from 'ember-a11y-testing/test-support'; module('Acceptance | roles | list', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); const instances = { diff --git a/ui/admin/tests/acceptance/roles/read-test.js b/ui/admin/tests/acceptance/roles/read-test.js index 9f2b71a39..9b1774300 100644 --- a/ui/admin/tests/acceptance/roles/read-test.js +++ b/ui/admin/tests/acceptance/roles/read-test.js @@ -8,12 +8,14 @@ import { visit, currentURL, click } from '@ember/test-helpers'; import { setupApplicationTest } from 'admin/tests/helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; +import { setupSqlite } from 'api/test-support/helpers/sqlite'; import { authenticateSession } from 'ember-simple-auth/test-support'; import * as commonSelectors from 'admin/tests/helpers/selectors'; module('Acceptance | roles | read', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); const instances = { diff --git a/ui/admin/tests/unit/controllers/scopes/scope/roles/index-test.js b/ui/admin/tests/unit/controllers/scopes/scope/roles/index-test.js index cd7779dd6..e03843d31 100644 --- a/ui/admin/tests/unit/controllers/scopes/scope/roles/index-test.js +++ b/ui/admin/tests/unit/controllers/scopes/scope/roles/index-test.js @@ -8,12 +8,14 @@ import { setupTest } from 'ember-qunit'; import { waitUntil, visit } from '@ember/test-helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; +import { setupSqlite } from 'api/test-support/helpers/sqlite'; import { setupIntl } from 'ember-intl/test-support'; import { authenticateSession } from 'ember-simple-auth/test-support'; module('Unit | Controller | scopes/scope/roles/index', function (hooks) { setupTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); setupIntl(hooks, 'en-us');