1 let stream_buffers = require('stream-buffers')
2 let XDate = require('xdate')
5 let session_cookie = await _require('/session_cookie.jst')
7 if (env.request.method !== 'POST') {
8 env.response.setHeader('Allow', 'POST')
9 env.mime_type = 'application/problem+json; charset=utf-8'
16 title: 'Method not allowed',
17 detail: `The endpoint "${env.parsed_url.path}" requires a POST request.`,
30 let write_stream = new stream_buffers.WritableStreamBuffer()
31 let data = new Promise(
32 (resolve, reject) => {
34 on('finish', () => {resolve(write_stream.getContents())}).
35 on('error', () => {reject()})
38 env.request.pipe(write_stream)
39 let query = JSON.parse((await data).toString())
40 let email = query.email.toLowerCase()
41 console.log('sign up', email)
43 // initialize env.session_key, set cookie in env.response
44 let transaction = await env.site.database.Transaction()
45 let session = await session_cookie(env, transaction)
47 let captcha = await session.get('captcha')
48 if (captcha === undefined || XDate.now() >= captcha.get('expires')) {
49 transaction.rollback()
51 env.mime_type = 'application/problem+json; charset=utf-8'
58 title: 'No verification image in session',
59 detail: `Please call the "/api/verification_image.png" endpoint to create a verification image, in same session as the "/api/sign_up.json" call and less than one hour prior.`,
73 let verification_code = query.verification_code.toLowerCase()
74 let captcha_text = await captcha.get('text')
75 if (verification_code !== captcha_text) {
76 console.log(`verification code mismatch, \"${verification_code}\" should be \"${captcha_text}\"`)
77 transaction.rollback()
79 env.mime_type = 'application/problem+json; charset=utf-8'
86 title: 'Verification code mismatch',
87 detail: `The provided verification code "${verification_code}" did not match the verification image.`,
100 let accounts = await (
101 await transaction.get({})
102 ).get('accounts', {})
104 if (accounts.has(email)) {
105 transaction.rollback()
107 env.mime_type = 'application/problem+json; charset=utf-8'
114 title: 'Account already exists',
115 detail: `The email "${email}" already has an account registered.`,
129 transaction.json_to_logjson(
131 given_names: query.given_names || '',
132 family_name: query.family_name || '',
133 password: query.password || '',
134 contact_me: query.contact_me || false,
135 email_verified: false
140 await transaction.commit()