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.`,
29 let write_stream = new stream_buffers.WritableStreamBuffer()
30 let data = new Promise(
31 (resolve, reject) => {
33 on('finish', () => {resolve(write_stream.getContents())}).
34 on('error', () => {reject()})
37 env.request.pipe(write_stream)
38 let query = JSON.parse((await data).toString())
39 let email = query.email.toLowerCase()
40 console.log('sign up', email)
42 // initialize env.session_key, set cookie in env.response
43 let transaction = env.site.database.Transaction()
44 let session = await session_cookie(env, transaction)
46 let captcha = await session.get('captcha')
47 if (captcha === undefined || XDate.now() >= captcha.get('expires')) {
48 transaction.rollback()
50 env.mime_type = 'application/problem+json; charset=utf-8'
57 title: 'No verification image in session',
58 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.`,
71 let verification_code = query.verification_code.toLowerCase()
72 let captcha_text = await captcha.get('text')
73 if (verification_code !== captcha_text) {
74 console.log(`verification code mismatch, \"${verification_code}\" should be \"${captcha_text}\"`)
75 transaction.rollback()
77 env.mime_type = 'application/problem+json; charset=utf-8'
84 title: 'Verification code mismatch',
85 detail: `The provided verification code "${verification_code}" did not match the verification image.`,
97 let accounts = await (
98 await transaction.get({})
101 if (accounts.has(email)) {
102 transaction.rollback()
104 env.mime_type = 'application/problem+json; charset=utf-8'
111 title: 'Account already exists',
112 detail: `The email "${email}" already has an account registered.`,
125 transaction.json_to_logjson(
127 given_names: query.given_names || '',
128 family_name: query.family_name || '',
129 password: query.password || '',
130 contact_me: query.contact_me || false,
131 email_verified: false
136 await transaction.commit()