Skip to content

Commit 2150f9a

Browse files
committed
feat: wip drop calendar repositories
1 parent aa68057 commit 2150f9a

24 files changed

+553
-1291
lines changed

packages/twenty-server/src/engine/core-modules/auth/services/google-apis.service.ts

+58-64
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,16 @@
11
import { Injectable } from '@nestjs/common';
22

3-
import { EntityManager } from 'typeorm';
3+
import { DataSource, EntityManager } from 'typeorm';
44
import { v4 } from 'uuid';
55

6-
import { TypeORMService } from 'src/database/typeorm/typeorm.service';
76
import { EnvironmentService } from 'src/engine/integrations/environment/environment.service';
87
import { MessageQueue } from 'src/engine/integrations/message-queue/message-queue.constants';
98
import { MessageQueueService } from 'src/engine/integrations/message-queue/services/message-queue.service';
10-
import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service';
119
import { InjectObjectMetadataRepository } from 'src/engine/object-metadata-repository/object-metadata-repository.decorator';
1210
import {
1311
GoogleCalendarSyncJobData,
1412
GoogleCalendarSyncJob,
1513
} from 'src/modules/calendar/jobs/google-calendar-sync.job';
16-
import { CalendarChannelRepository } from 'src/modules/calendar/repositories/calendar-channel.repository';
1714
import {
1815
CalendarChannelWorkspaceEntity,
1916
CalendarChannelVisibility,
@@ -35,12 +32,15 @@ import {
3532
MessagingMessageListFetchJobData,
3633
} from 'src/modules/messaging/message-import-manager/jobs/messaging-message-list-fetch.job';
3734
import { InjectMessageQueue } from 'src/engine/integrations/message-queue/decorators/message-queue.decorator';
35+
import { InjectWorkspaceDatasource } from 'src/engine/twenty-orm/decorators/inject-workspace-datasource.decorator';
36+
import { InjectWorkspaceRepository } from 'src/engine/twenty-orm/decorators/inject-workspace-repository.decorator';
37+
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
3838

3939
@Injectable()
4040
export class GoogleAPIsService {
4141
constructor(
42-
private readonly dataSourceService: DataSourceService,
43-
private readonly typeORMService: TypeORMService,
42+
@InjectWorkspaceDatasource()
43+
private readonly workspaceDataSource: DataSource,
4444
@InjectMessageQueue(MessageQueue.messagingQueue)
4545
private readonly messageQueueService: MessageQueueService,
4646
@InjectMessageQueue(MessageQueue.calendarQueue)
@@ -50,8 +50,8 @@ export class GoogleAPIsService {
5050
private readonly connectedAccountRepository: ConnectedAccountRepository,
5151
@InjectObjectMetadataRepository(MessageChannelWorkspaceEntity)
5252
private readonly messageChannelRepository: MessageChannelRepository,
53-
@InjectObjectMetadataRepository(CalendarChannelWorkspaceEntity)
54-
private readonly calendarChannelRepository: CalendarChannelRepository,
53+
@InjectWorkspaceRepository(CalendarChannelWorkspaceEntity)
54+
private readonly calendarChannelRepository: WorkspaceRepository<CalendarChannelWorkspaceEntity>,
5555
) {}
5656

5757
async refreshGoogleRefreshToken(input: {
@@ -71,14 +71,6 @@ export class GoogleAPIsService {
7171
messageVisibility,
7272
} = input;
7373

74-
const dataSourceMetadata =
75-
await this.dataSourceService.getLastDataSourceMetadataFromWorkspaceIdOrFail(
76-
workspaceId,
77-
);
78-
79-
const workspaceDataSource =
80-
await this.typeORMService.connectToDataSource(dataSourceMetadata);
81-
8274
const isCalendarEnabled = this.environmentService.get(
8375
'CALENDAR_PROVIDER_GOOGLE_ENABLED',
8476
);
@@ -93,65 +85,67 @@ export class GoogleAPIsService {
9385
const existingAccountId = connectedAccounts?.[0]?.id;
9486
const newOrExistingConnectedAccountId = existingAccountId ?? v4();
9587

96-
await workspaceDataSource?.transaction(async (manager: EntityManager) => {
97-
if (!existingAccountId) {
98-
await this.connectedAccountRepository.create(
99-
{
100-
id: newOrExistingConnectedAccountId,
101-
handle,
102-
provider: ConnectedAccountProvider.GOOGLE,
103-
accessToken: input.accessToken,
104-
refreshToken: input.refreshToken,
105-
accountOwnerId: workspaceMemberId,
106-
},
107-
workspaceId,
108-
manager,
109-
);
110-
111-
await this.messageChannelRepository.create(
112-
{
113-
id: v4(),
114-
connectedAccountId: newOrExistingConnectedAccountId,
115-
type: MessageChannelType.EMAIL,
116-
handle,
117-
visibility:
118-
messageVisibility || MessageChannelVisibility.SHARE_EVERYTHING,
119-
syncStatus: MessageChannelSyncStatus.ONGOING,
120-
},
121-
workspaceId,
122-
manager,
123-
);
88+
await this.workspaceDataSource?.transaction(
89+
async (manager: EntityManager) => {
90+
if (!existingAccountId) {
91+
await this.connectedAccountRepository.create(
92+
{
93+
id: newOrExistingConnectedAccountId,
94+
handle,
95+
provider: ConnectedAccountProvider.GOOGLE,
96+
accessToken: input.accessToken,
97+
refreshToken: input.refreshToken,
98+
accountOwnerId: workspaceMemberId,
99+
},
100+
workspaceId,
101+
manager,
102+
);
124103

125-
if (isCalendarEnabled) {
126-
await this.calendarChannelRepository.create(
104+
await this.messageChannelRepository.create(
127105
{
128106
id: v4(),
129107
connectedAccountId: newOrExistingConnectedAccountId,
108+
type: MessageChannelType.EMAIL,
130109
handle,
131110
visibility:
132-
calendarVisibility ||
133-
CalendarChannelVisibility.SHARE_EVERYTHING,
111+
messageVisibility || MessageChannelVisibility.SHARE_EVERYTHING,
112+
syncStatus: MessageChannelSyncStatus.ONGOING,
134113
},
135114
workspaceId,
136115
manager,
137116
);
138-
}
139-
} else {
140-
await this.connectedAccountRepository.updateAccessTokenAndRefreshToken(
141-
input.accessToken,
142-
input.refreshToken,
143-
newOrExistingConnectedAccountId,
144-
workspaceId,
145-
manager,
146-
);
147117

148-
await this.messageChannelRepository.resetSync(
149-
newOrExistingConnectedAccountId,
150-
workspaceId,
151-
manager,
152-
);
153-
}
154-
});
118+
if (isCalendarEnabled) {
119+
await this.calendarChannelRepository.save(
120+
{
121+
id: v4(),
122+
connectedAccountId: newOrExistingConnectedAccountId,
123+
handle,
124+
visibility:
125+
calendarVisibility ||
126+
CalendarChannelVisibility.SHARE_EVERYTHING,
127+
},
128+
{},
129+
manager,
130+
);
131+
}
132+
} else {
133+
await this.connectedAccountRepository.updateAccessTokenAndRefreshToken(
134+
input.accessToken,
135+
input.refreshToken,
136+
newOrExistingConnectedAccountId,
137+
workspaceId,
138+
manager,
139+
);
140+
141+
await this.messageChannelRepository.resetSync(
142+
newOrExistingConnectedAccountId,
143+
workspaceId,
144+
manager,
145+
);
146+
}
147+
},
148+
);
155149

156150
if (this.environmentService.get('MESSAGING_PROVIDER_GMAIL_ENABLED')) {
157151
const messageChannels =

packages/twenty-server/src/engine/core-modules/billing/billing.service.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -203,9 +203,7 @@ export class BillingService {
203203
: frontBaseUrl;
204204

205205
const quantity =
206-
(await this.userWorkspaceService.getWorkspaceMemberCount(
207-
user.defaultWorkspaceId,
208-
)) || 1;
206+
(await this.userWorkspaceService.getWorkspaceMemberCount()) || 1;
209207

210208
const stripeCustomerId = (
211209
await this.billingSubscriptionRepository.findOneBy({

packages/twenty-server/src/engine/core-modules/billing/jobs/update-subscription.job.ts

+6-3
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Logger } from '@nestjs/common';
1+
import { Logger, Scope } from '@nestjs/common';
22

33
import { BillingService } from 'src/engine/core-modules/billing/billing.service';
44
import { UserWorkspaceService } from 'src/engine/core-modules/user-workspace/user-workspace.service';
@@ -8,7 +8,10 @@ import { MessageQueue } from 'src/engine/integrations/message-queue/message-queu
88
import { Process } from 'src/engine/integrations/message-queue/decorators/process.decorator';
99
export type UpdateSubscriptionJobData = { workspaceId: string };
1010

11-
@Processor(MessageQueue.billingQueue)
11+
@Processor({
12+
queueName: MessageQueue.billingQueue,
13+
scope: Scope.REQUEST,
14+
})
1215
export class UpdateSubscriptionJob {
1316
protected readonly logger = new Logger(UpdateSubscriptionJob.name);
1417

@@ -21,7 +24,7 @@ export class UpdateSubscriptionJob {
2124
@Process(UpdateSubscriptionJob.name)
2225
async handle(data: UpdateSubscriptionJobData): Promise<void> {
2326
const workspaceMembersCount =
24-
await this.userWorkspaceService.getWorkspaceMemberCount(data.workspaceId);
27+
await this.userWorkspaceService.getWorkspaceMemberCount();
2528

2629
if (!workspaceMembersCount || workspaceMembersCount <= 0) {
2730
return;

packages/twenty-server/src/engine/core-modules/user-workspace/user-workspace.service.ts

+8-17
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@ import { ObjectRecordCreateEvent } from 'src/engine/integrations/event-emitter/t
1313
import { WorkspaceMemberWorkspaceEntity } from 'src/modules/workspace-member/standard-objects/workspace-member.workspace-entity';
1414
import { assert } from 'src/utils/assert';
1515
import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity';
16+
import { InjectWorkspaceRepository } from 'src/engine/twenty-orm/decorators/inject-workspace-repository.decorator';
17+
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
1618

1719
export class UserWorkspaceService extends TypeOrmQueryService<UserWorkspace> {
1820
constructor(
1921
@InjectRepository(UserWorkspace, 'core')
2022
private readonly userWorkspaceRepository: Repository<UserWorkspace>,
2123
@InjectRepository(User, 'core')
2224
private readonly userRepository: Repository<User>,
25+
@InjectWorkspaceRepository(WorkspaceMemberWorkspaceEntity)
26+
private readonly workspaceMemberRepository: WorkspaceRepository<WorkspaceMemberWorkspaceEntity>,
2327
private readonly dataSourceService: DataSourceService,
2428
private readonly typeORMService: TypeORMService,
2529
private readonly workspaceDataSourceService: WorkspaceDataSourceService,
@@ -99,23 +103,10 @@ export class UserWorkspaceService extends TypeOrmQueryService<UserWorkspace> {
99103
});
100104
}
101105

102-
public async getWorkspaceMemberCount(
103-
workspaceId: string,
104-
): Promise<number | undefined> {
105-
try {
106-
const dataSourceSchema =
107-
this.workspaceDataSourceService.getSchemaName(workspaceId);
108-
109-
return (
110-
await this.workspaceDataSourceService.executeRawQuery(
111-
`SELECT * FROM ${dataSourceSchema}."workspaceMember"`,
112-
[],
113-
workspaceId,
114-
)
115-
).length;
116-
} catch {
117-
return undefined;
118-
}
106+
public async getWorkspaceMemberCount(): Promise<number | undefined> {
107+
const workspaceMemberCount = await this.workspaceMemberRepository.count();
108+
109+
return workspaceMemberCount;
119110
}
120111

121112
async checkUserWorkspaceExists(
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,9 @@
1-
import { CalendarChannelEventAssociationRepository } from 'src/modules/calendar/repositories/calendar-channel-event-association.repository';
2-
import { CalendarChannelRepository } from 'src/modules/calendar/repositories/calendar-channel.repository';
3-
import { CalendarEventParticipantRepository } from 'src/modules/calendar/repositories/calendar-event-participant.repository';
4-
import { CalendarEventRepository } from 'src/modules/calendar/repositories/calendar-event.repository';
51
import { CompanyRepository } from 'src/modules/company/repositories/company.repository';
62
import { BlocklistRepository } from 'src/modules/connected-account/repositories/blocklist.repository';
73
import { ConnectedAccountRepository } from 'src/modules/connected-account/repositories/connected-account.repository';
84
import { AuditLogRepository } from 'src/modules/timeline/repositiories/audit-log.repository';
95
import { TimelineActivityRepository } from 'src/modules/timeline/repositiories/timeline-activity.repository';
106
import { WorkspaceMemberRepository } from 'src/modules/workspace-member/repositories/workspace-member.repository';
11-
import { AttachmentRepository } from 'src/modules/attachment/repositories/attachment.repository';
12-
import { CommentRepository } from 'src/modules/activity/repositories/comment.repository';
137
import { MessageChannelMessageAssociationRepository } from 'src/modules/messaging/common/repositories/message-channel-message-association.repository';
148
import { MessageChannelRepository } from 'src/modules/messaging/common/repositories/message-channel.repository';
159
import { MessageParticipantRepository } from 'src/modules/messaging/common/repositories/message-participant.repository';
@@ -20,11 +14,6 @@ import { PersonRepository } from 'src/modules/person/repositories/person.reposit
2014
export const metadataToRepositoryMapping = {
2115
AuditLogWorkspaceEntity: AuditLogRepository,
2216
BlocklistWorkspaceEntity: BlocklistRepository,
23-
CalendarChannelEventAssociationWorkspaceEntity:
24-
CalendarChannelEventAssociationRepository,
25-
CalendarChannelWorkspaceEntity: CalendarChannelRepository,
26-
CalendarEventParticipantWorkspaceEntity: CalendarEventParticipantRepository,
27-
CalendarEventWorkspaceEntity: CalendarEventRepository,
2817
CompanyWorkspaceEntity: CompanyRepository,
2918
ConnectedAccountWorkspaceEntity: ConnectedAccountRepository,
3019
MessageChannelMessageAssociationWorkspaceEntity:
@@ -36,6 +25,4 @@ export const metadataToRepositoryMapping = {
3625
PersonWorkspaceEntity: PersonRepository,
3726
TimelineActivityWorkspaceEntity: TimelineActivityRepository,
3827
WorkspaceMemberWorkspaceEntity: WorkspaceMemberRepository,
39-
AttachmentWorkspaceEntity: AttachmentRepository,
40-
CommentWorkspaceEntity: CommentRepository,
4128
};

packages/twenty-server/src/engine/twenty-orm/datasource/workspace.datasource.ts

+1-2
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,14 @@ import {
66
QueryRunner,
77
} from 'typeorm';
88

9-
import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.repository';
109
import { WorkspaceEntityManager } from 'src/engine/twenty-orm/entity-manager/entity.manager';
1110

1211
export class WorkspaceDataSource extends DataSource {
1312
readonly manager: WorkspaceEntityManager;
1413

1514
override getRepository<Entity extends ObjectLiteral>(
1615
target: EntityTarget<Entity>,
17-
): WorkspaceRepository<Entity> {
16+
) {
1817
return this.manager.getRepository(target);
1918
}
2019

packages/twenty-server/src/engine/twenty-orm/entity-manager/entity.manager.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { WorkspaceRepository } from 'src/engine/twenty-orm/repository/workspace.
55
export class WorkspaceEntityManager extends EntityManager {
66
override getRepository<Entity extends ObjectLiteral>(
77
target: EntityTarget<Entity>,
8-
): WorkspaceRepository<Entity> {
8+
) {
99
// find already created repository instance and return it if found
1010
const repoFromMap = this.repositories.get(target);
1111

0 commit comments

Comments
 (0)