@Summary Expire API key @ID expire-api-key @Security CoderSessionToken @Tags Users @Param user path string true "User ID, name, or me" @Param keyid path string true "Key ID" format(string) @Success 204 @Failure 404 {object} codersdk.Response @Failure 500 {object} codersdk.Response @Router /api/v2/us
(rw http.ResponseWriter, r *http.Request)
| 438 | // @Failure 500 {object} codersdk.Response |
| 439 | // @Router /api/v2/users/{user}/keys/{keyid}/expire [put] |
| 440 | func (api *API) expireAPIKey(rw http.ResponseWriter, r *http.Request) { |
| 441 | var ( |
| 442 | ctx = r.Context() |
| 443 | keyID = chi.URLParam(r, "keyid") |
| 444 | auditor = api.Auditor.Load() |
| 445 | aReq, commitAudit = audit.InitRequest[database.APIKey](rw, &audit.RequestParams{ |
| 446 | Audit: *auditor, |
| 447 | Log: api.Logger, |
| 448 | Request: r, |
| 449 | Action: database.AuditActionWrite, |
| 450 | }) |
| 451 | ) |
| 452 | defer commitAudit() |
| 453 | |
| 454 | if err := api.Database.InTx(func(db database.Store) error { |
| 455 | key, err := db.GetAPIKeyByID(ctx, keyID) |
| 456 | if err != nil { |
| 457 | return xerrors.Errorf("fetch API key: %w", err) |
| 458 | } |
| 459 | if !key.ExpiresAt.After(api.Clock.Now()) { |
| 460 | return nil // Already expired |
| 461 | } |
| 462 | aReq.Old = key |
| 463 | if err := db.UpdateAPIKeyByID(ctx, database.UpdateAPIKeyByIDParams{ |
| 464 | ID: key.ID, |
| 465 | LastUsed: key.LastUsed, |
| 466 | ExpiresAt: dbtime.Now(), |
| 467 | IPAddress: key.IPAddress, |
| 468 | }); err != nil { |
| 469 | return xerrors.Errorf("expire API key: %w", err) |
| 470 | } |
| 471 | // Fetch the updated key for audit log. |
| 472 | newKey, err := db.GetAPIKeyByID(ctx, keyID) |
| 473 | if err != nil { |
| 474 | api.Logger.Warn(ctx, "failed to fetch updated API key for audit log", slog.Error(err)) |
| 475 | } else { |
| 476 | aReq.New = newKey |
| 477 | } |
| 478 | return nil |
| 479 | }, nil); httpapi.Is404Error(err) { |
| 480 | httpapi.ResourceNotFound(rw) |
| 481 | return |
| 482 | } else if err != nil { |
| 483 | httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{ |
| 484 | Message: "Internal error expiring API key.", |
| 485 | Detail: err.Error(), |
| 486 | }) |
| 487 | return |
| 488 | } |
| 489 | |
| 490 | rw.WriteHeader(http.StatusNoContent) |
| 491 | } |
| 492 | |
| 493 | // @Summary Get token config |
| 494 | // @ID get-token-config |
nothing calls this directly
no test coverage detected