Skip to content

Commit

Permalink
Implement most of the regular settings
Browse files Browse the repository at this point in the history
  • Loading branch information
ThePerkinrex committed Jan 3, 2019
1 parent a678558 commit 3260638
Show file tree
Hide file tree
Showing 17 changed files with 1,374 additions and 588 deletions.
1 change: 1 addition & 0 deletions database/setup.cql
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ CREATE TABLE Hermes.Settings (
UUID TIMEUUID,
Username TEXT,
Notifications TINYINT,
Dark BOOLEAN,
Color TEXT,
Image BLOB,
PRIMARY KEY(UUID, Username)
Expand Down
2 changes: 1 addition & 1 deletion rest_test/api_get_setting.rest
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@ POST http://localhost:8080/api/getSettings/ HTTP/1.1
content-type: application/json

{
"uuid": "0f5a48e0-f628-11e8-8971-5b19dbc61f27"
"uuid": "9e813920-0f50-11e9-acc7-9d7907306a39"
}
16 changes: 16 additions & 0 deletions server.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,22 @@ app.get('/js/:file', function (req, res) {
});
});

app.get('/css/settings.css', function (req, res) {
if(req.headers['user-agent'].indexOf('Electron') !== -1){
res.sendFile(css_path + 'settingsCSS/electron.css');
}else{
res.sendFile(css_path + 'settingsCSS/regular.css');
}
});

app.get('/css/dark/settings.css', function (req, res) {
if(req.headers['user-agent'].indexOf('Electron') !== -1){
res.sendFile(css_path + 'dark/settingsCSS/electron.css');
}else{
res.sendFile(css_path + 'dark/settingsCSS/regular.css');
}
});

