package services import ( "log" "os" "ticket-pimp/internal/domain" "ticket-pimp/internal/helpers" "time" ) type Git struct { *CommonClient } type IGit interface { CreateRepo(name string) (*domain.Git, error) } func NewGit(base, token string) *Git { headers := map[string]string{ "Accept": "application/vnd.github+json", "Authorization": "Token " + token, "X-GitHub-Api-Version": "2022-11-28", "Content-Type": "application/json", } client := NewClient(). SetTimeout(5 * time.Second). SetCommonHeaders(headers). SetBaseURL(base) return &Git{ CommonClient: &CommonClient{client}, } } func (gb *Git) CreateRepo(name string) (*domain.Git, error) { //Create git repository with iGit interface; repo, err := gb.newRepo(name) if err != nil { return nil, err } //Set 'apps' as collaborator to created repository; _, err = gb.defaultGroupAsCollaborator(repo) if err != nil { return nil, err } return repo, nil } type request struct { Name string `json:"name"` Private bool `json:"private"` } type permissionRequest struct { Perm string `json:"permission"` } func (gb *Git) newRepo(name string) (*domain.Git, error) { name = helpers.GitNaming(name) payload := request{ Name: name, Private: true, } var git domain.Git git.Private = true resp, _ := gb.R(). SetBody(&payload). SetSuccessResult(&git). Post("/user/repos") if resp.Err != nil { log.Print(resp.Status) return nil, resp.Err } return &git, nil } func (gb *Git) defaultGroupAsCollaborator(git *domain.Git) (*domain.Git, error) { payload := permissionRequest{ Perm: "admin", } respURL := "/repos/" + os.Getenv("GIT_USER") + "/" + git.Name + "/collaborators/apps" resp, _ := gb.R(). SetBody(&payload). Put(respURL) if resp.Err != nil { log.Print(resp.Err) return nil, resp.Err } return git, nil }