From 3304def44a1851a6eae9d9f12c1b36fd86e5a420 Mon Sep 17 00:00:00 2001 From: Zhihe Li Date: Mon, 11 Aug 2025 15:57:58 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20Add=20sqlite=20support?= =?UTF-8?q?=20for=20aliases=20(#2957)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ✅ Closes: https://hashicorp.atlassian.net/browse/ICU-17420 --- addons/api/addon/services/sqlite.js | 12 +++- addons/api/addon/workers/utils/schema.js | 65 +++++++++++++++---- .../app/routes/scopes/scope/aliases/index.js | 1 - .../tests/acceptance/aliases/create-test.js | 4 +- .../tests/acceptance/aliases/delete-test.js | 4 +- .../tests/acceptance/aliases/list-test.js | 2 + .../tests/acceptance/aliases/read-test.js | 4 +- .../tests/acceptance/aliases/update-test.js | 4 +- .../scopes/scope/aliases/index-test.js | 4 +- 9 files changed, 82 insertions(+), 18 deletions(-) diff --git a/addons/api/addon/services/sqlite.js b/addons/api/addon/services/sqlite.js index ab1ff80a0..acee1f96e 100644 --- a/addons/api/addon/services/sqlite.js +++ b/addons/api/addon/services/sqlite.js @@ -18,10 +18,20 @@ export const modelMapping = { scope_id: 'scope.scope_id', created_time: 'created_time', }, + alias: { + id: 'id', + type: 'type', + name: 'name', + description: 'description', + destination_id: 'destination_id', + value: 'value', + 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']); +export const searchTables = new Set(['target', 'alias']); 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 7132473f5..c11e3d0aa 100644 --- a/addons/api/addon/workers/utils/schema.js +++ b/addons/api/addon/workers/utils/schema.js @@ -10,17 +10,8 @@ PRAGMA writable_schema = 0; VACUUM; PRAGMA integrity_check;`; -export const CREATE_TABLES = (version) => ` -BEGIN; - -PRAGMA user_version = ${version}; - -CREATE TABLE IF NOT EXISTS token ( - id TEXT NOT NULL PRIMARY KEY, - token TEXT NOT NULL -); - -CREATE TABLE IF NOT EXISTS target ( +const createTargetTables = ` + CREATE TABLE IF NOT EXISTS target ( id TEXT NOT NULL PRIMARY KEY, type TEXT NOT NULL, name TEXT NOT NULL UNIQUE, @@ -60,8 +51,60 @@ END; CREATE TRIGGER IF NOT EXISTS target_ad AFTER DELETE ON target BEGIN INSERT INTO target_fts(target_fts, rowid, id, type, name, description, address, scope_id, created_time) VALUES('delete', old.rowid, old.id, old.type, old.name, old.description, old.address, old.scope_id, old.created_time); +END;`; + +const createAliasTables = ` +CREATE TABLE IF NOT EXISTS alias ( + id TEXT NOT NULL PRIMARY KEY, + type TEXT NOT NULL, + name TEXT, + description TEXT, + destination_id TEXT, + value TEXT, + scope_id TEXT NOT NULL, + created_time TEXT NOT NULL, + data TEXT NOT NULL +); +CREATE INDEX IF NOT EXISTS idx_alias_created_time ON alias(created_time DESC); + +CREATE VIRTUAL TABLE IF NOT EXISTS alias_fts USING fts5( + id, + type, + name, + description, + destination_id, + value, + scope_id, + created_time, + content='', +); + +CREATE TRIGGER IF NOT EXISTS alias_ai AFTER INSERT ON alias BEGIN + INSERT INTO alias_fts( + id, type, name, description, destination_id, value, scope_id, created_time + ) VALUES ( + new.id, new.type, new.name, new.description, new.destination_id, new.value, new.scope_id, new.created_time + ); END; +CREATE TRIGGER IF NOT EXISTS alias_ad AFTER DELETE ON alias BEGIN + INSERT INTO alias_fts(alias_fts, rowid, id, type, name, description, destination_id, value, scope_id, created_time) + VALUES('delete', old.rowid, old.id, old.type, old.name, old.description, old.destination_id, old.value, old.scope_id, old.created_time); +END;`; + +export const CREATE_TABLES = (version) => ` +BEGIN; + +PRAGMA user_version = ${version}; + +CREATE TABLE IF NOT EXISTS token ( + id TEXT NOT NULL PRIMARY KEY, + token TEXT NOT NULL +); + +${createTargetTables} +${createAliasTables} + COMMIT;`; export const INSERT_STATEMENTS = (resource, items, modelMapping) => { diff --git a/ui/admin/app/routes/scopes/scope/aliases/index.js b/ui/admin/app/routes/scopes/scope/aliases/index.js index bab85cb99..ee7bd2394 100644 --- a/ui/admin/app/routes/scopes/scope/aliases/index.js +++ b/ui/admin/app/routes/scopes/scope/aliases/index.js @@ -123,7 +123,6 @@ export default class ScopesScopeAliasesIndexRoute extends Route { 'alias', { scope_id, - query: { filters: { scope_id: [{ equals: scope_id }] } }, page: 1, pageSize: 1, }, diff --git a/ui/admin/tests/acceptance/aliases/create-test.js b/ui/admin/tests/acceptance/aliases/create-test.js index dd544ad5d..d2742ca86 100644 --- a/ui/admin/tests/acceptance/aliases/create-test.js +++ b/ui/admin/tests/acceptance/aliases/create-test.js @@ -4,12 +4,13 @@ */ import { module, test } from 'qunit'; -import { visit, currentURL, click, fillIn } from '@ember/test-helpers'; +import { click, currentURL, fillIn, visit } from '@ember/test-helpers'; import { setupApplicationTest } from 'admin/tests/helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { Response } from 'miragejs'; import { authenticateSession } from 'ember-simple-auth/test-support'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; +import { setupSqlite } from 'api/test-support/helpers/sqlite'; import * as commonSelectors from 'admin/tests/helpers/selectors'; import * as selectors from './selectors'; import { setRunOptions } from 'ember-a11y-testing/test-support'; @@ -17,6 +18,7 @@ import { setRunOptions } from 'ember-a11y-testing/test-support'; module('Acceptance | aliases | create', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); let features; diff --git a/ui/admin/tests/acceptance/aliases/delete-test.js b/ui/admin/tests/acceptance/aliases/delete-test.js index 3e039393f..6469b277c 100644 --- a/ui/admin/tests/acceptance/aliases/delete-test.js +++ b/ui/admin/tests/acceptance/aliases/delete-test.js @@ -4,17 +4,19 @@ */ import { module, test } from 'qunit'; -import { visit, click } from '@ember/test-helpers'; +import { click, visit } from '@ember/test-helpers'; import { setupApplicationTest } from 'admin/tests/helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { authenticateSession } from 'ember-simple-auth/test-support'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; +import { setupSqlite } from 'api/test-support/helpers/sqlite'; import * as commonSelectors from 'admin/tests/helpers/selectors'; import { setRunOptions } from 'ember-a11y-testing/test-support'; module('Acceptance | aliases | delete', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); let aliasCount; diff --git a/ui/admin/tests/acceptance/aliases/list-test.js b/ui/admin/tests/acceptance/aliases/list-test.js index 032c50420..01195493d 100644 --- a/ui/admin/tests/acceptance/aliases/list-test.js +++ b/ui/admin/tests/acceptance/aliases/list-test.js @@ -8,6 +8,7 @@ import { visit, click, currentURL, waitFor, 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 { authenticateSession } from 'ember-simple-auth/test-support'; import * as commonSelectors from 'admin/tests/helpers/selectors'; import * as selectors from './selectors'; @@ -17,6 +18,7 @@ import { setRunOptions } from 'ember-a11y-testing/test-support'; module('Acceptance | aliases | list', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); let intl; diff --git a/ui/admin/tests/acceptance/aliases/read-test.js b/ui/admin/tests/acceptance/aliases/read-test.js index 0d76d4a39..d86e4d5b1 100644 --- a/ui/admin/tests/acceptance/aliases/read-test.js +++ b/ui/admin/tests/acceptance/aliases/read-test.js @@ -4,17 +4,19 @@ */ import { module, test } from 'qunit'; -import { visit, currentURL, click } from '@ember/test-helpers'; +import { click, currentURL, visit } from '@ember/test-helpers'; import { setupApplicationTest } from 'admin/tests/helpers'; import setupMirage from 'ember-cli-mirage/test-support/setup-mirage'; import { authenticateSession } from 'ember-simple-auth/test-support'; import { setupIndexedDb } from 'api/test-support/helpers/indexed-db'; +import { setupSqlite } from 'api/test-support/helpers/sqlite'; import * as commonSelectors from 'admin/tests/helpers/selectors'; import { setRunOptions } from 'ember-a11y-testing/test-support'; module('Acceptance | aliases | read', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); const instances = { diff --git a/ui/admin/tests/acceptance/aliases/update-test.js b/ui/admin/tests/acceptance/aliases/update-test.js index c90c4ab31..4089d8786 100644 --- a/ui/admin/tests/acceptance/aliases/update-test.js +++ b/ui/admin/tests/acceptance/aliases/update-test.js @@ -4,10 +4,11 @@ */ import { module, test } from 'qunit'; -import { visit, click, fillIn } from '@ember/test-helpers'; +import { click, fillIn, visit } 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'; import { setRunOptions } from 'ember-a11y-testing/test-support'; @@ -15,6 +16,7 @@ import { setRunOptions } from 'ember-a11y-testing/test-support'; module('Acceptance | aliases | update', function (hooks) { setupApplicationTest(hooks); setupMirage(hooks); + setupSqlite(hooks); setupIndexedDb(hooks); let aliasCount; diff --git a/ui/admin/tests/unit/controllers/scopes/scope/aliases/index-test.js b/ui/admin/tests/unit/controllers/scopes/scope/aliases/index-test.js index 2bda6b349..5fd1dfdb0 100644 --- a/ui/admin/tests/unit/controllers/scopes/scope/aliases/index-test.js +++ b/ui/admin/tests/unit/controllers/scopes/scope/aliases/index-test.js @@ -5,9 +5,10 @@ import { module, test } from 'qunit'; import { setupTest } from 'ember-qunit'; -import { waitUntil, visit } from '@ember/test-helpers'; +import { visit, waitUntil } 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'; @@ -15,6 +16,7 @@ module('Unit | Controller | scopes/scope/aliases/index', function (hooks) { setupTest(hooks); setupMirage(hooks); setupIndexedDb(hooks); + setupSqlite(hooks); setupIntl(hooks, 'en-us'); let intl;