-
Notifications
You must be signed in to change notification settings - Fork 70
/
default-user-modify-crud.repository.base.ts
126 lines (118 loc) · 3.87 KB
/
default-user-modify-crud.repository.base.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
// Copyright (c) 2023 Sourcefuse Technologies
//
// This software is released under the MIT License.
// https://opensource.org/licenses/MIT
import {
Count,
DataObject,
Entity,
Getter,
juggler,
Where,
} from '@loopback/repository';
import {HttpErrors} from '@loopback/rest';
import {Options} from 'loopback-datasource-juggler';
import {AuthErrorKeys} from 'loopback4-authentication';
import {SoftCrudRepository} from 'loopback4-soft-delete';
import {IAuthUserWithPermissions} from '../components';
import {UserModifiableEntity} from '../models';
export class DefaultUserModifyCrudRepository<
T extends UserModifiableEntity,
ID,
Relations extends object = {},
> extends SoftCrudRepository<T, ID, Relations> {
constructor(
entityClass: typeof Entity & {
prototype: T;
},
dataSource: juggler.DataSource,
protected readonly getCurrentUser: Getter<
IAuthUserWithPermissions | undefined
>,
) {
super(entityClass, dataSource);
}
async create(entity: DataObject<T>, options?: Options): Promise<T> {
let currentUser = await this.getCurrentUser();
currentUser = currentUser ?? options?.currentUser;
if (!currentUser) {
throw new HttpErrors.Forbidden(AuthErrorKeys.InvalidCredentials);
}
const uid = currentUser?.userTenantId ?? currentUser?.id;
entity.createdBy = uid;
entity.modifiedBy = uid;
return super.create(entity, options);
}
async createAll(entities: DataObject<T>[], options?: Options): Promise<T[]> {
let currentUser = await this.getCurrentUser();
currentUser = currentUser ?? options?.currentUser;
if (!currentUser) {
throw new HttpErrors.Forbidden(AuthErrorKeys.InvalidCredentials);
}
const uid = currentUser?.userTenantId ?? currentUser?.id;
entities.forEach(entity => {
entity.createdBy = uid ?? '';
entity.modifiedBy = uid ?? '';
});
return super.createAll(entities, options);
}
async save(entity: T, options?: Options): Promise<T> {
const currentUser = await this.getCurrentUser();
if (!currentUser) {
throw new HttpErrors.Forbidden(AuthErrorKeys.InvalidCredentials);
}
const uid = currentUser?.userTenantId ?? currentUser?.id;
entity.modifiedBy = uid;
return super.save(entity, options);
}
async update(entity: T, options?: Options): Promise<void> {
const currentUser = await this.getCurrentUser();
if (!currentUser) {
throw new HttpErrors.Forbidden(AuthErrorKeys.InvalidCredentials);
}
const uid = currentUser?.userTenantId ?? currentUser?.id;
entity.modifiedBy = uid;
return super.update(entity, options);
}
async updateAll(
data: DataObject<T>,
where?: Where<T>,
options?: Options,
): Promise<Count> {
let currentUser = await this.getCurrentUser();
currentUser = currentUser ?? options?.currentUser;
if (!currentUser) {
throw new HttpErrors.Forbidden(AuthErrorKeys.InvalidCredentials);
}
const uid = currentUser?.userTenantId ?? currentUser?.id;
data.modifiedBy = uid;
return super.updateAll(data, where, options);
}
async updateById(
id: ID,
data: DataObject<T>,
options?: Options,
): Promise<void> {
let currentUser = await this.getCurrentUser();
currentUser = currentUser ?? options?.currentUser;
if (!currentUser) {
throw new HttpErrors.Forbidden(AuthErrorKeys.InvalidCredentials);
}
const uid = currentUser?.userTenantId ?? currentUser?.id;
data.modifiedBy = uid;
return super.updateById(id, data, options);
}
async replaceById(
id: ID,
data: DataObject<T>,
options?: Options,
): Promise<void> {
const currentUser = await this.getCurrentUser();
if (!currentUser) {
throw new HttpErrors.Forbidden(AuthErrorKeys.InvalidCredentials);
}
const uid = currentUser?.userTenantId ?? currentUser?.id;
data.modifiedBy = uid;
return super.replaceById(id, data, options);
}
}