Skip to content

Commit

Permalink
Merge pull request #1787 from bcgov/UTOPIA-1558-bd
Browse files Browse the repository at this point in the history
[UTOPIA-1558] Implement package for text editor on Storing personal information tab
  • Loading branch information
JieunSon96 authored Nov 16, 2023
2 parents 7b74c2f + 866af2b commit 04c41da
Show file tree
Hide file tree
Showing 13 changed files with 468 additions and 227 deletions.
277 changes: 277 additions & 0 deletions src/backend/src/migrations/1700109002096-RichTextStoringPI.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,277 @@
import { MigrationInterface, QueryRunner } from 'typeorm';

export class RichTextStoringPI1700109002096 implements MigrationInterface {
public async up(queryRunner: QueryRunner): Promise<void> {
// Add temporary columns to store the existing text
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_whereDetails" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_disclosureDetails" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_contractualTerms" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_enterpriseServiceAccessDetails" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_unauthorizedAccessMeasures" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_trackAccessDetails" text`,
);

// Copy the data from the old columns to the temporary columns
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_whereDetails" = "storing_personal_information"->'personalInformation'->>'whereDetails'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_disclosureDetails" = "storing_personal_information"->'disclosuresOutsideCanada'->'storage'->>'disclosureDetails'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_contractualTerms" = "storing_personal_information"->'disclosuresOutsideCanada'->'storage'->>'contractualTerms'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_enterpriseServiceAccessDetails" = "storing_personal_information"->'disclosuresOutsideCanada'->'contract'->>'enterpriseServiceAccessDetails'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_unauthorizedAccessMeasures" = "storing_personal_information"->'disclosuresOutsideCanada'->'controls'->>'unauthorizedAccessMeasures'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_trackAccessDetails" = "storing_personal_information"->'disclosuresOutsideCanada'->'trackAccess'->>'trackAccessDetails'`,
);

// Change jsonb properties from type string to object
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{personalInformation, whereDetails}',
'{"content": ""}'::jsonb
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, storage, disclosureDetails}',
'{"content": ""}'::jsonb
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, storage, contractualTerms}',
'{"content": ""}'::jsonb
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, contract, enterpriseServiceAccessDetails}',
'{"content": ""}'::jsonb
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, controls, unauthorizedAccessMeasures}',
'{"content": ""}'::jsonb
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, trackAccess, trackAccessDetails}',
'{"content": ""}'::jsonb
)`,
);

// Populate the jsonb with the data from the temporary columns
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{personalInformation, whereDetails, content}',
to_jsonb("temp_storingPI_whereDetails")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, storage, disclosureDetails, content}',
to_jsonb("temp_storingPI_disclosureDetails")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, storage, contractualTerms, content}',
to_jsonb("temp_storingPI_contractualTerms")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, contract, enterpriseServiceAccessDetails, content}',
to_jsonb("temp_storingPI_enterpriseServiceAccessDetails")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, controls, unauthorizedAccessMeasures, content}',
to_jsonb("temp_storingPI_unauthorizedAccessMeasures")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, trackAccess, trackAccessDetails, content}',
to_jsonb("temp_storingPI_trackAccessDetails")
)`,
);

// Drop the temporary columns
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_whereDetails"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_disclosureDetails"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_contractualTerms"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_enterpriseServiceAccessDetails"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_unauthorizedAccessMeasures"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_trackAccessDetails"`,
);
}

public async down(queryRunner: QueryRunner): Promise<void> {
// Re-add temporary columns
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_whereDetails" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_disclosureDetails" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_contractualTerms" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_enterpriseServiceAccessDetails" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_unauthorizedAccessMeasures" text`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" ADD "temp_storingPI_trackAccessDetails" text`,
);

// Extract the content from JSONB and store in temporary columns
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_whereDetails" = "storing_personal_information"->'personalInformation'->'whereDetails'->>'content'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_disclosureDetails" = "storing_personal_information"->'disclosuresOutsideCanada'->'storage'->'disclosureDetails'->>'content'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_contractualTerms" = "storing_personal_information"->'disclosuresOutsideCanada'->'storage'->'contractualTerms'->>'content'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_enterpriseServiceAccessDetails" = "storing_personal_information"->'disclosuresOutsideCanada'->'contract'->'enterpriseServiceAccessDetails'->>'content'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_unauthorizedAccessMeasures" = "storing_personal_information"->'disclosuresOutsideCanada'->'controls'->'unauthorizedAccessMeasures'->>'content'`,
);
await queryRunner.query(
`UPDATE "pia-intake" SET "temp_storingPI_trackAccessDetails" = "storing_personal_information"->'disclosuresOutsideCanada'->'trackAccess'->'trackAccessDetails'->>'content'`,
);

