1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-12-22 19:07:54 +01:00
unleash.unleash/lib/db/client-instance-store.js
Ivar eb346756d2 Clean up intervals.
We use intervals in three places and we could probably organise them
better in the future. As long as they all do unref they do not form
any issues for us and I will just let them be as is for now.

This closes #186
2020-02-20 08:33:46 +01:00

104 lines
2.6 KiB
JavaScript

/* eslint camelcase: "off" */
'use strict';
const logger = require('../logger')('client-instance-store.js');
const COLUMNS = [
'app_name',
'instance_id',
'sdk_version',
'client_ip',
'last_seen',
'created_at',
];
const TABLE = 'client_instances';
const ONE_DAY = 24 * 61 * 60 * 1000;
const mapRow = row => ({
appName: row.app_name,
instanceId: row.instance_id,
sdkVersion: row.sdk_version,
clientIp: row.client_ip,
lastSeen: row.last_seen,
createdAt: row.created_at,
});
class ClientInstanceStore {
constructor(db) {
this.db = db;
const clearer = () => this._removeInstancesOlderThanTwoDays();
setTimeout(clearer, 10).unref();
setInterval(clearer, ONE_DAY).unref();
}
_removeInstancesOlderThanTwoDays() {
this.db(TABLE)
.whereRaw("created_at < now() - interval '2 days'")
.del()
.then(res => res > 0 && logger.info(`Deleted ${res} instances`));
}
updateRow(details) {
return this.db(TABLE)
.where('app_name', details.appName)
.where('instance_id', details.instanceId)
.update({
last_seen: 'now()',
client_ip: details.clientIp,
sdk_version: details.sdkVersion,
});
}
insertNewRow(details) {
return this.db(TABLE).insert({
app_name: details.appName,
instance_id: details.instanceId,
sdk_version: details.sdkVersion,
client_ip: details.clientIp,
});
}
insert(details) {
return this.db(TABLE)
.count('*')
.where('app_name', details.appName)
.where('instance_id', details.instanceId)
.map(row => ({ count: row.count }))
.then(rows => {
if (rows[0].count > 0) {
return this.updateRow(details);
} else {
return this.insertNewRow(details);
}
});
}
getAll() {
return this.db
.select(COLUMNS)
.from(TABLE)
.orderBy('last_seen', 'desc')
.map(mapRow);
}
getByAppName(appName) {
return this.db
.select()
.from(TABLE)
.where('app_name', appName)
.orderBy('last_seen', 'desc')
.map(mapRow);
}
getApplications() {
return this.db
.distinct('app_name')
.select(['app_name'])
.from(TABLE)
.orderBy('app_name', 'desc')
.map(mapRow);
}
}
module.exports = ClientInstanceStore;