Source

identitypass/services/nin-verification.service.ts

import {
  ININVerificationService,
  NINVerificationRequest,
  NINWithFaceVerificationRequest,
  NINSlipVerificationRequest,
  VirtualNINVerificationRequest,
  NINVerificationData,
  VerificationResponse,
} from 'porkate-valid8';
import { BaseIdentityPassService } from './base.service';

/**
 * IdentityPass NIN Verification Service
 */
export class IdentityPassNINService
  extends BaseIdentityPassService
  implements ININVerificationService
{
  /**
   * Verify NIN (National Identification Number) - Basic
   * @see https://docs.prembly.com/reference/nin-and-virtual-nin
   */
  async verifyNIN(
    data: NINVerificationRequest,
  ): Promise<VerificationResponse<NINVerificationData>> {
    return this.makeRequest(
      '/verification/vnin',
      {
        number_nin: data?.nin,
      },
      this.mapNINData,
    );
  }

  /**
   * Verify NIN with face matching
   * @see https://docs.prembly.com/docs/nin-with-face-copy
   */
  async verifyNINWithFace(
    data: NINWithFaceVerificationRequest,
  ): Promise<VerificationResponse<NINVerificationData>> {
    return this.makeRequest(
      '/verification/nin_w_face',
      {
        number: data?.nin,
        image: data?.image,
      },
      this.mapNINData,
    );
  }

  /**
   * Verify NIN Slip
   * @see https://docs.prembly.com/reference/nin-and-virtual-nin
   */
  async verifyNINSlip(
    data: NINSlipVerificationRequest,
  ): Promise<VerificationResponse<NINVerificationData>> {
    return this.makeRequest(
      '/verification/nin_slip',
      {
        number: data?.nin,
        slip_number: data?.slipNumber,
      },
      this.mapNINData,
    );
  }

  /**
   * Verify Virtual NIN - Basic
   * @see https://docs.prembly.com/docs/national-id-basic-1
   */
  async verifyVirtualNIN(
    data: VirtualNINVerificationRequest,
  ): Promise<VerificationResponse<NINVerificationData>> {
    return this.makeRequest(
      '/verification/vnin-basic',
      {
        number: data?.virtualNin,
      },
      this.mapNINData,
    );
  }

  /**
   * Map NIN API response to NINVerificationData
   * Handles various response field formats from Prembly API
   */
  private mapNINData(
    verificationData: Record<string, unknown>,
    payload: Record<string, unknown>,
  ): NINVerificationData {
    return {
      nin:
        (verificationData?.nin as string) ||
        (verificationData?.number as string) ||
        (payload?.number_nin as string) ||
        (payload?.number as string),
      firstName:
        (verificationData?.firstname as string) ||
        (verificationData?.firstName as string) ||
        (verificationData?.pfirstname as string) ||
        '',
      lastName:
        (verificationData?.surname as string) ||
        (verificationData?.lastname as string) ||
        (verificationData?.lastName as string) ||
        (verificationData?.psurname as string) ||
        '',
      middleName:
        (verificationData?.middlename as string) ||
        (verificationData?.middleName as string) ||
        (verificationData?.pmiddlename as string),
      dateOfBirth:
        (verificationData?.birthdate as string) ||
        (verificationData?.dob as string) ||
        (verificationData?.dateOfBirth as string) ||
        '',
      gender: (verificationData?.gender as string) || '',
      phoneNumber:
        (verificationData?.telephoneno as string) || (verificationData?.phoneNumber as string),
      address:
        (verificationData?.residence_address as string) ||
        (verificationData?.residentialAddress as string) ||
        (verificationData?.address as string),
      photo: verificationData?.photo as string,
      maritalStatus:
        (verificationData?.maritalstatus as string) || (verificationData?.maritalStatus as string),
      nationality: verificationData?.nationality as string,
      stateOfOrigin:
        (verificationData?.birthstate as string) ||
        (verificationData?.self_origin_state as string) ||
        (verificationData?.stateOfOrigin as string),
      lga:
        (verificationData?.birthlga as string) ||
        (verificationData?.self_origin_lga as string) ||
        (verificationData?.lga as string),
      title: verificationData?.title as string,
      birthCountry: verificationData?.birthcountry as string,
      email: verificationData?.email as string,
      employmentStatus: verificationData?.employmentstatus as string,
      height: verificationData?.heigth as number,
      educationalLevel: verificationData?.educationallevel as string,
      profession: verificationData?.profession as string,
      religion: verificationData?.religion as string,
      residenceStatus: verificationData?.residencestatus as string,
      residenceState: verificationData?.residence_state as string,
      residenceLga: verificationData?.residence_lga as string,
      residenceTown: verificationData?.residence_town as string,
      selfOriginPlace: verificationData?.self_origin_place as string,
      spokenLanguage:
        (verificationData?.spoken_language as string) || (verificationData?.ospokenlang as string),
      signature: verificationData?.signature as string,
      trackingId: verificationData?.trackingId as string,
      ...verificationData,
    };
  }
}