@platform-modules/civil-aviation-authority 2.3.336 → 2.3.338

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -259,6 +259,7 @@ const SlaConfigModel_1 = require("./models/SlaConfigModel");
259
259
  const ChatbotQnsAnsMappingModel_1 = require("./models/ChatbotQnsAnsMappingModel");
260
260
  const ChatbotDocumentsModel_1 = require("./models/ChatbotDocumentsModel");
261
261
  const IconsModel_1 = require("./models/IconsModel");
262
+ const HelpContentCategoryModel_1 = require("./models/HelpContentCategoryModel");
262
263
  const CSRMBusinessImpactRatingMasterModel_1 = require("./models/CSRMBusinessImpactRatingMasterModel");
263
264
  const CSRMLikelihoodMasterModel_1 = require("./models/CSRMLikelihoodMasterModel");
264
265
  const LocationModel_1 = require("./models/LocationModel");
@@ -586,6 +587,7 @@ exports.AppDataSource = new typeorm_1.DataSource({
586
587
  ChatbotQnsAnsMappingModel_1.ChatbotQnsAnsMapping,
587
588
  ChatbotDocumentsModel_1.ChatbotDocuments,
588
589
  IconsModel_1.Icons,
590
+ HelpContentCategoryModel_1.HelpContentCategories,
589
591
  CSRMBusinessImpactRatingMasterModel_1.CSRMBusinessImpactRatingMaster,
590
592
  CSRMLikelihoodMasterModel_1.CSRMLikelihoodMaster,
591
593
  LocationModel_1.Location,
@@ -0,0 +1,11 @@
1
+ import type { EntityManager } from 'typeorm';
2
+ /** DB columns written on create/update (order matches parameterized INSERT). */
3
+ export declare const CSRM_RISK_INSERT_COLUMNS: readonly ["request_id", "risk_no", "impacted_category", "impact_area", "threat", "vulnerability", "risk_description", "risk_owner", "asset_cia_impact", "asset_value", "likelihood", "business_impact", "risk_value", "new_likelihood", "new_business_impact", "new_risk_value", "existing_controls", "start_date", "end_date", "iso_control_reference", "risk_treatment_plan", "treatment", "action", "confidentiality", "integrity", "availability", "new_control", "actual_end_date", "notes", "justification_for_delay", "created_by", "is_deleted"];
4
+ export declare const CSRM_RISKS_TABLE = "cyber_security_risk_management_risks";
5
+ /**
6
+ * Maps one API/workflow risk object to DB values (same pattern as Duty Mission child rows:
7
+ * each property comes from the payload item, plus request_id / created_by / is_deleted from server).
8
+ */
9
+ export declare function buildCyberSecurityRiskInsertRow(requestId: number, riskPayload: Record<string, unknown>, createdBy: number): Record<(typeof CSRM_RISK_INSERT_COLUMNS)[number], unknown>;
10
+ /** Persists one risk row from workflow/API payload (explicit INSERT, like annual_training_plan_items). */
11
+ export declare function persistCsrmRiskFromPayload(manager: EntityManager, requestId: number, riskPayload: Record<string, unknown>, createdBy: number): Promise<void>;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CSRM_RISKS_TABLE = exports.CSRM_RISK_INSERT_COLUMNS = void 0;
4
+ exports.buildCyberSecurityRiskInsertRow = buildCyberSecurityRiskInsertRow;
5
+ exports.persistCsrmRiskFromPayload = persistCsrmRiskFromPayload;
6
+ /** DB columns written on create/update (order matches parameterized INSERT). */
7
+ exports.CSRM_RISK_INSERT_COLUMNS = [
8
+ 'request_id',
9
+ 'risk_no',
10
+ 'impacted_category',
11
+ 'impact_area',
12
+ 'threat',
13
+ 'vulnerability',
14
+ 'risk_description',
15
+ 'risk_owner',
16
+ 'asset_cia_impact',
17
+ 'asset_value',
18
+ 'likelihood',
19
+ 'business_impact',
20
+ 'risk_value',
21
+ 'new_likelihood',
22
+ 'new_business_impact',
23
+ 'new_risk_value',
24
+ 'existing_controls',
25
+ 'start_date',
26
+ 'end_date',
27
+ 'iso_control_reference',
28
+ 'risk_treatment_plan',
29
+ 'treatment',
30
+ 'action',
31
+ 'confidentiality',
32
+ 'integrity',
33
+ 'availability',
34
+ 'new_control',
35
+ 'actual_end_date',
36
+ 'notes',
37
+ 'justification_for_delay',
38
+ 'created_by',
39
+ 'is_deleted',
40
+ ];
41
+ exports.CSRM_RISKS_TABLE = 'cyber_security_risk_management_risks';
42
+ /**
43
+ * Maps one API/workflow risk object to DB values (same pattern as Duty Mission child rows:
44
+ * each property comes from the payload item, plus request_id / created_by / is_deleted from server).
45
+ */
46
+ function buildCyberSecurityRiskInsertRow(requestId, riskPayload, createdBy) {
47
+ const item = riskPayload;
48
+ const optionalText = (v) => {
49
+ if (v === null || v === undefined)
50
+ return null;
51
+ const s = String(v);
52
+ return s.length ? s : null;
53
+ };
54
+ const optionalNumber = (v) => {
55
+ if (v === null || v === undefined || v === '')
56
+ return null;
57
+ const n = Number(v);
58
+ return Number.isFinite(n) ? n : null;
59
+ };
60
+ const optionalDate = (v) => {
61
+ if (v === null || v === undefined || v === '')
62
+ return null;
63
+ const d = new Date(String(v));
64
+ return Number.isNaN(d.getTime()) ? null : d;
65
+ };
66
+ const requiredDate = (v) => optionalDate(v) ?? new Date(String(v));
67
+ const riskValueFromPayload = optionalNumber(item.risk_value);
68
+ return {
69
+ request_id: requestId,
70
+ risk_no: item.risk_no,
71
+ impacted_category: item.impacted_category,
72
+ impact_area: item.impact_area,
73
+ threat: item.threat,
74
+ vulnerability: item.vulnerability,
75
+ risk_description: item.risk_description,
76
+ risk_owner: item.risk_owner,
77
+ asset_cia_impact: Number(item.asset_cia_impact),
78
+ asset_value: optionalNumber(item.asset_value),
79
+ likelihood: Number(item.likelihood),
80
+ business_impact: Number(item.business_impact),
81
+ risk_value: riskValueFromPayload ?? 0,
82
+ new_likelihood: optionalNumber(item.new_likelihood),
83
+ new_business_impact: optionalNumber(item.new_business_impact),
84
+ new_risk_value: optionalNumber(item.new_risk_value),
85
+ existing_controls: item.existing_controls,
86
+ start_date: requiredDate(item.start_date),
87
+ end_date: requiredDate(item.end_date),
88
+ iso_control_reference: optionalText(item.iso_control_reference),
89
+ risk_treatment_plan: item.risk_treatment_plan,
90
+ treatment: optionalText(item.treatment),
91
+ action: optionalText(item.action),
92
+ confidentiality: optionalNumber(item.confidentiality),
93
+ integrity: optionalNumber(item.integrity),
94
+ availability: optionalNumber(item.availability),
95
+ new_control: optionalText(item.new_control),
96
+ actual_end_date: optionalDate(item.actual_end_date),
97
+ notes: optionalText(item.notes),
98
+ justification_for_delay: optionalText(item.justification_for_delay),
99
+ created_by: createdBy,
100
+ is_deleted: false,
101
+ };
102
+ }
103
+ /** Persists one risk row from workflow/API payload (explicit INSERT, like annual_training_plan_items). */
104
+ async function persistCsrmRiskFromPayload(manager, requestId, riskPayload, createdBy) {
105
+ const row = buildCyberSecurityRiskInsertRow(requestId, riskPayload, createdBy);
106
+ const values = exports.CSRM_RISK_INSERT_COLUMNS.map((col) => row[col]);
107
+ const colList = exports.CSRM_RISK_INSERT_COLUMNS.map((c) => `"${c}"`).join(', ');
108
+ const placeholders = exports.CSRM_RISK_INSERT_COLUMNS.map((_, i) => `$${i + 1}`).join(', ');
109
+ await manager.query(`INSERT INTO ${exports.CSRM_RISKS_TABLE} (${colList}) VALUES (${placeholders})`, values);
110
+ }
package/dist/index.d.ts CHANGED
@@ -266,6 +266,7 @@ export * from './models/CyberSecurityRiskManagementRequestModel';
266
266
  export { CyberSecurityRiskManagementRequest, CyberSecurityRiskManagementRequestStatus } from './models/CyberSecurityRiskManagementRequestModel';
267
267
  export * from './models/CyberSecurityRiskManagementRiskModel';
268
268
  export { CyberSecurityRiskManagementRisk, CyberSecurityRiskImpactedCategory } from './models/CyberSecurityRiskManagementRiskModel';
269
+ export { buildCyberSecurityRiskInsertRow, persistCsrmRiskFromPayload, CSRM_RISK_INSERT_COLUMNS, CSRM_RISKS_TABLE, } from './helpers/csrm-risk-persistence.helper';
269
270
  export * from './models/LegalContractReviewRequestModel';
270
271
  export { LegalContractReviewRequest, LegalContractReviewRequestStatus, LegalContractReviewRequestType } from './models/LegalContractReviewRequestModel';
271
272
  export * from './models/LegalContractReviewApprovalModel';
@@ -421,6 +422,7 @@ export * from './models/SlaConfigModel';
421
422
  export * from './models/ChatbotQnsAnsMappingModel';
422
423
  export * from './models/ChatbotDocumentsModel';
423
424
  export * from './models/IconsModel';
425
+ export * from './models/HelpContentCategoryModel';
424
426
  export * from './models/SlaRequestModel';
425
427
  export * from './models/SlaMyRequestsViewModel';
426
428
  export * from './models/SlaApprovalsViewModel';
package/dist/index.js CHANGED
@@ -16,7 +16,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  exports.TrainingRoomBookingWorkFlowStatus = exports.TrainingRoomBookingApprovalStatus = exports.TrainingRoomBookingRoomType = exports.TrainingRoomBookingRequestStatus = exports.AnnualTrainingPlanChatStatus = exports.AnnualTrainingPlanMessageType = exports.AnnualTrainingPlanRequestChat = exports.AnnualTrainingPlanRequestAttachment = exports.AnnualTrainingPlanWorkFlowStatus = exports.AnnualTrainingPlanApprovalStatus = exports.AnnualTrainingPlanPlace = exports.AnnualTrainingPlanRequestStatus = exports.StudyLeaveChatStatus = exports.StudyLeaveMessageType = exports.StudyLeaveRequestChat = exports.StudyLeaveRequestAttachment = exports.StudyLeaveWorkFlowStatus = exports.StudyLeaveApprovalStatus = exports.StudyLeaveRequestStatus = exports.TrainingMessageType = exports.TrainingRequestChat = exports.TrainingRequestAttachment = exports.TrainingWorkFlowStatus = exports.TrainingApprovalStatus = exports.TrainingRequestStatus = exports.HrServiceChatStatus = exports.HrServiceMessageType = exports.HrServiceRequestChat = exports.HrServiceRequestAttachment = exports.HrServiceWorkFlowStatus = exports.HrServiceApprovalStatus = exports.HrServiceRequestStatus = exports.CancellationMessageType = exports.CancellationRequestChat = exports.CancellationRequestAttachment = exports.CancellationWorkFlowStatus = exports.CancellationApprovalStatus = exports.EventSupportMessageType = exports.EventSupportRequestChat = exports.EventSupportRequestAttachment = exports.EventSupportWorkFlowStatus = exports.EventSupportApprovalStatus = exports.EventSupportReminderType = exports.EventSupportRequestStatus = exports.CancellationRequestStatus = exports.LogisticsVehicleMaintenanceWorkFlowStatus = exports.LogisticsVehicleMaintenanceMessageType = exports.LogisticsVehicleMaintenanceApprovalStatus = exports.VehicleMaintenanceStatus = exports.VehicleMaintenanceType = void 0;
18
18
  exports.CyberSecurityAuditRequest = exports.RequestForVaptClassification = exports.RequestForVaptType = exports.RequestForVaptStatus = exports.RequestForVaptRequest = exports.InformationSecurityRequestAttachment = exports.InformationSecurityWorkFlow = exports.InformationSecurityWorkFlowStatus = exports.InformationSecurityRequestChat = exports.InformationSecurityChatStatus = exports.InformationSecurityMessageType = exports.InformationSecurityApprovalDetails = exports.InformationSecurityApprovalStatus = exports.RequestForProjectApproval = exports.RequestForProjectApprovalStatus = exports.ShiftAllowanceValue = exports.ShiftAllowanceRequestStatus = exports.AssignTasksEmpMessageType = exports.AssignTasksEmpRequestChat = exports.AssignTasksEmpRequestAttachment = exports.AssignTasksEmpWorkFlowStatus = exports.AssignTasksEmpApprovalStatus = exports.AssignTasksEmpPriority = exports.AssignTasksEmpStatus = exports.RequestForPresidentsCoverageRequestAttachment = exports.RequestForPresidentsCoverageChatStatus = exports.RequestForPresidentsCoverageMessageType = exports.RequestForPresidentsCoverageRequestChat = exports.RequestForPresidentsCoverageApprovalStatus = exports.RequestForPresidentsCoverageWorkFlowStatus = exports.RequestForPresidentsCoverageNewsSize = exports.RequestForPresidentsCoverageRequestStatus = exports.RequestForCoverageRequestAttachment = exports.RequestForCoverageChatStatus = exports.RequestForCoverageMessageType = exports.RequestForCoverageRequestChat = exports.RequestForCoverageApprovalStatus = exports.RequestForCoverageWorkFlowStatus = exports.RequestForCoverageNewsSize = exports.RequestForCoverageRequestStatus = exports.ServiceTransferRequestType = exports.SalaryDetailsType = exports.ServiceTransferRequestStatus = exports.TemporaryAssignmentRequestType = exports.TemporaryAssignmentRequestStatus = exports.SecondmentRequestStatus = exports.TrainingRoomBookingChatStatus = exports.TrainingRoomBookingMessageType = exports.TrainingRoomBookingRequestChat = exports.TrainingRoomBookingRequestAttachment = void 0;
19
- exports.RespondToEnquiriesRequestAttachment = exports.RespondToEnquiriesWorkFlow = exports.RespondToEnquiriesWorkFlowStatus = exports.RespondToEnquiriesRequestChat = exports.RespondToEnquiriesChatStatus = exports.RespondToEnquiriesMessageType = exports.RespondToEnquiriesApprovalDetails = exports.RespondToEnquiriesApprovalStatus = exports.RespondToEnquiriesRequest = exports.RespondToEnquiriesRequestStatus = exports.DurationUnit = exports.RepeatFrequency = exports.Quarter = exports.HumanResourceAnnualPlanningRequestStatus = exports.PerformanceManagementCyclePeriod = exports.PerformanceManagementRequestStatus = exports.SkillsEnhancementRequestStatus = exports.AnnualIncrementRequestStatus = exports.PromotionRequestStatus = exports.CashAllowanceLeaveRequestStatus = exports.NotificationFrequency = exports.ServicesNotificationTriggerType = exports.NewResourceRequestStatus = exports.JobTransferRequestStatus = exports.AppealAgainstAdministrativeDecisionRequestStatus = exports.AppealAgainstAdministrativeDecisionRequest = exports.LegalContractReviewRequestType = exports.LegalContractReviewRequestStatus = exports.LegalContractReviewRequest = exports.CyberSecurityRiskImpactedCategory = exports.CyberSecurityRiskManagementRisk = exports.CyberSecurityRiskManagementRequestStatus = exports.CyberSecurityRiskManagementRequest = exports.CyberSecurityAuditApplicationType = exports.CyberSecurityAuditClassification = exports.CyberSecurityAuditRequestStatus = void 0;
19
+ exports.RespondToEnquiriesRequestAttachment = exports.RespondToEnquiriesWorkFlow = exports.RespondToEnquiriesWorkFlowStatus = exports.RespondToEnquiriesRequestChat = exports.RespondToEnquiriesChatStatus = exports.RespondToEnquiriesMessageType = exports.RespondToEnquiriesApprovalDetails = exports.RespondToEnquiriesApprovalStatus = exports.RespondToEnquiriesRequest = exports.RespondToEnquiriesRequestStatus = exports.DurationUnit = exports.RepeatFrequency = exports.Quarter = exports.HumanResourceAnnualPlanningRequestStatus = exports.PerformanceManagementCyclePeriod = exports.PerformanceManagementRequestStatus = exports.SkillsEnhancementRequestStatus = exports.AnnualIncrementRequestStatus = exports.PromotionRequestStatus = exports.CashAllowanceLeaveRequestStatus = exports.NotificationFrequency = exports.ServicesNotificationTriggerType = exports.NewResourceRequestStatus = exports.JobTransferRequestStatus = exports.AppealAgainstAdministrativeDecisionRequestStatus = exports.AppealAgainstAdministrativeDecisionRequest = exports.LegalContractReviewRequestType = exports.LegalContractReviewRequestStatus = exports.LegalContractReviewRequest = exports.CSRM_RISKS_TABLE = exports.CSRM_RISK_INSERT_COLUMNS = exports.persistCsrmRiskFromPayload = exports.buildCyberSecurityRiskInsertRow = exports.CyberSecurityRiskImpactedCategory = exports.CyberSecurityRiskManagementRisk = exports.CyberSecurityRiskManagementRequestStatus = exports.CyberSecurityRiskManagementRequest = exports.CyberSecurityAuditApplicationType = exports.CyberSecurityAuditClassification = exports.CyberSecurityAuditRequestStatus = void 0;
20
20
  __exportStar(require("./models/user"), exports);
21
21
  __exportStar(require("./models/role"), exports);
22
22
  __exportStar(require("./models/user-sessions"), exports);
@@ -397,6 +397,11 @@ __exportStar(require("./models/CyberSecurityRiskManagementRiskModel"), exports);
397
397
  var CyberSecurityRiskManagementRiskModel_1 = require("./models/CyberSecurityRiskManagementRiskModel");
398
398
  Object.defineProperty(exports, "CyberSecurityRiskManagementRisk", { enumerable: true, get: function () { return CyberSecurityRiskManagementRiskModel_1.CyberSecurityRiskManagementRisk; } });
399
399
  Object.defineProperty(exports, "CyberSecurityRiskImpactedCategory", { enumerable: true, get: function () { return CyberSecurityRiskManagementRiskModel_1.CyberSecurityRiskImpactedCategory; } });
400
+ var csrm_risk_persistence_helper_1 = require("./helpers/csrm-risk-persistence.helper");
401
+ Object.defineProperty(exports, "buildCyberSecurityRiskInsertRow", { enumerable: true, get: function () { return csrm_risk_persistence_helper_1.buildCyberSecurityRiskInsertRow; } });
402
+ Object.defineProperty(exports, "persistCsrmRiskFromPayload", { enumerable: true, get: function () { return csrm_risk_persistence_helper_1.persistCsrmRiskFromPayload; } });
403
+ Object.defineProperty(exports, "CSRM_RISK_INSERT_COLUMNS", { enumerable: true, get: function () { return csrm_risk_persistence_helper_1.CSRM_RISK_INSERT_COLUMNS; } });
404
+ Object.defineProperty(exports, "CSRM_RISKS_TABLE", { enumerable: true, get: function () { return csrm_risk_persistence_helper_1.CSRM_RISKS_TABLE; } });
400
405
  __exportStar(require("./models/LegalContractReviewRequestModel"), exports);
401
406
  var LegalContractReviewRequestModel_1 = require("./models/LegalContractReviewRequestModel");
402
407
  Object.defineProperty(exports, "LegalContractReviewRequest", { enumerable: true, get: function () { return LegalContractReviewRequestModel_1.LegalContractReviewRequest; } });
@@ -612,6 +617,7 @@ __exportStar(require("./models/SlaConfigModel"), exports);
612
617
  __exportStar(require("./models/ChatbotQnsAnsMappingModel"), exports);
613
618
  __exportStar(require("./models/ChatbotDocumentsModel"), exports);
614
619
  __exportStar(require("./models/IconsModel"), exports);
620
+ __exportStar(require("./models/HelpContentCategoryModel"), exports);
615
621
  __exportStar(require("./models/SlaRequestModel"), exports);
616
622
  __exportStar(require("./models/SlaMyRequestsViewModel"), exports);
617
623
  __exportStar(require("./models/SlaApprovalsViewModel"), exports);
@@ -0,0 +1,6 @@
1
+ import { BaseModel } from './BaseModel';
2
+ export declare class HelpContentCategories extends BaseModel {
3
+ name: string;
4
+ name_arabic: string | null;
5
+ constructor(name: string);
6
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.HelpContentCategories = void 0;
13
+ const typeorm_1 = require("typeorm");
14
+ const BaseModel_1 = require("./BaseModel");
15
+ let HelpContentCategories = class HelpContentCategories extends BaseModel_1.BaseModel {
16
+ constructor(name) {
17
+ super();
18
+ this.name = name;
19
+ this.name_arabic = null;
20
+ }
21
+ };
22
+ exports.HelpContentCategories = HelpContentCategories;
23
+ __decorate([
24
+ (0, typeorm_1.Column)({ nullable: true }),
25
+ __metadata("design:type", String)
26
+ ], HelpContentCategories.prototype, "name", void 0);
27
+ __decorate([
28
+ (0, typeorm_1.Column)({ type: 'varchar', length: 500, nullable: true }),
29
+ __metadata("design:type", Object)
30
+ ], HelpContentCategories.prototype, "name_arabic", void 0);
31
+ exports.HelpContentCategories = HelpContentCategories = __decorate([
32
+ (0, typeorm_1.Entity)({ name: 'help_content_categories' }),
33
+ __metadata("design:paramtypes", [String])
34
+ ], HelpContentCategories);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@platform-modules/civil-aviation-authority",
3
- "version": "2.3.336",
3
+ "version": "2.3.338",
4
4
  "main": "dist/index.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "scripts": {
@@ -0,0 +1,2 @@
1
+ ALTER TABLE help_content_categories
2
+ ADD COLUMN IF NOT EXISTS name_arabic VARCHAR(500) NULL;
@@ -257,6 +257,7 @@ import { SlaConfig } from './models/SlaConfigModel';
257
257
  import { ChatbotQnsAnsMapping } from './models/ChatbotQnsAnsMappingModel';
258
258
  import { ChatbotDocuments } from './models/ChatbotDocumentsModel';
259
259
  import { Icons } from './models/IconsModel';
260
+ import { HelpContentCategories } from './models/HelpContentCategoryModel';
260
261
  import { CSRMBusinessImpactRatingMaster } from './models/CSRMBusinessImpactRatingMasterModel';
261
262
  import { CSRMLikelihoodMaster } from './models/CSRMLikelihoodMasterModel';
262
263
  import { Location } from './models/LocationModel';
@@ -586,6 +587,7 @@ export const AppDataSource = new DataSource({
586
587
  ChatbotQnsAnsMapping,
587
588
  ChatbotDocuments,
588
589
  Icons,
590
+ HelpContentCategories,
589
591
  CSRMBusinessImpactRatingMaster,
590
592
  CSRMLikelihoodMaster,
591
593
  Location,
@@ -0,0 +1,125 @@
1
+ import type { EntityManager } from 'typeorm';
2
+
3
+ /** DB columns written on create/update (order matches parameterized INSERT). */
4
+ export const CSRM_RISK_INSERT_COLUMNS = [
5
+ 'request_id',
6
+ 'risk_no',
7
+ 'impacted_category',
8
+ 'impact_area',
9
+ 'threat',
10
+ 'vulnerability',
11
+ 'risk_description',
12
+ 'risk_owner',
13
+ 'asset_cia_impact',
14
+ 'asset_value',
15
+ 'likelihood',
16
+ 'business_impact',
17
+ 'risk_value',
18
+ 'new_likelihood',
19
+ 'new_business_impact',
20
+ 'new_risk_value',
21
+ 'existing_controls',
22
+ 'start_date',
23
+ 'end_date',
24
+ 'iso_control_reference',
25
+ 'risk_treatment_plan',
26
+ 'treatment',
27
+ 'action',
28
+ 'confidentiality',
29
+ 'integrity',
30
+ 'availability',
31
+ 'new_control',
32
+ 'actual_end_date',
33
+ 'notes',
34
+ 'justification_for_delay',
35
+ 'created_by',
36
+ 'is_deleted',
37
+ ] as const;
38
+
39
+ export const CSRM_RISKS_TABLE = 'cyber_security_risk_management_risks';
40
+
41
+ /**
42
+ * Maps one API/workflow risk object to DB values (same pattern as Duty Mission child rows:
43
+ * each property comes from the payload item, plus request_id / created_by / is_deleted from server).
44
+ */
45
+ export function buildCyberSecurityRiskInsertRow(
46
+ requestId: number,
47
+ riskPayload: Record<string, unknown>,
48
+ createdBy: number,
49
+ ): Record<(typeof CSRM_RISK_INSERT_COLUMNS)[number], unknown> {
50
+ const item = riskPayload;
51
+
52
+ const optionalText = (v: unknown): string | null => {
53
+ if (v === null || v === undefined) return null;
54
+ const s = String(v);
55
+ return s.length ? s : null;
56
+ };
57
+
58
+ const optionalNumber = (v: unknown): number | null => {
59
+ if (v === null || v === undefined || v === '') return null;
60
+ const n = Number(v);
61
+ return Number.isFinite(n) ? n : null;
62
+ };
63
+
64
+ const optionalDate = (v: unknown): Date | null => {
65
+ if (v === null || v === undefined || v === '') return null;
66
+ const d = new Date(String(v));
67
+ return Number.isNaN(d.getTime()) ? null : d;
68
+ };
69
+
70
+ const requiredDate = (v: unknown): Date => optionalDate(v) ?? new Date(String(v));
71
+
72
+ const riskValueFromPayload = optionalNumber(item.risk_value);
73
+
74
+ return {
75
+ request_id: requestId,
76
+ risk_no: item.risk_no,
77
+ impacted_category: item.impacted_category,
78
+ impact_area: item.impact_area,
79
+ threat: item.threat,
80
+ vulnerability: item.vulnerability,
81
+ risk_description: item.risk_description,
82
+ risk_owner: item.risk_owner,
83
+ asset_cia_impact: Number(item.asset_cia_impact),
84
+ asset_value: optionalNumber(item.asset_value),
85
+ likelihood: Number(item.likelihood),
86
+ business_impact: Number(item.business_impact),
87
+ risk_value: riskValueFromPayload ?? 0,
88
+ new_likelihood: optionalNumber(item.new_likelihood),
89
+ new_business_impact: optionalNumber(item.new_business_impact),
90
+ new_risk_value: optionalNumber(item.new_risk_value),
91
+ existing_controls: item.existing_controls,
92
+ start_date: requiredDate(item.start_date),
93
+ end_date: requiredDate(item.end_date),
94
+ iso_control_reference: optionalText(item.iso_control_reference),
95
+ risk_treatment_plan: item.risk_treatment_plan,
96
+ treatment: optionalText(item.treatment),
97
+ action: optionalText(item.action),
98
+ confidentiality: optionalNumber(item.confidentiality),
99
+ integrity: optionalNumber(item.integrity),
100
+ availability: optionalNumber(item.availability),
101
+ new_control: optionalText(item.new_control),
102
+ actual_end_date: optionalDate(item.actual_end_date),
103
+ notes: optionalText(item.notes),
104
+ justification_for_delay: optionalText(item.justification_for_delay),
105
+ created_by: createdBy,
106
+ is_deleted: false,
107
+ };
108
+ }
109
+
110
+ /** Persists one risk row from workflow/API payload (explicit INSERT, like annual_training_plan_items). */
111
+ export async function persistCsrmRiskFromPayload(
112
+ manager: EntityManager,
113
+ requestId: number,
114
+ riskPayload: Record<string, unknown>,
115
+ createdBy: number,
116
+ ): Promise<void> {
117
+ const row = buildCyberSecurityRiskInsertRow(requestId, riskPayload, createdBy);
118
+ const values = CSRM_RISK_INSERT_COLUMNS.map((col) => row[col]);
119
+ const colList = CSRM_RISK_INSERT_COLUMNS.map((c) => `"${c}"`).join(', ');
120
+ const placeholders = CSRM_RISK_INSERT_COLUMNS.map((_, i) => `$${i + 1}`).join(', ');
121
+ await manager.query(
122
+ `INSERT INTO ${CSRM_RISKS_TABLE} (${colList}) VALUES (${placeholders})`,
123
+ values,
124
+ );
125
+ }
package/src/index.ts CHANGED
@@ -282,6 +282,12 @@ export {
282
282
  CyberSecurityRiskManagementRisk,
283
283
  CyberSecurityRiskImpactedCategory
284
284
  } from './models/CyberSecurityRiskManagementRiskModel';
285
+ export {
286
+ buildCyberSecurityRiskInsertRow,
287
+ persistCsrmRiskFromPayload,
288
+ CSRM_RISK_INSERT_COLUMNS,
289
+ CSRM_RISKS_TABLE,
290
+ } from './helpers/csrm-risk-persistence.helper';
285
291
  export * from './models/LegalContractReviewRequestModel';
286
292
  export {
287
293
  LegalContractReviewRequest,
@@ -513,6 +519,7 @@ export * from './models/SlaConfigModel';
513
519
  export * from './models/ChatbotQnsAnsMappingModel';
514
520
  export * from './models/ChatbotDocumentsModel';
515
521
  export * from './models/IconsModel';
522
+ export * from './models/HelpContentCategoryModel';
516
523
  export * from './models/SlaRequestModel';
517
524
  export * from './models/SlaMyRequestsViewModel';
518
525
  export * from './models/SlaApprovalsViewModel';
@@ -0,0 +1,20 @@
1
+ import { Column, Entity } from "typeorm";
2
+ import { BaseModel } from './BaseModel';
3
+
4
+ @Entity({ name: 'help_content_categories' })
5
+ export class HelpContentCategories extends BaseModel {
6
+
7
+ @Column({ nullable: true })
8
+ name: string;
9
+
10
+ @Column({ type: 'varchar', length: 500, nullable: true })
11
+ name_arabic: string | null;
12
+
13
+ constructor(
14
+ name: string,
15
+ ) {
16
+ super();
17
+ this.name = name;
18
+ this.name_arabic = null;
19
+ }
20
+ }