Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/fiery-meals-care.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@ssecd/ihs': patch
---

Implement missing KFA api
2 changes: 1 addition & 1 deletion .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,5 @@ IHS_KYC_PEM_FILE=
TEST_AGENT_NIK=
TEST_AGENT_NAME=
TEST_PATIENT_NIK=
TEST_PATEINT_NAME=
TEST_PATIENT_NAME=
TEST_PATIENT_ID=
26 changes: 23 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -110,7 +110,7 @@ ihs.authStore = new RedisAuthStore();
export default ihs;
```

### Patient Consent API
### Patient Consent

Pada Patient Consent, terdapat dua buah method yang di-definisikan sesuai dengan spesifikasi IHS yakni method untuk mendapatkan informasi consent pasien:

Expand Down Expand Up @@ -142,7 +142,7 @@ if (result.resourceType === 'Consent') {

Setiap method pada Patient Consent API ini memiliki nilai kembalian FHIR resource `Consent` jika request sukses dan `OperationOutcome` jika request gagal.

### FHIR API
### FHIR

Pada API ini, implementasi-nya sangat sederhana dan mengutamakan fleksibilitas yakni dengan hanya mengembalikan `Response` object sehingga response sepenuhnya di-_handle_ pengguna.

Expand All @@ -160,7 +160,7 @@ if (response.ok) {
}
```

### KYC API
### KYC

Pada API ini, terdapat dua buah method yakni method untuk melakukan proses Generate URL Validasi di mana URL digunakan untuk melakukan verifikasi akun SatuSehat melalui SatuSehat Mobile:

Expand Down Expand Up @@ -218,6 +218,26 @@ Proses kriptografi pada API ini memerlukan file _server key_ atau _public key_ d

File _public key_ atau _server key_ dapat di-unduh di [sini](https://github.com/ssecd/ihs/issues/2).

### KFA

API KFA atau Kamus Farmasi & Alat Kesehatan ini diimplementasikan sesuai dengan spesifikasi IHS pada Playbook yang mana memiliki beberapa versi yakni `kfa`, `kfa-v2`, dan `kfa-v3`. Semua RestAPI yang tersedia sudah dibungkus pada method sehingga mempermudah pemanggilan API dan penulisan tipe request dan response.

```ts
const result1 = await ihs.kfa.getProducts({ ... });
if (result1.error) {
// result == ClientError
} else {
// result == Product
}

const result2 = await ihs.kfa.getAlkesVariants({ ... });
if (result2.error) {
// result == AlkesResponseBody<null>
} else {
// result == AlkesResponseBody<AlkesVariantData[]>
}
```

## Konfigurasi

Konfigurasi mengikuti interface berikut:
Expand Down
27 changes: 21 additions & 6 deletions src/ihs.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
import { getConsentSingleton } from './consent.js';
import { getKFASingleton } from './kfa.js';
import { getKycSingleton } from './kyc.js';

type MaybePromise<T> = T | Promise<T>;
type Mode = 'development' | 'staging' | 'production';
type API = 'auth' | 'fhir' | 'consent' | 'kyc';
type API = 'auth' | 'fhir' | 'consent' | 'kyc' | 'kfa' | 'kfa2' | 'kfa3';
type BaseURL = Record<Mode, Record<API, string>>;

export interface IHSConfig {
Expand Down Expand Up @@ -63,19 +64,28 @@ const defaultBaseUrls: BaseURL = {
auth: `https://api-satusehat-dev.dto.kemkes.go.id/oauth2/v1`,
fhir: `https://api-satusehat-dev.dto.kemkes.go.id/fhir-r4/v1`,
consent: `https://api-satusehat-dev.dto.kemkes.go.id/consent/v1`,
kyc: `https://api-satusehat-dev.dto.kemkes.go.id/kyc/v1`
kyc: `https://api-satusehat-dev.dto.kemkes.go.id/kyc/v1`,
kfa: `https://api-satusehat-dev.dto.kemkes.go.id/kfa`,
kfa2: `https://api-satusehat-dev.dto.kemkes.go.id/kfa-v2`,
kfa3: `https://api-satusehat-dev.dto.kemkes.go.id/kfa-v3`
},
staging: {
auth: `https://api-satusehat-stg.dto.kemkes.go.id/oauth2/v1`,
fhir: `https://api-satusehat-stg.dto.kemkes.go.id/fhir-r4/v1`,
consent: `https://api-satusehat-stg.dto.kemkes.go.id/consent/v1`,
kyc: `https://api-satusehat-stg.dto.kemkes.go.id/kyc/v1`
kyc: `https://api-satusehat-stg.dto.kemkes.go.id/kyc/v1`,
kfa: `https://api-satusehat-stg.dto.kemkes.go.id/kfa`,
kfa2: `https://api-satusehat-stg.dto.kemkes.go.id/kfa-v2`,
kfa3: `https://api-satusehat-stg.dto.kemkes.go.id/kfa-v3`
},
production: {
auth: `https://api-satusehat.kemkes.go.id/oauth2/v1`,
fhir: `https://api-satusehat.kemkes.go.id/fhir-r4/v1`,
consent: `https://api-satusehat.kemkes.go.id/consent/v1`,
kyc: `https://api-satusehat.kemkes.go.id/kyc/v1`
kyc: `https://api-satusehat.kemkes.go.id/kyc/v1`,
kfa: `https://api-satusehat.kemkes.go.id/kfa`,
kfa2: `https://api-satusehat.kemkes.go.id/kfa-v2`,
kfa3: `https://api-satusehat.kemkes.go.id/kfa-v3`
}
} as const;

Expand Down Expand Up @@ -123,7 +133,7 @@ export default class IHS {
}

/**
* Request ke API `consent`, `fhir`, dan `kyc` yang dapat diatur
* Request ke API `consent`, `fhir`, `kyc`, dan `kfa` yang dapat diatur
* pada property `type` pada parameter `config`. Autentikasi sudah
* ditangani secara otomatis pada method ini.
*/
Expand All @@ -143,7 +153,7 @@ export default class IHS {
/**
* Autentikasi menggunakan `clientSecret` dan `secretKey` dengan kembalian
* berupa detail autentikasi termasuk `access_token` yang digunakan untuk
* request ke API `consent`, `fhir`, dan `kyc`.
* request ke API `consent`, `fhir`, `kyc`, dan `kfa`.
*
* IHS Note: Rate limit is 1 request per minute after a failed attempt.
*/
Expand Down Expand Up @@ -192,6 +202,11 @@ export default class IHS {
const instance = getKycSingleton(this);
return instance;
}

get kfa() {
const instance = getKFASingleton(this);
return instance;
}
}

/**
Expand Down
22 changes: 22 additions & 0 deletions src/kfa.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { beforeAll, describe, expect, it } from 'vitest';
import IHS from './ihs.js';
import { getKFASingleton, KFA } from './kfa.js';

let kfa: KFA;

beforeAll(() => {
const ihs = new IHS();
kfa = getKFASingleton(ihs);
});

describe('kfa', () => {
it('instance should be object and valid', async () => {
expect(kfa).toBeTypeOf('object');
expect(kfa).toBeInstanceOf(KFA);
});

it('get price jkn', async () => {
const result = await kfa.getPriceJKN({ kfaCode: '' });
expect(result.error).toBe(false);
});
});
Loading