From 60bc5e50ce2ce0c77998358c1c65df330d024eea Mon Sep 17 00:00:00 2001 From: jonathan.brilhante Date: Mon, 15 May 2017 22:46:14 -0300 Subject: [PATCH] Atualizações de Volume e correção da rotina do Corretor de sinais --- Dockerfile | 22 ++++++++++++++-------- Makefile | 8 ++++++++ docker-compose.yml | 35 +++++++++++++++++++++++++++++++++++ docker-compose.yml.example | 14 ++++++++++++++ docker-compose.yml.template | 14 ++++++++++++++ pybossa/Makefile.bk | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ pybossa/Makefile.old | 133 ------------------------------------------------------------------------------------------------------------------------------------- pybossa/wikilibras-pybossa.sql.old | 47 ----------------------------------------------- wikilibras-pybossa.sql | 7 +++++++ wikilibras-pybossa.sql.old | 47 ----------------------------------------------- wikilibrasdbapi/routes/index.js | 2 +- wikilibrasdbapi/routes/index.js.old | 969 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 12 files changed, 1203 insertions(+), 236 deletions(-) create mode 100755 docker-compose.yml create mode 100755 pybossa/Makefile.bk delete mode 100755 pybossa/Makefile.old delete mode 100755 pybossa/wikilibras-pybossa.sql.old delete mode 100755 wikilibras-pybossa.sql.old create mode 100755 wikilibrasdbapi/routes/index.js.old diff --git a/Dockerfile b/Dockerfile index 4f295af..1d2dee1 100755 --- a/Dockerfile +++ b/Dockerfile @@ -80,11 +80,17 @@ RUN mkdir /home/vlibras/container WORKDIR /home/vlibras/container/ -#RUN wget http://150.165.205.38:8000/vlibras-wikilibras-container.zip - -#RUN unzip vlibras-wikilibras-container.zip - -ADD . /home/vlibras/container/ +ADD corretor_sinais/ /home/vlibras/container/corretor_sinais/ +ADD validador_sinais/ /home/vlibras/container/validador_sinais +ADD pybossa /home/vlibras/container/pybossa/ +ADD wikilibrasV2 /home/vlibras/container/wikilibrasV2/ +ADD wikilibras-front /home/vlibras/container/wikilibras-front/ +ADD wikilibras-core /home/vlibras/container/wikilibras-core/ +ADD wikilibras-api /home/vlibras/container/wikilibras-api/ +ADD wikilibrasdbapi /home/vlibras/container/wikilibrasdbapi/ +ADD wikilibras-pybossa.sql /home/vlibras/container/ +ADD Makefile /home/vlibras/container/ +ADD taskmgr /home/vlibras/container/taskmgr RUN chown -R vlibras /home/vlibras/container/ @@ -126,7 +132,7 @@ RUN sudo apt-get install mongodb -y RUN make install -RUN ( sudo service postgresql start & sleep 1m ) ; make create-db +RUN ( sudo service postgresql start & sleep 1m ) ; make create-db ; ( sudo service postgresql stop & sleep 1m ) WORKDIR /home/vlibras/container/taskmgr/ @@ -136,9 +142,9 @@ WORKDIR /home/vlibras/container/ RUN make config KEY=2324bc23-7d6f-4840-8905-b1e6c1675eed -WORKDIR /home/vlibras/container/pybossa/ +WORKDIR /home/vlibras/container/ -RUN ( sudo service postgresql start & sleep 3m ) ; sudo su postgres -c 'psql --set ON_ERROR_STOP=off -f /home/vlibras/container/wikilibras-pybossa.sql pybossa' +RUN ( sudo service postgresql start & sleep 3m ) ; sudo su postgres -c 'psql --set ON_ERROR_STOP=off -f /home/vlibras/container/wikilibras-pybossa.sql pybossa' ; ( sudo service postgresql stop & sleep 1m ) RUN sudo apt-get install nano git htop -y diff --git a/Makefile b/Makefile index e47d72d..53804cc 100755 --- a/Makefile +++ b/Makefile @@ -67,6 +67,14 @@ config: $(notdir ${VLIBRAS_WIKILIBRAS_ENV}) @ $(MAKE) -s apache @ $(MAKE) -s showip +start-up: + @ while ! sudo service supervisor restart; do echo "fail, retrying ..."; done + @ sudo supervisorctl restart rq-scheduler + @ sudo supervisorctl restart rq-worker + @ sudo supervisorctl restart pybossa + @ sudo service apache2 restart + @ sudo service apache2 reload + apache: @ sudo service apache2 start @ if [ -e /etc/apache2/sites-enabled/pybossa.conf ]; then sudo a2dissite pybossa.conf; fi diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100755 index 0000000..6376113 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,35 @@ +version: '2' + +services: + web: + build: + context: . + args: + - IP=150.165.205.99 + ports: + - "80:80" + - "18422" + - "5432" + - "6379" + - "27017" + - "200:200" + - "201:201" + - "8003:8003" + - "8001:8001" + - "8002:8002" + stdin_open: true + tty: true + volumes: + - /home/vlibras/container/wikilibrasdbapi/blender/ + - /home/vlibras/container/wikilibrasdbapi/sinais/ + - /home/vlibras/container/wikilibrasdbapi/avatar/ + - /var/log/apache2/ + - /var/lib/mongodb/ + - /home/vlibras/container/wikilibrasV2/view/videos/ + - /home/vlibras/container/corretor_sinais/view/videos/ + - /home/vlibras/container/validador_sinais/view/videos/ + - /home/vlibras/container/wikilibrasV2/view/uploads/ + - /home/vlibras/container/corretor_sinais/view/uploads/ + - /home/vlibras/container/validador_sinais/view/uploads/ + #- /home/vlibras/container/taskmgr/events.log + - /home/vlibras/container/wikilibras-core/users/ diff --git a/docker-compose.yml.example b/docker-compose.yml.example index e686788..d4991fc 100755 --- a/docker-compose.yml.example +++ b/docker-compose.yml.example @@ -17,3 +17,17 @@ services: - "8003" stdin_open: true tty: true + volumes: + - /home/vlibras/container/wikilibrasdbapi/blender/ + - /home/vlibras/container/wikilibrasdbapi/sinais/ + - /home/vlibras/container/wikilibrasdbapi/avatar/ + - /var/log/apache2/ + - /var/lib/mongodb/ + - /home/vlibras/container/wikilibrasV2/view/videos/ + - /home/vlibras/container/corretor_sinais/view/videos/ + - /home/vlibras/container/validador_sinais/view/videos/ + - /home/vlibras/container/wikilibrasV2/view/uploads/ + - /home/vlibras/container/corretor_sinais/view/uploads/ + - /home/vlibras/container/validador_sinais/view/uploads/ + #- /home/vlibras/container/taskmgr/events.log + - /home/vlibras/container/wikilibras-core/users/ diff --git a/docker-compose.yml.template b/docker-compose.yml.template index 3a6ced8..008685c 100755 --- a/docker-compose.yml.template +++ b/docker-compose.yml.template @@ -17,3 +17,17 @@ services: - "8003" stdin_open: true tty: true + volumes: + - /home/vlibras/container/wikilibrasdbapi/blender/ + - /home/vlibras/container/wikilibrasdbapi/sinais/ + - /home/vlibras/container/wikilibrasdbapi/avatar/ + - /var/log/apache2/ + - /var/lib/mongodb/ + - /home/vlibras/container/wikilibrasV2/view/videos/ + - /home/vlibras/container/corretor_sinais/view/videos/ + - /home/vlibras/container/validador_sinais/view/videos/ + - /home/vlibras/container/wikilibrasV2/view/uploads/ + - /home/vlibras/container/corretor_sinais/view/uploads/ + - /home/vlibras/container/validador_sinais/view/uploads/ + #- /home/vlibras/container/taskmgr/events.log + - /home/vlibras/container/wikilibras-core/users/ diff --git a/pybossa/Makefile.bk b/pybossa/Makefile.bk new file mode 100755 index 0000000..26b8ebc --- /dev/null +++ b/pybossa/Makefile.bk @@ -0,0 +1,141 @@ +PROJECT_NAME := pybossa +PROJECT_DIR := $(CURDIR) +SED_REPLACE_ALL = sed -i "s/$(1)/$(2)/g" "$(3)" +SED_REPLACE_ALL_PATH = sed -i "s\#$(1)\#$(2)\#g" "$(3)" + +ifndef IP + ifneq ($(shell ip route | grep "default" | awk '{print $$5; exit}'),) + IP := $(shell ip route get 1 | awk '{print $$7; exit}') + else + IP := 127.0.0.1 + endif +endif + +LOCALHOST ?= ${IP} + +install: .install config build + +build: env create-db + @ sudo chown redis:redis /etc/redis/redis.conf + @ sudo chown redis:redis /etc/redis/sentinel.conf + @ sudo service redis-server stop + @ sudo update-rc.d -f redis-server remove + @ while ! sudo service supervisor restart; do echo "fail, retrying ..."; done + @ sudo supervisorctl restart rq-scheduler + @ sudo supervisorctl restart rq-worker + @ sudo supervisorctl restart pybossa + +clean: + @ find . -regextype posix-awk -regex "(.*.log|.*.pyc)" -type f -print -delete + +config: + @ cp ./alembic.ini.template ./alembic.ini + @ cp ./settings_local.py.tmpl ./settings_local.py + @ cp ./contrib/pybossa.wsgi.tmpl ./contrib/pybossa.wsgi + @ cp ./contrib/apache/pybossa.conf.tmpl ./contrib/apache/pybossa.conf + @ cp ./contrib/pybossa.ini.template ./contrib/pybossa.ini + @ cp ./contrib/supervisor/rq-scheduler.conf.template ./contrib/supervisor/rq-scheduler.conf + @ cp ./contrib/supervisor/rq-worker.conf.template ./contrib/supervisor/rq-worker.conf + @ cp ./contrib/supervisor/pybossa.conf.template ./contrib/supervisor/pybossa.conf + @ ln -sf ./pybossa/themes/default/translations/ ./pybossa/translations + @ $(call SED_REPLACE_ALL_PATH,,$(CURDIR),./contrib/pybossa.wsgi) + @ $(call SED_REPLACE_ALL,ServerName localhost,ServerName ${LOCALHOST},./contrib/apache/pybossa.conf) + @ $(call SED_REPLACE_ALL,user1,$$USER,./contrib/apache/pybossa.conf) + @ $(call SED_REPLACE_ALL,group1,$$USER,./contrib/apache/pybossa.conf) + @ $(call SED_REPLACE_ALL_PATH,,$(CURDIR),./contrib/apache/pybossa.conf) + @ $(call SED_REPLACE_ALL_PATH,/home/pybossa/pybossa,$(CURDIR),./contrib/pybossa.ini) + @ $(call SED_REPLACE_ALL_PATH,/home/pybossa/pybossa,$(CURDIR),./contrib/supervisor/rq-scheduler.conf) + @ $(call SED_REPLACE_ALL,user=pybossa,user=$$USER,./contrib/supervisor/rq-scheduler.conf) + @ $(call SED_REPLACE_ALL_PATH,/home/pybossa/pybossa,$(CURDIR),./contrib/supervisor/rq-worker.conf) + @ $(call SED_REPLACE_ALL,user=pybossa,user=$$USER,./contrib/supervisor/rq-worker.conf) + @ $(call SED_REPLACE_ALL_PATH,/home/pybossa/pybossa,$(CURDIR),./contrib/supervisor/pybossa.conf) + @ $(call SED_REPLACE_ALL_PATH,pybossa.ini,contrib/pybossa.ini,./contrib/supervisor/pybossa.conf) + @ $(call SED_REPLACE_ALL,user=pybossa,user=$$USER,./contrib/supervisor/pybossa.conf) + @ sudo install -m 755 -p ./contrib/apache/pybossa.conf /etc/apache2/sites-available/pybossa.conf + @ sudo install -m 644 -p ./contrib/redis-supervisor/redis.conf /etc/redis/redis.conf + @ sudo install -m 644 -p ./contrib/redis-supervisor/sentinel.conf /etc/redis/sentinel.conf + @ sudo install -m 644 -p ./contrib/supervisor/pybossa.conf /etc/supervisor/conf.d/pybossa.conf + @ sudo install -m 644 -p ./contrib/supervisor/redis-sentinel.conf /etc/supervisor/conf.d/redis-sentinel.conf + @ sudo install -m 644 -p ./contrib/supervisor/redis-server.conf /etc/supervisor/conf.d/redis-server.conf + @ sudo install -m 644 -p ./contrib/supervisor/rq-scheduler.conf /etc/supervisor/conf.d/rq-scheduler.conf + @ sudo install -m 644 -p ./contrib/supervisor/rq-worker.conf /etc/supervisor/conf.d/rq-worker.conf + @ cat /etc/apache2/sites-available/pybossa.conf + @ ([ -e /etc/apache2/sites-enabled/wikilibras.conf ] && sudo a2dissite wikilibras.conf) || sudo a2ensite pybossa.conf + @ sudo service apache2 restart + @ sudo service apache2 reload + +env: + @ ( \ + virtualenv ./env/; \ + . ./env/bin/activate; \ + pip install -U pip; \ + pip install -U uwsgi; \ + pip install -U ndg-httpsclient; \ + pip install -r requirements.txt; \ + ) + + +start-up: + @ while ! sudo service supervisor restart; do echo "fail, retrying ..."; done + @ sudo supervisorctl restart rq-scheduler + @ sudo supervisorctl restart rq-worker + @ sudo supervisorctl restart pybossa + @ sudo service apache2 restart + @ sudo service apache2 reload + +uninstall: clean + @ rm -rf ./env/ + @ rm -f ./settings_local.py + @ rm -f ./contrib/${PROJECT_NAME}.wsgi + @ rm -f ./contrib/apache/${PROJECT_NAME}.conf + @ sudo rm -f /etc/apache2/sites-available/${PROJECT_NAME}.conf + @ sudo rm -f /etc/apache2/sites-enabled/${PROJECT_NAME}.conf + +run: + @ ( \ + . ./env/bin/activate; \ + python main.py; \ + ) + +.install: + @ sudo apt-get update && \ + sudo apt-get install -y git-core \ + postgresql postgresql-server-dev-all libpq-dev python-psycopg2 \ + python-virtualenv \ + python-dev build-essential libjpeg-dev libssl-dev swig libffi-dev \ + redis-server \ + supervisor \ + apache2 apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-wsgi + @ echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/servername.conf + @ sudo a2enconf servername + @ sudo a2enmod headers + -@ sudo a2dissite 000-default.conf + +PYBOSSA_DB_USERNAME := pybossa +PYBOSSA_DB_PASSWORD := tester +PYBOSSA_DB_CREATE := psql -c \"CREATE USER pybossa WITH PASSWORD '${PYBOSSA_DB_PASSWORD}'\"; +PYBOSSA_DB_CREATE += psql -c \"CREATE DATABASE pybossa OWNER ${PYBOSSA_DB_USERNAME}\"; +PYBOSSA_DB_DROP := psql -c \"DROP DATABASE ${PYBOSSA_DB_USERNAME}\"; +PYBOSSA_DB_DROP += psql -c \"DROP USER ${PYBOSSA_DB_USERNAME}\"; +PYBOSSA_DB_DUMPFILE := pybossa-dump.sql +PYBOSSA_DB_VERBOSE := -v +PYBOSSA_DB_ADMINFILE := wikilibras-pybossa.sql + +.postgresql: + -@ sudo service postgresql restart + +create-db: .postgresql env + @ sudo su postgres -c "${PYBOSSA_DB_CREATE}" + @ ( \ + . ./env/bin/activate; \ + python cli.py db_create; \ + ) + +create-admin: + @ sudo su postgres -c "psql --set ON_ERROR_STOP=off -f ${PYBOSSA_DB_ADMINFILE} ${PYBOSSA_DB_USERNAME}" + +drop-db: .postgresql + @ sudo su postgres -c "${PYBOSSA_DB_DROP}" + +${PYBOSSA_DB_DUMPFILE}: + @ sudo su postgres -c "PGPASSWORD='${PYBOSSA_DB_PASSWORD}' pg_dump ${PYBOSSA_DB_VERBOSE} -b --inserts ${PYBOSSA_DB_USERNAME};" > ${PYBOSSA_DB_DUMPFILE} diff --git a/pybossa/Makefile.old b/pybossa/Makefile.old deleted file mode 100755 index 309ff2a..0000000 --- a/pybossa/Makefile.old +++ /dev/null @@ -1,133 +0,0 @@ -PROJECT_NAME := pybossa -PROJECT_DIR := $(CURDIR) -SED_REPLACE_ALL = sed -i "s/$(1)/$(2)/g" "$(3)" -SED_REPLACE_ALL_PATH = sed -i "s\#$(1)\#$(2)\#g" "$(3)" - -ifndef IP - ifneq ($(shell ip route | grep "default" | awk '{print $$5; exit}'),) - IP := $(shell ip route get 1 | awk '{print $$7; exit}') - else - IP := 127.0.0.1 - endif -endif - -LOCALHOST ?= ${IP} - -install: .install config build - -build: env create-db - @ sudo chown redis:redis /etc/redis/redis.conf - @ sudo chown redis:redis /etc/redis/sentinel.conf - @ sudo service redis-server stop - @ sudo update-rc.d -f redis-server remove - @ while ! sudo service supervisor restart; do echo "fail, retrying ..."; done - @ sudo supervisorctl restart rq-scheduler - @ sudo supervisorctl restart rq-worker - @ sudo supervisorctl restart pybossa - -clean: - @ find . -regextype posix-awk -regex "(.*.log|.*.pyc)" -type f -print -delete - -config: - @ cp ./alembic.ini.template ./alembic.ini - @ cp ./settings_local.py.tmpl ./settings_local.py - @ cp ./contrib/pybossa.wsgi.tmpl ./contrib/pybossa.wsgi - @ cp ./contrib/apache/pybossa.conf.tmpl ./contrib/apache/pybossa.conf - @ cp ./contrib/pybossa.ini.template ./contrib/pybossa.ini - @ cp ./contrib/supervisor/rq-scheduler.conf.template ./contrib/supervisor/rq-scheduler.conf - @ cp ./contrib/supervisor/rq-worker.conf.template ./contrib/supervisor/rq-worker.conf - @ cp ./contrib/supervisor/pybossa.conf.template ./contrib/supervisor/pybossa.conf - @ ln -sf ./pybossa/themes/default/translations/ ./pybossa/translations - @ $(call SED_REPLACE_ALL_PATH,,$(CURDIR),./contrib/pybossa.wsgi) - @ $(call SED_REPLACE_ALL,ServerName localhost,ServerName ${LOCALHOST},./contrib/apache/pybossa.conf) - @ $(call SED_REPLACE_ALL,user1,$$USER,./contrib/apache/pybossa.conf) - @ $(call SED_REPLACE_ALL,group1,$$USER,./contrib/apache/pybossa.conf) - @ $(call SED_REPLACE_ALL_PATH,,$(CURDIR),./contrib/apache/pybossa.conf) - @ $(call SED_REPLACE_ALL_PATH,/home/pybossa/pybossa,$(CURDIR),./contrib/pybossa.ini) - @ $(call SED_REPLACE_ALL_PATH,/home/pybossa/pybossa,$(CURDIR),./contrib/supervisor/rq-scheduler.conf) - @ $(call SED_REPLACE_ALL,user=pybossa,user=$$USER,./contrib/supervisor/rq-scheduler.conf) - @ $(call SED_REPLACE_ALL_PATH,/home/pybossa/pybossa,$(CURDIR),./contrib/supervisor/rq-worker.conf) - @ $(call SED_REPLACE_ALL,user=pybossa,user=$$USER,./contrib/supervisor/rq-worker.conf) - @ $(call SED_REPLACE_ALL_PATH,/home/pybossa/pybossa,$(CURDIR),./contrib/supervisor/pybossa.conf) - @ $(call SED_REPLACE_ALL_PATH,pybossa.ini,contrib/pybossa.ini,./contrib/supervisor/pybossa.conf) - @ $(call SED_REPLACE_ALL,user=pybossa,user=$$USER,./contrib/supervisor/pybossa.conf) - @ sudo install -m 755 -p ./contrib/apache/pybossa.conf /etc/apache2/sites-available/pybossa.conf - @ sudo install -m 644 -p ./contrib/redis-supervisor/redis.conf /etc/redis/redis.conf - @ sudo install -m 644 -p ./contrib/redis-supervisor/sentinel.conf /etc/redis/sentinel.conf - @ sudo install -m 644 -p ./contrib/supervisor/pybossa.conf /etc/supervisor/conf.d/pybossa.conf - @ sudo install -m 644 -p ./contrib/supervisor/redis-sentinel.conf /etc/supervisor/conf.d/redis-sentinel.conf - @ sudo install -m 644 -p ./contrib/supervisor/redis-server.conf /etc/supervisor/conf.d/redis-server.conf - @ sudo install -m 644 -p ./contrib/supervisor/rq-scheduler.conf /etc/supervisor/conf.d/rq-scheduler.conf - @ sudo install -m 644 -p ./contrib/supervisor/rq-worker.conf /etc/supervisor/conf.d/rq-worker.conf - @ cat /etc/apache2/sites-available/pybossa.conf - @ ([ -e /etc/apache2/sites-enabled/wikilibras.conf ] && sudo a2dissite wikilibras.conf) || sudo a2ensite pybossa.conf - @ sudo service apache2 restart - @ sudo service apache2 reload - -env: - @ ( \ - virtualenv ./env/; \ - . ./env/bin/activate; \ - pip install -U pip; \ - pip install -U uwsgi; \ - pip install -U ndg-httpsclient; \ - pip install -r requirements.txt; \ - ) - - -uninstall: clean - @ rm -rf ./env/ - @ rm -f ./settings_local.py - @ rm -f ./contrib/${PROJECT_NAME}.wsgi - @ rm -f ./contrib/apache/${PROJECT_NAME}.conf - @ sudo rm -f /etc/apache2/sites-available/${PROJECT_NAME}.conf - @ sudo rm -f /etc/apache2/sites-enabled/${PROJECT_NAME}.conf - -run: - @ ( \ - . ./env/bin/activate; \ - python main.py; \ - ) - -.install: - @ sudo apt-get update && \ - sudo apt-get install -y git-core \ - postgresql postgresql-server-dev-all libpq-dev python-psycopg2 \ - python-virtualenv \ - python-dev build-essential libjpeg-dev libssl-dev swig libffi-dev \ - redis-server \ - supervisor \ - apache2 apache2-mpm-prefork apache2-utils libexpat1 ssl-cert libapache2-mod-wsgi - @ echo "ServerName localhost" | sudo tee /etc/apache2/conf-available/servername.conf - @ sudo a2enconf servername - @ sudo a2enmod headers - -@ sudo a2dissite 000-default.conf - -PYBOSSA_DB_USERNAME := pybossa -PYBOSSA_DB_PASSWORD := tester -PYBOSSA_DB_CREATE := psql -c \"CREATE USER pybossa WITH PASSWORD '${PYBOSSA_DB_PASSWORD}'\"; -PYBOSSA_DB_CREATE += psql -c \"CREATE DATABASE pybossa OWNER ${PYBOSSA_DB_USERNAME}\"; -PYBOSSA_DB_DROP := psql -c \"DROP DATABASE ${PYBOSSA_DB_USERNAME}\"; -PYBOSSA_DB_DROP += psql -c \"DROP USER ${PYBOSSA_DB_USERNAME}\"; -PYBOSSA_DB_DUMPFILE := pybossa-dump.sql -PYBOSSA_DB_VERBOSE := -v -PYBOSSA_DB_ADMINFILE := wikilibras-pybossa.sql - -.postgresql: - -@ sudo service postgresql restart - -create-db: .postgresql env - @ sudo su postgres -c "${PYBOSSA_DB_CREATE}" - @ ( \ - . ./env/bin/activate; \ - python cli.py db_create; \ - ) - -create-admin: - @ sudo su postgres -c "psql --set ON_ERROR_STOP=off -f ${PYBOSSA_DB_ADMINFILE} ${PYBOSSA_DB_USERNAME}" - -drop-db: .postgresql - @ sudo su postgres -c "${PYBOSSA_DB_DROP}" - -${PYBOSSA_DB_DUMPFILE}: - @ sudo su postgres -c "PGPASSWORD='${PYBOSSA_DB_PASSWORD}' pg_dump ${PYBOSSA_DB_VERBOSE} -b --inserts ${PYBOSSA_DB_USERNAME};" > ${PYBOSSA_DB_DUMPFILE} diff --git a/pybossa/wikilibras-pybossa.sql.old b/pybossa/wikilibras-pybossa.sql.old deleted file mode 100755 index 4102e5f..0000000 --- a/pybossa/wikilibras-pybossa.sql.old +++ /dev/null @@ -1,47 +0,0 @@ --- install: --- sudo su postgres -c 'psql --set ON_ERROR_STOP=off -f wikilibras-pybossa.sql pybossa' - --- SELECT * FROM "user"; --- postgres://pybossa:tester@localhost:5432/pybossa - -INSERT INTO "user" ( - id, - created, - email_addr, - name, - fullname, - locale, - api_key, - passwd_hash, - admin, - pro, - privacy_mode, - google_user_id, - ckan_api, - newsletter_prompted, - valid_email, - confirmation_email_sent, - subscribed, - info, - profile_id -) VALUES ( - 1, --id - '2017-02-20T15:12:14.560847', --created - 'wikilibras@lavid.ufpb.br', --email_addr - 'wikilibras', --name - 'wikilibras', --fullname - 'pt_BR', --locale - '2324bc23-7d6f-4840-8905-b1e6c1675eed', --api_key - 'pbkdf2:sha1:1000$wIP6vkOx$99be5c325961aa39030bb10e3b58a85ac3bfaa90', --passwd_hash, - 't', --admin - 'f', --pro - 'f', --privacy_mode - '', --google_user_id - '', --ckan_api - 'f', --newsletter_prompted - 't', --valid_email - 'f', --confirmation_email_sent - 't', --subscribed - '{}', --info - 1 --profile_i -) diff --git a/wikilibras-pybossa.sql b/wikilibras-pybossa.sql index fabfd41..0cb4007 100755 --- a/wikilibras-pybossa.sql +++ b/wikilibras-pybossa.sql @@ -3,3 +3,10 @@ INSERT INTO "user" VALUES (1, '2017-01-01T00:00:00.000000', 'wikilibras@lavid.ufpb.br', 'wikilibras', 'wikilibras', 'pt_BR', '2324bc23-7d6f-4840-8905-b1e6c1675eed', 'pbkdf2:sha1:1000$wIP6vkOx$99be5c325961aa39030bb10e3b58a85ac3bfaa90', true, false, false, NULL, NULL, NULL, NULL, NULL, NULL, false, true, false, true, '{}', 1); SELECT pg_catalog.setval('user_id_seq', 1, true); + +INSERT INTO "user" VALUES (2, '2017-01-01T00:00:00.000000', 'tester1@lavid.ufpb.br', 'tester1', 'tester1', 'pt_BR', 'e4fef6e0-d954-4ce8-be39-ab08a96aa61a', 'pbkdf2:sha256:50000$ZXnRVTb5$2bfd28d77b26d3c1f183192ec793885bbd523ad92b8a6708edce6d5226a850fe', true, false, false, NULL, NULL, NULL, NULL, NULL, NULL, false, true, false, true, '{}', 1); +INSERT INTO "user" VALUES (3, '2017-01-01T00:00:00.000000', 'tester2@lavid.ufpb.br', 'tester2', 'tester2', 'pt_BR', '1d0fbea5-88d7-40f2-a835-676bc3824f8c', 'pbkdf2:sha256:50000$DizF7nb3$d4b4946fcac8a88cb2337d610e743432441719559f236b0d5816feb9ffbbefdf', true, false, false, NULL, NULL, NULL, NULL, NULL, NULL, false, true, false, true, '{}', 1); +INSERT INTO "user" VALUES (4, '2017-01-01T00:00:00.000000', 'tester3@lavid.ufpb.br', 'tester3', 'tester3', 'pt_BR', '8c5707aa-e813-4a5e-b3f1-7d3e413da494', 'pbkdf2:sha256:50000$pYfjlhqL$a3bbd613e39c0ef6387548b4ef1c8b273bf02031b34b10d2f26f21f0839da890', true, false, false, NULL, NULL, NULL, NULL, NULL, NULL, false, true, false, true, '{}', 1); +INSERT INTO "user" VALUES (5, '2017-01-01T00:00:00.000000', 'tester4@lavid.ufpb.br', 'tester4', 'tester4', 'pt_BR', 'f47796e1-e0da-49ff-b030-ad7459cf464b', 'pbkdf2:sha256:50000$Zht8o4X9$b4e630fb43254589c407406836bf60b5e669f7368dfa45a24ebbc0ed5fee3872', true, false, false, NULL, NULL, NULL, NULL, NULL, NULL, false, true, false, true, '{}', 1); +INSERT INTO "user" VALUES (6, '2017-01-01T00:00:00.000000', 'tester5@lavid.ufpb.br', 'tester5', 'tester5', 'pt_BR', '7dce7aac-29cd-467f-a1b6-cc96044b5909', 'pbkdf2:sha256:50000$v6cDxeNk$2f7b494d9d4b2e175cdfc9e617758a3a6c30e511385bc24e4d1b499064f9a908', true, false, false, NULL, NULL, NULL, NULL, NULL, NULL, false, true, false, true, '{}', 1); +SELECT pg_catalog.setval('user_id_seq', 6, true); diff --git a/wikilibras-pybossa.sql.old b/wikilibras-pybossa.sql.old deleted file mode 100755 index 4102e5f..0000000 --- a/wikilibras-pybossa.sql.old +++ /dev/null @@ -1,47 +0,0 @@ --- install: --- sudo su postgres -c 'psql --set ON_ERROR_STOP=off -f wikilibras-pybossa.sql pybossa' - --- SELECT * FROM "user"; --- postgres://pybossa:tester@localhost:5432/pybossa - -INSERT INTO "user" ( - id, - created, - email_addr, - name, - fullname, - locale, - api_key, - passwd_hash, - admin, - pro, - privacy_mode, - google_user_id, - ckan_api, - newsletter_prompted, - valid_email, - confirmation_email_sent, - subscribed, - info, - profile_id -) VALUES ( - 1, --id - '2017-02-20T15:12:14.560847', --created - 'wikilibras@lavid.ufpb.br', --email_addr - 'wikilibras', --name - 'wikilibras', --fullname - 'pt_BR', --locale - '2324bc23-7d6f-4840-8905-b1e6c1675eed', --api_key - 'pbkdf2:sha1:1000$wIP6vkOx$99be5c325961aa39030bb10e3b58a85ac3bfaa90', --passwd_hash, - 't', --admin - 'f', --pro - 'f', --privacy_mode - '', --google_user_id - '', --ckan_api - 'f', --newsletter_prompted - 't', --valid_email - 'f', --confirmation_email_sent - 't', --subscribed - '{}', --info - 1 --profile_i -) diff --git a/wikilibrasdbapi/routes/index.js b/wikilibrasdbapi/routes/index.js index 83b3ae6..16a2e8f 100755 --- a/wikilibrasdbapi/routes/index.js +++ b/wikilibrasdbapi/routes/index.js @@ -164,7 +164,7 @@ router.put("/updateselo", function(req, res, next) } else { - query += 'UPDATE "sinal" SET "idSelo" = ' + parseInt(selo) + ' WHERE '; + query += 'UPDATE "sinal" SET "version" = 0, "idSelo" = ' + parseInt(selo) + ' WHERE '; } if (_.isEmpty(idTask) && _.isEmpty(idSinal)) { diff --git a/wikilibrasdbapi/routes/index.js.old b/wikilibrasdbapi/routes/index.js.old new file mode 100755 index 0000000..83b3ae6 --- /dev/null +++ b/wikilibrasdbapi/routes/index.js.old @@ -0,0 +1,969 @@ +var express = require("express"); +var promise = require("bluebird"); // or any other Promise/A+ compatible library; +var _ = require("lodash"); +var pgp = require("pg-promise")({promiseLib: promise}); // overriding the default (ES6 Promise); +var db = pgp("postgres://wikilibras:wikilibras123@localhost:5432/wikilibras"); +var parameters = require("../helpers/parameters"); +var async = require("async"); +var files = require("../helpers/files.js"); +var fs = require('fs'); +var path = require("path"); +var util = require("util"); +var mkdirp = require("mkdirp"); +var multer = require("multer"); +var upload = multer({dest: "uploads/"}); +var users = path.join(__dirname, "../public/users"); +var sys = require("util"); +var exec = require("child_process").exec; +var child = null; +var router = express.Router(); + +// GET home page +router.get("/", function(req, res, next) +{ + res.render("index" + , { + title: "Wikilibras-DB API", + version: "1.0.0" + }); +}); + +router.get("/countvideo", function(req, res, next) +{ + var response = {}; + db.query('SELECT COUNT(*) FROM sinal;') + .then(function(result) + { + // response.status = true; + // response.message = ""; + // response.data = result; + // TODO uncomment lines above, remove the line below and + response = [parseInt(result[0].count)]; + res.status(203); + }) + .catch(function(error) + { + response.status = false; + response.message = ""; + response.data = error; + res.status(500); + }) + .finally(function() + { + res.send(response); + pgp.end(); + }); +}); + +router.get("/listselos", function(req, res, next) +{ + var response = {}; + db.query('SELECT "nomeSelo", "idSelo" FROM "tipoSelo";') + .then(function(result) + { + // response.status = true; + // response.data = result; + response = result; + res.status(203); + }) + .catch(function(error) + { + response.status = false; + response.error = error; + res.status(500); + }) + .finally(function() + { + res.send(response); + pgp.end(); + }); +}); + +router.get("/countuservideos", function(req, res, next) +{ + var response = {}; + var limit = 10; + if (!_.isEmpty(req.query.limit)) + { + var _limit = parseInt(req.query.limit); + if ((0 <= _limit) && (_limit <= 1000)) + { + limit = _limit; + } + } + var query = 'SELECT DISTINCT' + + ' usuario as username,' + + ' "idUsuario" as email,' + + ' CAST(COUNT(*) as INTEGER) as videos' + + ' FROM sinal' + + ' GROUP BY usuario, "idUsuario"' + + ' ORDER BY videos DESC, usuario' + + ' LIMIT ' + limit + ';'; + db.query(query) + .then(function(result) + { + // response.status = true; + // response.data = result; + response = result; + res.status(203); + }) + .catch(function(error) + { + response.status = false; + response.error = error; + console.log(error); + res.status(500); + }) + .finally(function() + { + res.send(response); + pgp.end(); + }); +}); + +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.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.status = true; + } + else + { + 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) + { + 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(); + }); +}); + +/* +// only for test +router.get("/populate", function(req, res, next) +{ + var response = {}; + exec("sudo su postgres -c 'psql --set ON_ERROR_STOP=off -f ../wikilibras-db-api-dump.sql wikilibras'", + function(error, stdout, stderr) + { + if (error) + { + response.status = false; + response.message = "Error while populate"; + console.log(stdout); + res.status = 500; + } + else if (stderr.length > 0) + { + response.status = false; + response.message = "The Database already been populated"; + console.log(stderr); + res.status = 304; + } + else + { + response.status = true; + response.message = "The Database has been populated"; + res.status = 201; + } + res.send(response); + }); +}); +*/ + +router.get("/reset", function(req, res, next) +{ + var response = {}; + db.query('TRUNCATE TABLE sinal, selo; ALTER SEQUENCE sequence RESTART WITH 1;') + .then(function(result) + { + response.status = true; + response.message = "The database has been truncated"; + res.status(203); + }) + .catch(function(error) + { + response.status = false; + response.message = "The database cannot be truncated"; + response.error = error; + res.status(500); + }) + .finally(function() + { + res.send(response); + pgp.end(); + // console.log(JSON.stringify(response, null, 4)); + }); +}); + +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 = []; + db.query('SELECT MAX(version) FROM sinal;') + .then(function(result) + { + response = { "version": result[0].max }; + }) + .catch(function(error) + { + response = error; + }) + .finally(function() + { + pgp.end(); + res.status(200).send(response); + }); +}); + +router.get("/sinais", function(req, res, next) +{ + var results = []; + 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.query("selo"), req.query("version")]) + .then(function(result) + { + res.status(203).send(result); + }) + .catch(function(error) + { + // error; + }) + .finally(function() + { + pgp.end(); + }); + } + else + { + if (!_.isEmpty(req.query("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); + }) + .catch(function(error) + { + // error; + }) + .finally(function() + { + pgp.end(); + }); + } + 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.query("selo")) + + .then(function(result) + { + res.status(203).send(result); + }) + .catch(function(error) + { + // error; + }) + .finally(function() + { + pgp.end(); + }); + } + } +}); + +router.post('/gsinal', function(req, res, next) +{ + console.log("\n\n\n============================================="); + console.log("[" + new Date().toISOString() + "] Requisição do IP: " + req.ip); + console.log("== Parametros: " + util.inspect(req.body)); + console.log("== Body: " + JSON.stringify(req.headers)); + db.query('UPDATE sinal SET "idSelo" = ($1), version = version + 1 WHERE nome = ($2)', [req.body.selo, req.body.nome]) + .then(function(data) + { + res.status(203).send('Sinal ' + req.body.nome + ' atualizado com sucesso [without archive]'); + }) + .catch(function(error) + { + console.log("Erro " + error); + }); +}); + +/* +router.post('/addsinal', upload.array('video', 2), function(req, res, next) +{ + console.log("\n\n\n============================================="); + console.log("[" + new Date().toISOString() + "]"); + console.log("From: " + req.ip); + // console.log("Files: " + req.files[0]); + // console.log("headers: " + JSON.stringify(req.headers)); + console.log("body: " + JSON.stringify(req.body)); + + if (req.method === "OPTIONS") + { + res.header('Access-Control-Allow-Origin', req.headers.origin); + } + else + { + res.header('Access-Control-Allow-Origin', '*'); + } + + if (_.isEmpty(req.body.nome)) + { + res.send(500, 'O valor do parâmetro nome está vazio'); + return; + } + async.series([ + function(callback) + { + console.log("\t >> ORDEM 1"); + if (_.isEmpty(req.body.wikilibras)) + { + console.log("Movendo arquivo para conversão..."); + files.downloadAndMoveVideo(req, 'sinais', callback); + } + else + { + files.downloadAndMoveVideo(req, 'wikilibras', callback); + } + }, + function(callback) + { + console.log("\t >> ORDEM 2"); + if (_.isEmpty(req.body.wikilibras)) + { + console.log("Convertendo para .webm..."); + child = exec('avconv -v error -i uploads/' + req.files[0].originalname + ' -acodec libvorbis -vcodec libvpx -an sinais/' + req.files[0].originalname.slice(0, -4) + '.webm -y', function(error, stdout, stderr) + { + console.log('stdout: ' + stdout); + console.log('stderr: ' + stderr); + if (error !== null) + { + console.log('exec error: ' + error); + } + }); + + child.on('exit', function() + { + setTimeout(function() + { + console.log("Conversão para webm concluída."); + callback(null, 1); + }, 500); + }); + } + else + { + callback(); + } + }, + function(callback) + { + console.log("== Alterando o db"); + db.query('SELECT "idSelo" FROM "sinal" WHERE nome = $1', req.body.nome) + .then(function(result) + { + var d = new Date(); + if (Object.keys(result).length > 0) + { + if (!_.isEmpty(req.body.overwrite)) + { + if (!_.isEmpty(req.body.wikilibras)) + { + db.query('UPDATE sinal SET avatar = ($1), blender = ($2) WHERE nome = ($3)', [req.files[0].originalname, req.files[1].originalname, req.body.nome]) + .then(function(data) + { + res.send(200, 'Sinal ' + req.body.nome + ' atualizado com sucesso [with avatar/blender].'); + }) + .catch(function(error) + { + console.log("Erro " + error); + }); + } + if (!_.isEmpty(req.files)) + { + db.query('UPDATE sinal SET "idSelo" = ($1), version = version + 1, file = ($2) WHERE nome = ($3)', [req.body.selo, req.files[0].originalname, req.body.nome]) + .then(function(data) + { + res.status(200).send('Sinal ' + req.body.nome + ' atualizado com sucesso [with archive].'); + }) + .catch(function(error) + { + console.log("Erro " + error); + }); + } + else + { + db.query('UPDATE sinal SET "idSelo" = ($1) WHERE nome = ($2)', [req.body.selo, req.body.nome]) + .then(function(data) + { + res.status(200).send('Sinal ' + req.body.nome + ' atualizado com sucesso [without archive].'); + }) + .catch(function(error) + { + console.log("Erro " + error); + }); + } + } + else + { + res.status(500).send('Sinal já cadastrado no sistema'); + } + } + else + { + if (_.isEmpty(req.body.selo)) + { + req.body.selo = 7; + } + db.one('insert into sinal (usuario, nome, "idSelo", data, version, estado, cidade, file) values ($1, $2, $3, $4, $5, $6, $7, $8) returning "idSinal"', [req.body.login, req.body.nome, req.body.selo, d.getFullYear() + "/" + d.getMonth() + "/" + d.getDate(), 1, req.body.estado, req.body.cidade, req.files[0].originalname.slice(0, -4) + '.webm']) + .then(function(data) + { + res.status(200).send('Sinal ' + req.body.nome + ' adicionado com sucesso.'); + }) + .catch(function(error) + { + console.log("Erro " + error); + }); + } + }) + .catch(function(error) + { + console.log(error); + }) + .finally(function() + { + pgp.end(); + }); + } + , ], function(err) + { + if (err) + { + res.send(500, "Error"); + return; + } + }); +}); +*/ + +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() + "]"); + // 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 < 1) + { + 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"]; + var estado = req.body["estado"]; + var classe = req.body["classe-gramatical"]; + var nome = req.body["nome"]; + var cidade = req.body["cidade"]; + var frase = req.body["frases"]; + var selo = req.body["selo"]; + var filesize = req.files[0].size; + var input = req.files[0].path; + var videoref = ""; + var output = ""; + var maxfilesize = 25; // MB + if (filesize > (maxfilesize * 1048576)) + { + return res.status(500).send("O tamanho do arquivo deve ter no máximo " + maxfilesize + " MB"); + } + if (_.isEmpty(nome)) + { + return res.status(500).send("ERROR: O campo 'nome' não foi encontrado"); + } + else + { + nome = nome.trim().toUpperCase(); + videoref = nome + "_REF.webm"; + } + if (_.isEmpty(selo)) + { + selo = 7; + } + if (_.isEmpty(login)) + { + console.log("WARNING: O campo 'login' não foi encontrado"); + } + else + { + directory = path.join(directory, login); + } + if (_.isEmpty(estado)) + { + console.log("WARNING: O campo 'estado' não foi encontrado"); + } + else + { + directory = path.join(directory, estado); + } + if (_.isEmpty(classe)) + { + console.log("WARNING: O campo 'classe' não foi encontrado"); + } + else + { + directory = path.join(directory, classe); + } + output = path.join(directory, videoref); + async.series([ + function (callback) + { + if (fs.existsSync(directory)) + { + callback(null, 1); + } + else + { + 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); + } + }); + } + }, + // Converter para formato webm + function(callback) + { + 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) + { + if (error || (stderr.length > 0)) + { + var log = "O arquivo de vídeo é inválido, ou ocorreu um erro durante a conversão\nDetalhes: " + stdout + stderr; + log = log.trim(); + res.status(500); + callback(true, log); + } + else + { + res.status(200); + return 0; + } + }); + child.on("exit", function(code) + { + setTimeout(function() + { + if (code === 0) + { + console.log("Conversão concluída"); + callback(null, 1); + } + else + { + callback(true, new Error("Erro durante conversão")); + } + }, 500); + }); + }, + function(callback) + { + console.log("Verificando se este sinal já existe"); + db.query('SELECT "idSinal" FROM "sinal" WHERE usuario = ($1) AND estado = ($2) AND classe = ($3) AND nome = ($4)', [login, estado, classe, nome]) + .then(function(result) + { + var d = new Date(); + var date = d.getFullYear() + "/" + d.getMonth() + "/" + d.getDate(); + if (Object.keys(result).length > 0) + { + var idSinal = result[0].idSinal; + console.log("Existe, atualizando o sinal[" + idSinal + "]: '" + nome + "'"); + db.query('UPDATE sinal SET "idSelo" = ($1), version = ($2), data = ($3), cidade = ($4), frase = ($5), file = ($6) WHERE "idSinal" = ($7)', [7, 0, date, cidade, frase, videoref, idSinal]) + .then(function(data) + { + res.status(200).send("Sinal atualizado"); + }) + .catch(function(error) + { + var message = "Erro ao atualizar sinal '" + nome + "'\n" + error; + console.log(message); + res.status(500).send(message); + }); + } + else + { + 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!"; + console.log(message); + res.status(200).send(message); + }) + .catch(function(error) + { + res.status(500).send(error); + }); + } + }) + .catch(function(error) + { + console.log(error); + }) + .finally(function() + { + pgp.end(); + }); + } + ], + function(err, results) + { + if (err) + { + console.log(results[0]); + } + }); +}); + +module.exports = router; -- libgit2 0.21.2