driesvints / sponsors

A package for PHP to interact with GitHub Sponsors.
MIT License
104 stars 7 forks source link

Caching #1

Open driesvints opened 2 years ago

driesvints commented 2 years ago

Performing GraphQL calls can be costly and take quite a bit of time. Ideally I'd like to have dedicated caching support in the library. Most calls to check for sponsorships of GitHub users or to retrieve a list of sponsors don't need to be checked every second.

The way I see it we can ship a decorator for the GitHubSponsors client. This would look like as follows:

final class CachedGitHubSponsors
{
    public function __construct(
        private GitHubSponsors $client
    ) {}

    public function isSponsoredBy(string $account, string $sponsor, bool $isAccountAnOrganization = false): bool
    {
        // check cached status

        return $this->client->isSponsoredBy($account, $sponsor, $isAccountAnOrganization);
    }

    // ...
}

Maybe a common interface is needed?

I think this class should require a Psr\SimpleCache\CacheInterface implementation to handle the caching. For Laravel it can be retrieved from the already set cache store. We can add options to the github-sponsors.php config file to set the specific cache store and timeouts.

Gummibeer commented 2 years ago

I like the two classes approach - would only add a cached() method on the Facade so that users can easily use it like.

GithubSponsors::cached()->isSponsoredBy('Gummibeer');
mabdalmoniem commented 2 years ago

Hello guys! If you don't mind I'd like to work on this (this is my first public contribution so I want to make sure that I understand what do you require 😅)

I'll try to rephrase the proposed solution to make sure that I'm following:

interface GitHubSponsorsInterface
{
    public function isSponsoredBy(string $account, string $sponsor, bool $isAccountAnOrganization = false): bool;
    ...
}

final class GitHubSponsors implements GitHubSponsorsInterface
{
    // ...
}

final class CachedGitHubSponsors implements GitHubSponsorsInterface
{
    // ...
}
final class CachedGitHubSponsors implements GitHubSponsorsInterface
{
    public function __construct(
        private GitHubSponsors $client,
        private CacheDriver $cacheDriver
    ) {}
}

Please forgive me if that's not what you want and I've wasted your time 😅🙏

driesvints commented 2 years ago

Heya! Thanks for willing to help out. We'll need to rethink this quite a bit since the internals have changed in the meantime. I atm don't have time for this so we'll need to hold off on this until I can find some time to wrap my head around it.