diff --git a/controllers/devices.js b/controllers/devices.js index ced90ae..f1eb879 100644 --- a/controllers/devices.js +++ b/controllers/devices.js @@ -107,6 +107,21 @@ async function getDeviceFromDongle(dongleId) { } return devices.dataValues; } +// TODO combine these redundant functions into one +async function getDeviceFromSerial(serial) { + if (!serial) return null; + const devices = await orm.models.device.findOne({ where: { serial } }); + if (!devices || !devices.dataValues) { + return null; + } + return devices.dataValues; +} + +async function updateDevice(dongleId, data) { + if (!dongleId) return null; + + return orm.models.device.update(data, { where: { dongle_id: dongleId } }); +} async function setIgnoredUploads(dongleId, isIgnored) { await orm.models.accounts.update( @@ -245,6 +260,63 @@ async function getBootlogs(dongleId) { return bootlogFiles; } +async function updateOrCreateDrive(dongleId, identifier, data) { + const check = orm.models.drives.findOne({ where: { dongle_id: dongleId, identifier } }); + + if (check.dataValues) { + return { error: true, msg: 'DRIVE_EXISTS', drive_already_exits: true }; + } + + return orm.models.drives.create({ + ...data, + dongle_Id: dongleId, + identifier, + }); +} + +async function updateOrCreateDriveSegment(dongleId, identifier, segmentId, data) { + console.log(orm); + const check = orm.models.drive_segments.findOne({ + where: { dongle_id: dongleId, drive_identifier: identifier }, + }); + + if (check.dataValues) { + return { error: true, msg: 'DRIVE_EXISTS', drive_already_exits: true }; + } + + return orm.models.drive_segments.create({ + ...data, + segment_id: segmentId, + drive_identifier: identifier, + dongle_id: dongleId, + }); +} + +async function getDriveSegment(dongleId, driveName, segment) { + return orm.models.drive_segments.findOne({ + + where: { + segment_id: segment, + drive_identifier: driveName, + dongle_id: dongleId, + }, + }); +} + +async function createDongle(dongleId, accountId, imei, serial, publicKey) { + return orm.models.device.create({ + dongle_id: dongleId, + account_id: 0, + imei, + serial, + device_type: 'freon', + public_key: publicKey, + created: Date.now(), + last_ping: Date.now(), + storage_used: 0, + }); +} + module.exports = { pairDevice, unpairDevice, @@ -257,10 +329,15 @@ module.exports = { updateLastPing, isUserAuthorised, getOwnersFromDongle, + createDongle, + getDeviceFromSerial, + updateDevice, // drive stuff, move maybe? getDrives, getBootlogs, getCrashlogs, getDriveFromidentifier, + updateOrCreateDrive, + updateOrCreateDriveSegment, }; diff --git a/models/index.model.js b/models/index.model.js index 4c9e391..f36571e 100644 --- a/models/index.model.js +++ b/models/index.model.js @@ -17,6 +17,7 @@ const modelDefiners = [ require('./athena_action_log.model'), require('./athena_returned_data.model'), require('./device_authorised_users.model'), + require('./drive_segments.model'), ]; for (const modelDefiner of modelDefiners) { diff --git a/routes/api.js b/routes/api.js index eeeaf61..e5fe660 100644 --- a/routes/api.js +++ b/routes/api.js @@ -28,6 +28,7 @@ async function dbConnect() { dbConnect(); + // DRIVE & BOOT/CRASH LOG FILE UPLOAD HANDLING router.put('/backend/post_upload', bodyParser.raw({ inflate: true, @@ -284,51 +285,40 @@ async function upload(req, res) { const timeSplit = driveName.split('--'); const timeString = `${timeSplit[0]} ${timeSplit[1].replace(/-/g, ':')}`; - const driveResult = await models.run( - 'INSERT INTO drives (identifier, dongle_id, max_segment, duration, distance_meters, filesize, upload_complete, is_processed, drive_date, created, last_upload, is_preserved, is_deleted, is_physically_removed) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)', - driveName, - dongleId, - segment, - 0, - 0, - 0, - false, - false, - Date.parse(timeString), - Date.now(), - Date.now(), - false, - false, - false, - ).catch((err) => {logger.warn("303", err)}) + const driveResult = await deviceController.updateOrCreateDrive(dongleId, identifier, { + max_segment: segment, + duration: 0, + distance_meters: 0, + filesize: 0, + upload_complete: false, + is_processed: false, + drive_date: Date.parse(timeString), + created: Date.now(), + last_upload: Date.now(), + is_preserved: false, + is_deleted: false, + is_physically_removed: false, + }) - await models.run( - 'INSERT INTO drive_segments (segment_id, drive_identifier, dongle_id, duration, distance_meters, upload_complete, is_processed, is_stalled, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', - segment, - driveName, - dongleId, - 0, - 0, - false, - false, - false, - Date.now(), - ).catch((err) => {logger.warn("316", err)}) + await deviceController.updateOrCreateDriveSegment(dongleId, driveName, segment, { + duration: 0, + distance_meters: 0, + upload_complete: false, + is_processed: false, + is_stalled: false, + created: Date.now(), + }) logger.info(`HTTP.UPLOAD_URL created new drive #${JSON.stringify(driveResult.lastID)}`); } else { - await models.run( - 'UPDATE drives SET last_upload = ?, max_segment = ?, upload_complete = ?, is_processed = ? WHERE identifier = ? AND dongle_id = ?', - Date.now(), - Math.max(drive.max_segment, segment), - false, - false, - driveName, - dongleId, - ).catch((err) => {logger.warn("328", err)}) - - const driveSegment = await models.get('SELECT * FROM drive_segments WHERE drive_identifier = ? AND dongle_id = ? AND segment_id = ?', driveName, dongleId, segment); + await deviceController.updateOrCreateDrive(dongleId, driveName, { + max_segment: Math.max(drive.max_segment, segment), + upload_complete: false, + is_processed: false, + last_upload: Date.now(), + }) + const driveSegment = await driveController.getDriveSegment(dongleId, driveName, segment); if (driveSegment == null) { await models.run( 'INSERT INTO drive_segments (segment_id, drive_identifier, dongle_id, duration, distance_meters, upload_complete, is_processed, is_stalled, created) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', @@ -342,15 +332,20 @@ async function upload(req, res) { false, Date.now(), ).catch((err) => {logger.warn("344", err)}) + + await deviceController.updateOrCreateDriveSegment(dongleId, driveName, segment, { + duration: 0, + distance_meters: 0, + upload_complete: false, + is_processed: false, + is_stalled: false, + created: Date.now() + }) } else { - await models.run( - 'UPDATE drive_segments SET upload_complete = ?, is_stalled = ? WHERE drive_identifier = ? AND dongle_id = ? AND segment_id = ?', - false, - false, - driveName, - dongleId, - segment, - ).catch((err) => {logger.warn("353", err)}) + await deviceController.updateOrCreateDriveSegment(dongleId, driveName, segment, { + is_processed: false, + is_stalled: false, + }) } logger.info(`HTTP.UPLOAD_URL updated existing drive: ${JSON.stringify(drive)}`); @@ -391,7 +386,7 @@ router.post('/v2/pilotauth/', bodyParser.urlencoded({ extended: true }), async ( return res.status(400).send('Malformed Request.'); } - const device = await models.get('SELECT * FROM devices WHERE serial = ?', serial); + const device = await deviceController.getDeviceFromSerial(serial) if (device == null) { logger.info(`HTTP.V2.PILOTAUTH REGISTERING NEW DEVICE (${imei1}, ${serial})`); @@ -401,20 +396,10 @@ router.post('/v2/pilotauth/', bodyParser.urlencoded({ extended: true }), async ( const dongleId = crypto.randomBytes(4).toString('hex'); const isDongleIdTaken = await models.get('SELECT * FROM devices WHERE serial = ?', serial); if (isDongleIdTaken == null) { - await models.run( - 'INSERT INTO devices (dongle_id, account_id, imei, serial, device_type, public_key, created, last_ping, storage_used) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)', - dongleId, - 0, - imei1, - serial, - 'freon', - publicKey, - Date.now(), - Date.now(), - 0, - ); + await deviceController.createDongle(dongleId, 0, imei1, serial, publicKey) - const newDevice = await models.get('SELECT * FROM devices WHERE dongle_id = ?', dongleId); + + const newDevice = await deviceController.getDeviceFromDongle(dongleId); logger.info(`HTTP.V2.PILOTAUTH REGISTERED NEW DEVICE: ${JSON.stringify(newDevice)}`); return res.status(200).json({ dongle_id: newDevice.dongle_id, access_token: 'DEPRECATED-BUT-REQUIRED-FOR-07' }); @@ -422,12 +407,7 @@ router.post('/v2/pilotauth/', bodyParser.urlencoded({ extended: true }), async ( } } - await models.run( - 'UPDATE devices SET last_ping = ?, public_key = ? WHERE dongle_id = ?', - Date.now(), - publicKey, - device.dongle_id, - ); + await deviceController.updateDevice(device.dongle_id, {last_ping: Date.now(), public_key: publicKey}) logger.info(`HTTP.V2.PILOTAUTH REACTIVATING KNOWN DEVICE (${imei1}, ${serial}) with dongle_id ${device.dongle_id}`); return res.status(200).json({ dongle_id: device.dongle_id, access_token: 'DEPRECATED-BUT-REQUIRED-FOR-07' });