// Revert the JSONB properties to type string using the temporary column values
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{personalInformation, whereDetails}',
to_jsonb("temp_storingPI_whereDetails")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, storage, disclosureDetails}',
to_jsonb("temp_storingPI_disclosureDetails")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, storage, contractualTerms}',
to_jsonb("temp_storingPI_contractualTerms")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, contract, enterpriseServiceAccessDetails}',
to_jsonb("temp_storingPI_enterpriseServiceAccessDetails")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, controls, unauthorizedAccessMeasures}',
to_jsonb("temp_storingPI_unauthorizedAccessMeasures")
)`,
);
await queryRunner.query(
`UPDATE "pia-intake"
SET "storing_personal_information" = jsonb_set(
"storing_personal_information",
'{disclosuresOutsideCanada, trackAccess, trackAccessDetails}',
to_jsonb("temp_storingPI_trackAccessDetails")
)`,
);

// Drop the temporary columns
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_whereDetails"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_disclosureDetails"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_contractualTerms"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_enterpriseServiceAccessDetails"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_unauthorizedAccessMeasures"`,
);
await queryRunner.query(
`ALTER TABLE "pia-intake" DROP COLUMN "temp_storingPI_trackAccessDetails"`,
);
}
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { IsEnum, IsOptional, IsString } from '@nestjs/class-validator';
import { IsEnum, IsObject, IsOptional } from '@nestjs/class-validator';
import { YesNoInput } from 'src/common/enums/yes-no-input.enum';
import { RichTextContent } from '../../rich-text-content';

export class DisclosureContract {
@IsEnum(YesNoInput)
@IsOptional()
relyOnExistingContract?: YesNoInput;

@IsString()
@IsObject()
@IsOptional()
enterpriseServiceAccessDetails?: string;
enterpriseServiceAccessDetails?: RichTextContent;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { IsOptional, IsString } from '@nestjs/class-validator';
import { IsObject, IsOptional } from '@nestjs/class-validator';
import { RichTextContent } from '../../rich-text-content';

export class DisclosureControls {
@IsString()
@IsObject()
@IsOptional()
unauthorizedAccessMeasures?: string;
unauthorizedAccessMeasures?: RichTextContent;
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
import {
IsArray,
IsEnum,
IsObject,
IsOptional,
IsString,
ValidateNested,
} from '@nestjs/class-validator';
import { Type } from 'class-transformer';
import { YesNoInput } from 'src/common/enums/yes-no-input.enum';
import { RichTextContent } from '../../rich-text-content';

class ServiceProviderDetails {
@IsString()
Expand All @@ -31,11 +33,11 @@ export class DisclosureStorage {
@Type(() => ServiceProviderDetails)
serviceProviderList: Array<ServiceProviderDetails>;

@IsString()
@IsObject()
@IsOptional()
disclosureDetails?: string;
disclosureDetails?: RichTextContent;

@IsString()
@IsObject()
@IsOptional()
contractualTerms?: string;
contractualTerms?: RichTextContent;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import { IsOptional, IsString } from '@nestjs/class-validator';
import { IsObject, IsOptional } from '@nestjs/class-validator';
import { RichTextContent } from '../../rich-text-content';

export class DisclosureTrackAccess {
@IsString()
@IsObject()
@IsOptional()
trackAccessDetails?: string;
trackAccessDetails?: RichTextContent;
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { IsEnum, IsOptional, IsString } from '@nestjs/class-validator';
import { IsEnum, IsObject, IsOptional } from '@nestjs/class-validator';
import { YesNoInput } from 'src/common/enums/yes-no-input.enum';
import { RichTextContent } from '../rich-text-content';

export class PersonalInformation {
@IsEnum(YesNoInput)
@IsOptional()
storedOutsideCanada?: YesNoInput;

@IsString()
@IsObject()
@IsOptional()
whereDetails?: string;
whereDetails?: RichTextContent;
}
Loading

0 comments on commit 04c41da

Please sign in to comment.