From 1279b0427c19c55dbdb35a74877f11509d139b24 Mon Sep 17 00:00:00 2001 From: michaelfarrell76 Date: Tue, 26 Nov 2024 19:38:27 -0800 Subject: [PATCH] TSC --- .pnp.cjs | 10 +- ...ypes-npm-4.94.0-c5ce6b7558-8cc1a8dd54.zip} | Bin 357671 -> 371720 bytes package.json | 2 +- src/codecs.ts | 40 +- src/graphql/fetchAllAssessmentTemplates.ts | 83 ++++ src/graphql/fetchAllAssessments.ts | 405 ++++++++++++++++++ src/graphql/gqls/assessment.ts | 308 +++++++++++++ src/graphql/gqls/assessmentTemplate.ts | 67 +++ src/graphql/gqls/index.ts | 2 + src/graphql/index.ts | 2 + src/graphql/pullTranscendConfiguration.ts | 296 +++++++++++++ yarn.lock | 10 +- 12 files changed, 1195 insertions(+), 30 deletions(-) rename .yarn/cache/{@transcend-io-privacy-types-npm-4.93.0-18808935f7-dda3743a4b.zip => @transcend-io-privacy-types-npm-4.94.0-c5ce6b7558-8cc1a8dd54.zip} (85%) create mode 100644 src/graphql/fetchAllAssessmentTemplates.ts create mode 100644 src/graphql/fetchAllAssessments.ts create mode 100644 src/graphql/gqls/assessment.ts create mode 100644 src/graphql/gqls/assessmentTemplate.ts diff --git a/.pnp.cjs b/.pnp.cjs index e0dc0339..e7071bb5 100755 --- a/.pnp.cjs +++ b/.pnp.cjs @@ -32,7 +32,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@transcend-io/handlebars-utils", "npm:1.1.0"],\ ["@transcend-io/internationalization", "npm:1.6.0"],\ ["@transcend-io/persisted-state", "npm:1.0.4"],\ - ["@transcend-io/privacy-types", "npm:4.93.0"],\ + ["@transcend-io/privacy-types", "npm:4.94.0"],\ ["@transcend-io/secret-value", "npm:1.2.0"],\ ["@transcend-io/type-utils", "npm:1.5.0"],\ ["@types/bluebird", "npm:3.5.38"],\ @@ -682,7 +682,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { ["@transcend-io/handlebars-utils", "npm:1.1.0"],\ ["@transcend-io/internationalization", "npm:1.6.0"],\ ["@transcend-io/persisted-state", "npm:1.0.4"],\ - ["@transcend-io/privacy-types", "npm:4.93.0"],\ + ["@transcend-io/privacy-types", "npm:4.94.0"],\ ["@transcend-io/secret-value", "npm:1.2.0"],\ ["@transcend-io/type-utils", "npm:1.5.0"],\ ["@types/bluebird", "npm:3.5.38"],\ @@ -781,10 +781,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) { }]\ ]],\ ["@transcend-io/privacy-types", [\ - ["npm:4.93.0", {\ - "packageLocation": "./.yarn/cache/@transcend-io-privacy-types-npm-4.93.0-18808935f7-dda3743a4b.zip/node_modules/@transcend-io/privacy-types/",\ + ["npm:4.94.0", {\ + "packageLocation": "./.yarn/cache/@transcend-io-privacy-types-npm-4.94.0-c5ce6b7558-8cc1a8dd54.zip/node_modules/@transcend-io/privacy-types/",\ "packageDependencies": [\ - ["@transcend-io/privacy-types", "npm:4.93.0"],\ + ["@transcend-io/privacy-types", "npm:4.94.0"],\ ["@transcend-io/type-utils", "npm:1.0.5"],\ ["fp-ts", "npm:2.16.1"],\ ["io-ts", "virtual:a57afaf9d13087a7202de8c93ac4854c9e2828bad7709250829ec4c7bc9dc95ecc2858c25612aa1774c986aedc232c76957076a1da3156fd2ab63ae5551b086f#npm:2.2.21"]\ diff --git a/.yarn/cache/@transcend-io-privacy-types-npm-4.93.0-18808935f7-dda3743a4b.zip b/.yarn/cache/@transcend-io-privacy-types-npm-4.94.0-c5ce6b7558-8cc1a8dd54.zip similarity index 85% rename from .yarn/cache/@transcend-io-privacy-types-npm-4.93.0-18808935f7-dda3743a4b.zip rename to .yarn/cache/@transcend-io-privacy-types-npm-4.94.0-c5ce6b7558-8cc1a8dd54.zip index 0545256e141e29a92aff76c8a34b6871883b669a..0a9da4e9135fc84d6776283a2440531fe96e7839 100644 GIT binary patch delta 38074 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 CB(0kO delta 24333 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 -export const RiskLogicInput = t.type({ - /** The risk to assign to this question if the response matches the provided logic */ - 'risk-assignment': RiskAssignmentInput, - /** The operator to use when comparing the response to the operands */ - 'comparison-operator': valuesOf(ComparisonOperator), - /** The values to compare the response to */ - 'comparison-operands': t.array(t.string), -}); - -/** Type override */ -export type RiskLogicInput = t.TypeOf; - export const AssessmentAnswerOptionInput = t.type({ /** Value of answer */ value: t.string, @@ -1569,7 +1557,7 @@ export const AssessmentSectionQuestionInput = t.intersection([ /** Display logic for the question */ 'display-logic': AssessmentDisplayLogicInput, /** Risk logic for the question */ - 'risk-logic': t.array(RiskLogicInput), + 'risk-logic': t.array(t.string), /** Risk category titles for the question */ 'risk-categories': t.array(t.string), /** Risk framework titles for the question */ @@ -1598,12 +1586,24 @@ export type AssessmentSectionQuestionInput = t.TypeOf< typeof AssessmentSectionQuestionInput >; -export const AssessmentSectionInput = t.type({ - /** The title of the assessment section */ - title: t.string, - /** The questions in the assessment section */ - questions: t.array(AssessmentSectionQuestionInput), -}); +export const AssessmentSectionInput = t.intersection([ + t.type({ + /** The title of the assessment section */ + title: t.string, + /** The questions in the assessment section */ + questions: t.array(AssessmentSectionQuestionInput), + }), + t.partial({ + /** Email address of those assigned */ + assignees: t.array(t.string), + /** Email address of those externally assigned */ + 'external-assignees': t.array(t.string), + /** Status of section */ + status: t.string, + /** Whether assessment is reviewed */ + 'is-reviewed': t.boolean, + }), +]); /** Type override */ export type AssessmentSectionInput = t.TypeOf; @@ -1640,6 +1640,8 @@ export const AssessmentTemplateInput = t.intersection([ creator: t.string, /** Whether the template is in a locked status */ locked: t.boolean, + /** ID of parent template this was cloned from */ + 'parent-id': t.string, /** Whether the template is archived */ archived: t.boolean, /** The date that the assessment was created */ diff --git a/src/graphql/fetchAllAssessmentTemplates.ts b/src/graphql/fetchAllAssessmentTemplates.ts new file mode 100644 index 00000000..42a0ccac --- /dev/null +++ b/src/graphql/fetchAllAssessmentTemplates.ts @@ -0,0 +1,83 @@ +import { GraphQLClient } from 'graphql-request'; +import { ASSESSMENT_TEMPLATES } from './gqls'; +import { makeGraphQLRequest } from './makeGraphQLRequest'; +import type { + AssessmentSection, + RetentionSchedule, + UserPreview, +} from './fetchAllAssessments'; +import { + AssessmentFormTemplateSource, + AssessmentFormTemplateStatus, +} from '@transcend-io/privacy-types'; + +/** + * Represents an assessment template with various properties and metadata. + */ +export interface AssessmentTemplate { + /** The ID of the assessment template */ + id: string; + /** The user who created the assessment template */ + creator: UserPreview; + /** The user who last edited the assessment template */ + lastEditor: UserPreview; + /** The title of the assessment template */ + title: string; + /** The description of the assessment template */ + description: string; + /** The current status of the assessment template */ + status: AssessmentFormTemplateStatus; + /** The source fo the form template */ + source: AssessmentFormTemplateSource; + /** ID of parent template */ + parentId: string; + /** Indicates if the assessment template is locked */ + isLocked: boolean; + /** Indicates if the assessment template is archived */ + isArchived: boolean; + /** The date when the assessment template was created */ + createdAt: string; + /** The date when the assessment template was last updated */ + updatedAt: string; + /** The retention schedule of the assessment template */ + retentionSchedule: RetentionSchedule; + /** The sections of the assessment template */ + sections: AssessmentSection[]; +} + +const PAGE_SIZE = 20; + +/** + * Fetch all assessment templates in the organization + * + * @param client - GraphQL client + * @returns All assessment templates in the organization + */ +export async function fetchAllAssessmentTemplates( + client: GraphQLClient, +): Promise { + const assessmentTemplates: AssessmentTemplate[] = []; + let offset = 0; + + let shouldContinue = false; + do { + const { + assessmentFormTemplates: { nodes }, + // eslint-disable-next-line no-await-in-loop + } = await makeGraphQLRequest<{ + /** Templates */ + assessmentFormTemplates: { + /** Nodes */ + nodes: AssessmentTemplate[]; + }; + }>(client, ASSESSMENT_TEMPLATES, { + first: PAGE_SIZE, + offset, + }); + assessmentTemplates.push(...nodes); + offset += PAGE_SIZE; + shouldContinue = nodes.length === PAGE_SIZE; + } while (shouldContinue); + + return assessmentTemplates.sort((a, b) => a.title.localeCompare(b.title)); +} diff --git a/src/graphql/fetchAllAssessments.ts b/src/graphql/fetchAllAssessments.ts new file mode 100644 index 00000000..4be3a020 --- /dev/null +++ b/src/graphql/fetchAllAssessments.ts @@ -0,0 +1,405 @@ +/* eslint-disable max-lines */ +import { GraphQLClient } from 'graphql-request'; +import { ASSESSMENTS } from './gqls'; +import { makeGraphQLRequest } from './makeGraphQLRequest'; +import { + AssessmentFormStatus, + AssessmentQuestionSubType, + AssessmentQuestionType, + AssessmentSyncColumn, + AssessmentSyncModel, + AssessmentsDisplayLogicAction, + AttributeSupportedResourceType, + ComparisonOperator, + DataCategoryType, + LogicOperator, + ProcessingPurpose, + RetentionScheduleOperation, + RetentionScheduleType, +} from '@transcend-io/privacy-types'; + +/** + * Represents an assessment with various properties and metadata. + */ +export interface Assessment { + /** The ID of the assessment */ + id: string; + /** The user who created the assessment */ + creator: UserPreview; + /** The user who last edited the assessment */ + lastEditor: UserPreview; + /** The title of the assessment */ + title: string; + /** The description of the assessment */ + description: string; + /** The current status of the assessment */ + status: AssessmentFormStatus; + /** The users assigned to the assessment */ + assignees: UserPreview[]; + /** The external users assigned to the assessment */ + externalAssignees: ExternalUser[]; + /** The users who are reviewers of the assessment */ + reviewers: UserPreview[]; + /** Indicates if the assessment is locked */ + isLocked: boolean; + /** Indicates if the assessment is archived */ + isArchived: boolean; + /** Indicates if the assessment was created externally */ + isExternallyCreated: boolean; + /** The due date of the assessment */ + dueDate: string; + /** The date when the assessment was created */ + createdAt: string; + /** The date when the assessment was last updated */ + updatedAt: string; + /** The date when the assessment was assigned */ + assignedAt: string; + /** The date when the assessment was submitted */ + submittedAt: string; + /** The date when the assessment was approved */ + approvedAt: string; + /** The date when the assessment was rejected */ + rejectedAt: string; + /** Indicates if the title of the assessment is internal */ + titleIsInternal: boolean; + /** The retention schedule of the assessment */ + retentionSchedule: RetentionSchedule; + /** The attribute values associated with the assessment */ + attributeValues: AttributeValue[]; + /** The sections of the assessment */ + sections: AssessmentSection[]; + /** The group to which the assessment belongs */ + assessmentGroup: AssessmentGroup; + /** The resources associated with the assessment */ + resources: AssessmentResource[]; + /** The rows that are synced with the assessment */ + syncedRows: AssessmentResource[]; +} + +export interface UserPreview { + /** ID of user */ + id: string; + /** Email of user */ + email: string; + /** Name of user */ + name: string; +} + +export interface ExternalUser { + /** ID of external user */ + id: string; + /** Email of external user */ + email: string; +} + +export interface RetentionSchedule { + /** ID of retention schedule */ + id: string; + /** Type */ + type: RetentionScheduleType; + /** Duration of retention schedule */ + durationDays: number; + /** The operation to perform on the retention schedule */ + operation: RetentionScheduleOperation; +} + +interface AttributeValue { + /** Name of attribute value */ + name: string; + /** Key */ + attributeKey: { + /** Name of key */ + name: string; + }; +} + +export interface AssessmentSection { + /** ID of section */ + id: string; + /** Title of section */ + title: string; + /** Status of section */ + status: string; + /** Index of section */ + index: number; + /** Questions */ + questions: AssessmentQuestion[]; + /** Assignees */ + assignees: UserPreview[]; + /** External assignees */ + externalAssignees: ExternalUser[]; + /** Whether is reviewed */ + isReviewed: boolean; +} + +/** + * Represents a question in the assessment. + */ +export interface AssessmentQuestion { + /** + * Unique identifier for the question. + */ + id: string; + /** Title of the question */ + title: string; + /** Index of the question in the assessment */ + index: number; + /** Type of the question */ + type: AssessmentQuestionType; + /** Subtype of the question */ + subType: AssessmentQuestionSubType; + /** Placeholder text for the question */ + placeholder: string; + /** Description of the question */ + description: string; + /** Indicates if the question is required */ + isRequired: boolean; + /** Logic for displaying the question */ + displayLogic?: { + /** Action to take */ + action: AssessmentsDisplayLogicAction; + /** Rule logic */ + rule?: AssessmentRuleInputResponse; + /** Nested rule logic */ + nestedRule?: AssessmentNestedRuleInputResponse; + }; + /** Logic for assessing risk related to the question */ + riskLogic: string[]; + /** Indicates if risk evaluation is required for the question */ + requireRiskEvaluation: boolean; + /** Indicates if risk matrix evaluation is required for the question */ + requireRiskMatrixEvaluation: boolean; + /** Categories of risk associated with the question */ + riskCategories: RiskCategory[]; + /** Framework used for risk assessment */ + riskFramework?: RiskFramework; + /** Level of risk associated with the question */ + riskLevel?: RiskLevel; + /** Risk level assigned by the reviewer */ + reviewerRiskLevel?: RiskLevel; + /** Risk level derived from the risk matrix */ + riskLevelFromRiskMatrix?: RiskLevel; + /** Options available for answering the question */ + answerOptions: AssessmentAnswerOption[]; + /** Answers selected for the question */ + selectedAnswers: AssessmentAnswer[]; + /** User who responded to the question */ + respondent: UserPreview; + /** Key attribute associated with the question */ + attributeKey?: { + /** Name of key */ + name: string; + }; + /** Email of the external respondent */ + externalRespondentEmail?: string; + /** Comments related to the question */ + comments: Comment[]; + /** Allowed MIME types for file uploads in the question */ + allowedMimeTypes: string[]; + /** Timestamp of the last update to the question */ + updatedAt: string; + /** Reference identifier for the question */ + referenceId: string; + /** Previous submissions related to the question */ + previousSubmissions: AssessmentPreviousSubmission[]; + /** Indicates if selecting "Other" is allowed for the question */ + allowSelectOther: boolean; + /** Model used for synchronization */ + syncModel: AssessmentSyncModel; + /** Column used for synchronization */ + syncColumn: AssessmentSyncColumn; + /** Row IDs used for synchronization */ + syncRowIds: string[]; + /** Indicates if synchronization override is allowed */ + syncOverride: boolean; +} + +export interface RiskCategory { + /** ID of category */ + id: string; + /** Title of category */ + title: string; +} + +export interface RiskFramework { + /** ID of framework */ + id: string; + /** Title of framework */ + title: string; + /** Description of framework */ + description: string; + /** Risk levels */ + riskLevels: RiskLevel[]; + /** Risk categories */ + riskCategories: RiskCategory[]; + /** Risk matrix columns */ + riskMatrixColumns: RiskMatrixColumn[]; + /** Risk matrix rows */ + riskMatrixRows: RiskMatrixRow[]; + /** Risk matrix settings */ + riskMatrix: RiskMatrix[][]; + /** Creator of risk framework */ + creator?: UserPreview; + /** Risk matrix row title */ + riskMatrixRowTitle: string; + /** Risk matrix column title */ + riskMatrixColumnTitle: string; +} + +/** + * Represents the input for an assessment rule. + */ +export interface AssessmentRuleInputResponse { + /** Reference ID of the question this rule depends on */ + dependsOnQuestionReferenceId: string; + /** Operator used for comparison */ + comparisonOperator: ComparisonOperator; + /** Operands used for comparison */ + comparisonOperands?: string[]; +} + +/** + * Represents the input for a nested assessment rule. + */ +export interface AssessmentNestedRuleInputResponse { + /** Logical operator for combining rules */ + logicOperator: LogicOperator; + /** List of rules */ + rules: AssessmentRuleInputResponse[]; + /** List of nested rules */ + nestedRules?: AssessmentNestedRuleInputResponse[]; +} + +export interface RiskLevel { + /** ID of risk level */ + id: string; + /** Title of risk level */ + title: string; +} + +export interface RiskMatrix { + /** ID of risk matrix */ + id: string; + /** Title of risk matrix */ + title: string; +} + +export interface RiskMatrixColumn { + /** ID of column */ + id: string; + /** Title of column */ + title: string; +} + +export interface RiskMatrixRow { + /** ID of row */ + id: string; + /** Title of row */ + title: string; +} + +export interface AssessmentAnswerOption { + /** ID of answer option */ + id: string; + /** Index of answer option */ + index: number; + /** Value of answer */ + value: string; +} + +export interface AssessmentAnswer { + /** ID of answer */ + id: string; + /** Index of answer */ + index: number; + /** Value of answer */ + value: string; +} + +export interface AssessmentComment { + /** ID of comment */ + id: string; + /** Content of comment */ + content: string; + /** Date comment made */ + createdAt: string; + /** Date comment updated */ + updatedAt: string; + /** Author of comment */ + author?: UserPreview; +} + +export interface AssessmentPreviousSubmission { + /** Id of submission */ + id: string; + /** Date updated */ + updatedAt: string; + /** ID of question */ + assessmentQuestionId: string; + /** Answers */ + answers: AssessmentAnswer[]; +} + +export interface AssessmentGroup { + /** ID of group */ + id: string; + /** Title of group */ + title: string; + /** Description of group */ + description: string; +} + +export interface AssessmentResource { + /** Type of resource */ + resourceType: AttributeSupportedResourceType; + /** ID of resource */ + id: string; + /** Title of resource */ + title?: string; + /** Name of resource */ + name?: string; + /** Category of resource */ + category?: DataCategoryType; + /** Purpose of resource */ + purpose?: ProcessingPurpose; + /** Type of integration */ + type?: string; +} + +const PAGE_SIZE = 20; + +/** + * Fetch all assessments in the organization + * + * @param client - GraphQL client + * @returns All assessments in the organization + */ +export async function fetchAllAssessments( + client: GraphQLClient, +): Promise { + const assessments: Assessment[] = []; + let offset = 0; + + let shouldContinue = false; + do { + const { + assessmentForms: { nodes }, + // eslint-disable-next-line no-await-in-loop + } = await makeGraphQLRequest<{ + /** Forms */ + assessmentForms: { + /** Nodes */ + nodes: Assessment[]; + }; + }>(client, ASSESSMENTS, { + first: PAGE_SIZE, + offset, + }); + assessments.push(...nodes); + offset += PAGE_SIZE; + shouldContinue = nodes.length === PAGE_SIZE; + } while (shouldContinue); + + return assessments.sort((a, b) => a.title.localeCompare(b.title)); +} +/* eslint-enable max-lines */ diff --git a/src/graphql/gqls/assessment.ts b/src/graphql/gqls/assessment.ts new file mode 100644 index 00000000..2994ebfc --- /dev/null +++ b/src/graphql/gqls/assessment.ts @@ -0,0 +1,308 @@ +import { gql } from 'graphql-request'; + +export const ASSESSMENT_SECTION_FIELDS = ` + id + title + status + index + questions { + id + title + index + type + subType + placeholder + description + isRequired + displayLogic { + action + rule { + dependsOnQuestionReferenceId + comparisonOperator + comparisonOperands + } + nestedRule { + logicOperator + rules { + dependsOnQuestionReferenceId + comparisonOperator + comparisonOperands + } + nestedRules { + logicOperator + rules { + dependsOnQuestionReferenceId + comparisonOperator + comparisonOperands + } + } + } + } + riskLogic + requireRiskEvaluation + requireRiskMatrixEvaluation + riskCategories { + id + title + } + riskFramework { + id + title + description + riskLevels { + id + title + } + riskCategories { + id + title + } + riskMatrixColumns { + id + title + } + riskMatrixRows { + id + title + } + riskMatrix { + id + title + } + creator { + id + email + name + } + riskMatrixRowTitle + riskMatrixColumnTitle + } + riskLevel { + id + title + } + reviewerRiskLevel { + id + title + } + riskLevelFromRiskMatrix { + id + title + } + answerOptions { + id + index + value + } + selectedAnswers { + ... on AssessmentAnswerInterface { + id + index + value + } + } + respondent { + id + email + name + } + attributeKey { + name + } + externalRespondentEmail + comments { + id + content + createdAt + updatedAt + author { + id + email + name + } + } + allowedMimeTypes + updatedAt + referenceId + previousSubmissions { + id + updatedAt + assessmentQuestionId + answers { + ... on AssessmentAnswerInterface { + id + index + value + } + } + } + allowSelectOther + syncModel + syncColumn + syncRowIds + syncOverride + } + assignees { + id + email + name + } + externalAssignees { + id + email + } + isReviewed +`; + +// TODO: https://transcend.height.app/T-27909 - enable optimizations +// isExportCsv: true +// useMaster: false +// orderBy: [ +// { field: createdAt, direction: ASC } +// { field: name, direction: ASC } +// ] +export const ASSESSMENTS = gql` + query TranscendCliAssessments( + $first: Int! + $offset: Int! + $filterBy: AssessmentFormFiltersInput + ) { + assessmentForms(first: $first, offset: $offset, filterBy: $filterBy) { + nodes { + id + creator { + id + email + name + } + lastEditor { + id + email + name + } + title + description + status + assignees { + id + email + name + } + externalAssignees { + id + email + } + reviewers { + id + email + name + } + isLocked + isArchived + isExternallyCreated + dueDate + createdAt + updatedAt + assignedAt + submittedAt + approvedAt + rejectedAt + titleIsInternal + retentionSchedule { + id + type + durationDays + operation + } + attributeValues { + name + attributeKey { + name + } + } + sections { + ${ASSESSMENT_SECTION_FIELDS} + } + assessmentGroup { + id + title + description + } + resources { + resourceType + ... on AttributeBusinessEntityResource { + id + title + } + ... on AttributeDataSiloResource { + id + title + } + ... on AttributeDataSubCategoryResource { + id + name + category + } + ... on AttributeSubDataPointResource { + id + name + } + ... on AttributeProcessingPurposeSubCategoryResource { + id + name + purpose + } + ... on AttributeRequestResource { + id + type + } + ... on AttributeVendorResource { + id + title + } + ... on AttributePromptResource { + id + title + } + ... on AttributePromptRunResource { + id + title + } + ... on AttributePromptGroupResource { + id + title + } + } + syncedRows { + resourceType + ... on AttributeBusinessEntityResource { + id + title + } + ... on AttributeDataSiloResource { + id + title + } + ... on AttributeDataSubCategoryResource { + id + name + category + } + ... on AttributeSubDataPointResource { + id + name + } + ... on AttributeProcessingPurposeSubCategoryResource { + id + name + purpose + } + ... on AttributeVendorResource { + id + title + } + } + } + } + } +`; diff --git a/src/graphql/gqls/assessmentTemplate.ts b/src/graphql/gqls/assessmentTemplate.ts new file mode 100644 index 00000000..ad3e8598 --- /dev/null +++ b/src/graphql/gqls/assessmentTemplate.ts @@ -0,0 +1,67 @@ +import { gql } from 'graphql-request'; +import { ASSESSMENT_SECTION_FIELDS } from './assessment'; + +// TODO: https://transcend.height.app/T-27909 - enable optimizations +// isExportCsv: true +// useMaster: false +// orderBy: [ +// { field: createdAt, direction: ASC } +// { field: name, direction: ASC } +// ] +export const ASSESSMENT_TEMPLATES = gql` + query TranscendCliAssessmentTemplates( + $first: Int! + $offset: Int! + $filterBy: AssessmentFormTemplateFiltersInput + ) { + assessmentFormTemplates( + first: $first + offset: $offset + filterBy: $filterBy + ) { + nodes { + id + creator { + id + email + name + } + lastEditor { + id + email + name + } + title + description + status + source + parentId + isLocked + isArchived + createdAt + updatedAt + retentionSchedule { + id + type + durationDays + operation + createdAt + updatedAt + } + assessmentEmailSet { + id + title + description + isDefault + templates { + id + title + } + } + sections { + ${ASSESSMENT_SECTION_FIELDS} + } + } + } + } +`; diff --git a/src/graphql/gqls/index.ts b/src/graphql/gqls/index.ts index daea78e4..b39f98b3 100644 --- a/src/graphql/gqls/index.ts +++ b/src/graphql/gqls/index.ts @@ -17,6 +17,8 @@ export * from './policy'; export * from './request'; export * from './message'; export * from './RequestEnricher'; +export * from './assessment'; +export * from './assessmentTemplate'; export * from './prompt'; export * from './RequestEnricher'; export * from './RequestDataSilo'; diff --git a/src/graphql/index.ts b/src/graphql/index.ts index 6b451aae..3139599e 100644 --- a/src/graphql/index.ts +++ b/src/graphql/index.ts @@ -19,6 +19,8 @@ export * from './setResourceAttributes'; export * from './buildTranscendGraphQLClient'; export * from './retryRequestEnricher'; export * from './gqls'; +export * from './fetchAllAssessmentTemplates'; +export * from './fetchAllAssessments'; export * from './fetchPromptThreads'; export * from './fetchAllPolicies'; export * from './fetchAllRequestIdentifierMetadata'; diff --git a/src/graphql/pullTranscendConfiguration.ts b/src/graphql/pullTranscendConfiguration.ts index f566b20b..d442fefc 100644 --- a/src/graphql/pullTranscendConfiguration.ts +++ b/src/graphql/pullTranscendConfiguration.ts @@ -27,6 +27,10 @@ import { ActionItemInput, TeamInput, ActionItemCollectionInput, + AssessmentInput, + AssessmentTemplateInput, + AssessmentSectionInput, + AssessmentSectionQuestionInput, } from '../codecs'; import { RequestAction, @@ -77,6 +81,8 @@ import { fetchAllTeams } from './fetchAllTeams'; import { fetchAllActionItemCollections } from './fetchAllActionItemCollections'; import { LanguageKey } from '@transcend-io/internationalization'; import { fetchPartitions } from './syncPartitions'; +import { fetchAllAssessments } from './fetchAllAssessments'; +import { fetchAllAssessmentTemplates } from './fetchAllAssessmentTemplates'; export const DEFAULT_TRANSCEND_PULL_RESOURCES = [ TranscendPullResource.DataSilos, @@ -166,6 +172,8 @@ export async function pullTranscendConfiguration( privacyCenters, messages, partitions, + assessments, + assessmentTemplates, ] = await Promise.all([ // Grab all data subjects in the organization resources.includes(TranscendPullResource.DataSilos) || @@ -306,6 +314,14 @@ export async function pullTranscendConfiguration( resources.includes(TranscendPullResource.Partitions) ? fetchPartitions(client) : [], + // Fetch assessments + resources.includes(TranscendPullResource.Assessments) + ? fetchAllAssessments(client) + : [], + // Fetch assessmentTemplates + resources.includes(TranscendPullResource.AssessmentTemplates) + ? fetchAllAssessmentTemplates(client) + : [], ]); const consentManagerTheme = @@ -404,6 +420,286 @@ export async function pullTranscendConfiguration( }; } + // Save assessments + if ( + assessments.length > 0 && + resources.includes(TranscendPullResource.Assessments) + ) { + result.assessments = assessments.map( + ({ + title, + assessmentGroup, + sections, + creator, + description, + status, + assignees, + externalAssignees, + reviewers, + isLocked, + isArchived, + isExternallyCreated, + dueDate, + createdAt, + assignedAt, + submittedAt, + approvedAt, + rejectedAt, + titleIsInternal, + retentionSchedule, + attributeValues, + resources, + syncedRows, + }): AssessmentInput => ({ + title, + group: assessmentGroup.title, + sections: sections.map( + ({ + title, + status, + questions, + assignees, + isReviewed, + externalAssignees, + }): AssessmentSectionInput => ({ + title, + status, + questions: questions.map( + ({ + title, + type, + subType, + placeholder, + description, + isRequired, + referenceId, + displayLogic, + riskLogic, + riskCategories, + riskFramework, + answerOptions, + allowedMimeTypes, + allowSelectOther, + syncModel, + syncColumn, + attributeKey, + requireRiskEvaluation, + requireRiskMatrixEvaluation, + }): AssessmentSectionQuestionInput => ({ + title, + type, + 'sub-type': subType, + placeholder, + description, + 'is-required': isRequired, + 'reference-id': referenceId, + 'display-logic': displayLogic + ? { + action: displayLogic.action, + rule: displayLogic.rule + ? { + 'depends-on-question-reference-id': + displayLogic.rule.dependsOnQuestionReferenceId, + 'comparison-operator': + displayLogic.rule.comparisonOperator, + 'comparison-operands': + displayLogic.rule.comparisonOperands, + } + : undefined, + 'nested-rule': displayLogic.nestedRule + ? { + 'logic-operator': + displayLogic.nestedRule.logicOperator, + rules: displayLogic.nestedRule.rules.map( + (rule) => ({ + 'depends-on-question-reference-id': + rule.dependsOnQuestionReferenceId, + 'comparison-operator': rule.comparisonOperator, + 'comparison-operands': rule.comparisonOperands, + }), + ), + } + : undefined, + } + : undefined, + 'risk-logic': riskLogic, + 'risk-categories': riskCategories.map(({ title }) => title), + 'risk-framework': riskFramework?.title, + 'answer-options': answerOptions.map(({ value }) => ({ value })), + 'allowed-mime-types': allowedMimeTypes, + 'allow-select-other': allowSelectOther, + 'sync-model': syncModel, + 'sync-column': syncColumn, + 'attribute-key': attributeKey?.name, + 'require-risk-evaluation': requireRiskEvaluation, + 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation, + }), + ), + assignees: assignees.map(({ email }) => email), + 'external-assignees': externalAssignees.map(({ email }) => email), + 'is-reviewed': isReviewed, + }), + ), + creator: creator.email, + description, + status, + assignees: assignees.map(({ email }) => email), + 'external-assignees': externalAssignees.map(({ email }) => email), + reviewers: reviewers.map(({ email }) => email), + locked: isLocked, + archived: isArchived, + external: isExternallyCreated, + 'title-is-internal': titleIsInternal, + 'due-date': dueDate, + 'created-at': createdAt, + 'assigned-at': assignedAt, + 'submitted-at': submittedAt, + 'approved-at': approvedAt, + 'rejected-at': rejectedAt, + 'retention-schedule': { + type: retentionSchedule.type, + 'duration-days': retentionSchedule.durationDays, + operand: retentionSchedule.operation, + }, + attributes: + attributeValues !== undefined && attributeValues.length > 0 + ? formatAttributeValues(attributeValues) + : undefined, + resources: resources.map( + ({ resourceType, title, name, category, type, purpose }) => ({ + type: resourceType, + title: category + ? `${category} - ${name}` + : purpose + ? `${purpose} - ${name}` + : title || name || type || '', + }), + ), + rows: syncedRows.map( + ({ resourceType, title, name, category, type, purpose }) => ({ + type: resourceType, + title: category + ? `${category} - ${name}` + : purpose + ? `${purpose} - ${name}` + : title || name || type || '', + }), + ), + }), + ); + } + + // Save assessmentTemplates + if ( + assessmentTemplates.length > 0 && + resources.includes(TranscendPullResource.AssessmentTemplates) + ) { + result['assessment-templates'] = assessmentTemplates.map( + ({ + title, + description, + sections, + status, + source, + creator, + isLocked, + isArchived, + createdAt, + retentionSchedule, + }): AssessmentTemplateInput => ({ + title, + description, + sections: sections.map( + ({ title, questions }): AssessmentSectionInput => ({ + title, + questions: questions.map( + ({ + title, + type, + subType, + placeholder, + description, + isRequired, + referenceId, + displayLogic, + riskLogic, + riskCategories, + riskFramework, + answerOptions, + allowedMimeTypes, + allowSelectOther, + syncModel, + syncColumn, + attributeKey, + requireRiskEvaluation, + requireRiskMatrixEvaluation, + }): AssessmentSectionQuestionInput => ({ + title, + type, + 'sub-type': subType, + placeholder, + description, + 'is-required': isRequired, + 'reference-id': referenceId, + 'display-logic': displayLogic + ? { + action: displayLogic.action, + rule: displayLogic.rule + ? { + 'depends-on-question-reference-id': + displayLogic.rule.dependsOnQuestionReferenceId, + 'comparison-operator': + displayLogic.rule.comparisonOperator, + 'comparison-operands': + displayLogic.rule.comparisonOperands, + } + : undefined, + 'nested-rule': displayLogic.nestedRule + ? { + 'logic-operator': + displayLogic.nestedRule.logicOperator, + rules: displayLogic.nestedRule.rules.map( + (rule) => ({ + 'depends-on-question-reference-id': + rule.dependsOnQuestionReferenceId, + 'comparison-operator': rule.comparisonOperator, + 'comparison-operands': rule.comparisonOperands, + }), + ), + } + : undefined, + } + : undefined, + 'risk-logic': riskLogic, + 'risk-categories': riskCategories.map(({ title }) => title), + 'risk-framework': riskFramework?.title, + 'answer-options': answerOptions.map(({ value }) => ({ value })), + 'allowed-mime-types': allowedMimeTypes, + 'allow-select-other': allowSelectOther, + 'sync-model': syncModel, + 'sync-column': syncColumn, + 'attribute-key': attributeKey?.name, + 'require-risk-evaluation': requireRiskEvaluation, + 'require-risk-matrix-evaluation': requireRiskMatrixEvaluation, + }), + ), + }), + ), + status, + source, + creator: creator.email, + locked: isLocked, + archived: isArchived, + 'created-at': createdAt, + 'retention-schedule': { + type: retentionSchedule.type, + 'duration-days': retentionSchedule.durationDays, + operand: retentionSchedule.operation, + }, + }), + ); + } + // Save prompts if (prompts.length > 0 && resources.includes(TranscendPullResource.Prompts)) { result.prompts = prompts.map( diff --git a/yarn.lock b/yarn.lock index c0ed2b1f..02ff583d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -515,7 +515,7 @@ __metadata: "@transcend-io/handlebars-utils": ^1.1.0 "@transcend-io/internationalization": ^1.6.0 "@transcend-io/persisted-state": ^1.0.4 - "@transcend-io/privacy-types": ^4.93.0 + "@transcend-io/privacy-types": ^4.94.0 "@transcend-io/secret-value": ^1.2.0 "@transcend-io/type-utils": ^1.5.0 "@types/bluebird": ^3.5.38 @@ -643,14 +643,14 @@ __metadata: languageName: node linkType: hard -"@transcend-io/privacy-types@npm:^4.93.0": - version: 4.93.0 - resolution: "@transcend-io/privacy-types@npm:4.93.0" +"@transcend-io/privacy-types@npm:^4.94.0": + version: 4.94.0 + resolution: "@transcend-io/privacy-types@npm:4.94.0" dependencies: "@transcend-io/type-utils": ^1.0.5 fp-ts: ^2.16.1 io-ts: ^2.2.21 - checksum: dda3743a4b33dc84f36020d7b7d72791b1aff0497a0b3fc8047414a2873773150c5832112df994df52bace513f0bd12ff4c0787b41274c66a09541b29363628b + checksum: 8cc1a8dd546f7660a7363937c50bf217026c7e492e5a3ef9c7a482c70bd71f4b51db85dcc264128e5100698dac99d99508f9403e6709e47ee1d4f0c3ae743a86 languageName: node linkType: hard