First commit
[qomet.git] / entities / user.js
1 const db = require("../utils/database");
2
3 const UserEntity =
4 {
5 /*
6 * Structure:
7 * _id: BSON id
8 * ** Strings, identification informations:
9 * email
10 * forename
11 * name
12 * initials : computed, Benjamin Auder --> ba ...etc
13 * loginToken: {
14 * value: string
15 * timestamp: datetime (validity)
16 * ip: address of requesting machine
17 * }
18 * sessionTokens (array): cookie identification
19 */
20
21 getInitialsByPrefix: function(prefix, cb)
22 {
23 db.users.find(
24 { initials: new RegExp("^" + prefix) },
25 { initials: 1, _id: 0 },
26 cb
27 );
28 },
29
30 insert: function(newUser, cb)
31 {
32 db.users.insert(Object.assign({},
33 newUser,
34 {
35 loginToken: { },
36 sessionTokens: [ ],
37 }),
38 cb
39 );
40 },
41
42 getByLoginToken: function(token, cb)
43 {
44 db.users.findOne(
45 { "loginToken.value": token },
46 cb
47 );
48 },
49
50 getBySessionToken: function(token, cb)
51 {
52 db.users.findOne(
53 { sessionTokens: token},
54 cb
55 );
56 },
57
58 getById: function(uid, cb)
59 {
60 db.users.findOne(
61 { _id: uid },
62 cb
63 );
64 },
65
66 getByEmail: function(email, cb)
67 {
68 db.users.findOne(
69 { email: email },
70 cb
71 );
72 },
73
74 getByInitials: function(initials, cb)
75 {
76 db.users.findOne(
77 { initials: initials },
78 cb
79 );
80 },
81
82 getUnlogged: function(cb)
83 {
84 var tsNow = new Date().getTime();
85 // 86400000 = 24 hours in milliseconds
86 var day = 86400000;
87 db.users.find({}, (err,userArray) => {
88 let unlogged = userArray.filter( u => {
89 return u.sessionTokens.length==0 && u._id.getTimestamp().getTime() + day < tsNow;
90 });
91 cb(err, unlogged);
92 });
93 },
94
95 getAll: function(cb)
96 {
97 db.users.find({}, cb);
98 },
99
100 setLoginToken: function(token, uid, ip, cb)
101 {
102 db.users.update(
103 { _id: uid },
104 { $set: { loginToken: {
105 value: token,
106 timestamp: new Date().getTime(),
107 ip: ip,
108 }}
109 },
110 cb
111 );
112 },
113
114 setSessionToken: function(token, uid, cb)
115 {
116 // Also empty the login token to invalidate future attempts
117 db.users.update(
118 { _id: uid },
119 {
120 $set: { loginToken: {} },
121 $push: { sessionTokens: {
122 $each: [token],
123 $slice: -7 //only allow 7 simultaneous connections per user (TODO?)
124 }}
125 },
126 cb
127 );
128 },
129
130 removeToken: function(uid, token, cb)
131 {
132 db.users.update(
133 { _id: uid },
134 { $pull: {sessionTokens: token} },
135 cb
136 );
137 },
138
139 // TODO: later, allow account removal
140 remove: function(uids)
141 {
142 db.users.remove({_id: uids});
143 },
144 }
145
146 module.exports = UserEntity;