MCPcopy Index your code
hub / github.com/supabase/auth / PasskeyUpdate

Method PasskeyUpdate

internal/api/passkey_manage.go:54–107  ·  view source on GitHub ↗

PasskeyUpdate handles PATCH /passkeys/{passkey_id}. Requires authentication. Updates the friendly_name of a passkey owned by the authenticated user.

(w http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

52// PasskeyUpdate handles PATCH /passkeys/{passkey_id}.
53// Requires authentication. Updates the friendly_name of a passkey owned by the authenticated user.
54func (a *API) PasskeyUpdate(w http.ResponseWriter, r *http.Request) error {
55 ctx := r.Context()
56 config := a.config
57 user := getUser(ctx)
58 db := a.db.WithContext(ctx)
59
60 passkeyID, err := uuid.FromString(chi.URLParam(r, "passkey_id"))
61 if err != nil {
62 return apierrors.NewNotFoundError(apierrors.ErrorCodeValidationFailed, "Passkey not found")
63 }
64
65 params := &PasskeyUpdateParams{}
66 body, err := utilities.GetBodyBytes(r)
67 if err != nil {
68 return apierrors.NewBadRequestError(apierrors.ErrorCodeBadJSON, "Could not read request body")
69 }
70 if err := json.Unmarshal(body, params); err != nil {
71 return apierrors.NewBadRequestError(apierrors.ErrorCodeBadJSON, "Could not parse request body as JSON: %v", err)
72 }
73
74 if params.FriendlyName == "" {
75 return apierrors.NewBadRequestError(apierrors.ErrorCodeValidationFailed, "friendly_name is required")
76 }
77 if len(params.FriendlyName) > 120 {
78 return apierrors.NewBadRequestError(apierrors.ErrorCodeValidationFailed, "friendly_name must be 120 characters or less")
79 }
80
81 cred, err := models.FindWebAuthnCredentialByIDAndUserID(db, passkeyID, user.ID)
82 if err != nil {
83 if models.IsNotFoundError(err) {
84 return apierrors.NewNotFoundError(apierrors.ErrorCodeValidationFailed, "Passkey not found")
85 }
86 return apierrors.NewInternalServerError("Database error loading passkey").WithInternalError(err)
87 }
88
89 err = db.Transaction(func(tx *storage.Connection) error {
90 if terr := cred.UpdateFriendlyName(tx, params.FriendlyName); terr != nil {
91 return terr
92 }
93
94 if terr := models.NewAuditLogEntry(config.AuditLog, r, tx, user, models.PasskeyUpdatedAction, utilities.GetIPAddress(r), map[string]any{
95 "passkey_id": cred.ID,
96 }); terr != nil {
97 return terr
98 }
99
100 return nil
101 })
102 if err != nil {
103 return apierrors.NewInternalServerError("Database error updating passkey").WithInternalError(err)
104 }
105
106 return sendJSON(w, http.StatusOK, toPasskeyListItem(cred))
107}
108
109// PasskeyDelete handles DELETE /passkeys/{passkey_id}.
110// Requires authentication. Deletes a passkey owned by the authenticated user.

Callers

nothing calls this directly

Calls 15

NewNotFoundErrorFunction · 0.92
GetBodyBytesFunction · 0.92
NewBadRequestErrorFunction · 0.92
IsNotFoundErrorFunction · 0.92
NewInternalServerErrorFunction · 0.92
NewAuditLogEntryFunction · 0.92
GetIPAddressFunction · 0.92
getUserFunction · 0.85
sendJSONFunction · 0.85
toPasskeyListItemFunction · 0.85
WithContextMethod · 0.80

Tested by

no test coverage detected