mirror of
https://github.com/gristlabs/grist-core.git
synced 2026-03-02 04:09:24 +00:00
(core) Adding /webhooks endpoint
Summary: - New /webhooks event that lists all webhooks in a document (available for owners), - Monitoring webhooks usage and saving it in memory or Redis, - Loosening _usubscribe API endpoint, so that the information returned from the /webhook endpoint is enough to unsubscribe, - Owners can remove webhook without the unsubscribe key. The endpoint lists all webhooks that are registered in a document, not just webhooks from a single table. There are two status fields. First for the webhook, second for the last request attempt. Webhook can have 5 statuses: 'idle', 'sending', 'retrying', 'postponed', 'error', which roughly describes what the sendLoop is currently doing. The 'error' status describes a situation when all request attempts failed and the queue needs to be drained, so some requests were dropped. The last request status can only be: 'success', 'failure' or 'rejected'. Rejected means that the last batch was dropped because the queue was too long. Test Plan: New and updated tests Reviewers: paulfitz Reviewed By: paulfitz Differential Revision: https://phab.getgrist.com/D3727
This commit is contained in:
@@ -56,6 +56,7 @@ export class DocApiForwarder {
|
||||
app.use('/api/docs/:docId/compare', withDoc);
|
||||
app.use('/api/docs/:docId/assign', withDocWithoutAuth);
|
||||
app.use('/api/docs/:docId/webhooks/queue', withDoc);
|
||||
app.use('/api/docs/:docId/webhooks', withDoc);
|
||||
app.use('^/api/docs$', withoutDoc);
|
||||
}
|
||||
|
||||
|
||||
@@ -1807,18 +1807,23 @@ export class HomeDBManager extends EventEmitter {
|
||||
return secret?.value;
|
||||
}
|
||||
|
||||
public async removeWebhook(id: string, docId: string, unsubscribeKey: string): Promise<void> {
|
||||
if (!(id && unsubscribeKey)) {
|
||||
throw new ApiError('Bad request: id and unsubscribeKey both required', 400);
|
||||
public async removeWebhook(id: string, docId: string, unsubscribeKey: string, checkKey: boolean): Promise<void> {
|
||||
if (!id) {
|
||||
throw new ApiError('Bad request: id required', 400);
|
||||
}
|
||||
if (!unsubscribeKey && checkKey) {
|
||||
throw new ApiError('Bad request: unsubscribeKey required', 400);
|
||||
}
|
||||
return await this._connection.transaction(async manager => {
|
||||
const secret = await this.getSecret(id, docId, manager);
|
||||
if (!secret) {
|
||||
throw new ApiError('Webhook with given id not found', 404);
|
||||
}
|
||||
const webhook = JSON.parse(secret) as WebHookSecret;
|
||||
if (webhook.unsubscribeKey !== unsubscribeKey) {
|
||||
throw new ApiError('Wrong unsubscribeKey', 401);
|
||||
if (checkKey) {
|
||||
const secret = await this.getSecret(id, docId, manager);
|
||||
if (!secret) {
|
||||
throw new ApiError('Webhook with given id not found', 404);
|
||||
}
|
||||
const webhook = JSON.parse(secret) as WebHookSecret;
|
||||
if (webhook.unsubscribeKey !== unsubscribeKey) {
|
||||
throw new ApiError('Wrong unsubscribeKey', 401);
|
||||
}
|
||||
}
|
||||
await manager.createQueryBuilder()
|
||||
.delete()
|
||||
|
||||
Reference in New Issue
Block a user