Default-записи та життєвий цикл
Один default на власника й провайдера, явні переходи — і що насправді роблять disable/delete.
Збережений credential буває active або disabled, може бути default-ом свого власника й може бути м'яко видаленим. Ці три осі керують усім, що робить resolve, тож їхні інваріанти строгі.
Прапорець default
is_default позначає запис, який resolve вибере для його власника й провайдера. Інваріант: щонайбільше один активний default на пару (провайдер, власник), забезпечений транзакційно.
make-defaultперемикає атомарно: попередній default втрачає прапорець у тій самій транзакції; ніколи не буває ані моменту з двома, ані проміжку без жодного. Кваліфікуються лишеactive-записи (інакше400). Виклик на поточному default — це no-op із перевіркою версії.- Перший credential власника для провайдера стає default автоматично — без жодного прапора; другий create без прапора лишає default там, де він був.
createзmake_default: trueперебирає default на новостворений запис тим самим атомарним перемиканням. Задокументований409 DEFAULT_CREDENTIAL_ALREADY_EXISTS— це запобіжник конкурентності (два таких create наввипередки), а не звична відповідь; повторіть раз — і один із них тримає прапор.
Disable та enable
disable ставить запис на паузу, не знищуючи його: resolve одразу перестає його бачити, а is_default знімається в тій самій транзакції. Вимикаючи свій поточний default, можете передати replacement_default_id — інший активний запис того самого власника й провайдера — щоб підвищити його атомарно; без нього власник свідомо лишається без default (і resolve провалюється на наступний рівень).
enable повертає запис у active, але не відновлює прапорець default — повторне підвищення є явним make-default. Відновлений ключ, який мовчки знову стає живим default, — саме той сюрприз, якому це правило запобігає.
Delete
DELETE — це м'яке видалення: миттєве зникнення зі списків, читань, resolve і reveal; is_default знімається; шифротекст переживає вікно відновлення (за замовчуванням 5 днів), поки purge-джоб не прибере його фізично (audit-подія credential.purged). Видалення поточного default приймає той самий replacement_default_id. Повтор видалення власного вже видаленого запису: ідемпотентний 204. Версія не потрібна.
Оптимістичне блокування все зв'язує
PATCH, make-default, disable та enable — усі вимагають поточної version; кожен успіх її інкрементує. Два адміни, що редагують той самий запис, не можуть мовчки перезаписати одне одного — той, хто програв, отримує 409 CREDENTIAL_VERSION_CONFLICT і перечитує. Повна конвенція: Errors and Conventions.
Розібраний приклад усього цього танцю — два ключі, перемикання, disable із заміною: сценарій cookbook 04.