Skip to content

Commit f94a88f

Browse files
Merge branch 'main' into demo-mode-component
2 parents ca858f9 + f4cfd96 commit f94a88f

189 files changed

Lines changed: 3974 additions & 6579 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

backend/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
"langchain": "^1.2.34",
8080
"lru-cache": "^11.2.7",
8181
"nanoid": "5.1.7",
82-
"nodemailer": "^8.0.2",
82+
"nodemailer": "^8.0.4",
8383
"nunjucks": "^3.2.4",
8484
"openai": "^6.32.0",
8585
"otplib": "^12.0.1",

backend/src/common/application/global-database-context.interface.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ import { ICustomFieldsRepository } from '../../entities/custom-field/repository/
2323
import { IEmailVerificationRepository } from '../../entities/email/repository/email-verification.repository.interface.js';
2424
import { IGroupRepository } from '../../entities/group/repository/group.repository.interface.js';
2525
import { ILogOutRepository } from '../../entities/log-out/repository/log-out-repository.interface.js';
26-
import { IPermissionRepository } from '../../entities/permission/repository/permission.repository.interface.js';
2726
import { ISecretAccessLogRepository } from '../../entities/secret-access-log/repository/secret-access-log-repository.interface.js';
2827
import { SecretAccessLogEntity } from '../../entities/secret-access-log/secret-access-log.entity.js';
2928
import { ActionEventsEntity } from '../../entities/table-actions/table-action-events-module/action-event.entity.js';
@@ -70,7 +69,6 @@ export interface IGlobalDatabaseContext extends IDatabaseContext {
7069
userRepository: Repository<UserEntity> & IUserRepository;
7170
connectionRepository: Repository<ConnectionEntity> & IConnectionRepository;
7271
groupRepository: IGroupRepository;
73-
permissionRepository: IPermissionRepository;
7472
tableSettingsRepository: Repository<TableSettingsEntity> & ITableSettingsRepository;
7573
agentRepository: IAgentRepository;
7674
emailVerificationRepository: IEmailVerificationRepository;

backend/src/common/application/global-database-context.ts

Lines changed: 2 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ import { ConnectionPropertiesEntity } from '../../entities/connection-properties
3131
import { IConnectionPropertiesRepository } from '../../entities/connection-properties/repository/connection-properties.repository.interface.js';
3232
import { customConnectionPropertiesRepositoryExtension } from '../../entities/connection-properties/repository/custom-connection-properties-repository-extension.js';
3333
import { CustomFieldsEntity } from '../../entities/custom-field/custom-fields.entity.js';
34-
import { cusomFieldsCustomRepositoryExtension } from '../../entities/custom-field/repository/custom-field-repository-extension.js';
34+
import { customFieldsCustomRepositoryExtension } from '../../entities/custom-field/repository/custom-field-repository-extension.js';
3535
import { ICustomFieldsRepository } from '../../entities/custom-field/repository/custom-fields-repository.interface.js';
3636
import { EmailVerificationEntity } from '../../entities/email/email-verification.entity.js';
3737
import { IEmailVerificationRepository } from '../../entities/email/repository/email-verification.repository.interface.js';
@@ -42,9 +42,6 @@ import { groupCustomRepositoryExtension } from '../../entities/group/repository/
4242
import { LogOutEntity } from '../../entities/log-out/log-out.entity.js';
4343
import { logOutCustomRepositoryExtension } from '../../entities/log-out/repository/log-out-custom-repository-extension.js';
4444
import { ILogOutRepository } from '../../entities/log-out/repository/log-out-repository.interface.js';
45-
import { PermissionEntity } from '../../entities/permission/permission.entity.js';
46-
import { IPermissionRepository } from '../../entities/permission/repository/permission.repository.interface.js';
47-
import { permissionCustomRepositoryExtension } from '../../entities/permission/repository/permission-custom-repository-extension.js';
4845
import { secretAccessLogRepositoryExtension } from '../../entities/secret-access-log/repository/secret-access-log-repository.extension.js';
4946
import { ISecretAccessLogRepository } from '../../entities/secret-access-log/repository/secret-access-log-repository.interface.js';
5047
import { SecretAccessLogEntity } from '../../entities/secret-access-log/secret-access-log.entity.js';
@@ -123,7 +120,6 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext {
123120
private _userRepository: Repository<UserEntity> & IUserRepository;
124121
private _connectionRepository: Repository<ConnectionEntity> & IConnectionRepository;
125122
private _groupRepository: IGroupRepository;
126-
private _permissionRepository: IPermissionRepository;
127123
private _tableSettingsRepository: Repository<TableSettingsEntity> & ITableSettingsRepository;
128124
private _agentRepository: IAgentRepository;
129125
private _emailVerificationRepository: IEmailVerificationRepository;
@@ -175,9 +171,6 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext {
175171
.getRepository(ConnectionEntity)
176172
.extend(customConnectionRepositoryExtension);
177173
this._groupRepository = this.appDataSource.getRepository(GroupEntity).extend(groupCustomRepositoryExtension);
178-
this._permissionRepository = this.appDataSource
179-
.getRepository(PermissionEntity)
180-
.extend(permissionCustomRepositoryExtension);
181174
this._tableSettingsRepository = this.appDataSource
182175
.getRepository(TableSettingsEntity)
183176
.extend(tableSettingsCustomRepositoryExtension);
@@ -199,7 +192,7 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext {
199192
.extend(customConnectionPropertiesRepositoryExtension);
200193
this._customFieldsRepository = this.appDataSource
201194
.getRepository(CustomFieldsEntity)
202-
.extend(cusomFieldsCustomRepositoryExtension);
195+
.extend(customFieldsCustomRepositoryExtension);
203196
this._tableLogsRepository = this.appDataSource
204197
.getRepository(TableLogsEntity)
205198
.extend(tableLogsCustomRepositoryExtension);
@@ -285,10 +278,6 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext {
285278
return this._groupRepository;
286279
}
287280

288-
public get permissionRepository(): IPermissionRepository {
289-
return this._permissionRepository;
290-
}
291-
292281
public get tableSettingsRepository(): Repository<TableSettingsEntity> & ITableSettingsRepository {
293282
return this._tableSettingsRepository;
294283
}

backend/src/common/data-injection.tokens.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ export enum UseCaseType {
116116
SAAS_REGISTER_USER_WITH_SAML = 'SAAS_REGISTER_USER_WITH_SAML',
117117
SAAS_CREATE_CONNECTION_FOR_HOSTED_DB = 'SAAS_CREATE_CONNECTION_FOR_HOSTED_DB',
118118
SAAS_DELETE_CONNECTION_FOR_HOSTED_DB = 'SAAS_DELETE_CONNECTION_FOR_HOSTED_DB',
119+
SAAS_UPDATE_HOSTED_CONNECTION_PASSWORD = 'SAAS_UPDATE_HOSTED_CONNECTION_PASSWORD',
119120

120121
INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP = 'INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP',
121122
VERIFY_INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP = 'VERIFY_INVITE_USER_IN_COMPANY_AND_CONNECTION_GROUP',

backend/src/entities/agent/agent.entity.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,15 +25,26 @@ export class AgentEntity {
2525
@Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
2626
updatedAt: Date;
2727

28+
private _tokenChanged = false;
29+
30+
setToken(token: string): void {
31+
this.token = token;
32+
this._tokenChanged = true;
33+
}
34+
2835
@BeforeInsert()
2936
encryptToken(): void {
3037
this.token = Encryptor.hashDataHMAC(this.token);
38+
this._tokenChanged = false;
3139
}
3240

3341
@BeforeUpdate()
3442
updateTimestampAndEncryptToken(): void {
3543
this.updatedAt = new Date();
36-
this.token = Encryptor.hashDataHMAC(this.token);
44+
if (this._tokenChanged) {
45+
this.token = Encryptor.hashDataHMAC(this.token);
46+
this._tokenChanged = false;
47+
}
3748
}
3849

3950
@OneToOne(

backend/src/entities/agent/agent.module.ts

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
1-
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
1+
import { Module } from '@nestjs/common';
22
import { TypeOrmModule } from '@nestjs/typeorm';
3-
import { AuthMiddleware } from '../../authorization/index.js';
43
import { GlobalDatabaseContext } from '../../common/application/global-database-context.js';
54
import { BaseType } from '../../common/data-injection.tokens.js';
65
import { LogOutEntity } from '../log-out/log-out.entity.js';
@@ -17,8 +16,4 @@ import { AgentEntity } from './agent.entity.js';
1716
],
1817
exports: [],
1918
})
20-
export class AgentModule implements NestModule {
21-
public configure(consumer: MiddlewareConsumer): any {
22-
consumer.apply(AuthMiddleware).forRoutes();
23-
}
24-
}
19+
export class AgentModule {}

backend/src/entities/agent/repository/agent.repository.interface.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ConnectionTypeTestEnum } from '@rocketadmin/shared-code/dist/src/shared/enums/connection-types-enum.js';
12
import { ConnectionEntity } from '../../connection/connection.entity.js';
23
import { AgentEntity } from '../agent.entity.js';
34

@@ -7,4 +8,6 @@ export interface IAgentRepository {
78
createNewAgentForConnectionAndReturnToken(connection: ConnectionEntity): Promise<string>;
89

910
renewOrCreateConnectionToken(connectionId: string): Promise<string>;
11+
12+
getTestAgentToken(connectionType: ConnectionTypeTestEnum): string;
1013
}

backend/src/entities/agent/repository/custom-agent-repository-extension.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,18 @@ import { ConnectionTypeTestEnum } from '@rocketadmin/shared-code/dist/src/shared
22
import { nanoid } from 'nanoid';
33
import { ConnectionEntity } from '../../connection/connection.entity.js';
44
import { AgentEntity } from '../agent.entity.js';
5+
import { IAgentRepository } from './agent.repository.interface.js';
56

6-
export const customAgentRepositoryExtension = {
7-
async saveNewAgent(agent: AgentEntity): Promise<AgentEntity> {
8-
return await this.save(agent);
9-
},
10-
7+
export const customAgentRepositoryExtension: IAgentRepository = {
118
async createNewAgentForConnectionAndReturnToken(connection: ConnectionEntity): Promise<string> {
129
const newAgent = await this.createNewAgentForConnection(connection);
1310
return newAgent.token;
1411
},
1512

1613
async createNewAgentForConnection(connection: ConnectionEntity): Promise<AgentEntity> {
1714
const agent = new AgentEntity();
18-
let token = nanoid(64);
19-
if (process.env.NODE_ENV !== 'test') {
20-
agent.token = token;
21-
} else {
22-
token = this.getTestAgentToken(connection.type);
23-
agent.token = token;
24-
}
15+
const token = process.env.NODE_ENV !== 'test' ? nanoid(64) : this.getTestAgentToken(connection.type);
16+
agent.setToken(token);
2517
agent.connection = connection;
2618
const savedAgent = await this.save(agent);
2719
savedAgent.token = token;
@@ -42,7 +34,7 @@ export const customAgentRepositoryExtension = {
4234
return await this.createNewAgentForConnectionAndReturnToken(foundConnection);
4335
} else {
4436
const newToken = nanoid(64);
45-
foundAgent.token = newToken;
37+
foundAgent.setToken(newToken);
4638
await this.save(foundAgent);
4739
return newToken;
4840
}

backend/src/entities/amplitude/amplitude.service.ts

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,56 @@
11
import Amplitude from '@amplitude/node';
2-
import { Injectable } from '@nestjs/common';
2+
import { Injectable, OnModuleInit } from '@nestjs/common';
33
import { InjectRepository } from '@nestjs/typeorm';
44
import { Repository } from 'typeorm';
55
import { AmplitudeEventTypeEnum } from '../../enums/index.js';
66
import { UserEntity } from '../user/user.entity.js';
77

8+
export interface AmplitudeLogOptions {
9+
user_email?: string;
10+
tablesCount?: number;
11+
reason?: string;
12+
message?: string;
13+
operationCount?: number;
14+
}
15+
816
@Injectable()
9-
export class AmplitudeService {
17+
export class AmplitudeService implements OnModuleInit {
18+
private client: ReturnType<typeof Amplitude.init>;
19+
1020
constructor(
1121
@InjectRepository(UserEntity)
1222
private readonly userRepository: Repository<UserEntity>,
1323
) {}
1424

15-
public async formAndSendLogRecord(event_type: AmplitudeEventTypeEnum, user_id: string, options = null) {
25+
public onModuleInit(): void {
26+
if (process.env.AMPLITUDE_API_KEY) {
27+
this.client = Amplitude.init(process.env.AMPLITUDE_API_KEY);
28+
}
29+
}
30+
31+
public async formAndSendLogRecord(
32+
event_type: AmplitudeEventTypeEnum,
33+
user_id: string,
34+
options?: AmplitudeLogOptions,
35+
): Promise<void> {
1636
try {
1737
if (process.env.NODE_ENV === 'test') return;
1838
let user_email = (await this.userRepository.findOne({ where: { id: user_id } }))?.email;
1939
if (!user_email && options) {
20-
user_email = options?.user_email;
40+
user_email = options.user_email;
2141
}
22-
let event_properties;
42+
let event_properties: Record<string, unknown> | undefined;
2343
if (user_email) {
2444
event_properties = {
2545
user_properties: {
26-
email: user_email ? user_email : 'unknown',
27-
tablesCount: options?.tablesCount ? options.tablesCount : undefined,
28-
reason: options?.reason ? options?.reason : undefined,
29-
message: options?.message ? options.message : undefined,
46+
email: user_email ?? 'unknown',
47+
tablesCount: options?.tablesCount,
48+
reason: options?.reason,
49+
message: options?.message,
3050
},
3151
};
3252
}
33-
if (options?.operationCount && options?.operationCount > 0) {
53+
if (options?.operationCount && options.operationCount > 0) {
3454
const promisesArr = Array.from(Array(options.operationCount), () =>
3555
this.sendLog(event_type, user_id, event_properties),
3656
);
@@ -43,21 +63,19 @@ export class AmplitudeService {
4363
}
4464
}
4565

46-
private async sendLog(eventType, cognitoUserName, eventProperties) {
47-
const client = Amplitude.init(process.env.AMPLITUDE_API_KEY);
66+
private async sendLog(
67+
eventType: AmplitudeEventTypeEnum,
68+
userId: string,
69+
eventProperties?: Record<string, unknown>,
70+
): Promise<void> {
71+
if (!this.client) return;
4872
try {
49-
client
50-
.logEvent({
51-
event_type: eventType,
52-
user_id: cognitoUserName,
53-
event_properties: eventProperties ? eventProperties : undefined,
54-
})
55-
.catch((e) => {
56-
throw new Error(e);
57-
});
58-
client.flush().catch((e) => {
59-
throw new Error(e);
73+
await this.client.logEvent({
74+
event_type: eventType,
75+
user_id: userId,
76+
event_properties: eventProperties,
6077
});
78+
await this.client.flush();
6179
} catch (e) {
6280
console.error(e);
6381
}

0 commit comments

Comments
 (0)