hurricane/security_camera/resources/cloud_server/functions/registerDevice.js

const functions = require('firebase-functions');
const cors = require('cors')({origin: true})
const admin = require('firebase-admin');
const db = admin.firestore()
const uuid = require('uuid')
/*************************************************************************************************/
module.exports = functions.https.onRequest((req, res) => {
cors(req, res, () => {});
console.log('Received request: ' + JSON.stringify(req.body));
if(!req.body.code) {
return res.status(400).send('Missing code field');
}
let context = {
device_code: req.body.code.trim().toUpperCase()
}
return retrieveDevice(context).then(() => {
if(!context.deviceRef) {
return res.status(404).send('Device not found');
}
return generateCustomToken(context)
}).then((token) => {
return res.status(200).send({token});
}).catch((err) => {
console.log(`Server error,${err.description || err.message || err}`)
return res.status(500).send(`Server error,${err.description || err.message || err}`);
})
})
/*************************************************************************************************/
const retrieveDevice = (context) => {
const query = db.collection('devices').where('code', '==', context.device_code)
return query.get().then((results) => {
if (results.size > 0) {
context.deviceRef = results.docs[0].ref
context.uuid = results.docs[0].get('uuid')
}
return Promise.resolve()
})
}
/*************************************************************************************************/
const generateCustomToken = function (context) {
let uid = uuid.v4()
let tokenInfo = {
did: context.deviceRef.id,
uuid: context.uuid
}
console.log(`Generating custom token: uid:${uid} did:${tokenInfo.did}, uuid:${tokenInfo.uuid}`)
return admin.auth().createCustomToken(uid, tokenInfo)
.catch((err) => {
throw new Error(`Failed to generate token, err${err.description || err.message}`)
});
}