From 03bf6a9db3276069526020529aca796ed8e745b7 Mon Sep 17 00:00:00 2001 From: Aliaksandr Drozd Date: Fri, 12 Apr 2024 14:30:08 +0200 Subject: [PATCH] Updated dg reading --- package-lock.json | 14 +- package.json | 4 +- .../consts/data-group-read-status.const.ts | 24 +++ .../models/consts/data-group.const.ts | 23 --- .../models/consts/index.ts | 2 +- .../models/rfid-data-group-status.model.ts | 38 ++--- .../rfid-data-groups-status.recipe.test.ts | 5 +- .../rfid-data-groups-status.recipe.ts | 141 +++++++++++++----- 8 files changed, 154 insertions(+), 97 deletions(-) create mode 100644 src/recipes/rfid/rfid-data-groups-status/models/consts/data-group-read-status.const.ts delete mode 100644 src/recipes/rfid/rfid-data-groups-status/models/consts/data-group.const.ts diff --git a/package-lock.json b/package-lock.json index 8a8e8ed..09c928c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@regulaforensics/document-reader-recipes", - "version": "0.0.43", + "version": "0.0.44", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@regulaforensics/document-reader-recipes", - "version": "0.0.43", + "version": "0.0.44", "license": "MIT", "devDependencies": { "@types/jest": "^29.5.12", @@ -19,7 +19,7 @@ "vite-plugin-dts": "^3.8.1" }, "peerDependencies": { - "@regulaforensics/document-reader-typings": ">=0.0.20", + "@regulaforensics/document-reader-typings": ">=0.0.22", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "reflect-metadata": "^0.2.2", @@ -1505,15 +1505,15 @@ } }, "node_modules/@regulaforensics/document-reader-typings": { - "version": "0.0.20", - "resolved": "https://registry.npmjs.org/@regulaforensics/document-reader-typings/-/document-reader-typings-0.0.20.tgz", - "integrity": "sha512-oOHI1vD4bUT/zIzrmSUZZvAvx3biQDoelgUS4pV98dF/5pYT0kj1K7lmvlEFDswfPygRTLR+W5ZyLKeC7GjoQg==", + "version": "0.0.22", + "resolved": "https://registry.npmjs.org/@regulaforensics/document-reader-typings/-/document-reader-typings-0.0.22.tgz", + "integrity": "sha512-56VPPCOGLq7KiAlDOIFyT5+BOFAFjs+VEI7Um6uBDfAc1VzdyQts95NU6JW+uEEMIcHr+kDt4QlkxStAU57cUw==", "peer": true, "peerDependencies": { "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "pako": "^2.1.0", - "reflect-metadata": "^0.2.1" + "reflect-metadata": "^0.2.2" } }, "node_modules/@rollup/pluginutils": { diff --git a/package.json b/package.json index 2140e0b..fccb198 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "0.0.43", + "version": "0.0.44", "author": "Regula Forensics, Inc.", "name": "@regulaforensics/document-reader-recipes", "description": "Document Reader Recipes", @@ -9,7 +9,7 @@ "test": "jest" }, "peerDependencies": { - "@regulaforensics/document-reader-typings": ">=0.0.20", + "@regulaforensics/document-reader-typings": ">=0.0.22", "class-transformer": "^0.5.1", "class-validator": "^0.14.1", "reflect-metadata": "^0.2.2", diff --git a/src/recipes/rfid/rfid-data-groups-status/models/consts/data-group-read-status.const.ts b/src/recipes/rfid/rfid-data-groups-status/models/consts/data-group-read-status.const.ts new file mode 100644 index 0000000..3dddf24 --- /dev/null +++ b/src/recipes/rfid/rfid-data-groups-status/models/consts/data-group-read-status.const.ts @@ -0,0 +1,24 @@ +import { eRfidErrorCodes } from '@regulaforensics/document-reader-typings' + + +export enum eDataGroupReadStatus { + /** + * Group exists but not read + */ + NOT_PERFORMED = eRfidErrorCodes.ERROR_NOT_PERFORMED, + + /** + * Group not exists + */ + NOT_AVAILABLE = eRfidErrorCodes.ERROR_NOT_AVAILABLE, + + /** + * Read without errors + */ + NO_ERROR = eRfidErrorCodes.ERROR_NO_ERROR, + + /** + * Read with errors + */ + FAILED = eRfidErrorCodes.ERROR_FAILED +} diff --git a/src/recipes/rfid/rfid-data-groups-status/models/consts/data-group.const.ts b/src/recipes/rfid/rfid-data-groups-status/models/consts/data-group.const.ts deleted file mode 100644 index 873682c..0000000 --- a/src/recipes/rfid/rfid-data-groups-status/models/consts/data-group.const.ts +++ /dev/null @@ -1,23 +0,0 @@ -export enum eDataGroup { - DG1 = 1, - DG2 = 2, - DG3 = 3, - DG4 = 4, - DG5 = 5, - DG6 = 6, - DG7 = 7, - DG8 = 8, - DG9 = 9, - DG10 = 10, - DG11 = 11, - DG12 = 12, - DG13 = 13, - DG14 = 14, - DG15 = 15, - DG16 = 16, - DG17 = 17, - DG18 = 18, - DG19 = 19, - DG20 = 20, - DG21 = 21, -} diff --git a/src/recipes/rfid/rfid-data-groups-status/models/consts/index.ts b/src/recipes/rfid/rfid-data-groups-status/models/consts/index.ts index 6a5791f..dd80f0d 100644 --- a/src/recipes/rfid/rfid-data-groups-status/models/consts/index.ts +++ b/src/recipes/rfid/rfid-data-groups-status/models/consts/index.ts @@ -1 +1 @@ -export * from './data-group.const' +export * from './data-group-read-status.const' diff --git a/src/recipes/rfid/rfid-data-groups-status/models/rfid-data-group-status.model.ts b/src/recipes/rfid/rfid-data-groups-status/models/rfid-data-group-status.model.ts index 26eaee6..a94df74 100644 --- a/src/recipes/rfid/rfid-data-groups-status/models/rfid-data-group-status.model.ts +++ b/src/recipes/rfid/rfid-data-groups-status/models/rfid-data-group-status.model.ts @@ -1,32 +1,25 @@ import { plainToClass } from 'class-transformer' -import { IsDefined, IsEnum, IsIn, validateSync, ValidationError } from 'class-validator' -import { eRfidErrorCodes } from '@regulaforensics/document-reader-typings' +import { IsDefined, IsEnum, IsInt, validateSync, ValidationError } from 'class-validator' import { AllowPrimitives } from '@/types' -import { eDataGroup } from './consts' +import { eDataGroupReadStatus } from './consts' -export type tRfidDataGroupStatus = - eRfidErrorCodes.ERROR_NOT_PERFORMED | - eRfidErrorCodes.ERROR_NOT_AVAILABLE | - eRfidErrorCodes.ERROR_NO_ERROR | - eRfidErrorCodes.ERROR_FAILED - /** * Rfid data group status */ export interface iRRfidDataGroupStatus { /** * Data group - * @type {eDataGroup} + * @type {number} */ - group: eDataGroup + group: number /** - * Status - * @type {tRfidDataGroupStatus} + * Data group read status + * @type {eDataGroupReadStatus} */ - status: tRfidDataGroupStatus + status: eDataGroupReadStatus } /** @@ -35,24 +28,19 @@ export interface iRRfidDataGroupStatus { export class RRfidDataGroupStatus implements iRRfidDataGroupStatus { /** * Data group - * @type {eDataGroup} + * @type {number} */ @IsDefined() - @IsEnum(eDataGroup) - group: eDataGroup + @IsInt() + group: number /** * Status - * @type {tRfidDataGroupStatus} + * @type {eDataGroupReadStatus} */ @IsDefined() - @IsIn([ - eRfidErrorCodes.ERROR_NOT_PERFORMED, - eRfidErrorCodes.ERROR_NOT_AVAILABLE, - eRfidErrorCodes.ERROR_NO_ERROR, - eRfidErrorCodes.ERROR_FAILED - ]) - status: tRfidDataGroupStatus + @IsEnum(eDataGroupReadStatus) + status: eDataGroupReadStatus /** * Create instance of RRfidDataGroupStatus from plain object diff --git a/src/recipes/rfid/rfid-data-groups-status/rfid-data-groups-status.recipe.test.ts b/src/recipes/rfid/rfid-data-groups-status/rfid-data-groups-status.recipe.test.ts index 46e03c6..2012c63 100644 --- a/src/recipes/rfid/rfid-data-groups-status/rfid-data-groups-status.recipe.test.ts +++ b/src/recipes/rfid/rfid-data-groups-status/rfid-data-groups-status.recipe.test.ts @@ -37,9 +37,8 @@ describe('getRfidDataGroupsStatus', () => { test('should return some results', () => { const result = getRfidDataGroupsStatus(docReaderResponse) - // const hasChecked = result.some((status) => status.status === eRfidErrorCodes.ERROR_NO_ERROR) - - expect(result.length).toBeGreaterThan(0) + expect(result).not.toBeNull() + expect(result).not.toBeUndefined() }) }) }) diff --git a/src/recipes/rfid/rfid-data-groups-status/rfid-data-groups-status.recipe.ts b/src/recipes/rfid/rfid-data-groups-status/rfid-data-groups-status.recipe.ts index 8162440..92c47f7 100644 --- a/src/recipes/rfid/rfid-data-groups-status/rfid-data-groups-status.recipe.ts +++ b/src/recipes/rfid/rfid-data-groups-status/rfid-data-groups-status.recipe.ts @@ -1,11 +1,12 @@ import { DocBinaryInfoContainer, + eRfidApplicationType, eRfidDataFileType, eRfidErrorCodes, ProcessResponse } from '@regulaforensics/document-reader-typings' -import { eDataGroup, RRfidDataGroupStatus } from './models' +import { eDataGroupReadStatus, RRfidDataGroupStatus } from './models' /** * Get Rfid checks summary @@ -15,134 +16,202 @@ import { eDataGroup, RRfidDataGroupStatus } from './models' export const getRfidDataGroupsStatus = (input: ProcessResponse): RRfidDataGroupStatus[] => { const binary = DocBinaryInfoContainer.fromProcessResponse(input) - const countOfDataGroups = Object.keys(eDataGroup).length / 2 - const result: RRfidDataGroupStatus[] = [] - - for (let i = 0; i < countOfDataGroups; i++) { - const dummy = new RRfidDataGroupStatus() - dummy.group = i + 1 - dummy.status = eRfidErrorCodes.ERROR_NOT_PERFORMED - - result.push(dummy) - } + let result: RRfidDataGroupStatus[] = [] binary.forEach((container) => { const sessionData = container.TDocBinaryInfo.RFID_BINARY_DATA.RFID_Session_Data + const notRead = container.TDocBinaryInfo.RFID_BINARY_DATA.RFID_ePassp_Directory sessionData.Applications.forEach((application) => { + const chipType = application.Type + const tmp: { index: number, status: eDataGroupReadStatus }[] = [] + application.Files.forEach((file) => { const dataGroup = file.Type - const status = file.PA_Status - let mappedDg: eDataGroup | undefined + let mappedDg: number | undefined switch (dataGroup) { case eRfidDataFileType.ID_DG1: case eRfidDataFileType.PASSPORT_DG1: case eRfidDataFileType.DL_DG1: - mappedDg = eDataGroup.DG1 + mappedDg = 1 break case eRfidDataFileType.ID_DG2: case eRfidDataFileType.PASSPORT_DG2: case eRfidDataFileType.DL_DG2: - mappedDg = eDataGroup.DG2 + mappedDg = 2 break case eRfidDataFileType.ID_DG3: case eRfidDataFileType.PASSPORT_DG3: case eRfidDataFileType.DL_DG3: - mappedDg = eDataGroup.DG3 + mappedDg = 3 break case eRfidDataFileType.ID_DG4: case eRfidDataFileType.PASSPORT_DG4: case eRfidDataFileType.DL_DG4: - mappedDg = eDataGroup.DG4 + mappedDg = 4 break case eRfidDataFileType.ID_DG5: case eRfidDataFileType.PASSPORT_DG5: case eRfidDataFileType.DL_DG5: - mappedDg = eDataGroup.DG5 + mappedDg = 5 break case eRfidDataFileType.ID_DG6: case eRfidDataFileType.PASSPORT_DG6: case eRfidDataFileType.DL_DG6: - mappedDg = eDataGroup.DG6 + mappedDg = 6 break case eRfidDataFileType.ID_DG7: case eRfidDataFileType.PASSPORT_DG7: case eRfidDataFileType.DL_DG7: - mappedDg = eDataGroup.DG7 + mappedDg = 7 break case eRfidDataFileType.ID_DG8: case eRfidDataFileType.PASSPORT_DG8: case eRfidDataFileType.DL_DG8: - mappedDg = eDataGroup.DG8 + mappedDg = 8 break case eRfidDataFileType.ID_DG9: case eRfidDataFileType.PASSPORT_DG9: case eRfidDataFileType.DL_DG9: - mappedDg = eDataGroup.DG9 + mappedDg = 9 break case eRfidDataFileType.ID_DG10: case eRfidDataFileType.PASSPORT_DG10: case eRfidDataFileType.DL_DG10: - mappedDg = eDataGroup.DG10 + mappedDg = 10 break case eRfidDataFileType.ID_DG11: case eRfidDataFileType.PASSPORT_DG11: case eRfidDataFileType.DL_DG11: - mappedDg = eDataGroup.DG11 + mappedDg = 11 break case eRfidDataFileType.ID_DG12: case eRfidDataFileType.PASSPORT_DG12: case eRfidDataFileType.DL_DG12: - mappedDg = eDataGroup.DG12 + mappedDg = 12 break case eRfidDataFileType.ID_DG13: case eRfidDataFileType.PASSPORT_DG13: case eRfidDataFileType.DL_DG13: - mappedDg = eDataGroup.DG13 + mappedDg = 13 break case eRfidDataFileType.ID_DG14: case eRfidDataFileType.PASSPORT_DG14: case eRfidDataFileType.DL_DG14: - mappedDg = eDataGroup.DG14 + mappedDg = 14 break case eRfidDataFileType.ID_DG15: case eRfidDataFileType.PASSPORT_DG15: - mappedDg = eDataGroup.DG15 + mappedDg = 15 break case eRfidDataFileType.ID_DG16: case eRfidDataFileType.PASSPORT_DG16: - mappedDg = eDataGroup.DG16 + mappedDg = 16 break case eRfidDataFileType.ID_DG17: case eRfidDataFileType.PASSPORT_DG17: - mappedDg = eDataGroup.DG17 + mappedDg = 17 break case eRfidDataFileType.ID_DG18: case eRfidDataFileType.PASSPORT_DG18: - mappedDg = eDataGroup.DG18 + mappedDg = 18 break case eRfidDataFileType.ID_DG19: case eRfidDataFileType.PASSPORT_DG19: - mappedDg = eDataGroup.DG19 + mappedDg = 19 break case eRfidDataFileType.ID_DG20: case eRfidDataFileType.PASSPORT_DG20: - mappedDg = eDataGroup.DG20 + mappedDg = 20 break case eRfidDataFileType.ID_DG21: - mappedDg = eDataGroup.DG21 + mappedDg = 21 + break + } + + let status: eDataGroupReadStatus = eDataGroupReadStatus.NOT_AVAILABLE + + switch (file.PA_Status) { + case eRfidErrorCodes.ERROR_NO_ERROR: + status = eDataGroupReadStatus.NO_ERROR break + case eRfidErrorCodes.ERROR_NOT_PERFORMED: + status = eDataGroupReadStatus.NOT_PERFORMED + break + case eRfidErrorCodes.ERROR_NOT_AVAILABLE: + status = eDataGroupReadStatus.NOT_AVAILABLE + break; + case eRfidErrorCodes.ERROR_FAILED: + status = eDataGroupReadStatus.FAILED + break + } + + if (notRead.includes(mappedDg || 0)) { + status = eDataGroupReadStatus.NOT_PERFORMED } + if (mappedDg) { - result[mappedDg - 1].status = status + tmp.push({ + index: mappedDg, + status + }) } }) + + if (tmp.length) { + const sorted = tmp.sort((a, b) => a.index - b.index) + + let fillTo = 0 + + switch (chipType) { + case eRfidApplicationType.E_PASSPORT: + fillTo = 16 + break + case eRfidApplicationType.E_ID: + fillTo = 21 + break + case eRfidApplicationType.E_DL: + fillTo = 14 + break + default: + const groups = sorted.map((item) => item.index) + const max = Math.max(...groups) + + if (groups.includes(2) && groups.includes(3) && groups.includes(8) && max <= 8) { + fillTo = 8 + } else if (groups.includes(1) && groups.includes(2) && groups.includes(6) && groups.includes(10) && max <= 10) { + fillTo = 10 + } else { + fillTo = max + } + + break + } + + + // fill array with missing data groups + for (let i = 1; i <= fillTo; i++) { + if (!sorted.find((item) => item.index === i)) { + sorted.splice(i - 1, 0, { + index: i, + status: eDataGroupReadStatus.NOT_AVAILABLE + }) + } + } + + result = sorted.map((item) => { + const current = new RRfidDataGroupStatus() + current.group = item.index + current.status = item.status + + return current + }) + } }) }) - return result }