diff --git a/server/openapi.json b/server/openapi.json index c6e235d0f..0159955eb 100644 --- a/server/openapi.json +++ b/server/openapi.json @@ -6991,6 +6991,17 @@ "type": "string" }, "style": "simple" + }, + { + "description": "By default event types are archived when \"deleted\". Passing this to `true` deletes them entirely.", + "in": "query", + "name": "expunge", + "schema": { + "default": false, + "description": "By default event types are archived when \"deleted\". Passing this to `true` deletes them entirely.", + "type": "boolean" + }, + "style": "form" } ], "responses": { diff --git a/server/svix-server/src/v1/endpoints/event_type.rs b/server/svix-server/src/v1/endpoints/event_type.rs index 7d9fecebc..eb0974ba9 100644 --- a/server/svix-server/src/v1/endpoints/event_type.rs +++ b/server/svix-server/src/v1/endpoints/event_type.rs @@ -402,6 +402,14 @@ async fn patch_event_type( Ok(Json(ret.into())) } +#[derive(Debug, Deserialize, Serialize, Validate, JsonSchema)] +struct DeleteEventTypeQueryParams { + /// By default event types are archived when "deleted". Passing this to `true` deletes them + /// entirely. + #[serde(default)] + expunge: bool, +} + /// Archive an event type. /// /// Endpoints already configured to filter on an event type will continue to do so after archival. @@ -412,6 +420,9 @@ async fn patch_event_type( async fn delete_event_type( State(AppState { ref db, .. }): State, Path(EventTypeNamePath { event_type_name }): Path, + ValidatedQuery(DeleteEventTypeQueryParams { expunge }): ValidatedQuery< + DeleteEventTypeQueryParams, + >, permissions::Organization { org_id }: permissions::Organization, ) -> Result { let evtype = eventtype::Entity::secure_find_by_name(org_id, event_type_name) @@ -420,8 +431,13 @@ async fn delete_event_type( .ok_or_else(|| HttpError::not_found(None, None))?; let mut evtype: eventtype::ActiveModel = evtype.into(); - evtype.deleted = Set(true); - evtype.update(db).await?; + + if expunge { + evtype.delete(db).await?; + } else { + evtype.deleted = Set(true); + evtype.update(db).await?; + } Ok(NoContent) }