Skip to content

Commit

Permalink
Refactor project structure
Browse files Browse the repository at this point in the history
Signed-off-by: Paul Meyer <49727155+katexochen@users.noreply.github.com>
  • Loading branch information
katexochen committed Apr 3, 2023
1 parent a2219aa commit 7a4806b
Show file tree
Hide file tree
Showing 10 changed files with 144 additions and 114 deletions.
52 changes: 52 additions & 0 deletions internal/cmd/apiv4.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package cmd

import "github.com/shurcooL/githubv4"

// User is a GitHub user, see https://docs.github.com/en/graphql/reference/objects#user.
type User struct {
ID githubv4.ID
}

// Project is a GitHub project, see https://docs.github.com/en/graphql/reference/objects#projectv2.
type Project struct {
ID githubv4.ID
Title githubv4.String
Fields struct {
Nodes []ProjectField
} `graphql:"fields(first: 100)"`
URL githubv4.URI
}

// ProjectField is a GitHub project field, see https://docs.github.com/en/graphql/reference/objects#projectv2field.
type ProjectField struct {
Typename githubv4.String `graphql:"__typename"`
ProjectV2FieldCommon `graphql:"... on ProjectV2FieldCommon"`
Iteration struct {
Configuration struct {
Duration githubv4.Int
StartDay githubv4.Int
}
} `graphql:"... on ProjectV2IterationField"`
SingleSelect struct {
Options []ProjectSingleSelectFieldOption
} `graphql:"... on ProjectV2SingleSelectField"`
}

// ProjectV2FieldCommon is a GitHub project field common, see https://docs.github.com/en/graphql/reference/interfaces#projectv2fieldcommon.
type ProjectV2FieldCommon struct {
ID githubv4.ID
DataType githubv4.ProjectV2FieldType
Name githubv4.String
}

// ProjectSingleSelectFieldOption is a GitHub field option, see https://docs.github.com/en/graphql/reference/objects#projectv2singleselectfieldoption.
type ProjectSingleSelectFieldOption struct {
ID githubv4.String
Name githubv4.String
}

// ProjectItem is a GitHub project item, see https://docs.github.com/en/graphql/reference/objects#projectv2item.
type ProjectItem struct {
ID githubv4.ID
DatabaseID githubv4.Int
}
2 changes: 1 addition & 1 deletion client.go → internal/cmd/client.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package cmd

