Skip to content

Commit

Permalink
Add Event Trigger configuration UI (#84)
Browse files Browse the repository at this point in the history
  • Loading branch information
cheton committed Feb 28, 2017
1 parent b067a41 commit 3bc807e
Show file tree
Hide file tree
Showing 26 changed files with 951 additions and 158 deletions.
25 changes: 16 additions & 9 deletions package.json
Expand Up @@ -49,7 +49,7 @@
"start": "./bin/cnc",
"start-electron": "electron ./dist/cnc/main",
"watch-dev": "webpack --watch --config webpack.backend-config.development.js",
"start-dev": "NODE_ENV=development ./bin/cnc -vvv -p 8000",
"start-dev": "NODE_ENV=development ./bin/cnc -vv -p 8000",
"dev": "npm run build-dev && npm run start-dev",
"prod": "npm run build-prod && NODE_ENV=production ./bin/cnc",
"lint": "npm run eslint && npm run stylint",
Expand All @@ -70,7 +70,9 @@
},
"mac": {
"category": "public.app-category.productivity",
"target": ["dmg"],
"target": [
"dmg"
],
"icon": "build/icon.icns"
},
"dmg": {
Expand All @@ -93,11 +95,15 @@
]
},
"win": {
"target": ["nsis"],
"target": [
"nsis"
],
"icon": "build/icon.ico"
},
"linux": {
"target": ["deb"]
"target": [
"deb"
]
}
},
"keywords": [
Expand All @@ -121,6 +127,7 @@
"@trendmicro/react-interpolate": "~0.5.1",
"@trendmicro/react-modal": "~0.6.0",
"@trendmicro/react-paginations": "~0.5.1",
"@trendmicro/react-toggle-switch": "~0.5.1",
"async": "~2.1.5",
"babel-runtime": "~6.23.0",
"bcrypt-nodejs": "0.0.3",
Expand Down Expand Up @@ -151,7 +158,7 @@
"gcode-toolpath": "~1.1.1",
"history": "~3.2.1",
"hogan.js": "~3.0.2",
"i18next": "~7.0.1",
"i18next": "~7.1.0",
"i18next-browser-languagedetector": "~1.0.1",
"i18next-express-middleware": "~1.0.2",
"i18next-node-fs-backend": "~0.1.3",
Expand Down Expand Up @@ -197,8 +204,8 @@
"redux": "~3.6.0",
"semver": "~5.3.0",
"serialport": "~4.0.7",
"serve-favicon": "~2.4.0",
"serve-static": "~1.11.2",
"serve-favicon": "~2.4.1",
"serve-static": "~1.12.0",
"session-file-store": "~1.0.0",
"sha1": "~1.1.1",
"shortid": "~2.2.6",
Expand Down Expand Up @@ -234,7 +241,7 @@
"css-loader": "~0.26.2",
"css-split-webpack-plugin": "~0.2.3",
"electron": "~1.4.15",
"electron-builder": "~14.4.0",
"electron-builder": "~14.5.1",
"electron-rebuild": "~1.5.7",
"eslint": "~3.16.1",
"eslint-config-trendmicro": "~0.5.1",
Expand Down Expand Up @@ -273,7 +280,7 @@
"stylint-loader": "~1.0.0",
"stylus": "~0.54.5",
"stylus-loader": "~2.5.0",
"tap": "~10.2.1",
"tap": "~10.2.2",
"text-table": "~0.2.0",
"transform-loader": "~0.2.4",
"url-loader": "~0.5.8",
Expand Down
53 changes: 30 additions & 23 deletions src/app/api/api.events.js
Expand Up @@ -9,7 +9,8 @@ import {
} from '../constants';

export const fetchEvents = (req, res) => {
const events = _.orderBy(config.get('events', []), ['event'], ['asc']);
// Sort by `mtime` in descending order and by `event` in ascending order.
const events = _.orderBy(config.get('events', []), ['mtime', 'event'], ['desc', 'asc']);
const totalRecords = events.length;
let { page = 1, pageLength = 10 } = req.query;

Expand All @@ -35,10 +36,12 @@ export const fetchEvents = (req, res) => {
}
return {
id: evt.id,
mtime: evt.mtime,
enabled: evt.enabled,
event: evt.event,
trigger: evt.trigger,
command: evt.command
// WARNING: The "command" parameter is deprecated and will be removed in a future release.
commands: (evt.commands || evt.command || '')
};
});

