Files
gh-actions-cache/service/actions_cache.go
Sankalp Kotewar c98ebfe90b E2E delete command using list API (#4)
* 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>
2022-06-28 14:40:11 +05:30

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
}