/* eslint-disable @typescript-eslint/no-explicit-any */ import { IOtherVerificationService, AddressVerificationRequest, NYSCVerificationRequest, InsurancePolicyVerificationRequest, NationalIDVerificationRequest, WAECVerificationRequest, DocumentVerificationRequest, DocumentWithFaceVerificationRequest, AddressVerificationData, NYSCVerificationData, InsurancePolicyVerificationData, NationalIDVerificationData, WAECVerificationData, DocumentVerificationData, VerificationResponse, } from 'porkate-valid8'; import { BaseIdentityPassService } from './base.service'; /** * IdentityPass Other Verification Service * Handles miscellaneous verification types: Address, NYSC, Insurance, National ID, WAEC, Documents */ export class IdentityPassOtherService extends BaseIdentityPassService implements IOtherVerificationService { /** * Verify Address * @see https://docs.prembly.com/docs/address-verification-copy */ async verifyAddress( data: AddressVerificationRequest, ): Promise> { return this.makeRequest( '/verification/address', { ...data, // spread first to allow overrides address: data?.address, state: data?.state, lga: data?.lga, verification_type: 'person', }, this.mapAddressData, ); } /** * Verify NYSC Certificate * @see https://docs.prembly.com/docs/nysc-copy-1 */ async verifyNYSC( data: NYSCVerificationRequest, ): Promise> { return this.makeRequest( '/verification/nysc', { nysc_number: data?.certificateNumber, }, this.mapNYSCData, ); } /** * Verify Insurance Policy * @see https://docs.prembly.com/docs/insurance-policy */ async verifyInsurancePolicy( data: InsurancePolicyVerificationRequest, ): Promise> { return this.makeRequest( '/verification/insurance_policy', { number: data?.policyNumber, channel: 'insurance', // default channel }, this.mapInsurancePolicyData, ); } /** * Verify National ID (Virtual NIN Basic) * @see https://docs.prembly.com/docs/national-id-basic-1 */ async verifyNationalID( data: NationalIDVerificationRequest, ): Promise> { return this.makeRequest( '/verification/vnin-basic', { number: data?.nationalIdNumber, }, this.mapNationalIDData, ); } /** * Verify WAEC Result * @see https://docs.prembly.com/docs/waec */ async verifyWAEC( data: WAECVerificationRequest, ): Promise> { return this.makeRequest( '/verification/waec', { exam_number: data?.examNumber, exam_year: data?.examYear, exam_type: data?.examType || 'waec', }, this.mapWAECData, ); } /** * Verify Document (without face) * @see https://docs.prembly.com/docs/document-verification-copy-82 */ async verifyDocument( data: DocumentVerificationRequest, ): Promise> { return this.makeRequest( '/verification/document', { doc_type: data?.documentType, doc_country: (data as any).documentCountry || 'NGA', // Default to Nigeria doc_image: data?.image, }, this.mapDocumentData, ); } /** * Verify Document with Face * @see https://docs.prembly.com/docs/document-verification-with-face-copy-82 */ async verifyDocumentWithFace( data: DocumentWithFaceVerificationRequest, ): Promise> { return this.makeRequest( '/verification/document_w_face', { doc_type: data?.documentType, doc_country: (data as any).documentCountry || 'NGA', // Default to Nigeria doc_image: data?.image, selfie_image: data?.faceImage, }, this.mapDocumentData, ); } private mapAddressData( verificationData: Record, payload: Record, ): AddressVerificationData { const address = (verificationData?.address as Record) || {}; return { address: (verificationData?.address || address?.address || payload?.address || '') as string, verified: Boolean(verificationData?.verified || verificationData?.status), state: (verificationData?.state || address?.state) as string | undefined, lga: (verificationData?.lga || address?.lga) as string | undefined, landmark: (verificationData?.landmark || address?.landmark) as string | undefined, firstName: (verificationData?.first_name || address?.first_name) as string | undefined, lastName: (verificationData?.last_name || address?.last_name) as string | undefined, phone: (verificationData?.phone || address?.phone) as string | undefined, latitude: (verificationData?.latitude || address?.latitude) as string | undefined, longitude: (verificationData?.longitude || address?.longitude) as string | undefined, street: (verificationData?.street || address?.street) as string | undefined, city: (verificationData?.city || address?.city) as string | undefined, reference: (verificationData?.reference || verificationData?._id) as string | undefined, jobId: (verificationData?._id || verificationData?.job_id) as string | undefined, addressStatus: (verificationData?.addressStatus || verificationData?.status) as | string | undefined, ...verificationData, }; } private mapNYSCData( verificationData: Record, payload: Record, ): NYSCVerificationData { return { certificateNumber: (verificationData?.certificate_number || verificationData?.certificateNumber || verificationData?.callUpNo || payload?.nysc_number || '') as string, firstName: (verificationData?.first_name || verificationData?.firstname || verificationData?.firstName || '') as string, lastName: (verificationData?.last_name || verificationData?.lastname || verificationData?.lastName || verificationData?.surname || '') as string, middleName: (verificationData?.middle_name || verificationData?.middleName) as | string | undefined, stateOfService: (verificationData?.state_of_service || verificationData?.stateOfService || verificationData?.deployedState) as string | undefined, yearOfService: (verificationData?.year_of_service || verificationData?.yearOfService) as | string | undefined, institution: (verificationData?.institution || verificationData?.Institution) as | string | undefined, course: (verificationData?.course || verificationData?.Course) as string | undefined, matricNo: (verificationData?.matricNo || verificationData?.MatricNo) as string | undefined, grade: (verificationData?.grade || verificationData?.Grade) as string | undefined, dateOfBirth: (verificationData?.dateOfBirth || verificationData?.DateOfBirth) as | string | undefined, stateRegNumber: (verificationData?.stateRegNumber || verificationData?.StateRegNumber) as | string | undefined, gender: (verificationData?.gender || verificationData?.Gender) as string | undefined, status: (verificationData?.status || verificationData?.Status) as string | undefined, startPeriod: (verificationData?.startPeriod || verificationData?.StartPeriod) as | string | undefined, endPeriod: (verificationData?.endPeriod || verificationData?.EndPeriod) as string | undefined, image: (verificationData?.image || verificationData?.Image) as string | undefined, ...verificationData, }; } private mapInsurancePolicyData( verificationData: Record, payload: Record, ): InsurancePolicyVerificationData { return { policyNumber: (verificationData?.policy_number || verificationData?.policyNumber || payload?.number || '') as string, policyHolderName: (verificationData?.policy_holder_name || verificationData?.policyHolderName) as string | undefined, status: (verificationData?.status || verificationData?.policy_status) as string | undefined, expiryDate: (verificationData?.expiry_date || verificationData?.expiryDate) as | string | undefined, issueDate: (verificationData?.issue_date || verificationData?.issueDate) as | string | undefined, insuranceCompany: (verificationData?.insurance_company || verificationData?.insuranceCompany) as string | undefined, typeOfCover: (verificationData?.type_of_cover || verificationData?.typeOfCover) as | string | undefined, vehicleType: (verificationData?.vehicle_type || verificationData?.vehicleType) as | string | undefined, vehicleMake: (verificationData?.vehicle_make || verificationData?.vehicleMake) as | string | undefined, vehicleModel: (verificationData?.vehicle_model || verificationData?.vehicleModel) as | string | undefined, vehicleColor: (verificationData?.vehicle_color || verificationData?.vehicleColor) as | string | undefined, vehicleChasis: (verificationData?.vehicle_chasis || verificationData?.vehicleChasis) as | string | undefined, regNumber: (verificationData?.reg_number || verificationData?.regNumber) as | string | undefined, newRegNumber: (verificationData?.new_reg_number || verificationData?.newRegNumber) as | string | undefined, ...verificationData, }; } private mapNationalIDData( verificationData: Record, payload: Record, ): NationalIDVerificationData { const ninData = (verificationData?.nin_data as Record) || {}; return { nationalIdNumber: (verificationData?.national_id_number || verificationData?.nationalIdNumber || ninData?.nin || payload?.number || '') as string, firstName: (verificationData?.first_name || verificationData?.firstname || verificationData?.firstName || ninData?.firstname || '') as string, lastName: (verificationData?.last_name || verificationData?.lastname || verificationData?.lastName || ninData?.surname || '') as string, middleName: (verificationData?.middle_name || verificationData?.middleName || ninData?.middlename) as string | undefined, dateOfBirth: (verificationData?.date_of_birth || verificationData?.dob || verificationData?.dateOfBirth || ninData?.birthdate) as string | undefined, gender: (verificationData?.gender || ninData?.gender) as string | undefined, phoneNumber: (verificationData?.phone_number || verificationData?.phoneNumber || ninData?.telephoneno) as string | undefined, address: (verificationData?.address || ninData?.residence_address) as string | undefined, photo: (verificationData?.photo || ninData?.photo) as string | undefined, ...verificationData, }; } private mapWAECData( verificationData: Record, payload: Record, ): WAECVerificationData { const candidateResult = verificationData?.CandidateResult || verificationData?.candidateResult; return { examNumber: (verificationData?.exam_number || verificationData?.examNumber || verificationData?.CandidateNo || payload?.exam_number || '') as string, examYear: (verificationData?.exam_year || verificationData?.examYear || payload?.exam_year || '') as string, candidateName: (verificationData?.candidate_name || verificationData?.candidateName || verificationData?.Surname) as string | undefined, firstName: (verificationData?.first_name || verificationData?.FirstName) as | string | undefined, surname: (verificationData?.surname || verificationData?.Surname) as string | undefined, otherNames: (verificationData?.other_names || verificationData?.OtherNames) as | string | undefined, sex: (verificationData?.sex || verificationData?.Sex) as string | undefined, dateOfBirth: (verificationData?.dob || verificationData?.Dob) as string | undefined, centreCode: (verificationData?.centre_code || verificationData?.CentreCode) as | number | undefined, centreName: (verificationData?.centre_name || verificationData?.CentreName) as | string | undefined, photo: (verificationData?.photo || verificationData?.Passport) as string | undefined, results: Array.isArray(candidateResult) ? candidateResult.map((result: Record) => ({ subject: (result?.subject || result?.Subject) as string, grade: (result?.grade || result?.Grade) as string, gradeDescription: (result?.grade_desc || result?.GradeDesc) as string | undefined, })) : undefined, ...verificationData, }; } private mapDocumentData( verificationData: Record, payload: Record, ): DocumentVerificationData { return { documentType: (verificationData?.document_type || verificationData?.documentType || payload?.doc_type || '') as string, documentNumber: (verificationData?.document_number || verificationData?.documentNumber || '') as string, verified: (verificationData?.verified || verificationData?.status === true) as boolean, ownerName: (verificationData?.owner_name || verificationData?.ownerName || verificationData?.fullName) as string | undefined, fullName: (verificationData?.fullName || verificationData?.full_name) as string | undefined, firstName: (verificationData?.first_name || verificationData?.firstName) as | string | undefined, lastName: (verificationData?.last_name || verificationData?.lastName) as string | undefined, gender: (verificationData?.gender || verificationData?.Gender) as string | undefined, dateOfBirth: (verificationData?.dob || verificationData?.dateOfBirth) as string | undefined, address: (verificationData?.address || verificationData?.Address) as string | undefined, documentName: (verificationData?.document_name || verificationData?.documentName) as | string | undefined, documentCountry: (verificationData?.documentCountry || verificationData?.document_country) as | string | undefined, nationality: (verificationData?.nationality || verificationData?.Nationality) as | string | undefined, issuer: (verificationData?.issuer || verificationData?.Issuer) as string | undefined, placeOfIssue: (verificationData?.place_of_issue || verificationData?.placeOfIssue) as | string | undefined, dateOfIssue: (verificationData?.date_of_issue || verificationData?.dateOfIssue) as | string | undefined, expirationDate: (verificationData?.expirationDate || verificationData?.expiration_date) as | string | undefined, age: (verificationData?.age || verificationData?.Age) as number | undefined, image: (verificationData?.image || verificationData?.Image) as string | undefined, ...verificationData, }; } }