Source: models/invite-link.js

'use strict';

/**
 * Model for invitation links that let users sign up. Not versioned.
 *
 * @namespace InviteLink
 */
const thinky = require('../db');
const r = thinky.r;
const type = thinky.type;
const User = require('./user');
const config = require('config');

let inviteLinkSchema = {
  id: type.string().uuid(4),
  createdOn: type.date(),
  url: type.virtual().default(function() {
    return `${config.qualifiedURL}register/${this.id}`;
  })
};

let InviteLink = thinky.createModel("invite_link", inviteLinkSchema);

InviteLink.hasOne(User, 'usedByUser', 'usedBy', 'id');
InviteLink.hasOne(User, 'createdByUser', 'createdBy', 'id');
User.hasMany(InviteLink, "inviteCodes", "id", "createdBy");
User.hasMany(InviteLink, "registrationCodes", "id", "usedBy");

// NOTE: STATIC METHODS --------------------------------------------------------

/**
 * Get the invite links a given user has generated
 *
 * @param {User} user
 *  user to look up
 * @returns {Query}
 *  links in reverse chronological order
 */
InviteLink.getAvailable = function(user) {

  return InviteLink
    .filter({
      createdBy: user.id,
      usedBy: false
    }, {
      default: true
    })
    .orderBy(r.desc('createdOn'));
};

/**
 * Get the invite links generated by a given user that have already been used
 * by another user to sign up for an account
 *
 * @param {User} user
 *  user to look up
 * @returns {Query}
 *  links in reverse chronological order
 */
InviteLink.getUsed = function(user) {

  return InviteLink
    .filter({ createdBy: user.id })
    .filter(inviteLink => inviteLink('usedBy').ne(false))
    .getJoin({ usedByUser: true })
    .orderBy(r.desc('createdOn'));

};

module.exports = InviteLink;