App subscriptions: manage a user's subscriptions with the app's own token

- $user->appSubscriptions(): create (idempotency_key), find, all, checkout, revoke, pause,
  resume, update against /v1/client/subscriptions with a client credentials token, so apps don't
  depend on the user's login
- user id from the billable's anikeen_id (AnikeenId::useUserIdField())
- ApiException with status, stable error code, isNotFound/isConflict/isTemporary; network
  errors no longer escape as raw Guzzle exceptions
- rejected app tokens are renewed once; asApp() never changes the shared client's token
- tests (testbench + Guzzle mock) and CI

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Maurice PreußandClaude Opus 5.5 committed 2026-10-25 17:02:16 +01:00
1 parent 9c3f9344a0
commit 8de737641e
13 files changed
+749 -57

No files matched your search

+3 -2
View File
@@ -22,8 +22,9 @@
"firebase/php-jwt": "^7.0"
},
"require-dev": {
"phpunit/phpunit": "^8.0|^9.0",
"laravel/framework": "^10.0|^11.0|^12.0|^13.0"
"phpunit/phpunit": "^11.0|^12.0",
"laravel/framework": "^10.0|^11.0|^12.0|^13.0",
"orchestra/testbench": "^9.0|^10.0|^11.0"
},
"autoload": {
"psr-4": {