"use strict"; class GatewayRepo { constructor({ database }) { this.db = database; } add(...gateways) { const statement = this.db.prepare(`INSERT INTO gateways ( id, latitude, longitude, altitude ) VALUES ( :id, :latitude, :longitude, :altitude )`); for(let gateway of gateways) statement.run(gateway); } /** * Determines whether a gateway exists in the dayabase with the given name. * @param {string} id The id of the gateway. * @return {bool} Whether a gateway with the given name exists in the database. */ exists(id) { // Note that normally a count wouldn't be appropriate here just to test for existence, but it's ok because it's guaranteed that there will only ever be a single entry with a given id. let statement = this.db.prepare(`SELECT COUNT(id) AS count FROM gateways WHERE id = :id`); let count = statement.get({ id }).count; return count > 0; } /** * Returns a garteway by it's id. * @param {string} id The id to fetcht he gateway for. * @return {object} The information recorded about the gateway with the specified id . */ get_by_id(id) { return this.db.prepare(`SELECT * FROM gateways WHERE id = :id`).get({ id }); } /** * Iterates over all the gateways in the table. * TODO: Use Symbol.iterator here? * @return {Generator} A generator that can be used with for..of */ iterate() { return this.db.prepare(`SELECT * FROM gateways`).iterate(); } /** * Returns the average location of allt he currently registered gateways. * @return {{latitude: number, longitude: number}} The lat longg coordinates of the average location of all the gateways. */ get_average_location() { let count = 0, lat_sum = 0, lng_sum = 0; for(let gateway of this.iterate()) { lat_sum += gateway.latitude; lng_sum += gateway.longitude; count++; } return { latitude: lat_sum / count, longitude: lng_sum / count }; } } export default GatewayRepo;