+++ /dev/null
-class Problem {
- constructor(title, detail, status) {
- this.title = title
- this.detail = detail
- this.status = status
- }
-
- // note: Javascript errors return status 400 (Bad request) in the client
- // version of Problem, 500 (Internal server error) in the server version
- static from(error) {
- return (
- error instanceof Problem ?
- error :
- new Problem(
- 'Internal server error',
- (error.stack || error.message),
- 500
- )
- )
- }
-}
-
-return Problem
+let jst_server = (await import('@ndcode/jst_server')).default
let stream_buffers = require('stream-buffers')
return async (env, handler) => {
- let Problem = await _require('/_lib/Problem.jst')
-
- let result
- try {
- if (env.request.method !== 'POST') {
- env.response.setHeader('Allow', 'POST')
- throw new Problem(
- 'Method not allowed',
- `The endpoint "${env.parsed_url.path}" requires a POST request.`,
- 405
- )
- }
-
- let write_stream = new stream_buffers.WritableStreamBuffer()
- let data = new Promise(
- (resolve, reject) => {
- write_stream.
- on('finish', () => {resolve(write_stream.getContents())}).
- on('error', () => {reject()})
- }
+ if (env.request.method !== 'POST') {
+ env.response.setHeader('Allow', 'POST')
+ throw new jst_server.Problem(
+ 'Method not allowed',
+ `The endpoint "${env.parsed_url.path}" requires a POST request.`,
+ 405
)
- env.request.pipe(write_stream)
- let args = JSON.parse((await data).toString('utf-8'))
- console.log('endpoint', env.parsed_url.path, 'args', JSON.stringify(args))
-
- result = await handler(...args)
- if (result === undefined)
- result = null
- console.log('endpoint', env.parsed_url.path, 'result', JSON.stringify(result))
}
- catch (error) {
- let problem =
- error instanceof Problem ?
- error :
- new Problem(
- // title
- 'Internal server error',
- // details
- (error.stack || error.message).toString()
- // status
- 500
- )
- console.log('endpoint', env.parsed_url.path, 'problem', problem.detail)
- env.mime_type = 'application/problem+json; charset=utf-8'
- env.site.serve(
- env,
- problem.status,
- Buffer.from(
- JSON.stringify(
- {
- title: problem.title,
- detail: problem.detail,
- status: problem.status
- },
- null,
- 2
- ) + '\n',
- 'utf-8'
- ),
- 'post_request.jst'
- )
- return
- }
+ let write_stream = new stream_buffers.WritableStreamBuffer()
+ let data = new Promise(
+ (resolve, reject) => {
+ write_stream.
+ on('finish', () => {resolve(write_stream.getContents())}).
+ on('error', () => {reject()})
+ }
+ )
+ env.request.pipe(write_stream)
+ let args = JSON.parse((await data).toString('utf-8'))
+ console.log('endpoint', env.parsed_url.path, 'args', JSON.stringify(args))
+
+ let result = await handler(...args)
+ if (result === undefined)
+ result = null
+ console.log('endpoint', env.parsed_url.path, 'result', JSON.stringify(result))
env.site.serve(
env,
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_account = await _require('/_lib/get_account.jst')
let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
let account = await get_account(root, session)
if (account === undefined)
- throw new Problem('Unauthorized', 'Please sign in first.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Please sign in first.',
+ 401
+ )
return {
given_names: await account.get_json('given_names'),
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_account = await _require('/_lib/get_account.jst')
let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
contact_me: details.contact_me ? true : false
}
if (details.given_names.length === 0)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
let account = await get_account(root, session)
if (account === undefined)
- throw new Problem('Unauthorized', 'Please sign in first.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Please sign in first.',
+ 401
+ )
account.set_json('given_names', details.given_names)
account.set_json('family_name', details.family_name)
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
let crypto = require('crypto')
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_account = await _require('/_lib/get_account.jst')
let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
old_password = old_password.slice(0, 256)
new_password = new_password.slice(0, 256)
if (old_password.length < 8 || new_password.length < 8)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
let account = await get_account(root, session)
if (account === undefined)
- throw new Problem('Unauthorized', 'Please sign in first.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Please sign in first.',
+ 401
+ )
if (old_password !== await account.get_json('password'))
- throw new Problem(
+ throw new jst_server.Problem(
'Incorrect password',
`Provided old password did not match the expected value.`,
426
let crypto = require('crypto')
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_nodemailer = await _require('/_lib/get_nodemailer.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
email = email.slice(0, 256).toLowerCase()
password = password.slice(0, 256)
if (email.length === 0 || password.length < 8)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
let accounts = await root.get('accounts', {})
let account = await accounts.get(email)
if (account === undefined)
- throw new Problem(
+ throw new jst_server.Problem(
'Account does not exist',
`Please create the account for "${email}" before attempting to reset its password.`
421
+let jst_server = (await import('@ndcode/jst_server')).default
+
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
email = email.slice(0, 256).toLowerCase()
password = password.slice(0, 256)
if (email.length === 0 || password.length < 8)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
account === undefined ||
password !== await account.get_json('password')
)
- throw new Problem(
+ throw new jst_server.Problem(
'Unauthorized',
'Email and password combination was incorrect.'
401
)
if (!await account.get_json('email_verified'))
- throw new Problem(
+ throw new jst_server.Problem(
'Email not yet verified',
'Please verify your email address via email link before trying to sign in.',
425
+let jst_server = (await import('@ndcode/jst_server')).default
+
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
details.given_names.length === 0 ||
details.password.length < 8
)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
captcha === undefined ||
XDate.now() >= await captcha.get_json('expires')
)
- throw new Problem(
+ throw new jst_server.Problem(
'No verification image in session',
`Please call the "/api/verification_image.png" endpoint to create a verification image, in same session as the "/api/account/sign_up/create_account.json" call and less than one hour prior.`,
418
if (verification_code !== captcha_text) {
console.log(`verification code mismatch, \"${verification_code}\" should be \"${captcha_text}\"`)
- throw new Problem(
+ throw new jst_server.Problem(
'Verification code mismatch',
`The provided verification code "${verification_code}" did not match the verification image.`,
419
let accounts = await root.get('accounts', {})
if (accounts.has(details.email))
- throw new Problem(
+ throw new jst_server.Problem(
'Account already exists',
`The email "${details.email}" already has an account registered.`,
420
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
let crypto = require('crypto')
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_nodemailer = await _require('/_lib/get_nodemailer.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
// coerce and/or validate
email = email.slice(0, 256).toLowerCase()
if (email.length === 0)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
let accounts = await root.get('accounts', {})
let account = await accounts.get(email)
if (account === undefined)
- throw new Problem(
+ throw new jst_server.Problem(
'Account does not exist',
`Please create the account for "${email}" before attempting to send an email verification link.`
421
)
if (await account.get_json('email_verified'))
- throw new Problem(
+ throw new jst_server.Problem(
'Email already verified',
`Your email "${email}" is already verified. You can now sign in.`
422
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
let crypto = require('crypto')
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
email = email.slice(0, 256).toLowerCase()
link_code = link_code.slice(0, 256).toLowerCase()
if (email.length === 0 || link_code.length < 32)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
let accounts = await root.get('accounts', {})
let account = await accounts.get(email)
if (account === undefined)
- throw new Problem(
+ throw new jst_server.Problem(
'Account does not exist',
`Please create the account for "${email}" before attempting to verify the email verification link.`
421
)
if (await account.get_json('email_verified'))
- throw new Problem(
+ throw new jst_server.Problem(
'Email already verified',
`Your email "${email}" is already verified. You can now sign in.`
422
verify_email === undefined ||
XDate.now() >= await verify_email.get_json('expires')
)
- throw new Problem(
+ throw new jst_server.Problem(
'Link code missing',
`Email verification link code for account "${email}" does not exist or has expired.`,
423
)
if (link_code !== await verify_email.get_json('link_code'))
- throw new Problem(
+ throw new jst_server.Problem(
'Link code mismatch',
`Provided email verification link code "${link_code}" does not match expected value.`,
423
let crypto = require('crypto')
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
email = email.slice(0, 256).toLowerCase()
link_code = link_code.slice(0, 256).toLowerCase()
if (email.length === 0 || link_code.length < 32)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
let accounts = await root.get('accounts', {})
let account = await accounts.get(email)
if (account === undefined)
- throw new Problem(
+ throw new jst_server.Problem(
'Account does not exist',
`Please create the account for "${email}" before attempting to verify the password reset link.`
421
verify_password === undefined ||
XDate.now() >= await verify_password.get_json('expires')
)
- throw new Problem(
+ throw new jst_server.Problem(
'Link code missing',
`Password reset link code for account "${email}" does not exist or has expired.`,
423
)
if (link_code !== await verify_password.get_json('link_code'))
- throw new Problem(
+ throw new jst_server.Problem(
'Link code mismatch',
`Provided password reset link code "${link_code}" does not match expected value.`,
423
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_nodemailer = await _require('/_lib/get_nodemailer.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
details.email.length === 0 ||
details.message.length === 0
)
- throw new Problem(
+ throw new jst_server.Problem(
'Bad request',
'Minimum length check failed',
400
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_account = await _require('/_lib/get_account.jst')
let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
let account = await get_account(root, session)
if (account === undefined)
- throw new Problem('Unauthorized', 'Please sign in first.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Please sign in first.',
+ 401
+ )
if (!await account.get_json('administrator'))
- throw new Problem('Unauthorized', 'Not administrator.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Not administrator.',
+ 401
+ )
return /*await*/ root.get_json('globals', {})
}
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let post_request = await _require('/_lib/post_request.jst')
let get_session = await _require('/_lib/get_session.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
let account = await get_account(root, session)
if (account === undefined)
- throw new Problem('Unauthorized', 'Please sign in first.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Please sign in first.',
+ 401
+ )
if (!await account.get_json('administrator'))
- throw new Problem('Unauthorized', 'Not administrator.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Not administrator.',
+ 401
+ )
root.set_json('globals', globals)
await transaction.commit()
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_account = await _require('/_lib/get_account.jst')
let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
let account = await get_account(root, session)
if (account === undefined)
- throw new Problem('Unauthorized', 'Please sign in first.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Please sign in first.',
+ 401
+ )
if (!await account.get_json('administrator'))
- throw new Problem('Unauthorized', 'Not administrator.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Not administrator.',
+ 401
+ )
return /*await*/ root.get_json('nodemailers', {})
}
+let jst_server = (await import('@ndcode/jst_server')).default
let XDate = require('xdate')
return async env => {
let get_account = await _require('/_lib/get_account.jst')
let get_session = await _require('/_lib/get_session.jst')
let post_request = await _require('/_lib/post_request.jst')
- let Problem = await _require('/_lib/Problem.jst')
await post_request(
// env
let account = await get_account(root, session)
if (account === undefined)
- throw new Problem('Unauthorized', 'Please sign in first.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Please sign in first.',
+ 401
+ )
if (!await account.get_json('administrator'))
- throw new Problem('Unauthorized', 'Not administrator.', 401)
+ throw new jst_server.Problem(
+ 'Unauthorized',
+ 'Not administrator.',
+ 401
+ )
root.set_json('nodemailers', nodemailers)
await transaction.commit()
#!/bin/sh
rm -rf node_modules package-lock.json
-npm link @ndcode/logjson @ndcode/nodemailer_cache @ndcode/zettair_cache
+npm link @ndcode/jst_server @ndcode/logjson @ndcode/zettair_cache
npm install
npm link
"description": "Example website using JavaScript Template system",
"directories": {},
"dependencies": {
+ "@ndcode/jst_server": "^0.1.0",
"@ndcode/logjson": "^0.1.0",
"@ndcode/zettair_cache": "^0.1.0",
"captchagen": "^1.2.0",