From b37a848914f73f5fb3dfef42cd014ef5c7a15dfe Mon Sep 17 00:00:00 2001 From: Tom Moor Date: Mon, 8 Aug 2022 10:58:47 +0200 Subject: [PATCH] Add limit of 10 webhooks/team --- server/models/WebhookSubscription.ts | 17 +++++++++++++++++ shared/validations.ts | 5 +++++ 2 files changed, 22 insertions(+) diff --git a/server/models/WebhookSubscription.ts b/server/models/WebhookSubscription.ts index 5e3d08162..bc9eeb0fc 100644 --- a/server/models/WebhookSubscription.ts +++ b/server/models/WebhookSubscription.ts @@ -7,8 +7,11 @@ import { NotEmpty, DataType, IsUrl, + BeforeCreate, } from "sequelize-typescript"; import { SaveOptions } from "sequelize/types"; +import { WebhookSubscriptionValidation } from "@shared/validations"; +import { ValidationError } from "@server/errors"; import { Event } from "@server/types"; import Team from "./Team"; import User from "./User"; @@ -55,6 +58,20 @@ class WebhookSubscription extends ParanoidModel { @Column teamId: string; + // hooks + + @BeforeCreate + static async checkLimit(model: WebhookSubscription) { + const count = await this.count({ + where: { teamId: model.teamId }, + }); + if (count >= WebhookSubscriptionValidation.maxSubscriptions) { + throw ValidationError( + `You have reached the limit of ${WebhookSubscriptionValidation.maxSubscriptions} webhooks` + ); + } + } + // methods /** diff --git a/shared/validations.ts b/shared/validations.ts index e525d524d..0ca55c566 100644 --- a/shared/validations.ts +++ b/shared/validations.ts @@ -41,3 +41,8 @@ export const TeamValidation = { /** The maximum number of domains per team */ maxDomains: 10, }; + +export const WebhookSubscriptionValidation = { + /** The maximum number of webhooks per team */ + maxSubscriptions: 10, +};