Add missing database indexes for hooks.unfurl endpoint (#10870)

* Initial plan

* Add database indexes to improve hooks.unfurl performance

Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com>

* Verify migrations and query plans for new indexes

Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com>

* Address code review feedback: improve migration rollback order and add comments

Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com>

* Change index column order to teamId first as requested

Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com>

* Update .env.test

---------

Co-authored-by: copilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: tommoor <380914+tommoor@users.noreply.github.com>
Co-authored-by: Tom Moor <tom@getoutline.com>
This commit is contained in:
Copilot
2025-12-12 19:02:20 -05:00
committed by GitHub
parent 27f4ba7062
commit d5dbf286cc
3 changed files with 44 additions and 0 deletions
+1
View File
@@ -12,6 +12,7 @@ GOOGLE_CLIENT_SECRET=123
SLACK_CLIENT_ID=123
SLACK_CLIENT_SECRET=123
SLACK_VERIFICATION_TOKEN=test-token-123
GITHUB_CLIENT_ID=123;
GITHUB_CLIENT_SECRET=123;
@@ -0,0 +1,16 @@
"use strict";
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.addIndex("authentications", ["teamId", "service"], {
name: "authentications_team_id_service",
});
},
async down(queryInterface, Sequelize) {
await queryInterface.removeIndex(
"authentications",
"authentications_team_id_service"
);
},
};
@@ -0,0 +1,27 @@
"use strict";
module.exports = {
async up(queryInterface, Sequelize) {
// Add composite index on service and type for better filtering
await queryInterface.addIndex("integrations", ["service", "type"], {
name: "integrations_service_type",
});
// Add GIN index on settings for JSONB queries
// Using raw SQL as Sequelize doesn't support GIN index type natively
await queryInterface.sequelize.query(
'CREATE INDEX "integrations_settings_gin" ON "integrations" USING GIN ("settings");'
);
},
async down(queryInterface, Sequelize) {
// Drop indexes in reverse order of creation
await queryInterface.sequelize.query(
'DROP INDEX IF EXISTS "integrations_settings_gin";'
);
await queryInterface.removeIndex(
"integrations",
"integrations_service_type"
);
},
};