From e9b318fdb5988b9d00583287dba0ddcffbbc57df Mon Sep 17 00:00:00 2001 From: enlineawork Date: Mon, 7 Sep 2026 20:06:21 -0300 Subject: [PATCH] =?UTF-8?q?F4.6=20=C2=B7=20retirar=20Campa=C3=B1as=20del?= =?UTF-8?q?=20producto=20activo?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api-v3/src/app.module.ts | 35 +-- api-v3/src/database/entities/index.ts | 203 +++--------------- ...200000-phase-f4-remove-survey-subsystem.ts | 28 +++ .../phase-f4-remove-survey-subsystem.test.ts | 25 +++ 4 files changed, 96 insertions(+), 195 deletions(-) create mode 100644 api-v3/src/database/migrations/1790053200000-phase-f4-remove-survey-subsystem.ts create mode 100644 api-v3/test/unit/phase-f4-remove-survey-subsystem.test.ts diff --git a/api-v3/src/app.module.ts b/api-v3/src/app.module.ts index 65c4bf4..08ef57b 100644 --- a/api-v3/src/app.module.ts +++ b/api-v3/src/app.module.ts @@ -3,29 +3,27 @@ import { ConfigModule, ConfigService } from '@nestjs/config'; import { APP_GUARD } from '@nestjs/core'; import { ThrottlerGuard, ThrottlerModule } from '@nestjs/throttler'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { AuditModule } from './audit/audit.module'; +import { ActAdministrationModule } from './act-administration/act-administration.module'; import { AdministrationModule } from './administration/administration.module'; -import { AuthorizationModule } from './authorization/authorization.module'; -import { PermissionsGuard } from './authorization/guards/permissions.guard'; +import { AssetImportsModule } from './asset-imports/asset-imports.module'; +import { AssetMasterModule } from './asset-master/asset-master.module'; +import { AuditModule } from './audit/audit.module'; import { AuthModule } from './auth/auth.module'; import { AccessTokenGuard } from './auth/guards/access-token.guard'; +import { AuthorizationModule } from './authorization/authorization.module'; +import { PermissionsGuard } from './authorization/guards/permissions.guard'; import { CsrfGuard } from './auth/guards/csrf.guard'; import { PhaseADataModule } from './core-data/phase-a-data.module'; +import { DashboardModule } from './dashboard/dashboard.module'; import { HealthController } from './health.controller'; import { HealthService } from './health.service'; -import { DashboardModule } from './dashboard/dashboard.module'; -import { AssetMasterModule } from './asset-master/asset-master.module'; -import { SurveyPlanningModule } from './survey-planning/survey-planning.module'; -import { SurveyExecutionModule } from './survey-execution/survey-execution.module'; -import { InspectionVisitsModule } from './inspection-visits/inspection-visits.module'; import { InspectionActsModule } from './inspection-acts/inspection-acts.module'; -import { InspectionFindingsModule } from './inspection-findings/inspection-findings.module'; import { InspectionClosingModule } from './inspection-closing/inspection-closing.module'; import { InspectionDeadlinesModule } from './inspection-deadlines/inspection-deadlines.module'; -import { AssetImportsModule } from './asset-imports/asset-imports.module'; +import { InspectionFindingsModule } from './inspection-findings/inspection-findings.module'; import { InspectionReportsModule } from './inspection-reports/inspection-reports.module'; import { InspectionVerificationsModule } from './inspection-verifications/inspection-verifications.module'; -import { ActAdministrationModule } from './act-administration/act-administration.module'; +import { InspectionVisitsModule } from './inspection-visits/inspection-visits.module'; function required(config: ConfigService, key: string): string { const value = config.get(key); @@ -35,10 +33,7 @@ function required(config: ConfigService, key: string): string { @Module({ imports: [ - ConfigModule.forRoot({ - isGlobal: true, - ignoreEnvFile: true, - }), + ConfigModule.forRoot({ isGlobal: true, ignoreEnvFile: true }), TypeOrmModule.forRootAsync({ inject: [ConfigService], useFactory: (config: ConfigService) => ({ @@ -56,13 +51,7 @@ function required(config: ConfigService, key: string): string { connectTimeoutMS: 5000, }), }), - ThrottlerModule.forRoot([ - { - name: 'default', - ttl: 60_000, - limit: 120, - }, - ]), + ThrottlerModule.forRoot([{ name: 'default', ttl: 60_000, limit: 120 }]), PhaseADataModule, AuditModule, AuthorizationModule, @@ -70,8 +59,6 @@ function required(config: ConfigService, key: string): string { AdministrationModule, DashboardModule, AssetMasterModule, - SurveyPlanningModule, - SurveyExecutionModule, InspectionVisitsModule, InspectionActsModule, InspectionFindingsModule, diff --git a/api-v3/src/database/entities/index.ts b/api-v3/src/database/entities/index.ts index a7a0fe1..95a08e5 100644 --- a/api-v3/src/database/entities/index.ts +++ b/api-v3/src/database/entities/index.ts @@ -6,14 +6,8 @@ export { Role } from './role.entity'; export { UserRole } from './user-role.entity'; export { User, UserStatus } from './user.entity'; export { Asset, AssetDataOrigin, AssetInformationStatus, AssetOperationalStatus } from './asset.entity'; -export { - AssetVersion, - AssetVersionChangeType, -} from './asset-version.entity'; -export { - AssetAttributeDataType, - AssetAttributeDefinition, -} from './asset-attribute-definition.entity'; +export { AssetVersion, AssetVersionChangeType } from './asset-version.entity'; +export { AssetAttributeDataType, AssetAttributeDefinition } from './asset-attribute-definition.entity'; export { AssetAttributeValue } from './asset-attribute-value.entity'; export { AreaCompanyRelation, AreaOrganizationRole } from './area-company-relation.entity'; export { OrganizationProfile, OrganizationKind } from './organization-profile.entity'; @@ -25,121 +19,35 @@ export { AreaLegalRight, AreaLegalRightType, AreaLegalRightStatus } from './area export { AreaLegalRightOrganization, AreaLegalRightOrganizationRole } from './area-legal-right-organization.entity'; export { AssetTypeParentRule } from './asset-type-parent-rule.entity'; export { AssetType, AssetTypeOperationalRole } from './asset-type.entity'; -export { - AssetGeometry, - AssetGeometrySource, - AssetGeometryType, -} from './asset-geometry.entity'; -export { - AssetMedia, - AssetMediaKind, - AssetMediaSource, -} from './asset-media.entity'; -export { - SurveyCampaign, - SurveyCampaignStatus, -} from './survey-campaign.entity'; -export { - SurveyCampaignTarget, - SurveyTargetStatus, -} from './survey-campaign-target.entity'; -export { - SurveyReportOutcome, - SurveyReportStatus, - SurveyTargetReport, -} from './survey-target-report.entity'; -export { SurveyTargetReportMedia } from './survey-target-report-media.entity'; -export { - SurveyReportVersionEvent, - SurveyTargetReportVersion, -} from './survey-target-report-version.entity'; -export { - InspectionVisit, - InspectionVisitStatus, -} from './inspection-visit.entity'; +export { AssetGeometry, AssetGeometrySource, AssetGeometryType } from './asset-geometry.entity'; +export { AssetMedia, AssetMediaKind, AssetMediaSource } from './asset-media.entity'; +export { InspectionVisit, InspectionVisitStatus } from './inspection-visit.entity'; export { InspectionVisitAsset, InspectionVisitAssetPlanningSource } from './inspection-visit-asset.entity'; export { InspectionVisitMember } from './inspection-visit-member.entity'; -export { - DocumentAnnualSequence, - DocumentSequenceType, -} from './document-annual-sequence.entity'; -export { - InspectionAct, - InspectionActStatus, - InspectionActUrgency, - InspectionDeadlineBasis, - InspectionDeadlineDayType, -} from './inspection-act.entity'; +export { DocumentAnnualSequence, DocumentSequenceType } from './document-annual-sequence.entity'; +export { InspectionAct, InspectionActStatus, InspectionActUrgency, InspectionDeadlineBasis, InspectionDeadlineDayType } from './inspection-act.entity'; export { InspectionActAsset } from './inspection-act-asset.entity'; export { InspectionDeadlinePolicy } from './inspection-deadline-policy.entity'; export { InspectionNonWorkingDay } from './inspection-non-working-day.entity'; -export { - InspectionReport, - InspectionReportPdfStatus, - InspectionReportReviewStatus, - InspectionReportStatus, - InspectionReportWordStatus, -} from './inspection-report.entity'; -export { - InspectionReportFollowUp, - InspectionReportFollowUpType, -} from './inspection-report-follow-up.entity'; +export { InspectionReport, InspectionReportPdfStatus, InspectionReportReviewStatus, InspectionReportStatus, InspectionReportWordStatus } from './inspection-report.entity'; +export { InspectionReportFollowUp, InspectionReportFollowUpType } from './inspection-report-follow-up.entity'; export { InspectionReportFollowUpFile } from './inspection-report-follow-up-file.entity'; -export { - InspectionActVersion, - InspectionActVersionEvent, -} from './inspection-act-version.entity'; -export { - InspectionActResponsible, - InspectionResponsibleAttendanceStatus, - InspectionResponsibleDocumentType, -} from './inspection-act-responsible.entity'; -export { - InspectionActClosure, - InspectionActUploadMode, -} from './inspection-act-closure.entity'; -export { - InspectionActSignature, - InspectionActSignatureSource, - InspectionActSignatureStatus, - InspectionActSignerType, - InspectionCompanySignatureManifestation, -} from './inspection-act-signature.entity'; +export { InspectionActVersion, InspectionActVersionEvent } from './inspection-act-version.entity'; +export { InspectionActResponsible, InspectionResponsibleAttendanceStatus, InspectionResponsibleDocumentType } from './inspection-act-responsible.entity'; +export { InspectionActClosure, InspectionActUploadMode } from './inspection-act-closure.entity'; +export { InspectionActSignature, InspectionActSignatureSource, InspectionActSignatureStatus, InspectionActSignerType, InspectionCompanySignatureManifestation } from './inspection-act-signature.entity'; export { FindingCategory } from './finding-category.entity'; export { FindingCatalogItem } from './finding-catalog-item.entity'; export { FindingCatalogItemAssetType } from './finding-catalog-item-asset-type.entity'; export { FindingCatalogAssetTypeProfile } from './finding-catalog-asset-type-profile.entity'; export { FindingCatalogAssetOverride } from './finding-catalog-asset-override.entity'; export { FindingCatalogProposal, FindingCatalogProposalStatus } from './finding-catalog-proposal.entity'; -export { - InspectionFinding, - InspectionFindingResponseDueBasis, - InspectionFindingStatus, -} from './inspection-finding.entity'; -export { - InspectionFindingVersion, - InspectionFindingVersionEvent, -} from './inspection-finding-version.entity'; -export { - InspectionCommunicationChannel, - InspectionCommunicationDirection, - InspectionCommunicationType, - InspectionFindingCommunication, -} from './inspection-finding-communication.entity'; -export { - InspectionEvidenceKind, - InspectionEvidencePurpose, - InspectionEvidenceSource, - InspectionFindingEvidence, -} from './inspection-finding-evidence.entity'; -export { - InspectionFindingVerificationVisit, - InspectionVerificationOutcome, -} from './inspection-finding-verification-visit.entity'; -export { - InspectionFindingVerificationEvent, - InspectionFindingVerificationEventType, -} from './inspection-finding-verification-event.entity'; +export { InspectionFinding, InspectionFindingResponseDueBasis, InspectionFindingStatus } from './inspection-finding.entity'; +export { InspectionFindingVersion, InspectionFindingVersionEvent } from './inspection-finding-version.entity'; +export { InspectionCommunicationChannel, InspectionCommunicationDirection, InspectionCommunicationType, InspectionFindingCommunication } from './inspection-finding-communication.entity'; +export { InspectionEvidenceKind, InspectionEvidencePurpose, InspectionEvidenceSource, InspectionFindingEvidence } from './inspection-finding-evidence.entity'; +export { InspectionFindingVerificationVisit, InspectionVerificationOutcome } from './inspection-finding-verification-visit.entity'; +export { InspectionFindingVerificationEvent, InspectionFindingVerificationEventType } from './inspection-finding-verification-event.entity'; import { AuditEvent } from './audit-event.entity'; import { AuthSession } from './auth-session.entity'; @@ -164,11 +72,6 @@ import { AreaLegalRightOrganization } from './area-legal-right-organization.enti import { AssetGeometry } from './asset-geometry.entity'; import { AssetVersion } from './asset-version.entity'; import { AssetMedia } from './asset-media.entity'; -import { SurveyCampaign } from './survey-campaign.entity'; -import { SurveyCampaignTarget } from './survey-campaign-target.entity'; -import { SurveyTargetReport } from './survey-target-report.entity'; -import { SurveyTargetReportMedia } from './survey-target-report-media.entity'; -import { SurveyTargetReportVersion } from './survey-target-report-version.entity'; import { InspectionVisit } from './inspection-visit.entity'; import { InspectionVisitAsset } from './inspection-visit-asset.entity'; import { InspectionVisitMember } from './inspection-visit-member.entity'; @@ -198,59 +101,17 @@ import { InspectionFindingVerificationVisit } from './inspection-finding-verific import { InspectionFindingVerificationEvent } from './inspection-finding-verification-event.entity'; export const PHASE_A_ENTITIES = [ - User, - Role, - Permission, - UserRole, - RolePermission, - AuthSession, - AuditEvent, - AssetType, - AssetTypeParentRule, - AssetAttributeDefinition, - Asset, - AssetAttributeValue, - AreaCompanyRelation, - OrganizationProfile, - OrganizationMembership, - SourceDocument, - AssetSourceDocument, - AssetExternalIdentifier, - AreaLegalRight, - AreaLegalRightOrganization, - AssetGeometry, - AssetVersion, - AssetMedia, - SurveyCampaign, - SurveyCampaignTarget, - SurveyTargetReport, - SurveyTargetReportMedia, - SurveyTargetReportVersion, - InspectionVisit, - InspectionVisitAsset, - InspectionVisitMember, - DocumentAnnualSequence, - InspectionAct, - InspectionActAsset, - InspectionDeadlinePolicy, - InspectionNonWorkingDay, - InspectionReport, - InspectionReportFollowUp, - InspectionReportFollowUpFile, - InspectionActVersion, - InspectionActResponsible, - InspectionActClosure, - InspectionActSignature, - FindingCategory, - FindingCatalogItem, - FindingCatalogItemAssetType, - FindingCatalogAssetTypeProfile, - FindingCatalogAssetOverride, - FindingCatalogProposal, - InspectionFinding, - InspectionFindingVersion, - InspectionFindingCommunication, - InspectionFindingEvidence, - InspectionFindingVerificationVisit, - InspectionFindingVerificationEvent, + User, Role, Permission, UserRole, RolePermission, AuthSession, AuditEvent, + AssetType, AssetTypeParentRule, AssetAttributeDefinition, Asset, AssetAttributeValue, + AreaCompanyRelation, OrganizationProfile, OrganizationMembership, SourceDocument, + AssetSourceDocument, AssetExternalIdentifier, AreaLegalRight, AreaLegalRightOrganization, + AssetGeometry, AssetVersion, AssetMedia, InspectionVisit, InspectionVisitAsset, + InspectionVisitMember, DocumentAnnualSequence, InspectionAct, InspectionActAsset, + InspectionDeadlinePolicy, InspectionNonWorkingDay, InspectionReport, + InspectionReportFollowUp, InspectionReportFollowUpFile, InspectionActVersion, + InspectionActResponsible, InspectionActClosure, InspectionActSignature, FindingCategory, + FindingCatalogItem, FindingCatalogItemAssetType, FindingCatalogAssetTypeProfile, + FindingCatalogAssetOverride, FindingCatalogProposal, InspectionFinding, + InspectionFindingVersion, InspectionFindingCommunication, InspectionFindingEvidence, + InspectionFindingVerificationVisit, InspectionFindingVerificationEvent, ]; diff --git a/api-v3/src/database/migrations/1790053200000-phase-f4-remove-survey-subsystem.ts b/api-v3/src/database/migrations/1790053200000-phase-f4-remove-survey-subsystem.ts new file mode 100644 index 0000000..3a8d1fe --- /dev/null +++ b/api-v3/src/database/migrations/1790053200000-phase-f4-remove-survey-subsystem.ts @@ -0,0 +1,28 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class PhaseF4RemoveSurveySubsystem1790053200000 implements MigrationInterface { + name = 'PhaseF4RemoveSurveySubsystem1790053200000'; + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(` + DELETE FROM role_permissions + WHERE permission_id IN ( + SELECT id FROM permissions WHERE code LIKE 'surveys.%' + ) + `); + await queryRunner.query(` + DELETE FROM permissions WHERE code LIKE 'surveys.%' + `); + + await queryRunner.query(`DROP TABLE IF EXISTS survey_target_report_media`); + await queryRunner.query(`DROP TABLE IF EXISTS survey_target_report_versions`); + await queryRunner.query(`DROP TABLE IF EXISTS survey_target_reports`); + await queryRunner.query(`DROP TABLE IF EXISTS survey_campaign_targets`); + await queryRunner.query(`DROP TABLE IF EXISTS survey_campaigns`); + } + + public async down(_queryRunner: QueryRunner): Promise { + // Intentionally irreversible: historical migrations still document the old + // Survey schema, but restoring dropped campaign/report data would be unsafe. + } +} diff --git a/api-v3/test/unit/phase-f4-remove-survey-subsystem.test.ts b/api-v3/test/unit/phase-f4-remove-survey-subsystem.test.ts new file mode 100644 index 0000000..63ebc19 --- /dev/null +++ b/api-v3/test/unit/phase-f4-remove-survey-subsystem.test.ts @@ -0,0 +1,25 @@ +import assert from 'node:assert/strict'; +import fs from 'node:fs'; +import path from 'node:path'; +import test from 'node:test'; + +const root = process.cwd(); +const read = (relative: string) => fs.readFileSync(path.join(root, relative), 'utf8'); + +test('F4 removes Survey modules from the active API', () => { + const app = read('src/app.module.ts'); + assert.doesNotMatch(app, /SurveyPlanningModule/); + assert.doesNotMatch(app, /SurveyExecutionModule/); + const entities = read('src/database/entities/index.ts'); + assert.doesNotMatch(entities, /SurveyCampaign|SurveyTargetReport|survey-campaign|survey-target-report/); +}); + +test('F4 removes survey permissions and survey-specific tables through a new cleanup migration', () => { + const migration = read('src/database/migrations/1790053200000-phase-f4-remove-survey-subsystem.ts'); + assert.match(migration, /code LIKE 'surveys\.\%'/); + assert.match(migration, /DROP TABLE IF EXISTS survey_target_report_media/); + assert.match(migration, /DROP TABLE IF EXISTS survey_target_report_versions/); + assert.match(migration, /DROP TABLE IF EXISTS survey_target_reports/); + assert.match(migration, /DROP TABLE IF EXISTS survey_campaign_targets/); + assert.match(migration, /DROP TABLE IF EXISTS survey_campaigns/); +});