Commit | Line | Data |
---|---|---|
e99c53fb BA |
1 | const db = require("../utils/database"); |
2 | ||
3 | const UserEntity = | |
4 | { | |
5 | /* | |
6 | * Structure: | |
7 | * _id: BSON id | |
8 | * ** Strings, identification informations: | |
9 | ||
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; |