Expand Down Expand Up @@ -69,38 +72,40 @@ export const getEvent = (req, res) => {

res.send({
id: evt.id,
mtime: evt.mtime,
enabled: evt.enabled,
event: evt.event,
trigger: evt.trigger,
command: evt.command
// WARNING: The "command" parameter is deprecated and will be removed in a future release.
commands: (evt.commands || evt.command || '')
});
};

export const addEvent = (req, res) => {
export const createEvent = (req, res) => {
const {
enabled = false,
event = '',
trigger = '',
command = ''
commands = ''
} = { ...req.body };

if (!event) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'event\' must not be empty'
msg: 'The "event" parameter must not be empty'
});
return;
}

if (!trigger) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'trigger\' must not be empty'
msg: 'The "trigger" parameter must not be empty'
});
return;
}

if (!command) {
if (!commands) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'command\' must not be empty'
msg: 'The "commands" parameter must not be empty'
});
return;
}
Expand All @@ -109,10 +114,11 @@ export const addEvent = (req, res) => {
const events = config.get('events', []);
const evt = {
id: uuid.v4(),
mtime: new Date().getTime(),
enabled: !!enabled,
event: event,
trigger: trigger,
command: command
commands: commands
};

if (_.isArray(events)) {
Expand All @@ -122,7 +128,7 @@ export const addEvent = (req, res) => {
config.set('events', [evt]);
}

res.send({ id: evt.id });
res.send({ id: evt.id, mtime: evt.mtime });
} catch (err) {
res.status(ERR_INTERNAL_SERVER_ERROR).send({
msg: 'Failed to save ' + JSON.stringify(settings.cncrc)
Expand All @@ -146,45 +152,46 @@ export const updateEvent = (req, res) => {
enabled = evt.enabled,
event = evt.event,
trigger = evt.trigger,
command = evt.command
// WARNING: The "command" parameter is deprecated and will be removed in a future release.
commands = (evt.commands || evt.command || '')
} = { ...req.body };

if (typeof enabled !== 'boolean') {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'enabled\' must be a boolean value'
msg: 'The "enabled" parameter must be a boolean value'
});
return;
}

if (!event) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'event\' must not be empty'
msg: 'The "event" parameter must not be empty'
});
return;
}

if (!trigger) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'trigger\' must not be empty'
msg: 'The "trigger" parameter must not be empty'
});
return;
}

if (!command) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'command\' must not be empty'
});
return;
}
// Skip checking whether the commands parameter is empty or not

