diff --git a/src/lib/db/client-instance-store.ts b/src/lib/db/client-instance-store.ts index f0f75f5821..01cd271fce 100644 --- a/src/lib/db/client-instance-store.ts +++ b/src/lib/db/client-instance-store.ts @@ -78,10 +78,18 @@ export default class ClientInstanceStore implements IClientInstanceStore { clientIp, }: INewClientInstance): Promise { await this.db(TABLE) - .update({ last_seen: new Date(), client_ip: clientIp }) - .where({ app_name: appName, instance_id: instanceId, environment }) + .insert({ + app_name: appName, + instance_id: instanceId, + environment, + last_seen: new Date(), + client_ip: clientIp, + }) .onConflict(['app_name', 'instance_id', 'environment']) - .ignore(); + .merge({ + last_seen: new Date(), + client_ip: clientIp, + }); } async bulkUpsert(instances: INewClientInstance[]): Promise { @@ -97,7 +105,10 @@ export default class ClientInstanceStore implements IClientInstanceStore { instanceId, }: Pick): Promise { await this.db(TABLE) - .where({ app_name: appName, instance_id: instanceId }) + .where({ + app_name: appName, + instance_id: instanceId, + }) .del(); } @@ -113,7 +124,10 @@ export default class ClientInstanceStore implements IClientInstanceStore { 'appName' | 'instanceId' >): Promise { const row = await this.db(TABLE) - .where({ app_name: appName, instance_id: instanceId }) + .where({ + app_name: appName, + instance_id: instanceId, + }) .first(); return mapRow(row); } diff --git a/src/test/e2e/api/client/metrics.e2e.test.ts b/src/test/e2e/api/client/metrics.e2e.test.ts index 67e436d092..e81b637979 100644 --- a/src/test/e2e/api/client/metrics.e2e.test.ts +++ b/src/test/e2e/api/client/metrics.e2e.test.ts @@ -11,6 +11,13 @@ beforeAll(async () => { app = await setupApp(db.stores); }); +afterEach(async () => { + await Promise.all([ + db.stores.clientMetricsStoreV2.deleteAll(), + db.stores.clientInstanceStore.deleteAll(), + ]); +}); + afterAll(async () => { await app.destroy(); await db.destroy(); @@ -46,3 +53,14 @@ test('should accept empty client metrics', async () => { }) .expect(202); }); + +test('should create instance if does not exist', async () => { + const instances = await db.stores.clientInstanceStore.getAll(); + expect(instances.length).toBe(0); + await app.request + .post('/api/client/metrics') + .send(metricsExample) + .expect(202); + const finalInstances = await db.stores.clientInstanceStore.getAll(); + expect(finalInstances.length).toBe(1); +});