metis-desk/modules/assets/src/api/infrastructure/persistence/directory-membership-migration.ts

42 lines
2.6 KiB
TypeScript
Raw Normal View History

2026-10-20 11:20:22 +00:00
import type { Sequelize } from "sequelize";
export async function migrateDirectoryMemberships(database: Sequelize) {
await database.query(`CREATE TABLE IF NOT EXISTS asset_directory_memberships (
id CHAR(36) BINARY NOT NULL PRIMARY KEY,
companyId CHAR(36) BINARY NOT NULL,
assetId CHAR(36) BINARY NOT NULL,
domainResourceId CHAR(36) BINARY NOT NULL,
predecessorId CHAR(36) BINARY NULL,
role VARCHAR(30) NOT NULL,
createdAt VARCHAR(30) NOT NULL,
endedAt VARCHAR(30) NULL,
activeAssetId CHAR(36) BINARY NULL,
UNIQUE KEY directory_membership_active (activeAssetId),
UNIQUE KEY directory_membership_predecessor (predecessorId),
UNIQUE KEY directory_membership_identity_scope (id,companyId,assetId),
KEY directory_membership_asset (companyId,assetId,id),
KEY directory_membership_domain (companyId,domainResourceId,role,endedAt,id),
CONSTRAINT directory_membership_active_key CHECK ((endedAt IS NULL AND activeAssetId IS NOT NULL AND activeAssetId=assetId) OR (endedAt IS NOT NULL AND activeAssetId IS NULL)),
CONSTRAINT directory_membership_role CHECK (role IN ('member','domain-controller')),
CONSTRAINT directory_membership_period CHECK (endedAt IS NULL OR endedAt>=createdAt),
CONSTRAINT directory_membership_asset_fk FOREIGN KEY (companyId,assetId) REFERENCES assets(companyId,id),
CONSTRAINT directory_membership_domain_fk FOREIGN KEY (domainResourceId,companyId) REFERENCES resource_directory_domains(resourceId,companyId),
CONSTRAINT directory_membership_previous_fk FOREIGN KEY (predecessorId,companyId,assetId) REFERENCES asset_directory_memberships(id,companyId,assetId)
) ENGINE=InnoDB`);
await database.query(`CREATE TABLE IF NOT EXISTS asset_directory_membership_revisions (
id CHAR(36) BINARY NOT NULL PRIMARY KEY,
membershipId CHAR(36) BINARY NOT NULL,
position INTEGER NOT NULL,
role VARCHAR(30) NOT NULL,
endedAt VARCHAR(30) NULL,
actorId CHAR(36) BINARY NOT NULL,
recordedAt VARCHAR(30) NOT NULL,
UNIQUE KEY directory_membership_revision_order (membershipId,position),
CONSTRAINT directory_membership_revision_owner FOREIGN KEY (membershipId) REFERENCES asset_directory_memberships(id),
CONSTRAINT directory_membership_revision_actor FOREIGN KEY (actorId) REFERENCES users(id),
CONSTRAINT directory_membership_revision_role CHECK (role IN ('member','domain-controller')),
CONSTRAINT directory_membership_revision_position CHECK (position>=0),
CONSTRAINT directory_membership_revision_period CHECK (endedAt IS NULL OR endedAt<=recordedAt)
) ENGINE=InnoDB`);
}