Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add an endpoint to remove all webhook registrations from an app #47845

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading