mirror of
https://github.com/anikeen-com/id.git
synced 2026-11-03 14:19:31 +00:00
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:
1 parent
9c3f9344a0
commit
8de737641e
13 files changed
+749
-57
No files matched your search
@@ -58,6 +58,8 @@ class AnikeenId
|
||||
*/
|
||||
private static string $refreshTokenField = 'anikeen_id_refresh_token';
|
||||
|
||||
private static string $userIdField = 'anikeen_id';
|
||||
|
||||
/**
|
||||
* Guzzle is used to make http requests.
|
||||
*/
|
||||
@@ -143,6 +145,41 @@ class AnikeenId
|
||||
return self::$accessTokenField;
|
||||
}
|
||||
|
||||
/**
|
||||
* Attribute of the billable model that holds the user's Anikeen ID (used by app requests,
|
||||
* e.g. appSubscriptions(), which act on behalf of a user without the user's token).
|
||||
*/
|
||||
public static function useUserIdField(string $userIdField): void
|
||||
{
|
||||
self::$userIdField = $userIdField;
|
||||
}
|
||||
|
||||
public static function getUserIdField(): string
|
||||
{
|
||||
return self::$userIdField;
|
||||
}
|
||||
|
||||
/**
|
||||
* A copy that uses the app's own access token (client credentials) instead of a user's token.
|
||||
* The shared instance keeps its token, so app rights never leak into other requests.
|
||||
*
|
||||
* @throws Exceptions\RequestFreshAccessTokenException
|
||||
*/
|
||||
public function asApp(): static
|
||||
{
|
||||
return (clone $this)->withToken(app(Contracts\AppTokenRepository::class)->getAccessToken());
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace the HTTP client, e.g. with one using a Guzzle MockHandler in tests.
|
||||
*/
|
||||
public function setHttpClient(Client $client): static
|
||||
{
|
||||
$this->client = $client;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public static function getMode(): string
|
||||
{
|
||||
return config('services.anikeen.mode') ?: 'production';
|
||||
|
||||
Reference in new issue
Block a user