Skip to content

Commit

Permalink
Merge pull request #47845 from nextcloud/feat/webhook_listeners-remov…
Browse files Browse the repository at this point in the history
…e-all-from-appid

Add an endpoint to remove all webhook registrations from an app
  • Loading branch information
AndyScherzinger authored Sep 9, 2024
2 parents 3a85997 + 22a2893 commit 8ea4222
Show file tree
Hide file tree
Showing 3 changed files with 175 additions and 2 deletions.
32 changes: 31 additions & 1 deletion apps/webhook_listeners/lib/Controller/WebhooksController.php
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,7 @@ public function update(
*
* @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
Expand All @@ -269,4 +269,34 @@ public function destroy(int $id): DataResponse {
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);
}
}
}
15 changes: 15 additions & 0 deletions apps/webhook_listeners/lib/Db/WebhookListenerMapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,21 @@ public function deleteById(int $id): bool {
return ($qb->executeStatement() > 0);
}

/**
* 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>
Expand Down
130 changes: 129 additions & 1 deletion apps/webhook_listeners/openapi.json
Original file line number Diff line number Diff line change
Expand Up @@ -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": {
Expand Down Expand Up @@ -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": []
Expand Down

0 comments on commit 8ea4222

Please sign in to comment.