app.get('/css/:file', function (req, res) {
fileExists(css_path + req.params.file, function (err, exists) {
if (exists) {
Expand Down
31 changes: 25 additions & 6 deletions server/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,6 @@ module.exports = function (app, db, bcrypt, utils) {
data += result[i].username + SEPCHAR;
data += result[i].message + SEPCHAR;
data += result[i].timesent.getTime();
console.log(result[i].message);
if (i != result.length - 1)
data += NULLCHAR;
}
Expand Down Expand Up @@ -178,15 +177,16 @@ module.exports = function (app, db, bcrypt, utils) {
};
});

app.post('/api/saveSettings/:color/:notifications/:image_b64', function (req, res) {
app.post('/api/saveSettings/:color/:notifications/:dark/:image_b64', function (req, res) {
let color = req.params.color;
let dark = req.params.dark=='true';
let notifications = req.params.notifications;
let image_b64 = decodeURIComponent(req.params.image_b64);

let uuid = req.body.uuid;
db.getUserForUUID(uuid).then(user => {
console.log('Saving settings for', user + ':', '#' + color, parseInt(notifications));
db.saveSettingWithUsername(user, color, parseInt(notifications), image_b64).then(() => res.sendStatus(200)).catch(err => {
console.log('Saving settings for', user + ':', '#' + color, parseInt(notifications), dark);
db.saveSettingWithUsername(user, color, parseInt(notifications), image_b64, dark).then(() => res.sendStatus(200)).catch(err => {
if (err == USER_NOT_FOUND_ERROR) {
res.sendStatus(401); // Unauthorized
} else {
Expand All @@ -204,15 +204,34 @@ module.exports = function (app, db, bcrypt, utils) {
});
});

app.get('/api/getSettings/:username', function (req, res) { // Only for chat (Color & image only)
db.getSettingUsername(decodeURIComponent(req.params.username)).then((data) => {
let color = data[0];
let image_b64 = data[2];
console.log(decodeURIComponent(req.params.username), 'got its chat settings:', '#' + color);
res.status(200).send({color: '#' + color,image: image_b64});
}).catch(err => {
if (err == FIELD_REQUIRED_ERROR) {
res.sendStatus(400); // Bad request
} else if (err == USER_NOT_FOUND_ERROR) {
res.sendStatus(401); // Unauthorized
} else {
console.error('ERROR:', err);
res.sendStatus(500);
}
});
});

app.post('/api/getSettings/', function (req, res) {
let uuid = req.body.uuid;
db.getUserForUUID(uuid).then(user => {
db.getSettingUsername(user).then((data) => {
let color = data[0];
let notifications = data[1];
let image_b64 = data[2];
console.log(user, 'got its settings:', '#' + color, notifications);
res.status(200).send('#' + color + SEPCHAR + notifications + SEPCHAR + image_b64);
let dark = data[3];
console.log(user, 'got its settings:', '#' + color, notifications, dark);
res.status(200).send({color: '#' + color, notifications: notifications,image: image_b64,dark: dark});
}).catch(err => {
if (err == FIELD_REQUIRED_ERROR) {
res.sendStatus(400); // Bad request
Expand Down
42 changes: 30 additions & 12 deletions server/db.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ const uuidv1 = require('uuid/v1');
const SESSION_TIMEOUT = 60 * 60 * 24 * 7 // A week in seconds
const DEFAULT_IMAGE = '/9j/4AAQSkZJRgABAQEASABIAAD//gA7Q1JFQVRPUjogZ2QtanBlZyB2MS4wICh1c2luZyBJSkcgSlBFRyB2NjIpLCBxdWFsaXR5ID0gOTAK/9sAQwAEAgMDAwIEAwMDBAQEBAUJBgUFBQULCAgGCQ0LDQ0NCwwMDhAUEQ4PEw8MDBIYEhMVFhcXFw4RGRsZFhoUFhcW/8AACwgAgACAAQERAP/EABwAAQACAwEBAQAAAAAAAAAAAAAGBwMEBQIBCP/EADgQAAICAQICBwQJAwUAAAAAAAABAgMEBREGIQcSEzFBUWFxgZGhFBUiMlKxweHwIzOyQmOCktH/2gAIAQEAAD8A/RQAAAAAAAAAAAAAAAAAAAAAAAAABkxaLsjIhRRXKy2x9WMYrdtk74a4Foqgr9Xfa2Nb9hCW0I+1rm37OXtJZhYGFhxUcbEopS/BWonrMw8TKj1cnFpuT8LK1L8yLcR8C4eRB3aVL6Nd39lJt1y/Vfl6EBzsa/Dyp4+TXKu2t7Si/AwgAAAAs7o84fhpmnrMyIL6Zet3uudUX3RXr5/DwJMACP8AHOg16xp0p1QSzKYt1S8ZL8D9H4eT95Vkk4ycZJxaezT70fAAAAdfgbBjn8T41M1vXCXaT9VHnt73sveW6AACqukvAjhcU2uEdoZMVckvN7qXzTfvOAAAACV9ECT4nu3S3WJLb/vAskAAFe9MiX1phPbn2Muf/IhoAAAO70cZccTi7H672jf1qm/Vrl80i1wAAVf0qZayeKpVRe6xao1vbz5yf+W3uI2AAAD1XOULIzhJxlFpxku9PzLc4R1erWdIryOsu2glG+K/0z/8fev2OsADncSanRpGl2ZlzTcVtXDfnOXgv54blQZV1mTk2ZF0utZbNynLzbe7MYAAAB0eGdSz9N1KNmApWTn9mVKTkrV5NItfSMi3LwoX3YluLOX3qrdusv2+HsNwGvqWRPFw53wxrciUVyqrScpFUcW6rqGqalKWdCVKr3UMdppVr2Px82coAAAA7/CHC2XrUlfY3Rhp87Guc/SK/Xu9pYui6Rp+lUKvCxlB7bSm1vKXtf8AEdAAGhrOk6fqtHZZuNCzZfZl3Tj7Jd6K74w4VytHbyKW78Pf+5t9qv0kv1/IjwAABIuAOHXrGY8jJTWHRJdf/cl+Ffr+5Z1VcKq1XXFRhBJRilskl4IyAAAx21wtrddkVKE01KMlumn4MrLpA4c+qMpZWLFvDulsl39lL8L9PL+bxwAA2NKw7tQ1GnCoW9l01Fb9y82/RLd+4uHSMKjTtOqwseO1dUeqn4t+Lfq3zNsAAAGrquHTn4FuHfFOu6PVfmvJr1T5lPaxhW6dqd+Ff9+mbjvt95eD962ZrAAm3Q/p6nfk6nOO6r/o1P1fOXy2+LJ8AAAACB9MGnJSxtUrjt1v6NrXxi/8vkQcAFs9HmKsXhLEW2zti7ZPz6z3Xy2O2AAAADi8e4v0zhPMhtzrr7WL8nH7T+Sa95UoALr0mpU6VjUpbKumEfhFI2QAAAAYNQgrsG+p81OqUfimikgf/9k='


let USER_NOT_FOUND_ERROR = new Error('User not found');
USER_NOT_FOUND_ERROR.code = 10000;
let USER_NOT_LOGGED_IN_ERROR = new Error('User not found or not logged in');
Expand All @@ -23,6 +24,20 @@ function escapeCQL(str = '') {
return str;
}

function getRandomHEXPart() {
// Random RGB part to hex
var hexString = (Math.floor(Math.random() * 150 + 50)).toString(16);
if (hexString.length % 2) {
// Pad it of it's small
hexString = '0' + hexString;
}
return hexString;
}

function createColor(){
return getRandomHEXPart()+getRandomHEXPart()+getRandomHEXPart();
}

module.exports = class {
constructor() {
this.client = new cassandra.Client({ contactPoints: ['127.0.0.1:9042'], keyspace: 'hermes' })
Expand Down Expand Up @@ -57,7 +72,9 @@ module.exports = class {
const query = 'INSERT INTO Users (UUID, Username, PasswordHash) values(now(),?,?) IF NOT EXISTS;';
let data = [user, passwordHash];
return new Promise((resolve, reject) => {
this.client.execute(query, data, { prepare: true }).then(result => resolve()).catch(err => reject(err));
this.client.execute(query, data, { prepare: true }).then(result => {
this.saveSettingWithUsername(user,createColor()).then(result => resolve()).catch(err => reject(err));
}).catch(err => reject(err));
});
}

Expand Down Expand Up @@ -174,14 +191,14 @@ module.exports = class {
});
}

saveSettingWithUsername(username, color, notifications = NOTIFICATIONS_ON, image_b64 = DEFAULT_IMAGE) {
saveSettingWithUsername(username, color, notifications = NOTIFICATIONS_ON, image_b64 = DEFAULT_IMAGE, dark = false) {
const query = 'SELECT UUID FROM Users WHERE Username=? allow filtering;';
let data = [username];
return new Promise((resolve, reject) => {
this.client.execute(query, data, { prepare: true }).then(result => {
let uuidRow = result.first();
if (uuidRow) {
this.saveSetting(uuidRow.uuid, username, color, notifications, image_b64).then(() => {
this.saveSetting(uuidRow.uuid, username, color, notifications, image_b64, dark).then(() => {
resolve();
}).catch(err => reject(err));
} else {
Expand All @@ -191,14 +208,14 @@ module.exports = class {
});
}

saveSettingWithUUID(uuid, color, notifications = NOTIFICATIONS_ON, image_b64 = DEFAULT_IMAGE) {
saveSettingWithUUID(uuid, color, notifications = NOTIFICATIONS_ON, image_b64 = DEFAULT_IMAGE, dark = false) {
const query = 'SELECT Username FROM Users WHERE UUID=?;';
let data = [uuid];
return new Promise((resolve, reject) => {
this.client.execute(query, data, { prepare: true }).then(result => {
let userRow = result.first();
if (userRow) {
this.saveSetting(uuid, userRow.username, color, notifications, image_b64).then(() => {
this.saveSetting(uuid, userRow.username, color, notifications, image_b64, dark).then(() => {
resolve();
}).catch(err => reject(err));
} else {
Expand All @@ -208,10 +225,11 @@ module.exports = class {
});
}

saveSetting(uuid, username, color, notifications = NOTIFICATIONS_ON, image_b64 = DEFAULT_IMAGE) {
const query = 'INSERT INTO Settings (UUID, Username, Color, Notifications, textAsBlob(Image)) values(?,?,?,?);';
saveSetting(uuid, username, color, notifications = NOTIFICATIONS_ON, image_b64 = DEFAULT_IMAGE, dark = false) {
const query = 'INSERT INTO Settings (UUID, Username, Color, Notifications, Image, dark) values(?,?,?,?,textAsBlob(?),?);';
return new Promise((resolve, reject) => {
let data = [uuid, username, color, notifications, image_b64];
let data = [uuid, username, color, notifications, image_b64, dark];
//console.log(data);
this.client.execute(query, data, { prepare: true }).then(result => {
resolve();
}).catch(err => reject(err));
Expand All @@ -228,26 +246,26 @@ module.exports = class {

getSetting(uuid = undefined, username = undefined) {
if (uuid) {
const query = 'SELECT color, notifications, blobAsText(image) as image FROM Settings WHERE uuid=?;';
const query = 'SELECT color, notifications, blobAsText(image) as image, dark FROM Settings WHERE uuid=?;';
return new Promise((resolve, reject) => {
let data = [uuid];
this.client.execute(query, data, { prepare: true }).then(result => {
let userRow = result.first();
if (userRow) {
resolve([userRow.color, userRow.notifications, userRow.image]);
resolve([userRow.color, userRow.notifications, userRow.image, userRow.dark]);
} else {
reject(USER_NOT_FOUND_ERROR);
}
}).catch(err => reject(err));
});
} else if (username) {
const query = 'SELECT color, notifications, blobAsText(image) as image FROM Settings WHERE username=? ALLOW FILTERING;';
const query = 'SELECT color, notifications, blobAsText(image) as image, dark FROM Settings WHERE username=? ALLOW FILTERING;';
return new Promise((resolve, reject) => {
let data = [username];
this.client.execute(query, data, { prepare: true }).then(result => {
let userRow = result.first();
if (userRow) {
resolve([userRow.color, userRow.notifications, userRow.image]);
resolve([userRow.color, userRow.notifications, userRow.image, userRow.dark]);
} else {
reject(USER_NOT_FOUND_ERROR);
}
Expand Down

0 comments on commit 3260638

Please sign in to comment.