UNPKG

1.93 kBJavaScriptView Raw
1const os = require('os')
2const path = require('path')
3const fsEx = require('fs-extra')
4// @ts-check
5
6class UserSettings {
7 constructor () {
8 this.settingsFolder = process.env.USER_PATH ? process.env.USER_PATH : path.join(os.homedir(), '.sgcloud')
9 this.sessionFile = path.join(this.settingsFolder, 'session.json')
10 this.userData = null
11 }
12
13 /**
14 * @returns {Promise<UserSettings>}
15 */
16 async validate () {
17 await this.getToken()
18 return this
19 }
20
21 /**
22 * @returns {Promise<string>}
23 */
24 async getToken () {
25 const data = await this._loadSession()
26 if (!data.token) throw new Error('You\'re not logged in! Please run `sgconnect login` again.')
27 return data.token
28 }
29
30 /**
31 * @param {string} token - JWT Session Token
32 * @return {Promise<UserSettings>}
33 */
34 async setToken (token) {
35 const data = await this._loadSession()
36 data.token = token
37 await this._updateSession(data)
38 return this
39 }
40
41 /**
42 * @returns {String}
43 */
44 async getUsername () {
45 const data = await this._loadSession()
46 return !data.user ? undefined : data.user
47 }
48
49 /**
50 * @param {String} user The user name, i.e. email address
51 * @return {UserSettings}
52 */
53 async setUsername (user) {
54 const data = await this._loadSession()
55 data.user = user
56 await this._updateSession(data)
57 return this
58 }
59
60 /**
61 * @returns {Promise<Object>} The user / session data
62 * @private
63 */
64 async _loadSession () {
65 if (this.userData) return this.userData
66
67 try {
68 this.userData = await fsEx.readJson(this.sessionFile) || {}
69 return this.userData
70 } catch (err) {
71 return {}
72 }
73 }
74
75 /**
76 * @param {Object} data
77 * @returns {Promise<void>}
78 * @private
79 */
80 async _updateSession (data) {
81 await fsEx.ensureDir(this.settingsFolder)
82 await fsEx.writeJson(this.sessionFile, data)
83 this.userData = data
84 }
85}
86
87module.exports = UserSettings