import (
"context"
Expand Down
63 changes: 10 additions & 53 deletions clientv4.go → internal/cmd/clientv4.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package cmd

import (
"context"
Expand All @@ -8,22 +8,22 @@ import (
"golang.org/x/oauth2"
)

type GithubV4Client struct {
type githubV4Client struct {
client *githubv4.Client
logger Logger
logger loggerI
}

func NewGithubV4Client(ctx context.Context, token string, logger Logger) *GithubV4Client {
func newGithubV4Client(ctx context.Context, token string, logger loggerI) *githubV4Client {
ts := oauth2.StaticTokenSource(&oauth2.Token{AccessToken: token})
tc := oauth2.NewClient(ctx, ts)
client := githubv4.NewClient(tc)
return &GithubV4Client{
return &githubV4Client{
client: client,
logger: logger,
}
}

func (c *GithubV4Client) QueryUser(ctx context.Context, username string) (*User, error) {
func (c *githubV4Client) QueryUser(ctx context.Context, username string) (*User, error) {
var q struct {
User User `graphql:"user(login: $user)"`
}
Expand All @@ -39,7 +39,7 @@ func (c *GithubV4Client) QueryUser(ctx context.Context, username string) (*User,
return &q.User, nil
}

func (c *GithubV4Client) QueryProject(ctx context.Context, org string, projectNumber int) (*Project, error) {
func (c *githubV4Client) QueryProject(ctx context.Context, org string, projectNumber int) (*Project, error) {
var q struct {
Organization struct {
ProjectV2 Project `graphql:"projectV2(number: $number)"`
Expand All @@ -58,7 +58,7 @@ func (c *GithubV4Client) QueryProject(ctx context.Context, org string, projectNu
return &q.Organization.ProjectV2, nil
}

func (c *GithubV4Client) AddProjectV2DraftIssue(ctx context.Context, input githubv4.AddProjectV2DraftIssueInput,
func (c *githubV4Client) AddProjectV2DraftIssue(ctx context.Context, input githubv4.AddProjectV2DraftIssueInput,
) (ProjectItem, error) {
var m struct {
AddProjectV2DraftIssue struct {
Expand All @@ -69,7 +69,7 @@ func (c *GithubV4Client) AddProjectV2DraftIssue(ctx context.Context, input githu
return m.AddProjectV2DraftIssue.ProjectItem, c.client.Mutate(ctx, &m, input, nil)
}

func (c *GithubV4Client) UpdateProjectV2ItemFieldValueInput(ctx context.Context, project *Project,
func (c *githubV4Client) UpdateProjectV2ItemFieldValueInput(ctx context.Context, project *Project,
itemID githubv4.ID, fieldValues map[string]string,
) error {
for fieldName, value := range fieldValues {
Expand Down Expand Up @@ -113,7 +113,7 @@ func (c *GithubV4Client) UpdateProjectV2ItemFieldValueInput(ctx context.Context,
c.logger.PrintJSON("update project fields input", input)
var m struct {
UpdateProjectV2ItemFieldValue struct {
ClientMutationId githubv4.String
ClientMutationID githubv4.String
} `graphql:"updateProjectV2ItemFieldValue(input: $input)"`
}

Expand All @@ -125,46 +125,3 @@ func (c *GithubV4Client) UpdateProjectV2ItemFieldValueInput(ctx context.Context,

return nil
}

type User struct {
ID githubv4.ID
}

type Project struct {
ID githubv4.ID
Title githubv4.String
Fields struct {
Nodes []ProjectField
} `graphql:"fields(first: 100)"`
URL githubv4.URI
}

type ProjectField struct {
Typename githubv4.String `graphql:"__typename"`
ProjectV2FieldCommon `graphql:"... on ProjectV2FieldCommon"`
Iteration struct {
Configuration struct {
Duration githubv4.Int
StartDay githubv4.Int
}
} `graphql:"... on ProjectV2IterationField"`
SingleSelect struct {
Options []FieldOption
} `graphql:"... on ProjectV2SingleSelectField"`
}

type ProjectV2FieldCommon struct {
ID githubv4.ID
DataType githubv4.ProjectV2FieldType
Name githubv4.String
}

type FieldOption struct {
ID githubv4.String
Name githubv4.String
}

type ProjectItem struct {
ID githubv4.ID
DatabaseID githubv4.Int
}
11 changes: 6 additions & 5 deletions deleteruns.go → internal/cmd/deleteruns.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package cmd

import (
"fmt"
Expand All @@ -8,22 +8,23 @@ import (
"github.com/spf13/cobra"
)

func newDeleteAllRunsCmd() *cobra.Command {
// NewDeleteAllRunsCmd creates a new command for deleting workflow runs.
func NewDeleteAllRunsCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "delete-all-runs",
Short: "Delete all workflow runs",
RunE: DeleteRuns,
RunE: deleteRuns,
}
return cmd
}

func DeleteRuns(cmd *cobra.Command, _ []string) error {
func deleteRuns(cmd *cobra.Command, _ []string) error {
owner, repo, err := findOwnerAndRepo()
if err != nil {
return err
}

token, err := GetToken()
token, err := getToken()
if err != nil {
return err
}
Expand Down
2 changes: 1 addition & 1 deletion git.go → internal/cmd/git.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package main
package cmd

import (
"fmt"
Expand Down
13 changes: 13 additions & 0 deletions internal/cmd/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package cmd

type loggerI interface {
Infof(format string, args ...any)
Infoln(args ...any)
Warnf(format string, args ...any)
Warnln(args ...any)
Errorf(format string, args ...any)
Errorln(args ...any)
Debugf(format string, args ...any)
Debugln(args ...any)
PrintJSON(msg string, v any)
}
44 changes: 23 additions & 21 deletions projectissue.go → internal/cmd/projectissue.go
Original file line number Diff line number Diff line change
@@ -1,26 +1,28 @@
package main
package cmd

import (
"encoding/json"
"fmt"
"os"

"github.com/katexochen/ghh/internal/logger"
"github.com/shurcooL/githubv4"
"github.com/spf13/cobra"
)

func newCreateProjectIssueCmd() *cobra.Command {
// NewCreateProjectIssueCmd creates a new command for creating a project issue.
func NewCreateProjectIssueCmd() *cobra.Command {
cmd := &cobra.Command{
Use: "create-project-issue",
Short: "Create a project issue",
RunE: CreateProjectIssue,
RunE: createProjectIssue,
}
cmd.Flags().String("metadata", "", "Path to metadata file")
cmd.Flags().String("body", "", "Path to body file")
return cmd
}

type Metadata struct {
type metadata struct {
Organization string
ProjectNumber int

Expand All @@ -29,25 +31,25 @@ type Metadata struct {
Fields map[string]string
}

func CreateProjectIssue(cmd *cobra.Command, _ []string) error {
func createProjectIssue(cmd *cobra.Command, _ []string) error {
flags, err := parseCreateProjectIssueFlags(cmd)
if err != nil {
return err
}

var logger Logger
var log loggerI
if flags.verbose {
logger = &VerboseLogger{}
log = &logger.VerboseLogger{}
} else {
logger = &DefaultLogger{}
log = &logger.DefaultLogger{}
}

token, err := GetToken()
token, err := getToken()
if err != nil {
return err
}

c := NewGithubV4Client(cmd.Context(), token, logger)
c := newGithubV4Client(cmd.Context(), token, log)

project, err := c.QueryProject(cmd.Context(), flags.Metadata.Organization, flags.Metadata.ProjectNumber)
if err != nil {
Expand Down Expand Up @@ -86,41 +88,41 @@ func CreateProjectIssue(cmd *cobra.Command, _ []string) error {
return nil
}

type CreateProjectIssueFlags struct {
Metadata Metadata
type createProjectIssueFlags struct {
Metadata metadata
Body string
verbose bool
}

func parseCreateProjectIssueFlags(cmd *cobra.Command) (CreateProjectIssueFlags, error) {
func parseCreateProjectIssueFlags(cmd *cobra.Command) (createProjectIssueFlags, error) {
metadataPath, err := cmd.Flags().GetString("metadata")
if err != nil {
return CreateProjectIssueFlags{}, err
return createProjectIssueFlags{}, err
}
metadataBytes, err := os.ReadFile(metadataPath)
if err != nil {
return CreateProjectIssueFlags{}, err
return createProjectIssueFlags{}, err
}
var metadata Metadata
var metadata metadata
if err := json.Unmarshal(metadataBytes, &metadata); err != nil {
return CreateProjectIssueFlags{}, err
return createProjectIssueFlags{}, err
}

bodyPath, err := cmd.Flags().GetString("body")
if err != nil {
return CreateProjectIssueFlags{}, err
return createProjectIssueFlags{}, err
}
bodyBytes, err := os.ReadFile(bodyPath)
if err != nil {
return CreateProjectIssueFlags{}, err
return createProjectIssueFlags{}, err
}

verbose, err := cmd.Flags().GetBool("verbose")
if err != nil {
return CreateProjectIssueFlags{}, err
return createProjectIssueFlags{}, err
}

return CreateProjectIssueFlags{
return createProjectIssueFlags{
Metadata: metadata,
Body: string(bodyBytes),
verbose: verbose,
Expand Down

0 comments on commit 7a4806b

Please sign in to comment.