diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fd3237add..4265848fcc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,10 +2,9 @@ ## [2.18.0](https://github.com/UK-Export-Finance/exip/compare/v2.17.0...v2.18.0) (2024-07-25) - ### Features -* **EMS-3631:** declaration versions - database restructure, application creation ([#2805](https://github.com/UK-Export-Finance/exip/issues/2805)) ([2353b5f](https://github.com/UK-Export-Finance/exip/commit/2353b5f853ecb0c827662d7bd960dbd18a37eb62)) +- **EMS-3631:** declaration versions - database restructure, application creation ([#2805](https://github.com/UK-Export-Finance/exip/issues/2805)) ([2353b5f](https://github.com/UK-Export-Finance/exip/commit/2353b5f853ecb0c827662d7bd960dbd18a37eb62)) ## [2.17.0](https://github.com/UK-Export-Finance/exip/compare/v2.16.0...v2.17.0) (2024-07-25) diff --git a/database/exip.sql b/database/exip.sql index 3ae9ffb7fd..5688ea3a3b 100644 --- a/database/exip.sql +++ b/database/exip.sql @@ -3,7 +3,7 @@ # Version 2 # # Database: exip -# Generation Time: 2024-07-24 14:03:29 +0000 +# Generation Time: 2024-07-25 15:31:00 +0000 # ************************************************************ CREATE DATABASE IF NOT EXISTS `exip`; @@ -589,13 +589,13 @@ DROP TABLE IF EXISTS `Declaration`; CREATE TABLE `Declaration` ( `id` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL, - `agreeToConfidentiality` tinyint(1) DEFAULT NULL, + `agreeHowDataWillBeUsed` tinyint(1) DEFAULT NULL, `agreeToAntiBribery` tinyint(1) DEFAULT NULL, + `agreeToConfidentiality` tinyint(1) DEFAULT NULL, `agreeToConfirmationAndAcknowledgements` tinyint(1) DEFAULT NULL, - `willExportWithAntiBriberyCodeOfConduct` tinyint(1) DEFAULT NULL, - `hasAntiBriberyCodeOfConduct` tinyint(1) DEFAULT NULL, - `agreeHowDataWillBeUsed` tinyint(1) DEFAULT NULL, `application` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + `hasAntiBriberyCodeOfConduct` tinyint(1) DEFAULT NULL, + `willExportWithAntiBriberyCodeOfConduct` tinyint(1) DEFAULT NULL, `version` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, PRIMARY KEY (`id`), KEY `Declaration_application_idx` (`application`), diff --git a/src/api/.keystone/config.js b/src/api/.keystone/config.js index a4e59cba55..efd68e3494 100644 --- a/src/api/.keystone/config.js +++ b/src/api/.keystone/config.js @@ -710,7 +710,7 @@ var APPLICATION = { } } }, - GET_QUERY: "id eligibility { id } buyer { id companyOrOrganisationName } company { id } exportContract { id } nominatedLossPayee { id } policy { id } sectionReview { id } owner { id email firstName lastName } referenceNumber submissionDeadline status ", + GET_QUERY: "id eligibility { id } buyer { id companyOrOrganisationName } company { id } declaration { id } exportContract { id } nominatedLossPayee { id } policy { id } sectionReview { id } owner { id email firstName lastName } referenceNumber submissionDeadline status ", VERSIONS: versions_default }; var application_default = APPLICATION; @@ -763,6 +763,7 @@ var versions_default2 = DECLARATION_VERSIONS; // constants/declarations/index.ts var DECLARATIONS2 = { VERSIONS: versions_default2, + V1_DECLARATIONS: versions_default2[0], LATEST_DECLARATIONS: versions_default2[versions_default2.length - 1] }; var declarations_default2 = DECLARATIONS2; @@ -2439,12 +2440,12 @@ var lists = { fields: { application: (0, import_fields.relationship)({ ref: "Application" }), version: (0, import_fields.relationship)({ ref: "DeclarationVersion" }), - agreeToConfidentiality: nullable_checkbox_default(), + agreeHowDataWillBeUsed: nullable_checkbox_default(), agreeToAntiBribery: nullable_checkbox_default(), - hasAntiBriberyCodeOfConduct: nullable_checkbox_default(), - willExportWithAntiBriberyCodeOfConduct: nullable_checkbox_default(), + agreeToConfidentiality: nullable_checkbox_default(), agreeToConfirmationAndAcknowledgements: nullable_checkbox_default(), - agreeHowDataWillBeUsed: nullable_checkbox_default() + hasAntiBriberyCodeOfConduct: nullable_checkbox_default(), + willExportWithAntiBriberyCodeOfConduct: nullable_checkbox_default() }, hooks: { afterOperation: async ({ item, context }) => { diff --git a/src/api/constants/declarations/index.test.ts b/src/api/constants/declarations/index.test.ts index 0caa9fdb84..7cd414b4da 100644 --- a/src/api/constants/declarations/index.test.ts +++ b/src/api/constants/declarations/index.test.ts @@ -5,6 +5,7 @@ describe('api/constants/declarations', () => { it('should return an object', () => { const expected = { VERSIONS: DECLARATION_VERSIONS, + V1_DECLARATIONS: DECLARATION_VERSIONS[0], LATEST_DECLARATIONS: DECLARATION_VERSIONS[DECLARATION_VERSIONS.length - 1], }; diff --git a/src/api/constants/declarations/index.ts b/src/api/constants/declarations/index.ts index dc296ba18f..0d2b511473 100644 --- a/src/api/constants/declarations/index.ts +++ b/src/api/constants/declarations/index.ts @@ -8,6 +8,7 @@ import DECLARATION_VERSIONS from './versions'; */ export const DECLARATIONS = { VERSIONS: DECLARATION_VERSIONS, + V1_DECLARATIONS: DECLARATION_VERSIONS[0], LATEST_DECLARATIONS: DECLARATION_VERSIONS[DECLARATION_VERSIONS.length - 1], }; diff --git a/src/api/data-migration/version-1-to-version-2/README.md b/src/api/data-migration/version-1-to-version-2/README.md index 87604c08cd..8ff4418ffd 100644 --- a/src/api/data-migration/version-1-to-version-2/README.md +++ b/src/api/data-migration/version-1-to-version-2/README.md @@ -15,6 +15,12 @@ This directory contains source code for migrating version 1 of EXIP data into th - `Buyer` table - 3x new relationships - `buyerTradingHistory`, `contact`, `relationship`. - `Company` table - 1x new relationship - `differentTradingAddress`. - `Company` table - 1x new field - `differentTradingName`. +- `Declaration` table - 2x new fields - `version`, `exportContract`. +- `Declaration` table - 3x removed fields - `antiBribery`, `confirmationAndAcknowledgements`, `howDataWillBeUsed. +- `DeclarationAntiBribery` table - removed. +- `DeclarationConfidentiality` table - removed. +- `DeclarationConfirmationAndAcknowledgement` table - removed. +- `DeclarationHowDataWillBeUsed` table - removed. - `Eligibility` table - 1x new field - `hasEndBuyer`. - `ExportContract` table - 2x new relationships - `agent`, `privateMarket`. - `ExportContract` table - 1x new field - `paymentTermsDescription`. @@ -29,6 +35,7 @@ This directory contains source code for migrating version 1 of EXIP data into th - BuyerRelationship - BuyerTradingHistory - CompanyDifferentTradingAddress +- DeclarationVersion - ExportContractAgent - ExportContractAgentService - ExportContractAgentServiceCharge @@ -74,8 +81,10 @@ The migration should successfully do the following: 6. Create new account status relationships. 7. Remove old account status fields. 8. Update buyers. -9. Create new application relationships. -10. Exit the process. +9. Remove old declaration fields. +10. Remove old declaration content tables. +11. Create new application relationships. +12. Exit the process. ## How to ensure that data migration was successful diff --git a/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-field.ts b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-field.ts new file mode 100644 index 0000000000..22d4c7fced --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-field.ts @@ -0,0 +1,48 @@ +import { Connection } from 'mysql2/promise'; +import getAllDeclarations from '../get-all-declarations'; +import getAllDeclarationVersions from '../get-all-declaration-versions'; +import executeSqlQuery from '../execute-sql-query'; + +/** + * updateDeclarationVersionField + * Update "version" columns in "declaration" entries + * 1) Map over each "declaration". + * 2) Generate "version" values (version ID relationship) + * 3) Update the values in the Declaration table. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} Updated declarations + */ +const updateDeclarationVersionField = async (connection: Connection) => { + const loggingMessage = 'Creating declarationVersion entries with declaration relationships'; + + console.info(`✅ ${loggingMessage}`); + + try { + const declarations = await getAllDeclarations(connection); + const declarationVersions = await getAllDeclarationVersions(connection); + + const declarationPromises = declarations.map(async (declaration: object, index: number) => { + const version = declarationVersions[index]; + + const query = ` + UPDATE Declaration SET version='${version.id}' WHERE id='${declaration.id}' + `; + + const updated = await executeSqlQuery({ + connection, + query, + loggingMessage: `Updating version column in declartion table for declaration ${declaration.id}`, + }); + + return updated; + }); + + return Promise.all(declarationPromises); + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default updateDeclarationVersionField; diff --git a/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/index.ts b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/index.ts new file mode 100644 index 0000000000..f41d322202 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/index.ts @@ -0,0 +1,27 @@ +import { Connection } from 'mysql2/promise'; +import submittedApplications from './submitted-applications'; +import nonSubmittedApplications from './non-submitted-applications'; + +/** + * createDeclarationVersionRelationship + * Create new "declaration version" entires with version numbers and "declaration" relationships. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} Declaration version entries + */ +const createDeclarationVersionRelationship = async (connection: Connection) => { + const loggingMessage = 'Creating declarationVersion entries with declaration relationships for non-submitted applications'; + + console.info(`✅ ${loggingMessage}`); + + try { + const promises = Promise.all([await submittedApplications(connection), await nonSubmittedApplications(connection)]); + + return promises; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default createDeclarationVersionRelationship; diff --git a/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/non-submitted-applications.ts b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/non-submitted-applications.ts new file mode 100644 index 0000000000..59e95d48de --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/non-submitted-applications.ts @@ -0,0 +1,67 @@ +import { Connection } from 'mysql2/promise'; +import { DECLARATIONS } from '../../../../constants'; +import getAllNonSubmittedApplications from '../../get-all-non-submitted-applications'; +import createCuid from '../../create-cuid'; +import executeSqlQuery from '../../execute-sql-query'; +import { Application } from '../../../../types'; + +const { + ANTI_BRIBERY, + ANTI_BRIBERY_CODE_OF_CONDUCT, + ANTI_BRIBERY_EXPORTING_WITH_CODE_OF_CONDUCT, + CONFIDENTIALITY, + CONFIRMATION_AND_ACKNOWLEDGEMENTS, +} = DECLARATIONS.LATEST_DECLARATIONS; + +/** + * createDeclarationVersionRelationship + * Create new "declaration version" entires with version numbers and "declaration" relationships, + * for applications that do NOT have a SUBMITTED status. + * Applications that have NOT been submitted, prior to V2, should have the latest declaration versions. + * 1) Map over each application + * 2) Create new database values with a CUID and version numbers + * 3) Add entries to the DeclarationVersion table + * @param {Connection} connection: SQL database connection + * @returns {Promise>} Declaration version entries + */ +const createDeclarationVersionRelationshipNotSubmittedApplications = async (connection: Connection) => { + const loggingMessage = 'Creating declarationVersion entries with declaration relationships for non-submitted applications'; + + console.info(`✅ ${loggingMessage}`); + + const nonSubmittedApplications = await getAllNonSubmittedApplications(connection); + + if (!nonSubmittedApplications.length) { + console.info('ℹī¸ No non-submitted applications available - no need to create declarationVersion entries'); + + return false; + } + + try { + const declarationPromises = nonSubmittedApplications.map(async (application: Application) => { + const { declaration: declarationId } = application; + + const idValues = `'${createCuid()}', '${declarationId}',`; + + const versionValues = `'${ANTI_BRIBERY}', '${CONFIDENTIALITY}', '${CONFIRMATION_AND_ACKNOWLEDGEMENTS}', '${ANTI_BRIBERY_CODE_OF_CONDUCT}', '${ANTI_BRIBERY_EXPORTING_WITH_CODE_OF_CONDUCT}'`; + + const theValues = `(${idValues} ${versionValues})`; + + const query = await executeSqlQuery({ + connection, + query: `INSERT INTO DeclarationVersion (id, declaration, agreeToAntiBribery, agreeToConfidentiality, agreeToConfirmationAndAcknowledgements, hasAntiBriberyCodeOfConduct, willExportWithAntiBriberyCodeOfConduct) VALUES ${theValues}`, + loggingMessage: `Creating DeclarationVersion entry for application ${application.id}`, + }); + + return query; + }); + + return Promise.all(declarationPromises); + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default createDeclarationVersionRelationshipNotSubmittedApplications; diff --git a/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/submitted-applications.ts b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/submitted-applications.ts new file mode 100644 index 0000000000..b94ca61a18 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/declaration-version-relationship/submitted-applications.ts @@ -0,0 +1,68 @@ +import { Connection } from 'mysql2/promise'; +import { DECLARATIONS } from '../../../../constants'; +import getAllSubmittedApplications from '../../get-all-submitted-applications'; +import createCuid from '../../create-cuid'; +import executeSqlQuery from '../../execute-sql-query'; +import { Application } from '../../../../types'; + +const { + ANTI_BRIBERY, + ANTI_BRIBERY_CODE_OF_CONDUCT, + ANTI_BRIBERY_EXPORTING_WITH_CODE_OF_CONDUCT, + CONFIDENTIALITY, + CONFIRMATION_AND_ACKNOWLEDGEMENTS, + HOW_YOUR_DATA_WILL_BE_USED, +} = DECLARATIONS.V1_DECLARATIONS; + +/** + * createDeclarationVersionRelationshipSubmittedApplications + * Create new "declaration version" entires with version numbers and "declaration" relationships, + * for applications with a SUBMITTED status. + * Applications that have already been submitted, prior to V2, should have V1 declaration versions. + * 1) Map over each application + * 2) Create new database values with a CUID and version numbers + * 3) Add entries to the DeclarationVersion table + * @param {Connection} connection: SQL database connection + * @returns {Promise>} Declaration version entries + */ +const createDeclarationVersionRelationshipSubmittedApplications = async (connection: Connection) => { + const loggingMessage = 'Creating declarationVersion entries with declaration relationships for submitted applications'; + + console.info(`✅ ${loggingMessage}`); + + const submittedApplications = await getAllSubmittedApplications(connection); + + if (!submittedApplications.length) { + console.info('ℹī¸ No submitted applications available - no need to create declarationVersion entries'); + + return false; + } + + try { + const declarationPromises = submittedApplications.map(async (application: Application) => { + const { declaration: declarationId } = application; + + const idValues = `'${createCuid()}', '${declarationId}',`; + + const versionValues = `'${HOW_YOUR_DATA_WILL_BE_USED}', '${ANTI_BRIBERY}', '${CONFIDENTIALITY}', '${CONFIRMATION_AND_ACKNOWLEDGEMENTS}', '${ANTI_BRIBERY_CODE_OF_CONDUCT}', '${ANTI_BRIBERY_EXPORTING_WITH_CODE_OF_CONDUCT}'`; + + const theValues = `(${idValues} ${versionValues})`; + + const query = await executeSqlQuery({ + connection, + query: `INSERT INTO DeclarationVersion (id, declaration, agreeHowDataWillBeUsed, agreeToAntiBribery, agreeToConfidentiality, agreeToConfirmationAndAcknowledgements, hasAntiBriberyCodeOfConduct, willExportWithAntiBriberyCodeOfConduct) VALUES ${theValues}`, + loggingMessage: `Creating DeclarationVersion entry for application ${application.id}`, + }); + + return query; + }); + + return Promise.all(declarationPromises); + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default createDeclarationVersionRelationshipSubmittedApplications; diff --git a/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/index.ts b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/index.ts index f013c8c338..78d152b0ad 100644 --- a/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/index.ts +++ b/src/api/data-migration/version-1-to-version-2/create-new-application-relationships/index.ts @@ -2,13 +2,15 @@ import { Connection } from 'mysql2/promise'; import getAllApplications from '../get-all-applications'; import createLossPayee from './loss-payee'; import createJointlyInsuredParty from './jointly-insured-party'; -import updateLossPayeeFinancialUkVector from './loss-payee/update-loss-payee-financial-uk-vector'; -import updateLossPayeeFinancialInternationalVector from './loss-payee/update-loss-payee-financial-international-vector'; import createExportContractAgent from './export-contract-agent'; import createPrivateMarket from './private-market'; import updateExportContractPrivateMarket from './export-contract-private-market'; import createCompanyDifferentTradingAddress from './create-company-different-trading-address'; import updateCompanyDifferentTradingAddress from './update-company-different-trading-address'; +import createDeclarationVersionRelationship from './declaration-version-relationship'; +import updateDeclarationVersionField from './declaration-version-field'; +import updateLossPayeeFinancialUkVector from './loss-payee/update-loss-payee-financial-uk-vector'; +import updateLossPayeeFinancialInternationalVector from './loss-payee/update-loss-payee-financial-international-vector'; /** * createNewApplicationRelationships @@ -34,6 +36,8 @@ const createNewApplicationRelationships = async (connection: Connection) => { updateExportContractPrivateMarket(connection), createCompanyDifferentTradingAddress(connection, applications), updateCompanyDifferentTradingAddress(connection), + createDeclarationVersionRelationship(connection, applications), + updateDeclarationVersionField(connection, applications), ]); await updateLossPayeeFinancialUkVector(connection); diff --git a/src/api/data-migration/version-1-to-version-2/create-tables/create-declaration-version-table.ts b/src/api/data-migration/version-1-to-version-2/create-tables/create-declaration-version-table.ts new file mode 100644 index 0000000000..ac8d817951 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/create-tables/create-declaration-version-table.ts @@ -0,0 +1,34 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from '../execute-sql-query'; + +/** + * createDeclarationVersionTable + * Create new "declaration version" database table. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const createDeclarationVersionTable = (connection: Connection) => { + const loggingMessage = 'Creating TABLE - declaration version'; + + const query = ` + CREATE TABLE DeclarationVersion ( + id varchar(191) COLLATE utf8mb4_unicode_ci NOT NULL, + agreeHowDataWillBeUsed varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + agreeToAntiBribery varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + agreeToConfidentiality varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + agreeToConfirmationAndAcknowledgements varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + hasAntiBriberyCodeOfConduct varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + willExportWithAntiBriberyCodeOfConduct varchar(3) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '', + declaration varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL, + PRIMARY KEY (id), + KEY DeclarationVersion_declaration_idx (declaration), + CONSTRAINT DeclarationVersion_declaration_fkey FOREIGN KEY (declaration) REFERENCES Declaration (id) ON DELETE + SET + NULL ON UPDATE CASCADE + ) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COLLATE = utf8mb4_unicode_ci; + `; + + return executeSqlQuery({ connection, query, loggingMessage }); +}; + +export default createDeclarationVersionTable; diff --git a/src/api/data-migration/version-1-to-version-2/create-tables/index.ts b/src/api/data-migration/version-1-to-version-2/create-tables/index.ts index 024e8fbe5c..f1eab1c854 100644 --- a/src/api/data-migration/version-1-to-version-2/create-tables/index.ts +++ b/src/api/data-migration/version-1-to-version-2/create-tables/index.ts @@ -1,5 +1,6 @@ import { Connection } from 'mysql2/promise'; import createAccountStatusTable from './create-account-status-table'; +import createDeclarationVersionTable from './create-declaration-version-table'; import createJointlyInsuredPartyTable from './create-jointly-insured-party-table'; import createExportContractAgentServiceChargeTable from './create-export-contract-agent-service-charge-table'; import createExportContractAgentServiceTable from './create-export-contract-agent-service-table'; @@ -29,6 +30,7 @@ const createTables = async (connection: Connection) => { const tables = await Promise.all([ createAccountStatusTable(connection), + createDeclarationVersionTable(connection), createJointlyInsuredPartyTable(connection), createExportContractAgentServiceChargeTable(connection), diff --git a/src/api/data-migration/version-1-to-version-2/get-all-declaration-versions.ts b/src/api/data-migration/version-1-to-version-2/get-all-declaration-versions.ts new file mode 100644 index 0000000000..0e23396062 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/get-all-declaration-versions.ts @@ -0,0 +1,28 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from './execute-sql-query'; + +/** + * getAllDeclarationVersions + * Get all entries in the "DeclarationVersion" table. + * @param {Connection} connection: SQL database connection + * @returns {Promise} Declaration versions + */ +const getAllDeclarationVersions = async (connection: Connection) => { + const loggingMessage = 'Getting all declaration versions'; + + console.info(`✅ ${loggingMessage}`); + + try { + const query = 'SELECT * FROM DeclarationVersion'; + + const [exportContracts] = await executeSqlQuery({ connection, query, loggingMessage }); + + return exportContracts; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default getAllDeclarationVersions; diff --git a/src/api/data-migration/version-1-to-version-2/get-all-declarations.ts b/src/api/data-migration/version-1-to-version-2/get-all-declarations.ts new file mode 100644 index 0000000000..6268462924 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/get-all-declarations.ts @@ -0,0 +1,28 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from './execute-sql-query'; + +/** + * getAllDeclarations + * Get all entries in the "Declaration" table. + * @param {Connection} connection: SQL database connection + * @returns {Promise} Declarations + */ +const getAllDeclarations = async (connection: Connection) => { + const loggingMessage = 'Getting all declarations'; + + console.info(`✅ ${loggingMessage}`); + + try { + const query = 'SELECT * FROM Declaration'; + + const [exportContracts] = await executeSqlQuery({ connection, query, loggingMessage }); + + return exportContracts; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default getAllDeclarations; diff --git a/src/api/data-migration/version-1-to-version-2/get-all-non-submitted-applications.ts b/src/api/data-migration/version-1-to-version-2/get-all-non-submitted-applications.ts new file mode 100644 index 0000000000..b9b7550689 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/get-all-non-submitted-applications.ts @@ -0,0 +1,29 @@ +import { Connection } from 'mysql2/promise'; +import { APPLICATION } from '../../constants'; +import executeSqlQuery from './execute-sql-query'; + +const { STATUS } = APPLICATION; + +/** + * getAllNonSubmittedApplications + * Get all entries in the "Application" table that do NOT have a SUBMITTED status + * @param {Connection} connection: SQL database connection + * @returns {Promise} Non-submitted applications + */ +const getAllNonSubmittedApplications = async (connection: Connection) => { + const loggingMessage = 'Getting all non-submitted applications'; + + try { + const query = `SELECT * FROM Application WHERE status!='${STATUS.SUBMITTED}'`; + + const [applications] = await executeSqlQuery({ connection, query, loggingMessage }); + + return applications; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default getAllNonSubmittedApplications; diff --git a/src/api/data-migration/version-1-to-version-2/get-all-submitted-applications.ts b/src/api/data-migration/version-1-to-version-2/get-all-submitted-applications.ts new file mode 100644 index 0000000000..4b8bcfdbf6 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/get-all-submitted-applications.ts @@ -0,0 +1,29 @@ +import { Connection } from 'mysql2/promise'; +import { APPLICATION } from '../../constants'; +import executeSqlQuery from './execute-sql-query'; + +const { STATUS } = APPLICATION; + +/** + * getAllSubmittedApplications + * Get all entries in the "Application" table with a SUBMITTED status + * @param {Connection} connection: SQL database connection + * @returns {Promise} Submitted applications + */ +const getAllSubmittedApplications = async (connection: Connection) => { + const loggingMessage = 'Getting all submitted applications'; + + try { + const query = `SELECT * FROM Application WHERE status='${STATUS.SUBMITTED}'`; + + const [applications] = await executeSqlQuery({ connection, query, loggingMessage }); + + return applications; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default getAllSubmittedApplications; diff --git a/src/api/data-migration/version-1-to-version-2/index.ts b/src/api/data-migration/version-1-to-version-2/index.ts index ac02c215dc..13b92bc8a6 100644 --- a/src/api/data-migration/version-1-to-version-2/index.ts +++ b/src/api/data-migration/version-1-to-version-2/index.ts @@ -4,9 +4,11 @@ import updateAccounts from './update-accounts'; import updateApplications from './update-applications'; import createNewAccountStatusRelationships from './create-new-account-status-relationships'; import removeAccountStatusFields from './update-accounts/remove-account-status-fields'; -import createNewApplicationRelationships from './create-new-application-relationships'; +import removeDeclarationFields from './remove-declaration-fields'; import getAllBuyers from './get-all-buyers'; import updateBuyers from './update-buyers'; +import createNewApplicationRelationships from './create-new-application-relationships'; +import removeDeclarationContentTables from './remove-declaration-content-tables'; /** * dataMigration @@ -36,12 +38,24 @@ const dataMigration = async () => { await removeAccountStatusFields(connection); + console.info('✅ Accounts successfully updated.'); + const buyers = await getAllBuyers(connection); await updateBuyers(connection, buyers); + console.info('✅ Buyers successfully updated.'); + + await removeDeclarationFields(connection); + + await removeDeclarationContentTables(connection); + + console.info('✅ Declarations successfully updated.'); + await createNewApplicationRelationships(connection); + console.info('✅ Application relationships successfully updated.'); + console.info('🎉 Migration complete. Exiting script'); process.exit(); diff --git a/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/anti-bribery.ts b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/anti-bribery.ts new file mode 100644 index 0000000000..55499c74db --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/anti-bribery.ts @@ -0,0 +1,18 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from '../execute-sql-query'; + +/** + * removeAntiBriberyTable + * Remove the "anti-bribery" declaration table + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const removeAntiBriberyTable = (connection: Connection) => { + const loggingMessage = 'Removing TABLE DeclarationAntiBribery'; + + const query = `DROP TABLE DeclarationAntiBribery`; + + return executeSqlQuery({ connection, query, loggingMessage }); +}; + +export default removeAntiBriberyTable; diff --git a/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/confidentiality.ts b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/confidentiality.ts new file mode 100644 index 0000000000..dfbd503d56 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/confidentiality.ts @@ -0,0 +1,18 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from '../execute-sql-query'; + +/** + * removeConfidentialityTable + * Remove the "confidentiality" declaration table + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const removeConfidentialityTable = (connection: Connection) => { + const loggingMessage = 'Removing TABLE DeclarationConfidentiality'; + + const query = `DROP TABLE DeclarationConfidentiality`; + + return executeSqlQuery({ connection, query, loggingMessage }); +}; + +export default removeConfidentialityTable; diff --git a/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/confirmation-and-acknowledgement.ts b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/confirmation-and-acknowledgement.ts new file mode 100644 index 0000000000..b099dde845 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/confirmation-and-acknowledgement.ts @@ -0,0 +1,18 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from '../execute-sql-query'; + +/** + * removeConfirmationAndAcknowledgementTable + * Remove the "confirmation and acknowledgement" declaration table + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const removeConfirmationAndAcknowledgementTable = (connection: Connection) => { + const loggingMessage = 'Removing TABLE DeclarationConfirmationAndAcknowledgement'; + + const query = `DROP TABLE DeclarationConfirmationAndAcknowledgement`; + + return executeSqlQuery({ connection, query, loggingMessage }); +}; + +export default removeConfirmationAndAcknowledgementTable; diff --git a/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/how-data-will-be-used.ts b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/how-data-will-be-used.ts new file mode 100644 index 0000000000..ed353ce625 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/how-data-will-be-used.ts @@ -0,0 +1,18 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from '../execute-sql-query'; + +/** + * removeHowDataWillBeUsedTable + * Remove the "how data will be used" declaration table + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const removeHowDataWillBeUsedTable = (connection: Connection) => { + const loggingMessage = 'Removing TABLE DeclarationHowDataWillBeUsed'; + + const query = `DROP TABLE DeclarationHowDataWillBeUsed`; + + return executeSqlQuery({ connection, query, loggingMessage }); +}; + +export default removeHowDataWillBeUsedTable; diff --git a/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/index.ts b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/index.ts new file mode 100644 index 0000000000..970a7f805c --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/remove-declaration-content-tables/index.ts @@ -0,0 +1,40 @@ +import { Connection } from 'mysql2/promise'; +import removeAntiBriberyTable from './anti-bribery'; +import removeConfidentialityTable from './confidentiality' +import removeConfirmationAndAcknowledgementTable from './confirmation-and-acknowledgement'; +import removeHowDataWillBeUsedTable from './how-data-will-be-used'; + +/** + * removeDeclarationContentTables + * Remove declaration content tables. + * All declaration content has been moved from the API into content strings. + * The following tables will be removed: + * - DeclarationAntiBribery + * - DeclarationConfidentiality + * - DeclarationConfirmationAndAcknowledgement + * - DeclarationHowDataWillBeUsed + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery responses + */ +const removeDeclarationContentTables = async (connection: Connection) => { + const loggingMessage = 'Removing TABLES declaration content'; + + console.info(`✅ ${loggingMessage}`); + + try { + const tables = await Promise.all([ + removeAntiBriberyTable(connection), + removeConfidentialityTable(connection), + removeConfirmationAndAcknowledgementTable(connection), + removeHowDataWillBeUsedTable(connection), + ]); + + return tables; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default removeDeclarationContentTables; diff --git a/src/api/data-migration/version-1-to-version-2/remove-declaration-fields.ts b/src/api/data-migration/version-1-to-version-2/remove-declaration-fields.ts new file mode 100644 index 0000000000..68fb8ee120 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/remove-declaration-fields.ts @@ -0,0 +1,128 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from './execute-sql-query'; + +/** + * removeDeclarationKeys + * Remove old declaration keys from the declaration table. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery responses + */ +const removeDeclarationKeys = async (connection: Connection) => { + const loggingMessage = 'Removing KEYS declarations'; + + console.info(`✅ ${loggingMessage}`); + + try { + const queries = await Promise.all([ + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP KEY Declaration_antiBribery_idx`, + loggingMessage: 'Removing KEY Declaration_antiBribery_idx from declaration table', + }), + + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP KEY Declaration_confirmationAndAcknowledgements_idx`, + loggingMessage: 'Removing KEY Declaration_confirmationAndAcknowledgements_idx from declaration table', + }), + + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP KEY Declaration_howDataWillBeUsed_idx`, + loggingMessage: 'Removing KEY Declaration_howDataWillBeUsed_idx from declaration table', + }), + ]); + + return queries; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +/** + * removeDeclarationConstraints + * Remove old declaration constraints from the declaration table. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery responses + */ +const removeDeclarationConstraints = async (connection: Connection) => { + const loggingMessage = 'Removing CONSTRAINTS declarations'; + + console.info(`✅ ${loggingMessage}`); + + try { + const queries = await Promise.all([ + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP CONSTRAINT Declaration_antiBribery_fkey`, + loggingMessage: 'Removing CONSTRAINT Declaration_antiBribery_fkey from declaration table', + }), + + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP CONSTRAINT Declaration_confirmationAndAcknowledgements_fkey`, + loggingMessage: 'Removing CONSTRAINT Declaration_confirmationAndAcknowledgements_fkey from declaration table', + }), + + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP CONSTRAINT Declaration_howDataWillBeUsed_fkey`, + loggingMessage: 'Removing CONSTRAINT Declaration_howDataWillBeUsed_fkey from declaration table', + }), + ]); + + return queries; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +/** + * removeDeclarationFields + * Remove old declaration fields from the declaration table. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery responses + */ +const removeDeclarationFields = async (connection: Connection) => { + const loggingMessage = 'Removing FIELDS declarations'; + + console.info(`✅ ${loggingMessage}`); + + try { + const queries = await Promise.all([ + removeDeclarationConstraints(connection), + + removeDeclarationKeys(connection), + + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP COLUMN antiBribery`, + loggingMessage: 'Removing FIELD antiBribery from declaration table', + }), + + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP COLUMN confirmationAndAcknowledgements`, + loggingMessage: 'Removing FIELD confirmationAndAcknowledgements from declaration table', + }), + + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration DROP COLUMN howDataWillBeUsed`, + loggingMessage: 'Removing FIELD howDataWillBeUsed from declaration table', + }), + ]); + + return queries; + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default removeDeclarationFields; diff --git a/src/api/data-migration/version-1-to-version-2/update-accounts/remove-account-status-fields.ts b/src/api/data-migration/version-1-to-version-2/update-accounts/remove-account-status-fields.ts index 5e49fe1276..e03303b822 100644 --- a/src/api/data-migration/version-1-to-version-2/update-accounts/remove-account-status-fields.ts +++ b/src/api/data-migration/version-1-to-version-2/update-accounts/remove-account-status-fields.ts @@ -15,9 +15,9 @@ const removeAccountStatusFields = async (connection: Connection) => { console.info(`✅ ${loggingMessage}`); try { - const tables = await Promise.all([removeIsVerifiedField(connection), removeIsBlockedField(connection)]); + const queries = await Promise.all([removeIsVerifiedField(connection), removeIsBlockedField(connection)]); - return tables; + return queries; } catch (err) { console.error(`🚨 error ${loggingMessage} %O`, err); diff --git a/src/api/data-migration/version-1-to-version-2/update-applications/add-declaration-fields.ts b/src/api/data-migration/version-1-to-version-2/update-applications/add-declaration-fields.ts new file mode 100644 index 0000000000..83d4b19170 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/update-applications/add-declaration-fields.ts @@ -0,0 +1,57 @@ +import { Connection } from 'mysql2/promise'; +import executeSqlQuery from '../execute-sql-query'; + +/** + * declarationKeys + * Add new unique keys to the company table. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const declarationKeys = (connection: Connection) => + executeSqlQuery({ + connection, + query: 'ALTER TABLE Declaration ADD KEY Declaration_version_idx(version)', + loggingMessage: 'Adding KEY version to declaration table', + }); + +/** + * declarationConstraints + * Add new constraints to the declaration table. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const declarationConstraints = (connection: Connection) => + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration ADD CONSTRAINT Declaration_version_fkey FOREIGN KEY (version) REFERENCES DeclarationVersion (id) ON DELETE SET NULL ON UPDATE CASCADE`, + loggingMessage: 'Adding CONSTRAINT version to declaration table', + }); + +/** + * addDeclarationFields + * Add new fields to the declaration table. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const addDeclarationFields = async (connection: Connection) => { + const queries = await Promise.all([ + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration ADD version varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL`, + loggingMessage: 'Adding FIELD version to declaration table', + }), + + executeSqlQuery({ + connection, + query: `ALTER TABLE Declaration ADD exportContract tinyint(1) DEFAULT NULL`, + loggingMessage: 'Adding FIELD exportContract to declaration table', + }), + + declarationKeys(connection), + declarationConstraints(connection), + ]); + + return queries; +}; + +export default addDeclarationFields; diff --git a/src/api/data-migration/version-1-to-version-2/update-applications/add-declarations-export-contract-field.ts b/src/api/data-migration/version-1-to-version-2/update-applications/add-declarations-export-contract-field.ts deleted file mode 100644 index 7b37796ef1..0000000000 --- a/src/api/data-migration/version-1-to-version-2/update-applications/add-declarations-export-contract-field.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Connection } from 'mysql2/promise'; -import executeSqlQuery from '../execute-sql-query'; - -/** - * addDeclarationsExportContractField - * Add a exportContract field to the declarations table. - * @param {Connection} connection: SQL database connection - * @returns {Promise>} executeSqlQuery response - */ -const addDeclarationsExportContractField = (connection: Connection) => { - const loggingMessage = 'Adding FIELD exportContract to declaration table'; - - const query = ` - ALTER TABLE Declaration ADD exportContract tinyint(1) DEFAULT NULL - `; - - return executeSqlQuery({ connection, query, loggingMessage }); -}; - -export default addDeclarationsExportContractField; diff --git a/src/api/data-migration/version-1-to-version-2/update-applications/index.ts b/src/api/data-migration/version-1-to-version-2/update-applications/index.ts index 2e364ddd18..2af1be8ef7 100644 --- a/src/api/data-migration/version-1-to-version-2/update-applications/index.ts +++ b/src/api/data-migration/version-1-to-version-2/update-applications/index.ts @@ -7,7 +7,8 @@ import addCompanyFields from './add-company-fields'; import addBusinessFields from './add-business-fields'; import addBrokerFullAddressField from './add-broker-full-address-field'; import addEligibilityHasEndBuyerField from './add-eligibility-has-end-buyer-field'; -import addDeclarationsExportContractField from './add-declarations-export-contract-field'; +import addDeclarationFields from './add-declaration-fields'; +import updateDeclarationFields from './update-declaration-fields'; import addSectionReviewExportContractField from './add-section-review-export-contract-field'; import updateExportContractFinalDestinationCountryCodeVarChar from './update-export-contract-final-destination-country-code-var-char'; import updatePolicyCurrencyCodeVarChar from './update-policy-currency-code-var-char'; @@ -31,17 +32,23 @@ const updateApplications = async (connection: Connection) => { addApplicationMigratedField(connection), addNominatedLossPayeeField(connection), addNominatedLossPayeeConstraint(connection), + addExportContractFields(connection), addBuyerFields(connection), addCompanyFields(connection), addBusinessFields(connection), addBrokerFullAddressField(connection), addEligibilityHasEndBuyerField(connection), - addDeclarationsExportContractField(connection), + + addDeclarationFields(connection), + updateDeclarationFields(connection), + addSectionReviewExportContractField(connection), updateExportContractFinalDestinationCountryCodeVarChar(connection), + updatePolicyCurrencyCodeVarChar(connection), updatePolicyContactPositionCodeVarChar(connection), + updateApplicationVersion(connection), updateApplicationMigrated(connection), ]); diff --git a/src/api/data-migration/version-1-to-version-2/update-applications/update-declaration-fields.ts b/src/api/data-migration/version-1-to-version-2/update-applications/update-declaration-fields.ts new file mode 100644 index 0000000000..809bc04748 --- /dev/null +++ b/src/api/data-migration/version-1-to-version-2/update-applications/update-declaration-fields.ts @@ -0,0 +1,81 @@ +import { Connection } from 'mysql2/promise'; +import getAllNonSubmittedApplications from '../get-all-non-submitted-applications'; +import executeSqlQuery from '../execute-sql-query'; +import { Application } from '../../../types'; + +/** + * updateDeclarationFields + * update fields in the declaration table. + * This sets all existing declarations to NULL. + * In V2, any existing declarations will become invalid due to new versions. + * If we do not nullify a user's existing answers, they have technically agreed to something that is out of date. + * @param {Connection} connection: SQL database connection + * @returns {Promise>} executeSqlQuery response + */ +const updateDeclarationFields = async (connection: Connection) => { + const loggingMessage = 'Updating all declarations FIELDS'; + + console.info(`✅ ${loggingMessage}`); + + try { + const nonSubmittedApplications = await getAllNonSubmittedApplications(connection); + + if (!nonSubmittedApplications.length) { + console.info('ℹī¸ No non-submitted applications available - no need to update declaration fields'); + + return false; + } + + const promises = nonSubmittedApplications.map(async (application: Application) => { + const { declaration: declarationId } = application; + + const applicationPromises = Promise.all([ + executeSqlQuery({ + connection, + query: `UPDATE Declaration SET agreeHowDataWillBeUsed=null WHERE id='${declarationId}'`, + loggingMessage: `updating Declartion agreeHowDataWillBeUsed entry to null for application ${application.id}`, + }), + + executeSqlQuery({ + connection, + query: `UPDATE Declaration SET agreeToAntiBribery=null WHERE id='${declarationId}'`, + loggingMessage: `updating Declartion agreeToAntiBribery entry to null for application ${application.id}`, + }), + + executeSqlQuery({ + connection, + query: `UPDATE Declaration SET agreeToConfidentiality=null WHERE id='${declarationId}'`, + loggingMessage: `updating Declartion agreeToConfidentiality entry to null for application ${application.id}`, + }), + + executeSqlQuery({ + connection, + query: `UPDATE Declaration SET agreeToConfirmationAndAcknowledgements=null WHERE id='${declarationId}'`, + loggingMessage: `updating Declartion agreeToConfirmationAndAcknowledgements entry to null for application ${application.id}`, + }), + + executeSqlQuery({ + connection, + query: `UPDATE Declaration SET hasAntiBriberyCodeOfConduct=null WHERE id='${declarationId}'`, + loggingMessage: `updating Declartion hasAntiBriberyCodeOfConduct entry to null for application ${application.id}`, + }), + + executeSqlQuery({ + connection, + query: `UPDATE Declaration SET willExportWithAntiBriberyCodeOfConduct=null WHERE id='${declarationId}'`, + loggingMessage: `updating Declartion willExportWithAntiBriberyCodeOfConduct entry to null for application ${application.id}`, + }), + ]); + + return applicationPromises; + }); + + return Promise.all(promises); + } catch (err) { + console.error(`🚨 error ${loggingMessage} %O`, err); + + throw new Error(`🚨 error ${loggingMessage} ${err}`); + } +}; + +export default updateDeclarationFields; diff --git a/src/api/schema.graphql b/src/api/schema.graphql index 94412fcb3a..829e56a03c 100644 --- a/src/api/schema.graphql +++ b/src/api/schema.graphql @@ -2593,12 +2593,12 @@ type Declaration { id: ID! application: Application version: DeclarationVersion - agreeToConfidentiality: Boolean + agreeHowDataWillBeUsed: Boolean agreeToAntiBribery: Boolean + agreeToConfidentiality: Boolean + agreeToConfirmationAndAcknowledgements: Boolean hasAntiBriberyCodeOfConduct: Boolean willExportWithAntiBriberyCodeOfConduct: Boolean - agreeToConfirmationAndAcknowledgements: Boolean - agreeHowDataWillBeUsed: Boolean } input DeclarationWhereUniqueInput { @@ -2621,12 +2621,12 @@ input DeclarationOrderByInput { input DeclarationUpdateInput { application: ApplicationRelateToOneForUpdateInput version: DeclarationVersionRelateToOneForUpdateInput - agreeToConfidentiality: Boolean + agreeHowDataWillBeUsed: Boolean agreeToAntiBribery: Boolean + agreeToConfidentiality: Boolean + agreeToConfirmationAndAcknowledgements: Boolean hasAntiBriberyCodeOfConduct: Boolean willExportWithAntiBriberyCodeOfConduct: Boolean - agreeToConfirmationAndAcknowledgements: Boolean - agreeHowDataWillBeUsed: Boolean } input DeclarationVersionRelateToOneForUpdateInput { @@ -2643,12 +2643,12 @@ input DeclarationUpdateArgs { input DeclarationCreateInput { application: ApplicationRelateToOneForCreateInput version: DeclarationVersionRelateToOneForCreateInput - agreeToConfidentiality: Boolean + agreeHowDataWillBeUsed: Boolean agreeToAntiBribery: Boolean + agreeToConfidentiality: Boolean + agreeToConfirmationAndAcknowledgements: Boolean hasAntiBriberyCodeOfConduct: Boolean willExportWithAntiBriberyCodeOfConduct: Boolean - agreeToConfirmationAndAcknowledgements: Boolean - agreeHowDataWillBeUsed: Boolean } input DeclarationVersionRelateToOneForCreateInput { diff --git a/src/api/schema.prisma b/src/api/schema.prisma index 05c590ded7..a5eea94d72 100644 --- a/src/api/schema.prisma +++ b/src/api/schema.prisma @@ -516,12 +516,12 @@ model Declaration { applicationId String? @map("application") version DeclarationVersion? @relation("Declaration_version", fields: [versionId], references: [id]) versionId String? @map("version") - agreeToConfidentiality Boolean? + agreeHowDataWillBeUsed Boolean? agreeToAntiBribery Boolean? + agreeToConfidentiality Boolean? + agreeToConfirmationAndAcknowledgements Boolean? hasAntiBriberyCodeOfConduct Boolean? willExportWithAntiBriberyCodeOfConduct Boolean? - agreeToConfirmationAndAcknowledgements Boolean? - agreeHowDataWillBeUsed Boolean? from_Application_declaration Application[] @relation("Application_declaration") from_DeclarationVersion_declaration DeclarationVersion[] @relation("DeclarationVersion_declaration") diff --git a/src/api/schema.ts b/src/api/schema.ts index b917821e2a..73364b1074 100644 --- a/src/api/schema.ts +++ b/src/api/schema.ts @@ -1,9 +1,9 @@ +import { Lists } from '.keystone/types'; // eslint-disable-line import { list } from '@keystone-6/core'; import { allowAll } from '@keystone-6/core/access'; import { checkbox, integer, relationship, select, text, timestamp, password, decimal } from '@keystone-6/core/fields'; import { document } from '@keystone-6/fields-document'; import { addMonths } from 'date-fns'; -import { Lists } from '.keystone/types'; // eslint-disable-line import { APPLICATION, FEEDBACK } from './constants'; import updateApplication from './helpers/update-application'; import nullableCheckbox from './nullable-checkbox'; @@ -798,12 +798,12 @@ export const lists = { fields: { application: relationship({ ref: 'Application' }), version: relationship({ ref: 'DeclarationVersion' }), - agreeToConfidentiality: nullableCheckbox(), + agreeHowDataWillBeUsed: nullableCheckbox(), agreeToAntiBribery: nullableCheckbox(), + agreeToConfidentiality: nullableCheckbox(), + agreeToConfirmationAndAcknowledgements: nullableCheckbox(), hasAntiBriberyCodeOfConduct: nullableCheckbox(), willExportWithAntiBriberyCodeOfConduct: nullableCheckbox(), - agreeToConfirmationAndAcknowledgements: nullableCheckbox(), - agreeHowDataWillBeUsed: nullableCheckbox(), }, hooks: { afterOperation: async ({ item, context }) => {