Skip to content

Commit e0f27a1

Browse files
authored
feat: add lifecycle events (#109)
* init * request name * vclaim & rekam-medik names * apotek names * clarify antrean-fktp names * fix test script with native .env loader * tidy up fetcher types * docs * changeset * don't append type to name * define class/api name in base class
1 parent 37cb153 commit e0f27a1

25 files changed

Lines changed: 197 additions & 11 deletions

.changeset/fine-spies-design.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@ssecd/jkn': minor
3+
---
4+
5+
Add lifecycle events

.env.example

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ JKN_APOTEK_USER_KEY=
77
JKN_PCARE_USER_KEY=
88
JKN_ICARE_USER_KEY=
99
JKN_REKAM_MEDIS_USER_KEY=
10+
JKN_APLICARES_USER_KEY=
1011

1112
TEST_SEP_NUM=
1213
TEST_RM_NUM=

README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,35 @@ function persistSep(sep: VClaimResponse<'sep', 'insertV2'>) {
131131
}
132132
```
133133

134+
## Events
135+
136+
- `onRequest`
137+
138+
```ts
139+
onRequest: ((info: SendOption & { type: Type }) => MaybePromise<void>) | undefined = undefined;
140+
```
141+
142+
- `onResponse`
143+
144+
```ts
145+
onResponse: (<T extends Type = Type>(info: SendOption & { duration: number; type: T; }, result: SendResponse<unknown, unknown>[T]) => MaybePromise<void>) | undefined = undefined;
146+
```
147+
148+
- `onError`
149+
150+
```ts
151+
onError: ((error: unknown) => MaybePromise<void>) | undefined = undefined;
152+
```
153+
154+
Contoh penggunaan event:
155+
156+
```ts
157+
jkn.onResponse = (info, result) => {
158+
console.log('>', Math.round(info.duration) + 'ms', info.type, info.name);
159+
// > 279ms vclaim Peserta -> NIK
160+
};
161+
```
162+
134163
## Konfigurasi
135164

136165
Konfigurasi mengikuti interface berikut:

package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
},
1515
"type": "module",
1616
"scripts": {
17-
"vitest": "node --env-file=.env ./node_modules/vitest/vitest.mjs",
18-
"test": "vitest",
17+
"test": "node --env-file=.env ./node_modules/vitest/vitest.mjs",
1918
"build": "tsc && dts-buddy dist/index.d.ts -m @ssecd/jkn:src/index.js",
2019
"lint": "prettier --check . && eslint .",
2120
"format": "prettier --write .",

src/antrean-fktp.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ export class AntreanFKTP extends BaseApi<'pcare'> {
1818
kodepoli: string;
1919
}[];
2020
}>({
21+
name: this.name + 'Referensi Poli',
2122
path: `/ref/poli/tanggal/${params.tanggal}`,
2223
method: 'GET'
2324
});
@@ -41,6 +42,7 @@ export class AntreanFKTP extends BaseApi<'pcare'> {
4142
kapasitas: number;
4243
}[];
4344
}>({
45+
name: this.name + 'Referensi Dokter',
4446
path: `/ref/dokter/kodepoli/${params.kodePoli}/tanggal/${params.tanggal}`,
4547
method: 'GET'
4648
});
@@ -90,6 +92,7 @@ export class AntreanFKTP extends BaseApi<'pcare'> {
9092
keterangan: string;
9193
}) {
9294
return this.send({
95+
name: this.name + 'Tambah Antrean',
9396
path: `/antrean/add`,
9497
method: 'POST',
9598
data
@@ -122,6 +125,7 @@ export class AntreanFKTP extends BaseApi<'pcare'> {
122125
waktu: number;
123126
}) {
124127
return this.send({
128+
name: this.name + 'Update Status / Panggil Antrean',
125129
path: `/antrean/panggil`,
126130
method: 'POST',
127131
data
@@ -145,6 +149,7 @@ export class AntreanFKTP extends BaseApi<'pcare'> {
145149
alasan: string;
146150
}) {
147151
return this.send({
152+
name: this.name + 'Batal Antrean',
148153
path: `/antrean/batal`,
149154
method: 'POST',
150155
data

src/antrean.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ export class Antrean extends BaseApi<'antrean'> {
1515
kdpoli: string;
1616
}[]
1717
>({
18+
name: 'Referensi Poli',
1819
path: '/ref/poli',
1920
method: 'GET'
2021
});
@@ -30,6 +31,7 @@ export class Antrean extends BaseApi<'antrean'> {
3031
kodedokter: number;
3132
}[]
3233
>({
34+
name: 'Referensi Dokter',
3335
path: '/ref/dokter',
3436
method: 'GET'
3537
});
@@ -60,6 +62,7 @@ export class Antrean extends BaseApi<'antrean'> {
6062
kodedokter: number;
6163
}[]
6264
>({
65+
name: 'Referensi Jadwal Dokter',
6366
path: `/jadwaldokter/kodepoli/${params.poli}/tanggal/${params.tanggal}`,
6467
method: 'GET'
6568
});
@@ -77,6 +80,7 @@ export class Antrean extends BaseApi<'antrean'> {
7780
namapoli: string;
7881
}[]
7982
>({
83+
name: 'Referensi Poli Fingerprint',
8084
path: '/ref/poli/fp',
8185
method: 'GET'
8286
});
@@ -98,6 +102,7 @@ export class Antrean extends BaseApi<'antrean'> {
98102
tgllahir: string;
99103
daftarfp: number;
100104
}>({
105+
name: 'Referensi Pasien Fingerprint',
101106
path: `/ref/pasien/fp/identitas/${params.jenis}/noidentitas/${params.nomor}`,
102107
method: 'GET'
103108
});
@@ -142,6 +147,7 @@ export class Antrean extends BaseApi<'antrean'> {
142147
}[];
143148
}) {
144149
return this.send({
150+
name: 'Update Jadwal Dokter',
145151
path: `/jadwaldokter/updatejadwaldokter`,
146152
method: 'POST',
147153
data
@@ -226,6 +232,7 @@ export class Antrean extends BaseApi<'antrean'> {
226232
keterangan: string;
227233
}) {
228234
return this.send({
235+
name: 'Tambah Antrean',
229236
path: `/antrean/add`,
230237
method: 'POST',
231238
data
@@ -247,6 +254,7 @@ export class Antrean extends BaseApi<'antrean'> {
247254
keterangan: string;
248255
}) {
249256
return this.send({
257+
name: 'Tambah Antrean Farmasi',
250258
path: `/antrean/farmasi/add`,
251259
method: 'POST',
252260
data
@@ -302,6 +310,7 @@ export class Antrean extends BaseApi<'antrean'> {
302310
jenisresep?: 'Tidak ada' | 'Racikan' | 'Non racikan';
303311
}) {
304312
return this.send({
313+
name: 'Update Waktu Antrean',
305314
path: `/antrean/updatewaktu`,
306315
method: 'POST',
307316
data
@@ -321,6 +330,7 @@ export class Antrean extends BaseApi<'antrean'> {
321330
keterangan: string;
322331
}) {
323332
return this.send({
333+
name: 'Batal Antrean',
324334
path: `/antrean/batal`,
325335
method: 'POST',
326336
data
@@ -350,6 +360,7 @@ export class Antrean extends BaseApi<'antrean'> {
350360
kodebooking: string;
351361
}[]
352362
>({
363+
name: 'List Waktu TaskId',
353364
path: `/antrean/getlisttask`,
354365
method: 'POST',
355366
data: { kodebooking: params.kodeBooking }
@@ -379,6 +390,7 @@ export class Antrean extends BaseApi<'antrean'> {
379390
waktu: string;
380391
}) {
381392
return this.send<{ list: AntreanDashboard[] }>({
393+
name: 'Dashboard Per-Tanggal',
382394
path: `/dashboard/waktutunggu/tanggal/${params.tanggal}/waktu/${params.waktu}`,
383395
method: 'GET',
384396
skipDecrypt: true
@@ -413,6 +425,7 @@ export class Antrean extends BaseApi<'antrean'> {
413425
}) {
414426
const bulan = String(params.bulan).padStart(2, '0');
415427
return this.send<{ list: AntreanDashboard[] }>({
428+
name: 'Dashboard Per-Bulan',
416429
path: `/dashboard/waktutunggu/bulan/${bulan}/tahun/${params.tahun}/waktu/${params.waktu}`,
417430
method: 'GET',
418431
skipDecrypt: true
@@ -426,6 +439,7 @@ export class Antrean extends BaseApi<'antrean'> {
426439
*/
427440
async perTanggal(tanggal: string) {
428441
return this.send<AntreanDetail[]>({
442+
name: 'Antrean Per-Tanggal',
429443
path: `/antrean/pendaftaran/tanggal/${tanggal}`,
430444
method: 'GET'
431445
});
@@ -438,6 +452,7 @@ export class Antrean extends BaseApi<'antrean'> {
438452
*/
439453
async perKodeBooking(kodeBooking: string) {
440454
return this.send<AntreanDetail[]>({
455+
name: 'Antrean Per-KodeBooking',
441456
path: `/antrean/pendaftaran/kodebooking/${kodeBooking}`,
442457
method: 'GET'
443458
});
@@ -448,6 +463,7 @@ export class Antrean extends BaseApi<'antrean'> {
448463
*/
449464
async belumDilayani() {
450465
return this.send<AntreanDetail[]>({
466+
name: 'Antrean Belum Dilayani',
451467
path: `/antrean/pendaftaran/aktif`,
452468
method: 'GET'
453469
});
@@ -470,6 +486,7 @@ export class Antrean extends BaseApi<'antrean'> {
470486
jam: string;
471487
}) {
472488
return this.send<AntreanDetail[]>({
489+
name: 'Antrean Belum Dilayani Per-(Poli, Dokter, Hari, dan Jam Praktik)',
473490
path: `/antrean/pendaftaran/kodepoli/${params.poli}/kodedokter/${params.dokter}/hari/${params.hari}/jampraktek/${params.jam}`,
474491
method: 'GET'
475492
});

src/aplicares.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ export class Aplicares extends BaseApi<'aplicares'> {
1616
},
1717
{ totalitems: number }
1818
>({
19+
name: 'Referensi Kamar',
1920
path: `/rest/ref/kelas`,
2021
method: 'GET',
2122
skipDecrypt: true
@@ -33,6 +34,7 @@ export class Aplicares extends BaseApi<'aplicares'> {
3334
async update(data: AplicaresBedData) {
3435
const { ppkCode } = await this.requiredConfig('ppkCode');
3536
return this.send({
37+
name: 'Update Ketersediaan Tempat Tidur',
3638
path: `/rest/bed/update/${ppkCode}`,
3739
method: 'POST',
3840
skipContentTypeHack: true,
@@ -52,6 +54,7 @@ export class Aplicares extends BaseApi<'aplicares'> {
5254
async create(data: AplicaresBedData) {
5355
const { ppkCode } = await this.requiredConfig('ppkCode');
5456
return this.send<undefined>({
57+
name: 'Ruangan Baru',
5558
path: `/rest/bed/create/${ppkCode}`,
5659
method: 'POST',
5760
skipContentTypeHack: true,
@@ -85,6 +88,7 @@ export class Aplicares extends BaseApi<'aplicares'> {
8588
},
8689
{ totalitems: number }
8790
>({
91+
name: 'Ketersediaan Kamar Faskes',
8892
path: `/rest/bed/read/${ppkCode}/${params.start}/${params.limit}`,
8993
method: 'GET',
9094
skipDecrypt: true
@@ -103,6 +107,7 @@ export class Aplicares extends BaseApi<'aplicares'> {
103107
}) {
104108
const { ppkCode } = await this.requiredConfig('ppkCode');
105109
return this.send<undefined>({
110+
name: 'Hapus Ruangan',
106111
path: `/rest/bed/delete/${ppkCode}`,
107112
method: 'POST',
108113
skipContentTypeHack: true,

src/apotek/monitoring.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ export class Monitoring extends ApotekBaseApi {
3535
}[];
3636
};
3737
}>({
38+
name: this.name + 'Data Klaim',
3839
path: `/monitoring/klaim/${params.bulan}/${params.tahun}/${params.jenisObat}/${params.status}`,
3940
method: 'GET'
4041
});

src/apotek/obat.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ export class Obat extends ApotekBaseApi {
1717
CatKhsObt: string;
1818
}) {
1919
return this.send<null>({
20+
name: this.name + 'Simpan (Non-Racikan)',
2021
path: `/obatnonracikan/v3/insert`,
2122
method: 'POST',
2223
data
@@ -41,6 +42,7 @@ export class Obat extends ApotekBaseApi {
4142
CatKhsObt: string;
4243
}) {
4344
return this.send<null>({
45+
name: this.name + 'Simpan (Racikan)',
4446
path: `/obatracikan/v3/insert`,
4547
method: 'POST',
4648
data

src/apotek/pelayanan-obat.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export class PelayananObat extends ApotekBaseApi {
1414
tipeobat: string;
1515
}) {
1616
return this.send<string>({
17+
name: this.name + 'Hapus',
1718
path: `/pelayanan/obat/hapus/`,
1819
method: 'DELETE',
1920
headers: { 'Content-Type': 'application/json' },
@@ -52,6 +53,7 @@ export class PelayananObat extends ApotekBaseApi {
5253
};
5354
};
5455
}>({
56+
name: this.name + 'List/Daftar',
5557
path: `/pelayanan/obat/daftar/${params.nomorSep}`,
5658
method: 'GET'
5759
});
@@ -85,6 +87,7 @@ export class PelayananObat extends ApotekBaseApi {
8587
}[];
8688
};
8789
}>({
90+
name: this.name + 'Riwayat',
8891
path: `/riwayatobat/${params.awal}/${params.akhir}/${params.nomorKartu}`,
8992
method: 'GET'
9093
});

0 commit comments

Comments
 (0)