-
Notifications
You must be signed in to change notification settings - Fork 1
/
meeting.js
79 lines (64 loc) · 1.77 KB
/
meeting.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
var identifier = require('identifier');
var _ = require('lodash');
function getTime() {
var now = new Date();
var utc = new Date(
now.getUTCFullYear(),
now.getUTCMonth(),
now.getUTCDate(),
now.getUTCHours(),
now.getUTCMinutes(),
now.getUTCSeconds());
return utc;
}
function Meeting (name) {
this.id = identifier(3);
this.name = name;
this.attendees = [];
this.total = 0;
this.rate = 0; // per second
this.timeStamp = new Date();
}
Meeting.prototype = {
addAttendee: function(id, ratePerHour) {
var rate = ratePerHour / 3600 ;
this.attendees.push({ id: id, rate: rate });
this.updateRate(rate);
},
removeAttendee: function(id) {
var attendee = _.find(this.attendees, function(attendee) { return attendee.id == id; });
var index = _.indexOf(this.attendees, attendee);
if (index == -1) {
return;
}
var rate = this.attendees[index].rate;
this.attendees.splice(index, 1);
this.updateRate(-rate);
},
updateTotal: function() {
var newTimestamp = getTime();
var timespanMillis = newTimestamp - this.timeStamp;
this.timeStamp = newTimestamp;
this.total += this.getRate() * ( timespanMillis / 1000 );
},
updateRate: function(rate) {
this.updateTotal();
this.rate += rate;
},
getRate: function() { return this.rate; },
getTotal: function() { this.updateTotal(); return this.total; },
getAttendees: function() {
return _.map(this.attendees, function (attendee) { return attendee.id; });
},
clientModel: function() {
return {
rate: this.getRate(),
total: this.getTotal(),
timestamp: +getTime(),
id: this.id,
name: this.name,
attendees: this.getAttendees()
};
}
};
module.exports = exports = Meeting;