Ejemplo n.º 1
0
  getStatement(statement.id, function(err, retrievedStatement) {
    if (retrievedStatement) {
      log.warn({id: statement.id}, 'Attempted to save a learning activity statement that already exists');
      return callback({code: 400, msg: 'Attempted to save a learning activity statement that already exists'});
    } else if (err && err.code !== 404) {
      log.error({id: statement.id}, 'Unable to verify if learning activity statement already exists');
      return callback(err);
    }

    // Validate the xAPI statement
    xapiValidator.validate(statement, function(err) {
      if (err) {
        log.warn({err: err}, 'Invalid learning activity statement');
        return callback({code: 500, msg: err});
      }

      // When no uuid has been included, generate one
      statement.id = statement.id || uuid.v4();

      var currentTimestamp = new Date().toISOString();

      // When no timestamp has been included, generate one
      statement.timestamp = statement.timestamp || currentTimestamp;

      // Add the stored timestamp
      statement.stored = currentTimestamp;

      // Set statement type and version. Currently all XAPI feeds are coming from in house apps running 1.0.2 version.
      // TODO: For future integrations these variables can be derived to accomodate different versions. Currently, setting it to default.
      var statementType = XAPI;
      var statementVersion = XAPI_VERSION;
      var voided = false;

      // Get the learning activity statement that's referenced in the current
      // learning activity statement, if any
      getStatementRef(statement, function(err, refStatement) {
        if (err) {
          log.error({err: err}, 'An error occured while getting the referenced learning activity statement');
          return callback(err);
        }

        // Create the activity type summary (verb_objecttype)
        var activityType = statement.verb.id.split('/').pop();
        if (statement.object && statement.object.definition && statement.object.definition.type) {
          activityType += '_' + statement.object.definition.type.split('/').pop();
        } else if (refStatement && refStatement.object && refStatement.object.definition && refStatement.object.definition.type) {
          activityType += '_' + refStatement.object.definition.type.split('/').pop();
        }
        activityType = activityType.toLowerCase();

        // Get the user associated to this learning activity. If the user
        // doesn't exist yet, it will be created
        getOrCreateUser(ctx, statement, function(err, user) {
          if (err) {
            log.error({err: err}, 'An error occured while getting the learning activity statement actor');
            return callback(err);
          }

          var actorType = null;
          if (user) {
            actorType = 'Person';
          }

          // Store the learning activity statement in the DB
          var storedStatement = {
            uuid: statement.id,
            statement: statement,
            verb: statement.verb.id,
            timestamp: statement.timestamp,
            activity_type: activityType,
            voided: voided,
            tenant_id: ctx.auth.tenant_id,
            user_id: user.id,
            actor_type: actorType,
            statement_type: statementType,
            statement_version: statementVersion,
            credential_id: ctx.auth.id
          };

          DB.Statement.create(storedStatement).complete(function(err, statement) {
            if (err) {
              log.error({err: err}, 'Failed to store a new learning activity statement');
              return callback({code: 500, msg: err.message});
            }

            log.debug({statement: statement}, 'Sucessfully stored learning activity statement');
            return callback(null, statement);
          });
        });
      });
    });
  });
Ejemplo n.º 2
0
    getStatement(statement.id, function(err, retrievedStatement) {
      if (retrievedStatement) {
        log.warn({'id': statement.id}, 'Attempted to save a learning activity statement that already exists');
        return callback({'code': 400, 'msg': 'Attempted to save a learning activity statement that already exists'});
      } else if (err && err.code !== 404) {
        log.error({'id': statement.id}, 'Unable to verify if learning activity statement already exists');
        return callback(err);
      }

      // Validate the statement
      xapiValidator.validate(statement, function(err) {
        if (err) {
          log.warn({'err': err}, 'Invalid learning activity statement');
          return callback({'code': 500, 'msg': err});
        }

        // When no uuid has been included, generate one
        statement.id = statement.id || uuid.v4();

        var currentTimestamp = new Date().toISOString();

        // When no timestamp has been included, generate one
        statement.timestamp = statement.timestamp || currentTimestamp;

        // Add the stored timestamp
        statement.stored = currentTimestamp;

        // Get the learning activity statement that's referenced in the current
        // learning activity statement, if any
        getStatementRef(statement, function(err, refStatement) {
          if (err) {
            log.error({'err': err}, 'An error occured while getting the referenced learning activity statement');
            return callback(err);
          }

          // Create the activity type summary (verb_objecttype)
          var activityType = statement.verb.id.split('/').pop();
          if (statement.object && statement.object.definition && statement.object.definition.type) {
            activityType += '_' + statement.object.definition.type.split('/').pop();
          } else if (refStatement && refStatement.object && refStatement.object.definition && refStatement.object.definition.type) {
            activityType += '_' + refStatement.object.definition.type.split('/').pop();
          }
          activityType = activityType.toLowerCase();

          // Get the user associated to this learning activity. If the user
          // doesn't exist yet, it will be created
          getOrCreateUser(ctx, statement, function(err, user) {
            if (err) {
              log.error({'err': err}, 'An error occured while getting the learning activity statement actor');
              return callback(err);
            }

            // Store the learning activity statement in the DB
            var storedStatement = {
              'uuid': statement.id,
              'statement': statement,
              'verb': statement.verb.id,
              'timestamp': statement.timestamp,
              'activity_type': activityType,
              'voided': false,
              'tenant_id': ctx.auth.tenant_id,
              'user_id': user.id,
              'write_credential_id': ctx.auth.id
            };

            DB.Statement.create(storedStatement).complete(function(err, statement) {
              if (err) {
                log.error({'err': err}, 'Failed to store a new learning activity statement');
                return callback({'code': 500, 'msg': err.message});
              }

              log.debug({'statement': statement}, 'Sucessfully stored learning activity statement');
              return callback();
            });
          });
        });
      });
    })