diff --git a/.dockerignore b/.dockerignore index 17a8f5409f6076009cd717b8a76672feab1c9519..0727a20a84abbcc1eaa66a9feb70bd2b55944389 100644 --- a/.dockerignore +++ b/.dockerignore @@ -5,4 +5,5 @@ node_modules/ .circleci/ helm/ google-storage.json -*.tgz \ No newline at end of file +*.tgz +.dck \ No newline at end of file diff --git a/Makefile b/Makefile index a6d22faa68cb882cb4517025a346e1ae824cde78..89609969c797e0b54289adf198f2d952d04762d2 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ ORG=jetsam APPNAME=api TAG=latest REMOTE_TAG=$(TAG) -REMOTE=lcr.gr +REMOTE=registry.digitalocean.com export diff --git a/package.json b/package.json index 42ec44a4f9089026db161ec63c4d995efce00160..59878e97d640c0fcbfb6dcc52083841f5c1d51b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "jetsam-api", - "version": "2.0.0-beta.2", + "version": "2.2.0", "description": "The Jetsam App API Server", "main": "server.js", "scripts": { diff --git a/src/domain/data/MetricsService.js b/src/domain/data/MetricsService.js index 832087609270e732c08eeaf41141dc82bc82abc8..8aa9027bb87d283988597cd0ff8e435394821635 100644 --- a/src/domain/data/MetricsService.js +++ b/src/domain/data/MetricsService.js @@ -3,6 +3,7 @@ const crypto = require('core/utils/crypto') const { User, AccessToken, Metric, Sequelize } = require('database/models') const { unset } = require('bootstrap') const HttpError = require('core/errors/HttpError') +const moment = require("moment"); const { Op } = Sequelize @@ -17,6 +18,22 @@ module.exports = class MetricsService extends ContextualModule { async recordMetric(value, type, location, meta = {}, transaction) { const user = await this.ctx.services['core.auth'].getUser() + const surveys = await user.getSurveys({ + where: { + expires_at: { + [Sequelize.Op.gt]: moment.utc().toISOString() + }, + published_at: { + [Sequelize.Op.lt]: moment.utc().toISOString() + }, + public: true, + }, + }) + + if (surveys.length > 0) { + meta.surveys = surveys.map(s => s.id) + } + const point = { type: 'Point', coordinates: [location.longitude, location.latitude], diff --git a/src/http/controllers/api/v2/surveys.js b/src/http/controllers/api/v2/surveys.js index 9752c7dc00de19d884e2d586488decbbb23fe394..8a4251a025d3892e1f18b7cebcd222691e839b76 100644 --- a/src/http/controllers/api/v2/surveys.js +++ b/src/http/controllers/api/v2/surveys.js @@ -2,11 +2,11 @@ const moment = require('moment') const UnauthorizedError = require("../../../../core/errors/UnauthorizedError"); const NotFoundError = require("../../../../core/errors/NotFoundError"); const HttpError = require("../../../../core/errors/HttpError"); -const { Survey, SurveyUser, User, sequelize } = require('database/models') -const { QueryTypes } = require('sequelize') +const {Survey, SurveyUser, User, sequelize} = require('database/models') +const {QueryTypes} = require('sequelize') exports.list = async ctx => { - const { Sequelize, Survey } = require('database/models') + const {Sequelize, Survey} = require('database/models') const user = await ctx.services['core.auth'].getUser() let includes = user ? [{ @@ -26,15 +26,18 @@ exports.list = async ctx => { [Sequelize.Op.lt]: moment.utc().toISOString() }, public: true, - } - }, { + }, include: includes + }, { }) - console.log(surveys) - ctx.body = { - surveys: surveys.map(s => s.asOwnSurvey()), + surveys: surveys.map(s => { + if (Array.isArray(s.SurveyUsers) && s.SurveyUsers[0] != null) { + s.SurveyUser = s.SurveyUsers[0] + } + return s.asOwnSurvey(); + }), } } @@ -47,7 +50,7 @@ exports.joined = async ctx => { return } - const surveys = await user.getSurveys({ include: [SurveyUser] }) + const surveys = await user.getSurveys({include: [SurveyUser]}) ctx.body = { surveys: surveys.map(s => s.asOwnSurvey()) @@ -64,19 +67,19 @@ exports.join = async ctx => { throw new UnauthorizedError() } - const { survey } = ctx.models - const { properties = {} } = ctx.request.body + const {survey} = ctx.models + const {properties = {}} = ctx.request.body console.log(survey.properties, properties) if (Object.values(survey.properties).length !== Object.values(properties).length) { - throw new HttpError(400, 'Must provide values for all properties') + throw new HttpError(400, `Must provide values for all properties. Expecting: [${Object.keys(survey.properties).join(', ')}]; Found [${Object.keys(properties).join(', ')}] `) } const surveyUserProperties = {} Object.entries(survey.properties).forEach(([key, type]) => { if (properties[key] == null) { - throw new HttpError(400, `Must provide value for property ${ key }`) + throw new HttpError(400, `Must provide value for property ${key}`) } surveyUserProperties[key] = properties[key] }) @@ -101,10 +104,10 @@ exports.join = async ctx => { } const [rows, count] = await sequelize.query(` - INSERT INTO "survey_users" ("user_id","properties","survey_id") - VALUES (:user_id,:properties,:survey_id) RETURNING "user_id","survey_id","properties","created_at"; + INSERT INTO "survey_users" ("user_id", "properties", "survey_id") + VALUES (:user_id, :properties, :survey_id) RETURNING "user_id","survey_id","properties","created_at"; `, { - replacements: { survey_id: survey.id, user_id: user.id, properties: JSON.stringify(properties) }, + replacements: {survey_id: survey.id, user_id: user.id, properties: JSON.stringify(properties)}, type: QueryTypes.INSERT, }) @@ -130,4 +133,20 @@ exports.leave = async ctx => { throw new UnauthorizedError() } + const result = await sequelize.query(`DELETE + FROM "survey_users" + WHERE user_id = :user_id + AND survey_id = :survey_id`, { + replacements: { + survey_id: ctx.models.survey.id, + user_id: user.id, + }, + type: QueryTypes.DELETE + }) + + console.log(result) + + ctx.body = { + success: true + } } \ No newline at end of file