consensus
Version:
vote for topics for your next meeting
140 lines (118 loc) • 2.76 kB
JavaScript
var
_ = require('lodash'),
assert = require('assert'),
P = require('p-promise'),
polyclay = require('polyclay'),
Puid = require('puid'),
through = require('through'),
Topic = require('./Topic')
;
var puid = new Puid(true);
var Agenda = module.exports = polyclay.Model.buildClass(
{
properties:
{
key: 'string',
title: 'string',
created: 'date',
modified: 'date',
description: 'string',
owner: 'reference',
active: 'boolean'
},
required: [ 'key', 'title', 'owner'],
singular: 'agenda',
plural: 'agendas',
initialize: function()
{
this.active = true;
},
});
polyclay.persist(Agenda);
Agenda.compare = function(left, right)
{
if (!left.active && right.active)
return -1;
if (!right.active && left.active)
return 1;
return left.title.localeCompare(right.title);
};
Agenda.create = function(opts)
{
assert(opts, 'you must pass an options object to Agenda.create()');
assert(opts.owner, 'you must pass opts.owner to Agenda.create()');
var agenda = new Agenda();
agenda.key = puid.generate();
agenda.created = Date.now();
agenda.modified = agenda.created;
agenda.owner = opts.owner;
agenda.title = opts.title;
agenda.description = opts.description;
return agenda.save()
.then(function()
{
return agenda;
});
};
function compareTopics(left, right)
{
if (left.closed() && !right.closed())
return -1;
if (right.closed() && !left.closed())
return 1;
if (left.tally === right.tally)
return (left.created.getTime() - right.created.getTime());
return left.tally - right.tally;
}
Agenda.prototype.fetchTopics = function()
{
if (this.topics)
return P(this.topics);
var self = this,
deferred = P.defer();
var topicdb = Topic.adapter.objects;
var keys = [];
var opts =
{
start: this.key + ':',
end: this.key + '}'
};
topicdb.createKeyStream(opts)
.on('data', function(key)
{
keys.push(key);
})
.on('end', function()
{
Topic.get(keys, function(err, topics)
{
if (err)
deferred.reject(err);
else
{
self.topics = topics.sort(compareTopics).reverse();
self.topics.open = _.filter(self.topics, function(item) { return !item.closed(); });
self.topics.top = self.topics.open.slice(0, 3);
self.topics.closed = _.filter(self.topics, function(item) { return item.closed(); });
deferred.resolve(self.topics);
}
});
});
return deferred.promise;
};
Agenda.stream = function()
{
var thruStream = through();
Agenda.adapter.objects.createReadStream()
.on('data', function (data) {
thruStream.queue(JSON.stringify(data.value) + '\n');
})
.on('error', function (err)
{
thruStream.end();
})
.on('end', function () {
thruStream.end();
});
return thruStream;
};