Skip to content

Commit 7d0ee49

Browse files
committed
Add AI responses to user functionality with repository and entity integration
1 parent 191f276 commit 7d0ee49

11 files changed

Lines changed: 204 additions & 50 deletions

File tree

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

Lines changed: 28 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,52 +1,54 @@
11
import { Repository } from 'typeorm';
22
import { IAgentRepository } from '../../entities/agent/repository/agent.repository.interface.js';
3+
import { IAiResponsesToUserRepository } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user-repository.interface.js';
4+
import { AiResponsesToUserEntity } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.js';
5+
import { IAiUserFilesRepository } from '../../entities/ai/ai-data-entities/ai-user-files/ai-user-files-repository.interface.js';
6+
import { AiUserFileEntity } from '../../entities/ai/ai-data-entities/ai-user-files/ai-user-files.entity.js';
7+
import { IAiUserThreadsRepository } from '../../entities/ai/ai-data-entities/ai-user-threads/ai-user-threads-repository.interface.js';
8+
import { AiUserThreadEntity } from '../../entities/ai/ai-data-entities/ai-user-threads/ai-user-threads.entity.js';
9+
import { UserApiKeyEntity } from '../../entities/api-key/api-key.entity.js';
10+
import { IUserApiKeyRepository } from '../../entities/api-key/repository/user-api-key-repository.interface.js';
11+
import { CompanyFaviconEntity } from '../../entities/company-favicon/company-favicon.entity.js';
12+
import { CompanyInfoEntity } from '../../entities/company-info/company-info.entity.js';
13+
import { InvitationInCompanyEntity } from '../../entities/company-info/invitation-in-company/invitation-in-company.entity.js';
14+
import { IInvitationInCompanyRepository } from '../../entities/company-info/invitation-in-company/repository/invitation-repository.interface.js';
15+
import { ICompanyInfoRepository } from '../../entities/company-info/repository/company-info-repository.interface.js';
16+
import { CompanyLogoEntity } from '../../entities/company-logo/company-logo.entity.js';
17+
import { CompanyTabTitleEntity } from '../../entities/company-tab-title/company-tab-title.entity.js';
318
import { IConnectionPropertiesRepository } from '../../entities/connection-properties/repository/connection-properties.repository.interface.js';
19+
import { ConnectionEntity } from '../../entities/connection/connection.entity.js';
420
import { IConnectionRepository } from '../../entities/connection/repository/connection.repository.interface.js';
521
import { ICustomFieldsRepository } from '../../entities/custom-field/repository/custom-fields-repository.interface.js';
622
import { IEmailVerificationRepository } from '../../entities/email/repository/email-verification.repository.interface.js';
723
import { IGroupRepository } from '../../entities/group/repository/group.repository.interface.js';
824
import { ILogOutRepository } from '../../entities/log-out/repository/log-out-repository.interface.js';
925
import { IPermissionRepository } from '../../entities/permission/repository/permission.repository.interface.js';
26+
import { ActionEventsEntity } from '../../entities/table-actions/table-action-events-module/action-event.entity.js';
27+
import { IActionEventsRepository } from '../../entities/table-actions/table-action-events-module/repository/action-events-custom-repository.interface.js';
28+
import { ActionRulesEntity } from '../../entities/table-actions/table-action-rules-module/action-rules.entity.js';
29+
import { IActionRulesRepository } from '../../entities/table-actions/table-action-rules-module/repository/action-rules-custom-repository.interface.js';
1030
import { ITableActionRepository } from '../../entities/table-actions/table-actions-module/repository/table-action-custom-repository.interface.js';
31+
import { TableActionEntity } from '../../entities/table-actions/table-actions-module/table-action.entity.js';
1132
import { TableFieldInfoEntity } from '../../entities/table-field-info/table-field-info.entity.js';
33+
import { ITableFiltersCustomRepository } from '../../entities/table-filters/repository/table-filters-custom-repository.interface.js';
34+
import { TableFiltersEntity } from '../../entities/table-filters/table-filters.entity.js';
1235
import { TableInfoEntity } from '../../entities/table-info/table-info.entity.js';
1336
import { ITableLogsRepository } from '../../entities/table-logs/repository/table-logs-repository.interface.js';
1437
import { ITableSettingsRepository } from '../../entities/table-settings/repository/table-settings.repository.interface.js';
38+
import { TableSettingsEntity } from '../../entities/table-settings/table-settings.entity.js';
1539
import { IUserAccessRepository } from '../../entities/user-access/repository/user-access.repository.interface.js';
1640
import { IUserActionRepository } from '../../entities/user-actions/repository/user-action.repository.interface.js';
1741
import { IUserRepository } from '../../entities/user/repository/user.repository.interface.js';
1842
import { IEmailChangeRepository } from '../../entities/user/user-email/repository/email-change.repository.interface.js';
43+
import { IUserGitHubIdentifierRepository } from '../../entities/user/user-github-identifier/repository/user-github-identifier-repository.interface.js';
1944
import { IUserInvitationRepository } from '../../entities/user/user-invitation/repository/user-invitation-repository.interface.js';
2045
import { IPasswordResetRepository } from '../../entities/user/user-password/repository/password-reset-repository.interface.js';
21-
import { ITableWidgetsRepository } from '../../entities/widget/repository/table-widgets-repository.interface.js';
22-
import { IDatabaseContext } from '../database-context.interface.js';
23-
import { IUserGitHubIdentifierRepository } from '../../entities/user/user-github-identifier/repository/user-github-identifier-repository.interface.js';
24-
import { CompanyInfoEntity } from '../../entities/company-info/company-info.entity.js';
25-
import { ICompanyInfoRepository } from '../../entities/company-info/repository/company-info-repository.interface.js';
26-
import { InvitationInCompanyEntity } from '../../entities/company-info/invitation-in-company/invitation-in-company.entity.js';
27-
import { IInvitationInCompanyRepository } from '../../entities/company-info/invitation-in-company/repository/invitation-repository.interface.js';
2846
import { IUserSessionSettings } from '../../entities/user/user-session-settings/reposiotory/user-session-settings-repository.interface.js';
2947
import { UserSessionSettingsEntity } from '../../entities/user/user-session-settings/user-session-settings.entity.js';
3048
import { UserEntity } from '../../entities/user/user.entity.js';
31-
import { ConnectionEntity } from '../../entities/connection/connection.entity.js';
32-
import { ActionRulesEntity } from '../../entities/table-actions/table-action-rules-module/action-rules.entity.js';
33-
import { IActionRulesRepository } from '../../entities/table-actions/table-action-rules-module/repository/action-rules-custom-repository.interface.js';
34-
import { IActionEventsRepository } from '../../entities/table-actions/table-action-events-module/repository/action-events-custom-repository.interface.js';
35-
import { UserApiKeyEntity } from '../../entities/api-key/api-key.entity.js';
36-
import { IUserApiKeyRepository } from '../../entities/api-key/repository/user-api-key-repository.interface.js';
37-
import { ActionEventsEntity } from '../../entities/table-actions/table-action-events-module/action-event.entity.js';
38-
import { TableActionEntity } from '../../entities/table-actions/table-actions-module/table-action.entity.js';
39-
import { IAiUserThreadsRepository } from '../../entities/ai/ai-data-entities/ai-user-threads/ai-user-threads-repository.interface.js';
40-
import { AiUserThreadEntity } from '../../entities/ai/ai-data-entities/ai-user-threads/ai-user-threads.entity.js';
41-
import { IAiUserFilesRepository } from '../../entities/ai/ai-data-entities/ai-user-files/ai-user-files-repository.interface.js';
42-
import { AiUserFileEntity } from '../../entities/ai/ai-data-entities/ai-user-files/ai-user-files.entity.js';
43-
import { CompanyLogoEntity } from '../../entities/company-logo/company-logo.entity.js';
44-
import { CompanyFaviconEntity } from '../../entities/company-favicon/company-favicon.entity.js';
45-
import { CompanyTabTitleEntity } from '../../entities/company-tab-title/company-tab-title.entity.js';
46-
import { TableFiltersEntity } from '../../entities/table-filters/table-filters.entity.js';
47-
import { ITableFiltersCustomRepository } from '../../entities/table-filters/repository/table-filters-custom-repository.interface.js';
48-
import { TableSettingsEntity } from '../../entities/table-settings/table-settings.entity.js';
49+
import { ITableWidgetsRepository } from '../../entities/widget/repository/table-widgets-repository.interface.js';
4950
import { TableWidgetEntity } from '../../entities/widget/table-widget.entity.js';
51+
import { IDatabaseContext } from '../database-context.interface.js';
5052

