UNPKG

4.81 kBJavaScriptView Raw
1var http = require("http");
2var path = require("path");
3var fs = require("fs");
4var util = require("../util/util");
5var request = require("request");
6
7var Gitana = require("gitana");
8
9var exports = module.exports;
10
11var fns = {};
12
13var trigger = function(eventName)
14{
15 var list = fns[eventName];
16 if (list)
17 {
18 for (var i = 0; i < list.length; i++)
19 {
20 list[i]();
21 }
22 }
23};
24
25/**
26 * Handles registration of a user.
27 *
28 * @param req
29 * @param res
30 */
31var handleRegister = function(req, res)
32{
33 // registration info
34 var form = req.body;
35
36 // validation
37 var errors = [];
38
39 // check for missing password
40 if (!form.password)
41 {
42 errors.push({
43 "field": "password",
44 "error": "Field 'password' is missing"
45 });
46 }
47
48 // check for missing verify
49 if (!form.passwordVerify)
50 {
51 errors.push({
52 "field": "passwordVerify",
53 "error": "Field 'passwordVerify' is missing"
54 });
55 }
56
57 // check that passwords match
58 if (form.password != form.passwordVerify)
59 {
60 errors.push({
61 "field": "password",
62 "error": "The passwords do not match."
63 });
64 }
65
66 // check email provided
67 if (!form.email)
68 {
69 errors.push({
70 "field": "email",
71 "error": "Field 'email' is missing"
72 });
73 }
74
75 // check for email validity
76 if (form.email)
77 {
78 var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
79 if (!re.test(form.email))
80 {
81 errors.push({
82 "field": "email",
83 "error": "The provided email is not valid"
84 });
85 }
86 }
87
88 // check username
89 if (!form.username)
90 {
91 errors.push({
92 "field": "username",
93 "error": "Field 'username' is missing"
94 });
95 }
96
97 // gitana instance
98 var gitana = req.gitana;
99
100 // check if a user already exists with this username
101 Chain(gitana.datastore("principals")).trap(function() {
102
103 // not found
104 p();
105
106 }).readPrincipal(form.username).then(function() {
107
108 // found
109 errors.push({
110 "field": "username",
111 "error": "A user already exists for this username."
112 });
113
114 p();
115
116 });
117
118 var p = function()
119 {
120 if (errors && errors.length > 0)
121 {
122 res.send(500, {
123 "ok": false,
124 "errors": errors
125 });
126 return;
127 }
128
129 var errHandler = function(err) {
130
131 res.send(500, {
132 "ok": false,
133 "message": err.message
134 });
135 };
136
137 Chain(gitana.datastore("principals")).trap(errHandler).createUser({
138 "name": form.username,
139 "email": form.email,
140 "password": form.password
141 }).then(function() {
142 var user = this;
143
144 // add the user to the "appusers" team for the stack
145 var teamKey = "appusers-" + gitana.application().getId();
146 Chain(gitana.stack()).trap(errHandler).readTeam(teamKey).addMember(user).then(function() {
147
148 res.send({
149 "ok": true,
150 "user": user
151 });
152
153 });
154 });
155 };
156};
157
158var handleInvalidate = function(req, res)
159{
160 // custom invalidations
161 trigger("invalidate");
162
163 // new timestamp
164 process.env.CLOUDCMS_APPSERVER_TIMESTAMP = new Date().getTime();
165
166 // update all socket clients
167 process.IO.sockets.emit("timestamp", {
168 "timestamp": process.env.CLOUDCMS_APPSERVER_TIMESTAMP
169 });
170
171 console.log("Server timestamp regenerated");
172
173 res.send({
174 "ok": true,
175 "timestamp": process.env.CLOUDCMS_APPSERVER_TIMESTAMP
176 });
177};
178
179var handleInfo = function(req, res)
180{
181 res.send({
182 "ok": true,
183 "timestamp": process.env.CLOUDCMS_APPSERVER_TIMESTAMP,
184 "process.env.CLOUDCMS_APPSERVER_MODE": process.env.CLOUDCMS_APPSERVER_MODE
185 });
186};
187
188exports.init = function(app, callback)
189{
190 /**
191 * Registers a user.
192 */
193 app.post("/register", function(req, res) {
194 handleRegister(req, res);
195 });
196
197 /**
198 * Invalidates all HTML5 and server-side caches.
199 */
200 app.get("/server/invalidate", function(req, res) {
201 handleInvalidate(req, res);
202 });
203
204 /**
205 * Debug helper
206 */
207 app.get("/server/info", function(req, res) {
208 handleInfo(req, res);
209 });
210
211 callback();
212};
213
214exports.onInvalidate = function(fn)
215{
216 if (!fns["invalidate"])
217 {
218 fns["invalidate"] = [];
219 }
220
221 fns["invalidate"].push(fn);
222};