Implement a command-line interface to the running webserver, and a way to get/set...
[ndcode_site.git] / _config / sign_in.mjs
1 #!/usr/bin/env node
2
3 import readline from 'readline'
4 import util from 'util'
5 import Problem from './Problem.mjs'
6 import Session from './Session.mjs'
7
8 let session = new Session('session.json')
9 try {
10   await session.load()
11 }
12 catch (error) {
13   if (error.code !== 'ENOENT')
14     throw error
15
16   console.log('warning: session.json not found, using defaults')
17 }
18
19 let rl = readline.createInterface(
20   {
21     input: process.stdin,
22     output: process.stdout,
23     terminal: false
24   }
25 )
26 let rl_question = util.promisify(rl.question).bind(rl)
27
28 let url = await rl_question(`url: [${session.persistent.url || ''}] `)
29 if (url.length)
30   session.persistent.url = url
31 else if (session.persistent.url === undefined) {
32   console.log('url is required')
33   process.exit(1)
34 }
35
36 let username = await rl_question(`username: [${session.persistent.username || ''}] `)
37 if (username.length)
38   session.persistent.username = username
39 else if (session.persistent.username === undefined) {
40   console.log('username is required')
41   process.exit(1)
42 }
43
44 let password = await rl_question('password: ')
45 if (password.length < 8) {
46   console.log('password is minimum 8 characters')
47   process.exit(1)
48 }
49
50 rl.close()
51
52 try {
53   await session.api_call(
54     '/api/account/sign_in.json',
55     session.persistent.username,
56     password
57   )
58 }
59 catch (error) {
60   let problem = Problem.from(error)
61   console.error('problem:')
62   console.error('  title:', problem.title)
63   console.error('  detail:', problem.detail)
64   console.error('  status:', problem.status)
65
66   await session.save()
67   process.exit(1)
68 }
69
70 await session.save()