* Completed List cmd and added API calls * Minor comments and add delete code to pass linting * Typo in descriptions * Added delete functionality using existing list API * Updated limit param for list api to default 30 * Minor refactoring * Linting fixes for survey output * Implemented review comments * Handling 404 response when confirm flag is passed * Added COMMAND back to delete CLI * Minor comments * Check http err statuscode for 404 * Validations * Validations-1 * improved branch flag validation * removed build * String match made case insensitive * Added TODO for error handling * Updated error message when args are not provided * Worked on review comments * Argument length check updated * Separated direct and indirect dependencies * Used SPrintF for formatting strings * Updated lastAccessed time logic * Removed extra variable userConfirmation * Removed unnecessary computations * Printing and formatting changes * Passed key from input in queryparams * Scan List API iteratively to get exact matches * Added pretty print for trimmed list * Update page number instead of re-generating params * Added listAllCaches method and moved it to utils * Moved redTick to utils * Update internal/utils.go Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com> * Limited scope of `sb` to `if` block * Fixed pretty print issue * Error type checked for httpError * Added PrintOneOrMore fn, moved listAll to service * Implemented `Goment` for last accessed time * Used percentage based on window size for printing * Removed stringbuilder and updated fn name * Made `ListAllCaches` member of `actions_cache.go` * Updated prettyPrint logic cover better content * Using PrettyPrint for List command as well. * Separated direct and indirect modules Co-authored-by: t-dedah <t-dedah@github.com> Co-authored-by: Deepak Dahiya <59823596+t-dedah@users.noreply.github.com> Co-authored-by: Bishal Prasad <bishal-pdmsft@github.com>
92 lines
2.6 KiB
Go
92 lines
2.6 KiB
Go
package service
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"log"
|
|
"math"
|
|
"net/url"
|
|
"strconv"
|
|
|
|
"github.com/actions/gh-actions-cache/types"
|
|
gh "github.com/cli/go-gh"
|
|
"github.com/cli/go-gh/pkg/api"
|
|
ghRepo "github.com/cli/go-gh/pkg/repository"
|
|
)
|
|
|
|
type ArtifactCacheService interface {
|
|
GetCacheUsage() float64
|
|
ListCaches(queryParams url.Values) types.ListApiResponse
|
|
DeleteCaches(queryParams url.Values) int
|
|
ListAllCaches(queryParams url.Values, key string) []types.ActionsCache
|
|
}
|
|
|
|
type ArtifactCache struct {
|
|
HttpClient api.RESTClient
|
|
repo ghRepo.Repository
|
|
}
|
|
|
|
func NewArtifactCache(repo ghRepo.Repository, command string, version string) ArtifactCacheService {
|
|
opts := api.ClientOptions{
|
|
Host: repo.Host(),
|
|
Headers: map[string]string{"User-Agent": fmt.Sprintf("gh-actions-cache/%s/%s", version, command)},
|
|
}
|
|
restClient, err := gh.RESTClient(&opts)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
return &ArtifactCache{HttpClient: restClient, repo: repo}
|
|
}
|
|
|
|
func (a *ArtifactCache) GetCacheUsage() float64 {
|
|
pathComponent := fmt.Sprintf("repos/%s/%s/actions/cache/usage", a.repo.Owner(), a.repo.Name())
|
|
var apiResults types.RepoLevelUsageApiResponse
|
|
err := a.HttpClient.Get(pathComponent, &apiResults)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
return apiResults.ActiveCacheSizeInBytes
|
|
}
|
|
|
|
func (a *ArtifactCache) ListCaches(queryParams url.Values) types.ListApiResponse {
|
|
pathComponent := fmt.Sprintf("repos/%s/%s/actions/caches", a.repo.Owner(), a.repo.Name())
|
|
var apiResults types.ListApiResponse
|
|
err := a.HttpClient.Get(pathComponent+"?"+queryParams.Encode(), &apiResults)
|
|
if err != nil {
|
|
log.Fatal(err)
|
|
}
|
|
|
|
return apiResults
|
|
}
|
|
|
|
func (a *ArtifactCache) DeleteCaches(queryParams url.Values) int {
|
|
pathComponent := fmt.Sprintf("repos/%s/%s/actions/caches", a.repo.Owner(), a.repo.Name())
|
|
var apiResults types.DeleteApiResponse
|
|
err := a.HttpClient.Delete(pathComponent+"?"+queryParams.Encode(), &apiResults)
|
|
if err != nil {
|
|
var httpError api.HTTPError
|
|
if errors.As(err, &httpError) && httpError.StatusCode == 404 {
|
|
return 0
|
|
} else {
|
|
log.Fatal(err)
|
|
}
|
|
}
|
|
return apiResults.TotalCount
|
|
}
|
|
|
|
func (a *ArtifactCache) ListAllCaches(queryParams url.Values, key string) []types.ActionsCache {
|
|
var listApiResponse types.ListApiResponse
|
|
listApiResponse = a.ListCaches(queryParams)
|
|
caches := listApiResponse.ActionsCaches
|
|
totalCaches := listApiResponse.TotalCount
|
|
if totalCaches > 100 {
|
|
for page := 2; page <= int(math.Ceil(float64(listApiResponse.TotalCount)/100)); page++ {
|
|
queryParams.Set("page", strconv.Itoa(page))
|
|
listApiResponse = a.ListCaches(queryParams)
|
|
caches = append(caches, listApiResponse.ActionsCaches...)
|
|
}
|
|
}
|
|
return caches
|
|
}
|