42 lines
2.6 KiB
TypeScript
42 lines
2.6 KiB
TypeScript
|
|
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`);
|
||
|
|
}
|