github.com/massongit/reviewdog@v0.0.0-20240331071725-4a16675475a8/doghouse/server/storage/token.go (about)

     1  package storage
     2  
     3  import (
     4  	"context"
     5  	"fmt"
     6  
     7  	"cloud.google.com/go/datastore"
     8  )
     9  
    10  // GitHubRepositoryToken represents token data for authenticating reviewdog CLI
    11  // to the target repository.
    12  type GitHubRepositoryToken struct {
    13  	Token string
    14  	// https://github/<RepositoryOwner>/<RepositoryName>.
    15  	RepositoryOwner string
    16  	RepositoryName  string
    17  	RepositoryID    int64
    18  }
    19  
    20  // GitHubRepositoryTokenStore represents GitHubRepositoryToken storage interface.
    21  type GitHubRepositoryTokenStore interface {
    22  	// Put upserts GitHubRepositoryToken entity.
    23  	Put(ctx context.Context, token *GitHubRepositoryToken) error
    24  	// Get get GitHubRepositoryToken entity by owner and repo name.
    25  	// - If the entity is found, return token with ok is true.
    26  	// - If the entity is not found, ok is false.
    27  	// - If error occurs, it returns err.
    28  	Get(ctx context.Context, owner, repo string) (ok bool, token *GitHubRepositoryToken, err error)
    29  }
    30  
    31  // GitHubRepoTokenDatastore is store of GitHubRepositoryToken by Datastore of
    32  // Google Appengine.
    33  type GitHubRepoTokenDatastore struct{}
    34  
    35  func (g *GitHubRepoTokenDatastore) newKey(owner, repo string) *datastore.Key {
    36  	kind := "GitHubRepositoryToken"
    37  	return datastore.NameKey(kind, fmt.Sprintf("%s/%s", owner, repo), nil)
    38  }
    39  
    40  // Put upserts GitHubRepositoryToken.
    41  func (g *GitHubRepoTokenDatastore) Put(ctx context.Context, token *GitHubRepositoryToken) error {
    42  	key := g.newKey(token.RepositoryOwner, token.RepositoryName)
    43  	d, err := datastoreClient(ctx)
    44  	if err != nil {
    45  		return err
    46  	}
    47  	_, err = d.Put(ctx, key, token)
    48  	return err
    49  }
    50  
    51  func (g *GitHubRepoTokenDatastore) Get(ctx context.Context, owner, repo string) (ok bool, token *GitHubRepositoryToken, err error) {
    52  	key := g.newKey(owner, repo)
    53  	token = new(GitHubRepositoryToken)
    54  	d, err := datastoreClient(ctx)
    55  	if err != nil {
    56  		return false, nil, err
    57  	}
    58  	if err := d.Get(ctx, key, token); err != nil {
    59  		if err == datastore.ErrNoSuchEntity {
    60  			return false, nil, nil
    61  		}
    62  		return false, nil, err
    63  	}
    64  	return true, token, nil
    65  }