try {
evt.mtime = new Date().getTime();
evt.enabled = enabled;
evt.event = event;
evt.trigger = trigger;
evt.command = command;
evt.commands = commands;
if (evt.command !== undefined) {
// WARNING: The "command" parameter is deprecated and will be removed in a future release.
delete evt.command;
}
config.set('events', events);

res.send({ id: evt.id });
res.send({ id: evt.id, mtime: evt.mtime });
} catch (err) {
res.status(ERR_INTERNAL_SERVER_ERROR).send({
msg: 'Failed to save ' + JSON.stringify(settings.cncrc)
Expand Down
2 changes: 1 addition & 1 deletion src/app/api/api.macros.js
Expand Up @@ -39,7 +39,7 @@ export const getMacro = (req, res) => {
});
};

export const addMacro = (req, res) => {
export const createMacro = (req, res) => {
const { name, content } = { ...req.body };

try {
Expand Down
46 changes: 29 additions & 17 deletions src/app/api/api.users.js
Expand Up @@ -92,7 +92,8 @@ export const signin = (req, res) => {
};

export const fetchUsers = (req, res) => {
const users = _.orderBy(config.get('users', []), ['name'], ['asc']);
// Sort by `mtime` in descending order and by `name` in ascending order.
const users = _.orderBy(config.get('users', []), ['mtime', 'name'], ['desc', 'asc']);
const totalRecords = users.length;
let { page = 1, pageLength = 10 } = req.query;

Expand All @@ -114,6 +115,7 @@ export const fetchUsers = (req, res) => {
const records = users.slice(begin, end).map((user) => {
return {
id: user.id,
mtime: user.mtime,
enabled: user.enabled,
name: user.name
};
Expand All @@ -131,7 +133,7 @@ export const fetchUsers = (req, res) => {

export const getUser = (req, res) => {
const user = _.find(config.get('users', []), { id: req.params.id });
const { id, enabled, name } = { ...user };
const { id, mtime, enabled, name } = { ...user };

if (!user) {
res.status(ERR_NOT_FOUND).send({
Expand All @@ -140,10 +142,10 @@ export const getUser = (req, res) => {
return;
}

res.send({ id, enabled, name });
res.send({ id, mtime, enabled, name });
};

export const addUser = (req, res) => {
export const createUser = (req, res) => {
const {
enabled = false,
name = '',
Expand All @@ -152,14 +154,14 @@ export const addUser = (req, res) => {

if (!name) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'name\' must not be empty'
msg: 'The "name" parameter must not be empty'
});
return;
}

if (!password) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'password\' must not be empty'
msg: 'The "password" parameter must not be empty'
});
return;
}
Expand All @@ -177,6 +179,7 @@ export const addUser = (req, res) => {
const users = config.get('users', []);
const user = {
id: uuid.v4(),
mtime: new Date().getTime(),
enabled: enabled,
name: name,
password: hash
Expand All @@ -189,7 +192,7 @@ export const addUser = (req, res) => {
config.set('users', [user]);
}

res.send({ id: user.id });
res.send({ id: user.id, mtime: user.mtime });
} catch (err) {
res.status(ERR_INTERNAL_SERVER_ERROR).send({
msg: 'Failed to save ' + JSON.stringify(settings.cncrc)
Expand All @@ -199,15 +202,8 @@ export const addUser = (req, res) => {

export const updateUser = (req, res) => {
const id = req.params.id;
const {
enabled = false,
name = '',
oldPassword = '',
newPassword = ''
} = { ...req.body };
const users = config.get('users', []);
const user = _.find(users, { id: id });
const changePassword = oldPassword && newPassword;

if (!user) {
res.status(ERR_NOT_FOUND).send({
Expand All @@ -216,9 +212,24 @@ export const updateUser = (req, res) => {
return;
}

const {
enabled = user.enabled,
name = user.name,
oldPassword = '',
newPassword = ''
} = { ...req.body };
const changePassword = oldPassword && newPassword;

if (typeof enabled !== 'boolean') {
res.status(ERR_BAD_REQUEST).send({
msg: 'The "enabled" parameter must be a boolean value'
});
return;
}

if (!name) {
res.status(ERR_BAD_REQUEST).send({
msg: 'The parameter \'name\' must not be empty'
msg: 'The "name" parameter must not be empty'
});
return;
}
Expand All @@ -241,7 +252,8 @@ export const updateUser = (req, res) => {
}

try {
user.enabled = !!enabled;
user.mtime = new Date().getTime();
user.enabled = enabled;
user.name = name;

if (changePassword) {
Expand All @@ -252,7 +264,7 @@ export const updateUser = (req, res) => {

config.set('users', users);

res.send({ id: user.id });
res.send({ id: user.id, mtime: user.mtime });
} catch (err) {
res.status(ERR_INTERNAL_SERVER_ERROR).send({
msg: 'Failed to save ' + JSON.stringify(settings.cncrc)
Expand Down

0 comments on commit 3bc807e

Please sign in to comment.