fix(core): Do not cache dynamic webhooks (#15176)

This commit is contained in:
Iván Ovejero
2025-05-07 13:21:33 +02:00
committed by GitHub
parent 90f662e229
commit 0659ba957c
2 changed files with 33 additions and 8 deletions

View File

@@ -360,4 +360,30 @@ describe('WebhookService', () => {
expect(nodeType.webhook).toHaveBeenCalled();
});
});
describe('findCached()', () => {
test('should not cache dynamic webhooks', async () => {
const method = 'GET';
const webhookId = uuid();
const fullPath = `${webhookId}/user/123/posts`;
const dynamicWebhook = createWebhook(method, 'user/:id/posts', webhookId, 3);
webhookRepository.findOneBy.mockResolvedValueOnce(null); // static lookup
webhookRepository.findBy.mockResolvedValueOnce([dynamicWebhook]); // dynamic lookup
const result1 = await webhookService.findWebhook(method, fullPath);
expect(result1).toBe(dynamicWebhook);
expect(cacheService.set).not.toHaveBeenCalled();
webhookRepository.findOneBy.mockResolvedValueOnce(null);
webhookRepository.findBy.mockResolvedValueOnce([dynamicWebhook]);
const result2 = await webhookService.findWebhook(method, fullPath);
expect(result2).toBe(dynamicWebhook);
expect(webhookRepository.findOneBy).toHaveBeenCalledTimes(2);
expect(webhookRepository.findBy).toHaveBeenCalledTimes(2);
});
});
});

View File

@@ -41,19 +41,18 @@ export class WebhookService {
private async findCached(method: Method, path: string) {
const cacheKey = `webhook:${method}-${path}`;
const cachedWebhook = await this.cacheService.get(cacheKey);
const cachedStaticWebhook = await this.cacheService.get(cacheKey);
if (cachedWebhook) return this.webhookRepository.create(cachedWebhook);
if (cachedStaticWebhook) return this.webhookRepository.create(cachedStaticWebhook);
let dbWebhook = await this.findStaticWebhook(method, path);
const dbStaticWebhook = await this.findStaticWebhook(method, path);
if (dbWebhook === null) {
dbWebhook = await this.findDynamicWebhook(method, path);
if (dbStaticWebhook) {
void this.cacheService.set(cacheKey, dbStaticWebhook);
return dbStaticWebhook;
}
void this.cacheService.set(cacheKey, dbWebhook);
return dbWebhook;
return await this.findDynamicWebhook(method, path);
}
/**