@Summary Delete an AI provider @ID delete-an-ai-provider @Security CoderSessionToken @Tags AI Providers @Param idOrName path string true "Provider ID or name" @Success 204 @Router /api/v2/ai/providers/{idOrName} [delete]
(rw http.ResponseWriter, r *http.Request)
| 438 | // @Success 204 |
| 439 | // @Router /api/v2/ai/providers/{idOrName} [delete] |
| 440 | func (api *API) aiProvidersDelete(rw http.ResponseWriter, r *http.Request) { |
| 441 | var ( |
| 442 | ctx = r.Context() |
| 443 | auditor = api.Auditor.Load() |
| 444 | aReq, commitAudit = audit.InitRequest[database.AIProvider](rw, &audit.RequestParams{ |
| 445 | Audit: *auditor, |
| 446 | Log: api.Logger, |
| 447 | Request: r, |
| 448 | Action: database.AuditActionDelete, |
| 449 | }) |
| 450 | ) |
| 451 | defer commitAudit() |
| 452 | |
| 453 | idOrName := chi.URLParam(r, "idOrName") |
| 454 | |
| 455 | err := api.Database.InTx(func(tx database.Store) error { |
| 456 | row, err := lookupAIProvider(ctx, tx, idOrName) |
| 457 | if err != nil { |
| 458 | return err |
| 459 | } |
| 460 | aReq.Old = row |
| 461 | |
| 462 | // Soft-delete UPDATE; :exec, so re-deletion is a silent no-op. |
| 463 | if err := tx.DeleteAIProviderByID(ctx, row.ID); err != nil { |
| 464 | return xerrors.Errorf("delete ai provider: %w", err) |
| 465 | } |
| 466 | return nil |
| 467 | }, &database.TxOptions{TxIdentifier: "delete_ai_provider"}) |
| 468 | if err != nil { |
| 469 | writeAIProviderError(ctx, api.Logger, rw, err, "delete AI provider", "Internal error deleting AI provider.") |
| 470 | return |
| 471 | } |
| 472 | |
| 473 | api.publishAIProvidersChanged(ctx) |
| 474 | |
| 475 | rw.WriteHeader(http.StatusNoContent) |
| 476 | } |
| 477 | |
| 478 | // publishAIProvidersChanged notifies subscribers (aibridged, |
| 479 | // aibridgeproxyd) that the live provider set changed and they should |
nothing calls this directly
no test coverage detected