diff --git a/api-v3/src/database/migrations/1790000200000-f4-company-signature-invites.ts b/api-v3/src/database/migrations/1790000200000-f4-company-signature-invites.ts new file mode 100644 index 0000000..99c2c4e --- /dev/null +++ b/api-v3/src/database/migrations/1790000200000-f4-company-signature-invites.ts @@ -0,0 +1,51 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class F4CompanySignatureInvites1790000200000 implements MigrationInterface { + name = 'F4CompanySignatureInvites1790000200000'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + CREATE TABLE inspection_act_company_signature_invites ( + id uuid PRIMARY KEY DEFAULT gen_random_uuid(), + act_id uuid NOT NULL, + token_sha256 char(64) NOT NULL UNIQUE, + recipient_email varchar(320) NOT NULL, + recipient_name varchar(200), + recipient_document_type varchar(20), + recipient_document_number varchar(40), + recipient_position varchar(200), + status varchar(20) NOT NULL DEFAULT 'PENDING', + expires_at timestamptz NOT NULL, + sent_at timestamptz, + used_at timestamptz, + revoked_at timestamptz, + created_by uuid NOT NULL, + revoked_by uuid, + created_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at timestamptz NOT NULL DEFAULT CURRENT_TIMESTAMP, + CONSTRAINT fk_company_signature_invite_act FOREIGN KEY (act_id) + REFERENCES inspection_acts(id) ON DELETE CASCADE, + CONSTRAINT fk_company_signature_invite_created_by FOREIGN KEY (created_by) + REFERENCES users(id) ON DELETE RESTRICT, + CONSTRAINT fk_company_signature_invite_revoked_by FOREIGN KEY (revoked_by) + REFERENCES users(id) ON DELETE SET NULL, + CONSTRAINT chk_company_signature_invite_status CHECK ( + status IN ('PENDING','USED','REVOKED','EXPIRED') + ) + ) + `); + await queryRunner.query(` + CREATE INDEX idx_company_signature_invites_act_created + ON inspection_act_company_signature_invites(act_id,created_at DESC) + `); + await queryRunner.query(` + CREATE INDEX idx_company_signature_invites_pending_expiry + ON inspection_act_company_signature_invites(status,expires_at) + WHERE status='PENDING' + `); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query('DROP TABLE IF EXISTS inspection_act_company_signature_invites'); + } +}