mirror of
https://github.com/glenndehaan/unifi-voucher-site.git
synced 2026-04-05 08:54:17 -04:00
Completed the UniFi create voucher flow.
This commit is contained in:
@@ -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}`);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
42
app/helpers/modules/UniFi.js
Normal file
42
app/helpers/modules/UniFi.js
Normal 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);
|
||||||
|
});
|
||||||
|
};
|
||||||
@@ -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
9
package-lock.json
generated
@@ -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",
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user