summaryrefslogtreecommitdiffstats
path: root/app/Models/User.ts
diff options
context:
space:
mode:
Diffstat (limited to 'app/Models/User.ts')
-rw-r--r--app/Models/User.ts78
1 files changed, 41 insertions, 37 deletions
diff --git a/app/Models/User.ts b/app/Models/User.ts
index cc2c553..d292b3a 100644
--- a/app/Models/User.ts
+++ b/app/Models/User.ts
@@ -1,70 +1,70 @@
1import { DateTime } from 'luxon' 1import { DateTime } from 'luxon';
2import { BaseModel, beforeSave, column, hasMany } from '@adonisjs/lucid/orm' 2import { BaseModel, beforeSave, column, hasMany } from '@adonisjs/lucid/orm';
3import hash from '@adonisjs/core/services/hash' 3import hash from '@adonisjs/core/services/hash';
4import emitter from '@adonisjs/core/services/emitter' 4import emitter from '@adonisjs/core/services/emitter';
5import moment from 'moment' 5import moment from 'moment';
6import Encryption from '@ioc:Adonis/Core/Encryption' 6import Encryption from '@ioc:Adonis/Core/Encryption';
7import randtoken from 'rand-token' 7import randtoken from 'rand-token';
8import Token from './Token.js' 8import Token from './Token.js';
9import Workspace from './Workspace.js' 9import Workspace from './Workspace.js';
10import Service from './Service.js' 10import Service from './Service.js';
11import mail from '@adonisjs/mail/services/main' 11import mail from '@adonisjs/mail/services/main';
12import { url } from '#config/app' 12import { url } from '#config/app';
13import { mailFrom } from '#config/dashboard' 13import { mailFrom } from '#config/dashboard';
14import { HasMany } from '@adonisjs/lucid/types/relations' 14import { HasMany } from '@adonisjs/lucid/types/relations';
15 15
16export default class User extends BaseModel { 16export default class User extends BaseModel {
17 @column({ isPrimary: true }) 17 @column({ isPrimary: true })
18 public id: number 18 public id: number;
19 19
20 @column() 20 @column()
21 public email: string 21 public email: string;
22 22
23 @column() 23 @column()
24 public username: string 24 public username: string;
25 25
26 @column() 26 @column()
27 public password: string 27 public password: string;
28 28
29 @column() 29 @column()
30 public lastname: string 30 public lastname: string;
31 31
32 // TODO: Type the settings object. 32 // TODO: Type the settings object.
33 @column() 33 @column()
34 public settings: object 34 public settings: object;
35 35
36 @column.dateTime({ autoCreate: true }) 36 @column.dateTime({ autoCreate: true })
37 public created_at: DateTime 37 public created_at: DateTime;
38 38
39 @column.dateTime({ autoCreate: true, autoUpdate: true }) 39 @column.dateTime({ autoCreate: true, autoUpdate: true })
40 public updated_at: DateTime 40 public updated_at: DateTime;
41 41
42 @beforeSave() 42 @beforeSave()
43 public static async hashPassword(user: User) { 43 public static async hashPassword(user: User) {
44 if (user.$dirty.password) { 44 if (user.$dirty.password) {
45 user.password = await hash.make(user.password) 45 user.password = await hash.make(user.password);
46 } 46 }
47 } 47 }
48 48
49 @hasMany(() => Token, { 49 @hasMany(() => Token, {
50 foreignKey: 'user_id', 50 foreignKey: 'user_id',
51 }) 51 })
52 public tokens: HasMany<typeof Token> 52 public tokens: HasMany<typeof Token>;
53 53
54 @hasMany(() => Service, { 54 @hasMany(() => Service, {
55 foreignKey: 'userId', 55 foreignKey: 'userId',
56 }) 56 })
57 public services: HasMany<typeof Service> 57 public services: HasMany<typeof Service>;
58 58
59 @hasMany(() => Workspace, { 59 @hasMany(() => Workspace, {
60 foreignKey: 'userId', 60 foreignKey: 'userId',
61 }) 61 })
62 public workspaces: HasMany<typeof Workspace> 62 public workspaces: HasMany<typeof Workspace>;
63 63
64 public async forgotPassword(): Promise<void> { 64 public async forgotPassword(): Promise<void> {
65 const token = await this.generateToken(this, 'forgot_password') 65 const token = await this.generateToken(this, 'forgot_password');
66 66
67 await mail.send((message) => { 67 await mail.send(message => {
68 message 68 message
69 .from(mailFrom) 69 .from(mailFrom)
70 .to(this.email) 70 .to(this.email)
@@ -73,13 +73,13 @@ export default class User extends BaseModel {
73 username: this.username, 73 username: this.username,
74 appUrl: url, 74 appUrl: url,
75 token: token, 75 token: token,
76 }) 76 });
77 }) 77 });
78 78
79 await emitter.emit('forgot:password', { 79 await emitter.emit('forgot:password', {
80 user: this, 80 user: this,
81 token, 81 token,
82 }) 82 });
83 } 83 }
84 84
85 private async generateToken(user: User, type: string): Promise<string> { 85 private async generateToken(user: User, type: string): Promise<string> {
@@ -88,17 +88,21 @@ export default class User extends BaseModel {
88 .query() 88 .query()
89 .where('type', type) 89 .where('type', type)
90 .where('is_revoked', false) 90 .where('is_revoked', false)
91 .where('updated_at', '>=', moment().subtract(24, 'hours').format('YYYY-MM-DD HH:mm:ss')) 91 .where(
92 'updated_at',
93 '>=',
94 moment().subtract(24, 'hours').format('YYYY-MM-DD HH:mm:ss'),
95 );
92 96
93 const row = await query.first() 97 const row = await query.first();
94 if (row) { 98 if (row) {
95 return row.token 99 return row.token;
96 } 100 }
97 101
98 const token = Encryption.encrypt(randtoken.generate(16)) 102 const token = Encryption.encrypt(randtoken.generate(16));
99 103
100 await user.related('tokens').create({ type, token }) 104 await user.related('tokens').create({ type, token });
101 105
102 return token 106 return token;
103 } 107 }
104} 108}