]>
Commit | Line | Data |
---|---|---|
ecb4e35f C |
1 | import { createClient, RedisClient } from 'redis' |
2 | import { logger } from '../helpers/logger' | |
3 | import { generateRandomString } from '../helpers/utils' | |
4 | import { CONFIG, USER_PASSWORD_RESET_LIFETIME } from '../initializers' | |
5 | ||
6 | class Redis { | |
7 | ||
8 | private static instance: Redis | |
9 | private initialized = false | |
10 | private client: RedisClient | |
11 | private prefix: string | |
12 | ||
13 | private constructor () {} | |
14 | ||
15 | init () { | |
16 | // Already initialized | |
17 | if (this.initialized === true) return | |
18 | this.initialized = true | |
19 | ||
20 | this.client = createClient({ | |
21 | host: CONFIG.REDIS.HOSTNAME, | |
22 | port: CONFIG.REDIS.PORT | |
23 | }) | |
24 | ||
25 | this.client.on('error', err => { | |
26 | logger.error('Error in Redis client.', err) | |
27 | process.exit(-1) | |
28 | }) | |
29 | ||
30 | if (CONFIG.REDIS.AUTH) { | |
31 | this.client.auth(CONFIG.REDIS.AUTH) | |
32 | } | |
33 | ||
34 | this.prefix = 'redis-' + CONFIG.WEBSERVER.HOST + '-' | |
35 | } | |
36 | ||
37 | async setResetPasswordVerificationString (userId: number) { | |
38 | const generatedString = await generateRandomString(32) | |
39 | ||
40 | await this.setValue(this.generateResetPasswordKey(userId), generatedString, USER_PASSWORD_RESET_LIFETIME) | |
41 | ||
42 | return generatedString | |
43 | } | |
44 | ||
45 | async getResetPasswordLink (userId: number) { | |
46 | return this.getValue(this.generateResetPasswordKey(userId)) | |
47 | } | |
48 | ||
49 | private getValue (key: string) { | |
50 | return new Promise<string>((res, rej) => { | |
51 | this.client.get(this.prefix + key, (err, value) => { | |
52 | if (err) return rej(err) | |
53 | ||
54 | return res(value) | |
55 | }) | |
56 | }) | |
57 | } | |
58 | ||
59 | private setValue (key: string, value: string, expirationMilliseconds: number) { | |
60 | return new Promise<void>((res, rej) => { | |
61 | this.client.set(this.prefix + key, value, 'PX', expirationMilliseconds, (err, ok) => { | |
62 | if (err) return rej(err) | |
63 | ||
64 | if (ok !== 'OK') return rej(new Error('Redis result is not OK.')) | |
65 | ||
66 | return res() | |
67 | }) | |
68 | }) | |
69 | } | |
70 | ||
71 | private generateResetPasswordKey (userId: number) { | |
72 | return 'reset-password-' + userId | |
73 | } | |
74 | ||
75 | static get Instance () { | |
76 | return this.instance || (this.instance = new this()) | |
77 | } | |
78 | } | |
79 | ||
80 | // --------------------------------------------------------------------------- | |
81 | ||
82 | export { | |
83 | Redis | |
84 | } |