import { Column, Entity, Index, PrimaryGeneratedColumn } from 'typeorm'; export enum AuditSource { WEB = 'WEB', ANDROID = 'ANDROID', SYSTEM = 'SYSTEM', IMPORT = 'IMPORT', } export enum AuditAction { AUTH_LOGIN_SUCCESS = 'AUTH_LOGIN_SUCCESS', AUTH_LOGIN_FAILED = 'AUTH_LOGIN_FAILED', AUTH_LOGOUT = 'AUTH_LOGOUT', AUTH_REFRESH = 'AUTH_REFRESH', AUTH_REFRESH_REUSE_DETECTED = 'AUTH_REFRESH_REUSE_DETECTED', AUTH_PASSWORD_CHANGED = 'AUTH_PASSWORD_CHANGED', SYSTEM_BOOTSTRAP_ADMIN_CREATED = 'SYSTEM_BOOTSTRAP_ADMIN_CREATED', USER_CREATED = 'USER_CREATED', USER_UPDATED = 'USER_UPDATED', USER_PASSWORD_RESET = 'USER_PASSWORD_RESET', USER_STATUS_CHANGED = 'USER_STATUS_CHANGED', USER_ROLES_CHANGED = 'USER_ROLES_CHANGED', ROLE_CREATED = 'ROLE_CREATED', ROLE_UPDATED = 'ROLE_UPDATED', ROLE_PERMISSIONS_CHANGED = 'ROLE_PERMISSIONS_CHANGED', ASSET_TYPE_CREATED = 'ASSET_TYPE_CREATED', ASSET_TYPE_UPDATED = 'ASSET_TYPE_UPDATED', ASSET_MASTER_BOOTSTRAPPED = 'ASSET_MASTER_BOOTSTRAPPED', ASSET_ATTRIBUTE_CREATED = 'ASSET_ATTRIBUTE_CREATED', ASSET_ATTRIBUTE_UPDATED = 'ASSET_ATTRIBUTE_UPDATED', ASSET_CREATED = 'ASSET_CREATED', ASSET_FIELD_DISCOVERY_CREATED = 'ASSET_FIELD_DISCOVERY_CREATED', ASSET_FIELD_DISCOVERY_APPROVED = 'ASSET_FIELD_DISCOVERY_APPROVED', ASSET_FIELD_DISCOVERY_MATCHED = 'ASSET_FIELD_DISCOVERY_MATCHED', ASSET_FIELD_DISCOVERY_REJECTED = 'ASSET_FIELD_DISCOVERY_REJECTED', ASSET_UPDATED = 'ASSET_UPDATED', ASSET_CONTEXT_CHANGED = 'ASSET_CONTEXT_CHANGED', ASSET_FUNCTION_CHANGED = 'ASSET_FUNCTION_CHANGED', INVENTORY_FUNCTION_CREATED = 'INVENTORY_FUNCTION_CREATED', INVENTORY_FUNCTION_UPDATED = 'INVENTORY_FUNCTION_UPDATED', ASSET_INFORMATION_STATUS_CHANGED = 'ASSET_INFORMATION_STATUS_CHANGED', ASSET_OPERATIONAL_STATUS_CHANGED = 'ASSET_OPERATIONAL_STATUS_CHANGED', ASSET_REGISTRY_UPDATED = 'ASSET_REGISTRY_UPDATED', ASSET_IMPORT_BATCH_ANALYZED = 'ASSET_IMPORT_BATCH_ANALYZED', ASSET_IMPORT_BATCH_RECONCILED = 'ASSET_IMPORT_BATCH_RECONCILED', ASSET_IMPORT_PLAN_GENERATED = 'ASSET_IMPORT_PLAN_GENERATED', ASSET_IMPORT_PLAN_ITEM_RESOLVED = 'ASSET_IMPORT_PLAN_ITEM_RESOLVED', ASSET_IMPORT_PLAN_APPLIED = 'ASSET_IMPORT_PLAN_APPLIED', ASSET_IMPORT_PLAN_ROLLED_BACK = 'ASSET_IMPORT_PLAN_ROLLED_BACK', ASSET_IMPORT_BATCH_CANCELLED = 'ASSET_IMPORT_BATCH_CANCELLED', SOURCE_DOCUMENT_CREATED = 'SOURCE_DOCUMENT_CREATED', AREA_LEGAL_RIGHT_CREATED = 'AREA_LEGAL_RIGHT_CREATED', AREA_LEGAL_RIGHT_UPDATED = 'AREA_LEGAL_RIGHT_UPDATED', AREA_LEGAL_RIGHT_ORGANIZATION_ENDED = 'AREA_LEGAL_RIGHT_ORGANIZATION_ENDED', ASSET_GEOMETRY_UPDATED = 'ASSET_GEOMETRY_UPDATED', ASSET_GEOMETRY_REMOVED = 'ASSET_GEOMETRY_REMOVED', ASSET_MEDIA_UPLOADED = 'ASSET_MEDIA_UPLOADED', ASSET_MEDIA_UPDATED = 'ASSET_MEDIA_UPDATED', ASSET_MEDIA_REMOVED = 'ASSET_MEDIA_REMOVED', ASSET_PROVENANCE_UPDATED = 'ASSET_PROVENANCE_UPDATED', ASSET_PROVENANCE_VERIFIED = 'ASSET_PROVENANCE_VERIFIED', ASSET_AREA_COMPANY_RELATION_CREATED = 'ASSET_AREA_COMPANY_RELATION_CREATED', ASSET_AREA_COMPANY_RELATION_ENDED = 'ASSET_AREA_COMPANY_RELATION_ENDED', SURVEY_CAMPAIGN_CREATED = 'SURVEY_CAMPAIGN_CREATED', SURVEY_CAMPAIGN_UPDATED = 'SURVEY_CAMPAIGN_UPDATED', SURVEY_CAMPAIGN_STATUS_CHANGED = 'SURVEY_CAMPAIGN_STATUS_CHANGED', SURVEY_TARGET_ADDED = 'SURVEY_TARGET_ADDED', SURVEY_TARGET_UPDATED = 'SURVEY_TARGET_UPDATED', SURVEY_TARGET_ASSIGNED = 'SURVEY_TARGET_ASSIGNED', SURVEY_TARGET_STATUS_CHANGED = 'SURVEY_TARGET_STATUS_CHANGED', SURVEY_REPORT_SAVED = 'SURVEY_REPORT_SAVED', SURVEY_REPORT_SUBMITTED = 'SURVEY_REPORT_SUBMITTED', SURVEY_REPORT_APPROVED = 'SURVEY_REPORT_APPROVED', SURVEY_REPORT_REJECTED = 'SURVEY_REPORT_REJECTED', INSPECTION_VISIT_CREATED = 'INSPECTION_VISIT_CREATED', INSPECTION_VISIT_UPDATED = 'INSPECTION_VISIT_UPDATED', INSPECTION_VISIT_STATUS_CHANGED = 'INSPECTION_VISIT_STATUS_CHANGED', INSPECTION_VISIT_ASSETS_UPDATED = 'INSPECTION_VISIT_ASSETS_UPDATED', INSPECTION_VISIT_TEAM_UPDATED = 'INSPECTION_VISIT_TEAM_UPDATED', INSPECTION_VISIT_CHECKLIST_GENERATED = 'INSPECTION_VISIT_CHECKLIST_GENERATED', INSPECTION_VISIT_ASSET_EXCLUDED = 'INSPECTION_VISIT_ASSET_EXCLUDED', INSPECTION_VISIT_ASSET_REINCLUDED = 'INSPECTION_VISIT_ASSET_REINCLUDED', INSPECTION_VISIT_STARTED = 'INSPECTION_VISIT_STARTED', INSPECTION_ACT_CREATED = 'INSPECTION_ACT_CREATED', INSPECTION_ACT_UPDATED = 'INSPECTION_ACT_UPDATED', INSPECTION_ACT_CANCELLED = 'INSPECTION_ACT_CANCELLED', INSPECTION_ACT_RESPONSIBLE_UPDATED = 'INSPECTION_ACT_RESPONSIBLE_UPDATED', INSPECTION_ACT_LOCKED = 'INSPECTION_ACT_LOCKED', INSPECTION_ACT_SEALED = 'INSPECTION_ACT_SEALED', INSPECTION_ACT_READY = 'INSPECTION_ACT_READY', INSPECTION_ACT_REOPENED = 'INSPECTION_ACT_REOPENED', INSPECTION_ACT_SIGNATURE_RECORDED = 'INSPECTION_ACT_SIGNATURE_RECORDED', INSPECTION_ACT_COMPANY_OUTCOME_RECORDED = 'INSPECTION_ACT_COMPANY_OUTCOME_RECORDED', INSPECTION_ACT_CLOSED = 'INSPECTION_ACT_CLOSED', INSPECTION_REPORT_GENERATED = 'INSPECTION_REPORT_GENERATED', INSPECTION_REPORT_UPDATED = 'INSPECTION_REPORT_UPDATED', INSPECTION_REPORT_REVISION_ADDED = 'INSPECTION_REPORT_REVISION_ADDED', INSPECTION_REPORT_OFFICIALIZED = 'INSPECTION_REPORT_OFFICIALIZED', INSPECTION_REPORT_FOLLOW_UP_ADDED = 'INSPECTION_REPORT_FOLLOW_UP_ADDED', INSPECTION_REPORT_APPROVED = 'INSPECTION_REPORT_APPROVED', INSPECTION_REPORT_SIGNED = 'INSPECTION_REPORT_SIGNED', INSPECTION_DEADLINE_POLICY_UPDATED = 'INSPECTION_DEADLINE_POLICY_UPDATED', INSPECTION_BUSINESS_CALENDAR_UPDATED = 'INSPECTION_BUSINESS_CALENDAR_UPDATED', SMTP_SETTINGS_UPDATED = 'SMTP_SETTINGS_UPDATED', SMTP_TEST_SENT = 'SMTP_TEST_SENT', USER_SMTP_SETTINGS_UPDATED = 'USER_SMTP_SETTINGS_UPDATED', USER_SMTP_TEST_SENT = 'USER_SMTP_TEST_SENT', DOCUMENT_DELIVERY_SETTINGS_UPDATED = 'DOCUMENT_DELIVERY_SETTINGS_UPDATED', DOCUMENT_DELIVERY_RETRY_REQUESTED = 'DOCUMENT_DELIVERY_RETRY_REQUESTED', DOCUMENT_DELIVERY_SENT = 'DOCUMENT_DELIVERY_SENT', INSPECTION_VERIFICATION_PLANNED = 'INSPECTION_VERIFICATION_PLANNED', INSPECTION_VERIFICATION_RESULT_RECORDED = 'INSPECTION_VERIFICATION_RESULT_RECORDED', INSPECTION_FINDING_CREATED = 'INSPECTION_FINDING_CREATED', INSPECTION_FINDING_UPDATED = 'INSPECTION_FINDING_UPDATED', INSPECTION_FINDING_FOLLOW_UP_UPDATED = 'INSPECTION_FINDING_FOLLOW_UP_UPDATED', INSPECTION_FINDING_CLOSED = 'INSPECTION_FINDING_CLOSED', INSPECTION_FINDING_EVIDENCE_UPLOADED = 'INSPECTION_FINDING_EVIDENCE_UPLOADED', INSPECTION_FINDING_COMMUNICATION_CREATED = 'INSPECTION_FINDING_COMMUNICATION_CREATED', FINDING_CATEGORY_CREATED = 'FINDING_CATEGORY_CREATED', FINDING_CATEGORY_UPDATED = 'FINDING_CATEGORY_UPDATED', FINDING_CATALOG_ITEM_CREATED = 'FINDING_CATALOG_ITEM_CREATED', FINDING_CATALOG_ITEM_UPDATED = 'FINDING_CATALOG_ITEM_UPDATED', FINDING_CATALOG_TYPE_APPLICABILITY_UPDATED = 'FINDING_CATALOG_TYPE_APPLICABILITY_UPDATED', FINDING_CATALOG_ASSET_SELECTION_UPDATED = 'FINDING_CATALOG_ASSET_SELECTION_UPDATED', FINDING_CATALOG_PROPOSAL_MATCHED = 'FINDING_CATALOG_PROPOSAL_MATCHED', FINDING_CATALOG_PROPOSAL_REJECTED = 'FINDING_CATALOG_PROPOSAL_REJECTED', } @Entity({ name: 'audit_events' }) @Index('idx_audit_events_occurred_at', ['occurredAt']) @Index('idx_audit_events_actor_user_id', ['actorUserId']) @Index('idx_audit_events_action', ['action']) @Index('idx_audit_events_entity', ['entityType', 'entityId']) @Index('idx_audit_events_request_id', ['requestId']) export class AuditEvent { @PrimaryGeneratedColumn('uuid') id!: string; @Column({ name: 'occurred_at', type: 'timestamptz', default: () => 'CURRENT_TIMESTAMP' }) occurredAt!: Date; @Column({ name: 'actor_user_id', type: 'uuid', nullable: true }) actorUserId!: string | null; @Column({ name: 'actor_username', type: 'varchar', length: 80, nullable: true }) actorUsername!: string | null; @Column({ type: 'varchar', length: 100 }) action!: string; @Column({ name: 'entity_type', type: 'varchar', length: 100, nullable: true }) entityType!: string | null; @Column({ name: 'entity_id', type: 'varchar', length: 255, nullable: true }) entityId!: string | null; @Column({ name: 'request_id', type: 'varchar', length: 128, nullable: true }) requestId!: string | null; @Column({ type: 'varchar', length: 32 }) source!: AuditSource; @Column({ type: 'inet', nullable: true }) ip!: string | null; @Column({ name: 'user_agent', type: 'text', nullable: true }) userAgent!: string | null; @Column({ name: 'before_data', type: 'jsonb', nullable: true }) beforeData!: Record | null; @Column({ name: 'after_data', type: 'jsonb', nullable: true }) afterData!: Record | null; @Column({ type: 'jsonb', nullable: true }) metadata!: Record | null; }