From 1e01b8368f71aeaef162c64c47069682504edea8 Mon Sep 17 00:00:00 2001 From: André Araújo Date: Tue, 14 Feb 2017 10:33:41 -0300 Subject: [PATCH] Atualiza endpoints --- Makefile | 5 +++-- routes/index.js | 410 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------- wikilibras-db-api.sql | 5 +++-- 3 files changed, 373 insertions(+), 47 deletions(-) diff --git a/Makefile b/Makefile index 910bacf..6ba2d2c 100755 --- a/Makefile +++ b/Makefile @@ -5,6 +5,7 @@ SCRIPT_PATH_ETC := /etc/init.d/${SCRIPT_NAME} NPM := $(shell which npm) install: + @ sudo chmod -R 777 $$HOME/tmp/ @ npm install @ sudo npm install -g supervisor @@ -26,12 +27,12 @@ clean: @ find ./public/users/ -type d -empty -delete distclean: - @ sudo rm -rf ./public/users/ ./uploads/ + @ sudo rm -rf ./public/users/* ./uploads/* run: @ sudo ${NPM} start -unistall: distclean +uninstall: distclean @ rm -rf ./node_modules/ ROLENAME := wikilibras diff --git a/routes/index.js b/routes/index.js index 33a929f..e347498 100755 --- a/routes/index.js +++ b/routes/index.js @@ -125,22 +125,187 @@ router.get("/listall", function(req, res, next) { var response = {}; // db.query('SELECT s."nome", s."data", s.cidade, s.estado, s.file, s.avatar, s.blender, ts."nomeSelo", s."version" FROM "sinal" s, "tipoSelo" ts WHERE s."idSelo" = ts."idSelo"') - db.query('SELECT s."data", s."usuario", s."idSinal", s."idSelo", s."nome", s."classe", s."frase", s."estado", s."cidade", s."file" FROM "sinal" s, "tipoSelo" ts WHERE s."idSelo" = ts."idSelo"') - .then(function(result) + db.query('SELECT s."data", s."usuario", s."idSinal", s.idtask, s."idSelo", ts."nomeSelo", s."version", s."nome", s."classe", s."frase", s."estado", s."cidade", s."file", s."avatar", s."blender" FROM "sinal" s INNER JOIN "tipoSelo" ts ON (s."idSelo" = ts."idSelo")') + .then(function(result) + { + response = result; + res.status(203); + }) + .catch(function(error) + { + response = error; + res.status(500); + }) + .finally(function() + { + res.send(response); + pgp.end(); + }); +}); + +/** + * Atualiza o campo selo com base no idSinal ou idTask + */ +router.put("/updateselo", function(req, res, next) +{ + var response = {}; + var idTask = req.body["idtask"]; + var idSinal = req.body["idsinal"]; + var selo = req.body["selo"]; + + console.log(JSON.stringify(req.body, null, 4)); + var query = ""; + if (_.isEmpty(selo)) + { + res.status(500); + response.status = false; + response.error = "O campo 'selo' é obrigatório"; + return res.send(response); + } + else + { + query += 'UPDATE "sinal" SET "idSelo" = ' + parseInt(selo) + ' WHERE '; + } + if (_.isEmpty(idTask) && _.isEmpty(idSinal)) + { + res.status(500); + response.status = false; + response.error = "O campo 'idtask' ou 'idsinal' está ausente"; + return res.send(response); + } + if (!_.isEmpty(idTask)) + { + query += 'idtask = ' + parseInt(idTask); + } + if (!_.isEmpty(idTask) && !_.isEmpty(idSinal)) + { + query += " AND "; + } + if (!_.isEmpty(idSinal)) + { + query += '"idSinal" = ' + parseInt(idSinal); + } + query += ' RETURNING "nome", "idSinal", idtask, "idSelo";'; + db.query(query) + .then(function(result) + { + if (Object.keys(result).length > 0) { - response = result; - res.status(203); - }) - .catch(function(error) + response.status = true; + } + else { - response = error; - res.status(500); - }) - .finally(function() + response.status = false; + } + response.data = result; + res.status(200); + }) + .catch(function(error) + { + response.status = false; + response.error = error; + res.status(500); + }) + .finally(function() + { + res.send(response); + pgp.end(); + }); +}); + +/** + * Atualiza o campo 'idtask' com base no idSinal + */ +router.get("/updatetask", function(req, res, next) +{ + var response = {}; + var idTask = req.query["idtask"]; + var idSinal = req.query["idsinal"]; + if (_.isEmpty(idTask)) + { + res.status(500); + response.status = false; + response.error = "O campo 'idtask' é obrigatório"; + res.send(response); + return; + } + else + { + idTask = parseInt(idTask); + } + if (_.isEmpty(idSinal)) + { + res.status(500); + response.status = false; + response.error = "O campo 'idsinal' é obrigatório"; + res.send(response); + return; + } + else + { + idSinal = parseInt(idSinal); + } + db.query('UPDATE "sinal" SET version = version + 1, idtask = ($1) WHERE "idSinal" = ($2) RETURNING "idSinal", idtask;', [idTask, idSinal]) + .then(function(result) + { + if (Object.keys(result).length > 0) { - res.send(response); - pgp.end(); - }); + response.status = true; + response.data = result; + } + else + { + response.status = false; + response.data = "ERROR: 'idSinal' = " + idSinal + " Não encontrado"; + } + res.status(200); + }) + .catch(function(error) + { + response.status = false; + response.error = error; + res.status(500); + }) + .finally(function() + { + res.send(response); + pgp.end(); + }); +}); + +/** + * Retorna lista de sinais inseridos pelo formulário e + * os que que tiveram o selo alterado + */ +router.get("/newtasks", function(req, res, next) +{ + var response = {}; + var selo = req.query["selo"]; + var query = 'SELECT s."idSinal", s."nome", s."idSelo", ts."nomeSelo", s."usuario", s."estado", s."classe", s."file", s."avatar", s."blender" FROM "sinal" s INNER JOIN "tipoSelo" ts ON (s."idSelo" = ts."idSelo") WHERE s."version" = 0 '; + if (!_.isEmpty(selo)) + { + query += ' AND s."idSelo" = ' + parseInt(selo); + } + query += ';'; + db.query(query) + .then(function(result) + { + response.status = true; + response.count = result.length; + response.data = result; + res.status(200); + }) + .catch(function(error) + { + response.status = false; + response.error = error; + res.status(500); + }) + .finally(function() + { + res.send(response); + pgp.end(); + }); }); /* @@ -201,6 +366,33 @@ router.get("/reset", function(req, res, next) }); }); +router.get("/resettasks", function(req, res, next) +{ + const pg = require("pg"); + const connectionString = "postgres://pybossa:tester@localhost:5432/pybossa"; + const results = []; + const data = { text: req.body.text, complete: false }; + pg.connect(connectionString, function(err, client, done) + { + if (err) + { + done(); + console.log(err); + return res.status(500).json({ success: false, data: err }); + } + const query = client.query('TRUNCATE "task" CASCADE; ALTER SEQUENCE task_id_seq RESTART WITH 1'); + query.on('row', function(row) + { + results.push(row); + }); + query.on('end', function() + { + done(); + return res.json({ success: true, data: results }); + }); + }); +}); + router.get("/version", function(req, res, next) { var response = []; @@ -216,16 +408,16 @@ router.get("/version", function(req, res, next) .finally(function() { pgp.end(); - res.status(203).send(response); + res.status(200).send(response); }); }); router.get("/sinais", function(req, res, next) { var results = []; - if ((!_.isEmpty(req.param("selo"))) && (!_.isEmpty(req.param("version")))) + if ((!_.isEmpty(req.query("selo"))) && (!_.isEmpty(req.query("version")))) { - db.query('SELECT s."nome", s."data", s.cidade, s."version", s.estado, s.file, s.avatar, s.blender, ts."nomeSelo" FROM "sinal" s, "tipoSelo" ts WHERE s."idSelo" = ts."idSelo" AND ts."nomeSelo" = $1 AND s."version" = $2', [req.param("selo"), req.param("version")]) + db.query('SELECT s."nome", s."data", s.cidade, s."version", s.estado, s.file, s.avatar, s.blender, ts."nomeSelo" FROM "sinal" s, "tipoSelo" ts WHERE s."idSelo" = ts."idSelo" AND ts."nomeSelo" = $1 AND s."version" = $2', [req.query("selo"), req.query("version")]) .then(function(result) { res.status(203).send(result); @@ -241,9 +433,9 @@ router.get("/sinais", function(req, res, next) } else { - if (!_.isEmpty(req.param("version"))) + if (!_.isEmpty(req.query("version"))) { - db.query("select nome, data, file, avatar, blender version FROM sinal WHERE version = $1", req.param("version")) + db.query("select nome, data, file, avatar, blender version FROM sinal WHERE version = $1", req.query("version")) .then(function(result) { res.status(203).send(result); @@ -257,9 +449,9 @@ router.get("/sinais", function(req, res, next) pgp.end(); }); } - if (!_.isEmpty(req.param("selo"))) + if (!_.isEmpty(req.query("selo"))) { - db.query('SELECT s."nome", s."data", s.cidade, s.estado, s.file, s.avatar, s.blender, ts."nomeSelo", s.version FROM "sinal" s, "tipoSelo" ts WHERE s."idSelo" = ts."idSelo" AND ts."nomeSelo" = $1', req.param("selo")) + db.query('SELECT s."nome", s."data", s.cidade, s.estado, s.file, s.avatar, s.blender, ts."nomeSelo", s.version FROM "sinal" s, "tipoSelo" ts WHERE s."idSelo" = ts."idSelo" AND ts."nomeSelo" = $1', req.query("selo")) .then(function(result) { @@ -452,6 +644,134 @@ router.post('/addsinal', upload.array('video', 2), function(req, res, next) }); */ +router.post('/updatesinal', upload.array('video', 2), function(req, res, next) +{ + // console.log("[" + new Date().toISOString() + "]"); + // console.log("From: " + req.ip); + // console.log("Files: " + JSON.stringify(req.files[0], null, 4)); + // console.log("headers: " + JSON.stringify(req.headers, null, 4)); + // console.log("body: " + JSON.stringify(req.body, null, 4)); + if (req.method === "OPTIONS") + { + res.header('Access-Control-Allow-Origin', req.headers.origin); + } + else + { + res.header('Access-Control-Allow-Origin', '*'); + } + if (req.files.length < 2) + { + return res.status(500).send("ERROR: O campo 'video' deve conter dois arquivos (video, blend)"); + } + var response = {}; + var directory = users; + var nome = req.body["nome"]; + var selo = req.body["selo"]; + var idTask = req.body["idtask"]; + var blend = req.files[1]; + var video = req.files[0]; + var maxblendsize = 25; // MB + var maxvideosize = 25; // MB + if (_.isEmpty(nome) || _.isEmpty(idTask)) + { + response.status = false; + response.error = "Os campos 'nome' e 'idtask' são obrigatórios"; + return res.status(500).send(response); + } + else + { + nome = nome.trim().toUpperCase(); + } + if (video.size > (maxvideosize * 1048576)) + { + response.status = false; + response.error = "O tamanho do video deve ter no máximo " + maxvideosize + " MB"; + return res.status(500).send(response); + } + if (blend.size > (maxblendsize * 1048576)) + { + response.status = false; + response.error = "O tamanho do blend deve ter no máximo " + maxblendsize + " MB"; + return res.status(500).send(response); + } + if (_.isEmpty(selo) || 1 < selo || selo > 7) + { + selo = 1; + } + db.query('SELECT "idSinal", usuario, estado, classe FROM "sinal" WHERE nome = ($1) AND idtask = ($2)', [nome, idTask]) + .then(function(result) + { + if (Object.keys(result).length > 0) + { + var idSinal = result[0]["idSinal"]; + var login = result[0]["usuario"]; + var estado = result[0]["estado"]; + var classe = result[0]["classe"]; + var videoname = nome + ".webm"; + var blendname = nome + ".blend"; + if (login !== null) + { + directory = path.join(directory, login); + } + if (estado !== null) + { + directory = path.join(directory, estado); + } + if (classe !== null) + { + directory = path.join(directory, classe); + } + if (!fs.existsSync(directory)) + { + console.log("Criando diretorio: " + directory); + mkdirp(directory, function (err) + { + if (err) + { + console.error(err); + res.status(500).send(err); + return; + } + else + { + console.log("Diretório criado com sucesso!"); + } + }); + } + db.query('UPDATE sinal SET "idSelo" = ($1), version = ($2), avatar = ($3), blender = ($4) WHERE "idSinal" = ($5)', [selo, 0, videoname, blendname, idSinal]) + .then(function(data) + { + videopath = path.join(directory, videoname); + blendpath = path.join(directory, blendname); + fs.rename(video.path, videopath); + fs.rename(blend.path, blendpath); + var message = "Sinal atualizado: '" + nome + "'"; + console.log(message); + res.status(200).send(message); + }) + .catch(function(error) + { + var message = "Erro ao atualizar sinal '" + nome + "'\n" + error; + console.log(message); + res.status(500).send(message); + }); + } + else + { + var message = "Não foi encontrado nenhum 'idtask' = '" + idTask + "' com sinal = " + nome; + res.status(500).send(message); + } + }) + .catch(function(error) + { + console.log(error); + }) + .finally(function() + { + pgp.end(); + }); +}); + router.post('/addsinal', upload.array('video', 2), function(req, res, next) { // console.log("[" + new Date().toISOString() + "]"); @@ -469,8 +789,7 @@ router.post('/addsinal', upload.array('video', 2), function(req, res, next) } if (req.files.length < 1) { - res.status(500).send("ERROR: O campo 'video' não contém nenhum arquivo do sinal"); - return; + return res.status(500).send("ERROR: O campo 'video' não contém nenhum arquivo do sinal"); } var directory = users; var login = req.body["login"]; @@ -487,13 +806,11 @@ router.post('/addsinal', upload.array('video', 2), function(req, res, next) var maxfilesize = 25; // MB if (filesize > (maxfilesize * 1048576)) { - res.status(500).send("O tamanho do arquivo deve ter no máximo " + maxfilesize + " MB"); - return; + return res.status(500).send("O tamanho do arquivo deve ter no máximo " + maxfilesize + " MB"); } if (_.isEmpty(nome)) { - res.status(500).send("ERROR: O campo 'nome' não foi encontrado"); - return; + return res.status(500).send("ERROR: O campo 'nome' não foi encontrado"); } else { @@ -528,29 +845,36 @@ router.post('/addsinal', upload.array('video', 2), function(req, res, next) { directory = path.join(directory, classe); } - if (!fs.existsSync(directory)) - { - console.log("Criando diretorio: " + directory); - mkdirp(directory, function (err) + output = path.join(directory, videoref); + async.series([ + function (callback) { - if (err) + if (fs.existsSync(directory)) { - console.error(err); - res.status(500).send(err); - return; + callback(null, 1); } else { - console.log("Diretório criado com sucesso!"); + console.log("Criando diretorio: " + directory); + mkdirp(directory, function (err) + { + if (err) + { + console.error(err); + return res.status(500).send(err); + } + else + { + console.log("Diretório criado com sucesso!"); + callback(null, 1); + } + }); } - }); - } - output = path.join(directory, videoref); - async.series([ + }, // Converter para formato webm function(callback) { - console.log("Convertendo para webm..."); + console.log("Convertendo sinal '" + nome + "' para webm..."); child = exec("avconv -y -v error -i \"" + input + "\" -acodec libvorbis -vcodec libvpx -an \"" + output + "\"", function(error, stdout, stderr) { @@ -563,7 +887,7 @@ router.post('/addsinal', upload.array('video', 2), function(req, res, next) } else { - res.status(200); + res.status(500); return 0; } }); @@ -609,11 +933,11 @@ router.post('/addsinal', upload.array('video', 2), function(req, res, next) } else { - console.log("Não existe, inserindo o sinal: '" + nome + "'"); + console.log("Não existe, inserindo sinal: '" + nome + "'"); db.one('INSERT INTO sinal (usuario, nome, classe, "idSelo", data, version, estado, cidade, frase, file) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10) RETURNING "idSinal"', [login, nome, classe, selo, date, 0, estado, cidade, frase, videoref]) .then(function(data) { - var message = "Sinal[" + data.idSinal + "]: '" + nome + "', inserido com sucesso"; + var message = "Sinal[" + data.idSinal + "]: '" + nome + "', inserido com sucesso!"; console.log(message); res.status(200).send(message); }) diff --git a/wikilibras-db-api.sql b/wikilibras-db-api.sql index ec458a7..03e754b 100644 --- a/wikilibras-db-api.sql +++ b/wikilibras-db-api.sql @@ -39,12 +39,13 @@ CREATE TABLE sinal ( -- TODO create table users "idUsuario" integer, usuario character varying(30), - version integer DEFAULT 0, "idSinal" integer DEFAULT nextval('sequence'::regclass) NOT NULL, + idtask integer DEFAULT 0, "idSelo" integer, + version integer DEFAULT 0, nome character varying(30), classe character varying(30), - frase character varying(100), + frase character varying(255), estado character varying(30), cidade character varying(30), file character varying(100), -- libgit2 0.21.2