diff options
-rw-r--r-- | apps/webhook_listeners/lib/Controller/WebhooksController.php | 32 | ||||
-rw-r--r-- | apps/webhook_listeners/lib/Db/WebhookListenerMapper.php | 15 | ||||
-rw-r--r-- | apps/webhook_listeners/openapi.json | 130 |
3 files changed, 175 insertions, 2 deletions
diff --git a/apps/webhook_listeners/lib/Controller/WebhooksController.php b/apps/webhook_listeners/lib/Controller/WebhooksController.php index eeb26b57030..1d5e37cb373 100644 --- a/apps/webhook_listeners/lib/Controller/WebhooksController.php +++ b/apps/webhook_listeners/lib/Controller/WebhooksController.php @@ -247,7 +247,7 @@ class WebhooksController extends OCSController { * * @return DataResponse<Http::STATUS_OK, bool, array{}> * - * 200: Boolean returned whether something was deleted FIXME + * 200: Boolean returned whether something was deleted * * @throws OCSBadRequestException Bad request * @throws OCSForbiddenException Insufficient permissions @@ -269,4 +269,34 @@ class WebhooksController extends OCSController { throw new OCSException('An internal error occurred', Http::STATUS_INTERNAL_SERVER_ERROR, $e); } } + + /** + * Remove all existing webhook registration mapped to an AppAPI app id + * + * @param string $appid id of the app, as in the EX-APP-ID for creation + * + * @return DataResponse<Http::STATUS_OK, int, array{}> + * + * 200: Integer number of registrations deleted + * + * @throws OCSBadRequestException Bad request + * @throws OCSForbiddenException Insufficient permissions + * @throws OCSException Other error + */ + #[ApiRoute(verb: 'DELETE', url: '/api/v1/webhooks/byappid/{appid}')] + #[AuthorizedAdminSetting(settings:Admin::class)] + #[AppApiAdminAccessWithoutUser] + public function deleteByAppId(string $appid): DataResponse { + try { + $deletedCount = $this->mapper->deleteByAppId($appid); + return new DataResponse($deletedCount); + } catch (\UnexpectedValueException $e) { + throw new OCSBadRequestException($e->getMessage(), $e); + } catch (\DomainException $e) { + throw new OCSForbiddenException($e->getMessage(), $e); + } catch (\Exception $e) { + $this->logger->error('Error when deleting flows for app id ' . $appid, ['exception' => $e]); + throw new OCSException('An internal error occurred', Http::STATUS_INTERNAL_SERVER_ERROR, $e); + } + } } diff --git a/apps/webhook_listeners/lib/Db/WebhookListenerMapper.php b/apps/webhook_listeners/lib/Db/WebhookListenerMapper.php index a55a8c7f6a0..c0d96891ecc 100644 --- a/apps/webhook_listeners/lib/Db/WebhookListenerMapper.php +++ b/apps/webhook_listeners/lib/Db/WebhookListenerMapper.php @@ -160,6 +160,21 @@ class WebhookListenerMapper extends QBMapper { } /** + * Delete all registrations made by the given appId + * + * @throws Exception + * @return int number of registration deleted + */ + public function deleteByAppId(string $appId): int { + $qb = $this->db->getQueryBuilder(); + + $qb->delete($this->getTableName()) + ->where($qb->expr()->eq('app_id', $qb->createNamedParameter($appId, IQueryBuilder::PARAM_STR))); + + return $qb->executeStatement(); + } + + /** * @throws Exception * @return list<string> */ diff --git a/apps/webhook_listeners/openapi.json b/apps/webhook_listeners/openapi.json index 7b6fdd6241f..fcd26efdf6d 100644 --- a/apps/webhook_listeners/openapi.json +++ b/apps/webhook_listeners/openapi.json @@ -686,7 +686,7 @@ ], "responses": { "200": { - "description": "Boolean returned whether something was deleted FIXME", + "description": "Boolean returned whether something was deleted", "content": { "application/json": { "schema": { @@ -773,6 +773,134 @@ } } } + }, + "/ocs/v2.php/apps/webhook_listeners/api/v1/webhooks/byappid/{appid}": { + "delete": { + "operationId": "webhooks-delete-by-app-id", + "summary": "Remove all existing webhook registration mapped to an AppAPI app id", + "description": "This endpoint requires admin access", + "tags": [ + "webhooks" + ], + "security": [ + { + "bearer_auth": [] + }, + { + "basic_auth": [] + } + ], + "parameters": [ + { + "name": "appid", + "in": "path", + "description": "id of the app, as in the EX-APP-ID for creation", + "required": true, + "schema": { + "type": "string" + } + }, + { + "name": "OCS-APIRequest", + "in": "header", + "description": "Required to be true for the API request to pass", + "required": true, + "schema": { + "type": "boolean", + "default": true + } + } + ], + "responses": { + "200": { + "description": "Integer number of registrations deleted", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": { + "type": "integer", + "format": "int64" + } + } + } + } + } + } + } + }, + "400": { + "description": "Bad request", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + }, + "403": { + "description": "Insufficient permissions", + "content": { + "application/json": { + "schema": { + "type": "object", + "required": [ + "ocs" + ], + "properties": { + "ocs": { + "type": "object", + "required": [ + "meta", + "data" + ], + "properties": { + "meta": { + "$ref": "#/components/schemas/OCSMeta" + }, + "data": {} + } + } + } + } + } + } + } + } + } } }, "tags": [] |