e-ucm/rage-analytics-backend

View on GitHub
lib/versions.js

Summary

Maintainability
C
7 hrs
Test Coverage
'use strict';

module.exports = (function() {
    var Collection = require('easy-collections');
    var _ = require('underscore');
    var db = require('./db');
    var versions = new Collection(db, 'versions');
    var games = require('./games');
    versions.sort = {
        _id: -1
    };

    var Validator = require('jsonschema').Validator;
    var v = new Validator();

    var versionScheme = {
        id: '/Version',
        type: 'object',
        properties: {
            gameId: { type: 'ID'}
        },
        required: ['gameId'],
        additionalProperties: false
    };
    v.addSchema(versionScheme, '/Version');

    var token = function() {
        return Math.random().toString(36).substr(2);
    };

    versions.setValidator(function(version, insert) {
        if (insert) {
            if (!version.gameId) {
                return false;
            }
            return versions.find({
                gameId: version.gameId
            }).then(function(versions) {
                for (var i = 0; i < versions.length; i++) {
                    version = _.defaults(version, versions[i]);
                }
                delete version._id;
                return version;
            });
        }

        return version;
    });

    versions.createVersion = function(object) {
        return games.findById(object.gameId).then(function (game) {
            if (!game) {
                throw {
                    message: 'Game does not exist',
                    status: 400
                };
            }
            var validationObj = v.validate(object, versionScheme);
            if (validationObj.errors && validationObj.errors.length > 0) {
                throw {
                    message: 'Version bad format: ' + validationObj.errors[0],
                    status: 400
                };
            }
            object.gameId = game._id;
            return versions.insert(object);
        });

    };

    versions.insert = function(object) {

        return Collection.prototype.insert.call(this, object).then(function(version) {
            var set = {
                trackingCode: version._id + token()
            };
            return versions.findAndModify(version._id, set);
        });
    };

    versions.preRemove(function(_id, next) {
        var versionId = _id.toString();
        db.collection('gameplays_' + versionId).drop();
        require('./activities').remove({
            versionId: _id
        }).then(function () {
            next();
        }).fail(function() {
            next();
        });
    });

    return versions;
})();