Completed the UniFi create voucher flow.

This commit is contained in:
Glenn de Haan
2018-02-27 21:25:04 +01:00
parent acd81fb2b2
commit a80c585f4a
8 changed files with 173 additions and 8 deletions

View File

@@ -1,5 +1,6 @@
const uuidv4 = require('uuid/v4'); const uuidv4 = require('uuid/v4');
const config = require('../../config/config'); const config = require('../../config/config');
const unifi = require('./UniFi');
class Socket { class Socket {
constructor(server) { constructor(server) {
@@ -65,6 +66,47 @@ class Socket {
} }
}); });
/**
* Create voucher method
*/
socket.on('voucher', (data) => {
if(typeof this.authenticatedUsers[data.uuid] !== "undefined") {
if(this.authenticatedUsers[data.uuid]) {
unifi((voucher) => {
if(voucher !== false) {
socket.emit('voucher', {
success: true,
voucher: voucher
});
console.log(`[SOCKET][${socket.id}] Client voucher: OK. Voucher: ${voucher}!`);
} else {
socket.emit('voucher', {
success: false,
voucher: ''
});
console.log(`[SOCKET][${socket.id}] Client voucher: FAILED. UniFi Error!`);
}
});
} else {
socket.emit('voucher', {
success: false,
voucher: ''
});
console.log(`[SOCKET][${socket.id}] Client voucher: FAILED. Not authenticated!`);
}
} else {
socket.emit('voucher', {
success: false,
voucher: ''
});
console.log(`[SOCKET][${socket.id}] Client voucher: FAILED. Invalid UUID!`);
}
});
console.log(`[SOCKET] New client connected! ID: ${socket.id}`); console.log(`[SOCKET] New client connected! ID: ${socket.id}`);
}); });

View File

@@ -0,0 +1,42 @@
const unifi = require('node-unifi');
const config = require('../../config/config');
/**
* Create new UniFi controller object
*
* @type {Controller}
*/
const controller = new unifi.Controller(config.unifi.ip, config.unifi.port);
module.exports = (callback) => {
controller.login(config.unifi.username, config.unifi.password, (err) => {
if(err) {
console.log(`[UNIFI] Error: ${err}`);
callback(false);
return;
}
// CREATE VOUCHER
controller.createVouchers(config.unifi.siteID, 480, (err, voucher_data) => {
if(err) {
console.log(`[UNIFI] Error: ${err}`);
callback(false);
return;
}
// GET VOUCHER CODE
controller.getVouchers(config.unifi.siteID, (err, voucher_data_complete) => {
if(err) {
console.log(`[UNIFI] Error: ${err}`);
callback(false);
return;
}
const voucher = `${[voucher_data_complete[0][0].code.slice(0, 5), '-', voucher_data_complete[0][0].code.slice(5)].join('')}`;
callback(voucher);
controller.logout();
}, voucher_data[0][0].create_time);
}, 1, 1);
});
};

View File

@@ -6,10 +6,21 @@
<div id="sign-in"> <div id="sign-in">
<h3>Access Code</h3> <h3>Access Code</h3>
<input type="text" class="access-fields" title="number-1" maxlength="1"> <input type="number" class="access-fields" title="number-1" maxlength="1">
<input type="text" class="access-fields" title="number-2" maxlength="1"> <input type="number" class="access-fields" title="number-2" maxlength="1">
<input type="text" class="access-fields" title="number-3" maxlength="1"> <input type="number" class="access-fields" title="number-3" maxlength="1">
<input type="text" class="access-fields" title="number-4" maxlength="1"> <input type="number" class="access-fields" title="number-4" maxlength="1">
</div>
<div id="voucher" class="hidden">
<h3>Voucher:</h3>
<h4>XXXXX-XXXXX</h4>
<p>
This voucher is valid for one day on one device.
</p>
<button>
Generate
</button>
</div> </div>
<div id="error" class="hidden"> <div id="error" class="hidden">

9
package-lock.json generated
View File