5153
export interface IGlobalDatabaseContext extends IDatabaseContext {
5254
userRepository: Repository<UserEntity> & IUserRepository;
@@ -82,4 +84,5 @@ export interface IGlobalDatabaseContext extends IDatabaseContext {
8284
companyFaviconRepository: Repository<CompanyFaviconEntity>;
8385
companyTabTitleRepository: Repository<CompanyTabTitleEntity>;
8486
tableFiltersRepository: Repository<TableFiltersEntity> & ITableFiltersCustomRepository;
87+
aiResponsesToUserRepository: Repository<AiResponsesToUserEntity> & IAiResponsesToUserRepository;
8588
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,9 @@ import { CompanyTabTitleEntity } from '../../entities/company-tab-title/company-
9090
import { TableFiltersEntity } from '../../entities/table-filters/table-filters.entity.js';
9191
import { ITableFiltersCustomRepository } from '../../entities/table-filters/repository/table-filters-custom-repository.interface.js';
9292
import { tableFiltersCustomRepositoryExtension } from '../../entities/table-filters/repository/table-filters-custom-repository-extension.js';
93+
import { IAiResponsesToUserRepository } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user-repository.interface.js';
94+
import { AiResponsesToUserEntity } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-responses-to-user.entity.js';
95+
import { aiResponsesToUserRepositoryExtension } from '../../entities/ai/ai-data-entities/ai-reponses-to-user/ai-reponses-to-user-repository.extension.js';
9396

9497
@Injectable({ scope: Scope.REQUEST })
9598
export class GlobalDatabaseContext implements IGlobalDatabaseContext {
@@ -128,6 +131,7 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext {
128131
private _companyFaviconRepository: Repository<CompanyFaviconEntity>;
129132
private _companyTabTitleRepository: Repository<CompanyTabTitleEntity>;
130133
private _tableFiltersRepository: Repository<TableFiltersEntity> & ITableFiltersCustomRepository;
134+
private _aiResponsesToUserRepository: Repository<AiResponsesToUserEntity> & IAiResponsesToUserRepository;
131135

132136
public constructor(
133137
@Inject(BaseType.DATA_SOURCE)
@@ -216,6 +220,9 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext {
216220
this._tableFiltersRepository = this.appDataSource
217221
.getRepository(TableFiltersEntity)
218222
.extend(tableFiltersCustomRepositoryExtension);
223+
this._aiResponsesToUserRepository = this.appDataSource
224+
.getRepository(AiResponsesToUserEntity)
225+
.extend(aiResponsesToUserRepositoryExtension);
219226
}
220227

221228
public get userRepository(): Repository<UserEntity> & IUserRepository {
@@ -350,6 +357,10 @@ export class GlobalDatabaseContext implements IGlobalDatabaseContext {
350357
return this._tableFiltersRepository;
351358
}
352359

360+
public get aiResponsesToUserRepository(): Repository<AiResponsesToUserEntity> & IAiResponsesToUserRepository {
361+
return this._aiResponsesToUserRepository;
362+
}
363+
353364
public startTransaction(): Promise<void> {
354365
this._queryRunner = this.appDataSource.createQueryRunner();
355366
this._queryRunner.startTransaction();
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { IAiResponsesToUserRepository } from './ai-responses-to-user-repository.interface.js';
2+
import { AiResponsesToUserEntity } from './ai-responses-to-user.entity.js';
3+
4+
export const aiResponsesToUserRepositoryExtension: IAiResponsesToUserRepository = {
5+
async findResponsesByUserId(userId: string): Promise<Array<AiResponsesToUserEntity>> {
6+
return await this.createQueryBuilder('ai_responses_to_user')
7+
.leftJoin('ai_responses_to_user.user', 'user')
8+
.where('user.id = :userId', { userId })
9+
.getMany();
10+
},
11+
12+
async findResponseByIdAndUserId(responseId: string, userId: string): Promise<AiResponsesToUserEntity> {
13+
return await this.createQueryBuilder('ai_responses_to_user')
14+
.leftJoin('ai_responses_to_user.user', 'user')
15+
.where('user.id = :userId', { userId })
16+
.andWhere('ai_responses_to_user.id = :responseId', { responseId })
17+
.getOne();
18+
},
19+
};
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import { AiResponsesToUserEntity } from './ai-responses-to-user.entity.js';
2+
3+
export interface IAiResponsesToUserRepository {
4+
findResponsesByUserId(userId: string): Promise<Array<AiResponsesToUserEntity>>;
5+
6+
findResponseByIdAndUserId(responseId: string, userId: string): Promise<AiResponsesToUserEntity>;
7+
}
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
import { BeforeUpdate, Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn, Relation } from 'typeorm';
2+
import { UserEntity } from '../../../user/user.entity.js';
3+
4+
@Entity('ai_responses_to_user')
5+
export class AiResponsesToUserEntity {
6+
@PrimaryGeneratedColumn('uuid')
7+
id: string;
8+
9+
@Column({ type: 'varchar', length: 128, nullable: true })
10+
ai_response_id: string;
11+
12+
@Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
13+
createdAt: Date;
14+
15+
@Column({ type: 'timestamp', default: null, nullable: true })
16+
updatedAt: Date;
17+
18+
@Column()
19+
user_id: string;
20+
21+
@ManyToOne((_) => UserEntity, (user) => user.ai_responses, { onDelete: 'CASCADE' })
22+
@JoinColumn({ name: 'user_id' })
23+
user: Relation<UserEntity>;
24+
25+
@BeforeUpdate()
26+
updateTimestamp() {
27+
this.updatedAt = new Date();
28+
}
29+
}

backend/src/entities/ai/application/data-structures/request-info-from-table.ds.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,5 @@ export class RequestInfoFromTableDS {
99

1010
export class RequestInfoFromTableDSV2 extends RequestInfoFromTableDS {
1111
response: Response;
12-
previous_response_id?: string | null;
12+
ai_thread_id?: string | null;
1313
}

0 commit comments

Comments
 (0)