mirror of
https://github.com/outline/outline.git
synced 2026-06-13 11:25:03 +03:00
c3f93a3e9d
* Migrate Backlink model to generic Relationship model - Create new Relationship model with type field to support different relationship types - Add database migration to create relationships table and migrate existing backlinks - Update Backlink model to delegate to Relationship model for backward compatibility - Update BacklinksProcessor to use Relationship model with backlink type - Update API routes to use new Relationship model - Update test files to use Relationship model - Maintain backward compatibility through database view and model delegation Fixes #9366 * Update migration to rename table instead of creating new one - Rename existing backlinks table to relationships instead of creating new table - Add type column with default value to existing table - Update existing rows to have type='backlink' - Avoid expensive data migration by keeping existing data in place - Maintain backward compatibility with database view - Update rollback to reverse table rename and column addition This approach is much more efficient for large datasets as it avoids copying millions of rows. * Remove unnecessary UPDATE statement from migration The UPDATE statement is not needed since defaultValue automatically applies to existing rows when adding a column with a default value. Thanks @tommoor for catching this! * Wrap up migration in transaction - Wrap all migration operations in a transaction for atomicity - Add transaction parameter to all queryInterface calls - Follow the same pattern as other migrations in the codebase - Ensures all operations succeed or fail together * Remove Backlink class entirely and use Relationship everywhere - Delete server/models/Backlink.ts - Remove Backlink export from server/models/index.ts - Remove Backlink import and association from Document model - All functionality now uses Relationship model with RelationshipType.Backlink - Maintains same API through Relationship model methods - Cleaner architecture with single relationship model * Update documents.test.ts to use RelationshipType enum instead of string - Import RelationshipType from Relationship model - Replace type: "backlink" with type: RelationshipType.Backlink - Improves type safety and consistency with enum usage * Address code review feedback - Add transaction wrapper to migration down method for safer rollback - Remove unused findByTypeForUser method from Relationship model - Method wasn't used and won't work for all relationship types (e.g., user mentions) - Clean up code structure and improve safety * Restore imports * Add relationships API endpoints - Create relationships API following stars pattern - Add CRUD operations: create, list, delete - Include proper validation, authentication, and authorization - Support filtering by relationship type and document IDs - Add relationship presenter and policies - Register routes in main API router * Remove relationships.create and relationships.delete endpoints - Keep only relationships.list endpoint as requested - Remove create and delete schemas from validation - Update policies to only allow read operations - Relationships will be managed internally, not via external API * Add relationships.info endpoint - Use Document.findByPk for authorization as requested - Find relationship by ID and verify user has access to related document - Return relationship details with accessible documents - Include proper validation schema for UUID parameter * Update 20250601223331-migrate-backlink-to-relationship.js * Update Relationship.ts * wip * test * Final tweaks --------- Co-authored-by: codegen-sh[bot] <131295404+codegen-sh[bot]@users.noreply.github.com> Co-authored-by: Tom Moor <tom@getoutline.com>
78 lines
2.2 KiB
JavaScript
78 lines
2.2 KiB
JavaScript
"use strict";
|
|
|
|
/** @type {import('sequelize-cli').Migration} */
|
|
module.exports = {
|
|
async up(queryInterface, Sequelize) {
|
|
await queryInterface.sequelize.transaction(async (transaction) => {
|
|
// Rename the existing backlinks table to relationships
|
|
await queryInterface.renameTable("backlinks", "relationships", {
|
|
transaction,
|
|
});
|
|
|
|
// Add the type column with default value
|
|
await queryInterface.addColumn(
|
|
"relationships",
|
|
"type",
|
|
{
|
|
type: Sequelize.ENUM("backlink", "similar"),
|
|
allowNull: false,
|
|
defaultValue: "backlink",
|
|
},
|
|
{ transaction }
|
|
);
|
|
|
|
// Add new indexes for performance (the old indexes on documentId and reverseDocumentId should still exist)
|
|
await queryInterface.addIndex("relationships", ["type"], { transaction });
|
|
await queryInterface.addIndex("relationships", ["documentId", "type"], {
|
|
transaction,
|
|
});
|
|
|
|
// Create a view for backward compatibility
|
|
await queryInterface.sequelize.query(
|
|
`
|
|
CREATE VIEW backlinks AS
|
|
SELECT id, "userId", "documentId", "reverseDocumentId", "createdAt", "updatedAt"
|
|
FROM relationships
|
|
WHERE type = 'backlink';
|
|
`,
|
|
{ transaction }
|
|
);
|
|
});
|
|
},
|
|
|
|
async down(queryInterface, Sequelize) {
|
|
await queryInterface.sequelize.transaction(async (transaction) => {
|
|
// Drop the view
|
|
await queryInterface.sequelize.query("DROP VIEW IF EXISTS backlinks;", {
|
|
transaction,
|
|
});
|
|
|
|
// Remove the type-specific indexes
|
|
await queryInterface.removeIndex("relationships", ["type"], {
|
|
transaction,
|
|
});
|
|
await queryInterface.removeIndex(
|
|
"relationships",
|
|
["documentId", "type"],
|
|
{ transaction }
|
|
);
|
|
|
|
// Remove the type column
|
|
await queryInterface.removeColumn("relationships", "type", {
|
|
transaction,
|
|
});
|
|
|
|
// Drop the enum type
|
|
await queryInterface.sequelize.query(
|
|
'DROP TYPE IF EXISTS "enum_relationships_type";',
|
|
{ transaction }
|
|
);
|
|
|
|
// Rename the table back to backlinks
|
|
await queryInterface.renameTable("relationships", "backlinks", {
|
|
transaction,
|
|
});
|
|
});
|
|
},
|
|
};
|