mirror of
https://github.com/twentyhq/twenty
synced 2026-04-21 13:37:22 +00:00
related to https://github.com/twentyhq/core-team-issues/issues/601 ## Done - add a `onDbEvent` `Subscription` graphql endpoint to listen to database_event using what we have done with webhooks: - you can subscribe to any `action` (created, updated, ...) for any `objectNameSingular` or a specific `recordId`. Parameters are nullable and treated as wildcards when null. - returns events with following shape ```typescript @Field(() => String) eventId: string; @Field() emittedAt: string; @Field(() => DatabaseEventAction) action: DatabaseEventAction; @Field(() => String) objectNameSingular: string; @Field(() => GraphQLJSON) record: ObjectRecord; @Field(() => [String], { nullable: true }) updatedFields?: string[]; ``` - front provide a componentEffect `<ListenRecordUpdatesEffect />` that listen for an `objectNameSingular`, a `recordId` and a list of `listenedFields`. It subscribes to record updates and updates its apollo cached value for specified `listenedFields` - subscription is protected with credentials ## Result Here is an application with `workflowRun` https://github.com/user-attachments/assets/c964d857-3b54-495f-bf14-587ba26c5a8c --------- Co-authored-by: prastoin <paul@twenty.com>
34 lines
1 KiB
TypeScript
34 lines
1 KiB
TypeScript
import { Inject, Module, OnModuleDestroy } from '@nestjs/common';
|
|
|
|
import { RedisPubSub } from 'graphql-redis-subscriptions';
|
|
|
|
import { RedisClientService } from 'src/engine/core-modules/redis-client/redis-client.service';
|
|
import { SubscriptionsResolver } from 'src/engine/subscriptions/subscriptions.resolver';
|
|
import { SubscriptionsJob } from 'src/engine/subscriptions/subscriptions.job';
|
|
|
|
@Module({
|
|
exports: ['PUB_SUB'],
|
|
providers: [
|
|
{
|
|
provide: 'PUB_SUB',
|
|
inject: [RedisClientService],
|
|
|
|
useFactory: (redisClientService: RedisClientService) =>
|
|
new RedisPubSub({
|
|
publisher: redisClientService.getClient().duplicate(),
|
|
subscriber: redisClientService.getClient().duplicate(),
|
|
}),
|
|
},
|
|
SubscriptionsResolver,
|
|
SubscriptionsJob,
|
|
],
|
|
})
|
|
export class SubscriptionsModule implements OnModuleDestroy {
|
|
constructor(@Inject('PUB_SUB') private readonly pubSub: RedisPubSub) {}
|
|
|
|
async onModuleDestroy() {
|
|
if (this.pubSub) {
|
|
await this.pubSub.close();
|
|
}
|
|
}
|
|
}
|