writeAIProviderError translates an error from the AI provider lookup/update/delete paths into the right HTTP status code. logMsg labels the log line for operator debugging, and userMsg is the internal-error response message shown to the API consumer when no more specific branch fires.
(ctx context.Context, logger slog.Logger, rw http.ResponseWriter, err error, logMsg, userMsg string)
| 538 | // internal-error response message shown to the API consumer when no |
| 539 | // more specific branch fires. |
| 540 | func writeAIProviderError(ctx context.Context, logger slog.Logger, rw http.ResponseWriter, err error, logMsg, userMsg string) { |
| 541 | if errors.Is(err, errAIProviderInvalidName) { |
| 542 | httpapi.Write(ctx, rw, http.StatusBadRequest, codersdk.Response{ |
| 543 | Message: fmt.Sprintf("Invalid provider id or name: must be a UUID or match %s.", codersdk.AIProviderNameRegex), |
| 544 | }) |
| 545 | return |
| 546 | } |
| 547 | if errors.Is(err, sql.ErrNoRows) { |
| 548 | httpapi.ResourceNotFound(rw) |
| 549 | return |
| 550 | } |
| 551 | if dbauthz.IsNotAuthorizedError(err) { |
| 552 | logger.Error(ctx, logMsg, slog.Error(err)) |
| 553 | httpapi.Forbidden(rw) |
| 554 | return |
| 555 | } |
| 556 | logger.Error(ctx, logMsg, slog.Error(err)) |
| 557 | httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ |
| 558 | Message: userMsg, |
| 559 | Detail: err.Error(), |
| 560 | }) |
| 561 | } |
| 562 | |
| 563 | // loadAIProviderKeysByProvider fetches keys for every live provider in |
| 564 | // one query and buckets the rows by ProviderID, so the list handler |
no test coverage detected