@@ -5374,6 +5374,15 @@
} }
} }
}, },
"node-unifi": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/node-unifi/-/node-unifi-1.2.2.tgz",
"integrity": "sha1-ObpLOgIzwNNwm2Rz7vAdv3/W9E8=",
"requires": {
"async": "2.6.0",
"request": "2.79.0"
}
},
"nodemon": { "nodemon": {
"version": "1.15.1", "version": "1.15.1",
"resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.15.1.tgz", "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-1.15.1.tgz",

View File

@@ -63,6 +63,7 @@
"gsap": "^1.20.4", "gsap": "^1.20.4",
"mitt": "^1.1.3", "mitt": "^1.1.3",
"node-sass": "^4.7.2", "node-sass": "^4.7.2",
"node-unifi": "^1.2.2",
"particles.js": "^2.0.0", "particles.js": "^2.0.0",
"postcss": "^6.0.19", "postcss": "^6.0.19",
"postcss-loader": "^2.1.1", "postcss-loader": "^2.1.1",

View File

@@ -9,10 +9,14 @@ export default class Socket {
this.mainContainer = document.querySelector("#container"); this.mainContainer = document.querySelector("#container");
this.signInContainer = document.querySelector("#sign-in"); this.signInContainer = document.querySelector("#sign-in");
this.voucherContainer = document.querySelector("#voucher");
this.errorContainer = document.querySelector("#error"); this.errorContainer = document.querySelector("#error");
this.preloader = document.querySelector("#preloader");
this.tl = new TimelineMax(); this.tl = new TimelineMax();
document.querySelector("#voucher button").addEventListener("click", () => this.requestVoucher());
this.init(); this.init();
} }
@@ -28,6 +32,7 @@ export default class Socket {
this.socket.on('uuid', (data) => this.setUuid(data)); this.socket.on('uuid', (data) => this.setUuid(data));
this.socket.on('auth', (data) => this.auth(data)); this.socket.on('auth', (data) => this.auth(data));
this.socket.on('voucher', (data) => this.voucher(data));
} }
/** /**
@@ -36,7 +41,7 @@ export default class Socket {
connect() { connect() {
console.log('[SOCKET] Connected!'); console.log('[SOCKET] Connected!');
if(!this.uuid) { if (!this.uuid) {
console.log('[SOCKET] Requesting UUID!'); console.log('[SOCKET] Requesting UUID!');
this.socket.emit('uuid'); this.socket.emit('uuid');
} }
@@ -47,9 +52,12 @@ export default class Socket {
display: "none" display: "none"
}) })
.add(() => { .add(() => {
if(!this.userSignedIn) { if (!this.userSignedIn) {
this.signInContainer.classList.remove("hidden"); this.signInContainer.classList.remove("hidden");
} else {
this.voucherContainer.classList.remove("hidden");
} }
this.errorContainer.classList.add("hidden"); this.errorContainer.classList.add("hidden");
}) })
.to(this.mainContainer, 0.5, { .to(this.mainContainer, 0.5, {
@@ -71,6 +79,7 @@ export default class Socket {
}) })
.add(() => { .add(() => {
this.signInContainer.classList.add("hidden"); this.signInContainer.classList.add("hidden");
this.voucherContainer.classList.add("hidden");
this.errorContainer.classList.remove("hidden"); this.errorContainer.classList.remove("hidden");
}) })
.to(this.mainContainer, 0.5, { .to(this.mainContainer, 0.5, {
@@ -92,6 +101,7 @@ export default class Socket {
}) })
.add(() => { .add(() => {
this.signInContainer.classList.add("hidden"); this.signInContainer.classList.add("hidden");
this.voucherContainer.classList.add("hidden");
this.errorContainer.classList.remove("hidden"); this.errorContainer.classList.remove("hidden");
}) })
.to(this.mainContainer, 0.5, { .to(this.mainContainer, 0.5, {
@@ -105,14 +115,13 @@ export default class Socket {
*/ */
setUuid(data) { setUuid(data) {
this.uuid = data.uuid; this.uuid = data.uuid;
console.log('this.uuid', this.uuid);
} }
/** /**
* Event for getting the auth result * Event for getting the auth result
*/ */
auth(data) { auth(data) {
if(data.success) { if (data.success) {
this.userSignedIn = true; this.userSignedIn = true;
this.tl this.tl
@@ -121,7 +130,9 @@ export default class Socket {
display: "none" display: "none"
}) })
.add(() => { .add(() => {
site.modules.Signin.resetForm();
this.signInContainer.classList.add("hidden"); this.signInContainer.classList.add("hidden");
this.voucherContainer.classList.remove("hidden");
}) })
.to(this.mainContainer, 0.5, { .to(this.mainContainer, 0.5, {
opacity: 1, opacity: 1,
@@ -131,4 +142,29 @@ export default class Socket {
site.modules.Signin.invalidCode(); site.modules.Signin.invalidCode();
} }
} }
/**
* Request a guest voucher
*/
requestVoucher() {
if (this.userSignedIn) {
this.preloader.classList.remove("completed");
this.socket.emit('voucher', {
uuid: this.uuid
});
}
}
/**
* Process the voucher
*
* @param data
*/
voucher(data) {
this.preloader.classList.add("completed");
if (data.success) {
this.voucherContainer.querySelector("h4").innerHTML = data.voucher;
}
}
} }

View File

@@ -57,4 +57,13 @@ export default class Signin {
this.fields[field].value = ""; this.fields[field].value = "";
} }
} }
/**
* Clear the inputs
*/
resetForm() {
for(let field = 0; field < this.fields.length; field++) {
this.fields[field].value = "";
}
}
} }

View File

@@ -21,3 +21,18 @@ input {
border: #F00 solid 2px; border: #F00 solid 2px;
} }
} }
button {
background-image: linear-gradient(to bottom, #3498db, #2980b9);
border-radius: 7px;
box-shadow: 0px 1px 3px #666666;
color: #ffffff;
font-size: 18px;
padding: 6px;
text-decoration: none;
}
button:hover {
background-image: linear-gradient(to bottom, #3cb0fd, #3498db);
text-decoration: none;
}