Github 문제를 사용하여 고객 피드백을 추적하는 방법

Boot.dev는 지난 몇 년 동안 저의 사이드 프로젝트였습니다. 양보다 질에 중점을 둔 learning path for backend developers이기 때문에 학생들로부터 정말 긴밀한 피드백 루프가 필요하다는 것을 일찍부터 알았습니다. 우리는 저와 학생들이 어울리는 Discord server이 있었고, 처음에는 괜찮았습니다. 안타깝게도 Discord 채널에는 문제 추적과 관련하여 몇 가지 문제가 있습니다.
  • 긴 대화로 인해 개별 보고서를 추적하기 어렵습니다
  • .
  • "티켓"을 "해결"할 방법이 없습니다
  • .
  • 모든 학생이 Discord에 있지 않음
  • 다른 응용 프로그램에서 문제를 보고하는 데 마찰이 더 많습니다
  • .

    지금까지 훌륭하게 작동한 솔루션은 각 코딩 과제 내에 직접 피드백 상자를 추가하는 것이었습니다! 이제 학생들은 번거로움 없이 문제를 쉽게 보고할 수 있습니다. 불행히도, 제출된 문제를 얻기 위해 SQL 쿼리를 실행하는 것은 엄청난 고통입니다... Github API가 채팅에 들어갔습니다.

    Github 문제를 사용하여 사용자 피드백 추적



    Markdown 파일의 Boot.dev에 있는 computer science courses에 대한 모든 콘텐츠를 저장하는 개인 Github 저장소가 있습니다. 사용자가 해당 리포지토리에서 Github 이슈로 자동으로 매니페스트된 이슈를 보고하면 정말 편리할 것입니다! 몇 분 만에 파헤친 후 Github API를 사용하는 것이 매우 쉽다는 것을 깨달았습니다. 내 백엔드가 Go로 작성된 REST-ish API라는 점을 감안하여 Google's Github API client package 및 공식Golang oauth2 package 을 사용하기로 결정했습니다.

    따라하고 싶은데 먼저 "repo"권한이 있는 personal access token이 필요합니다.

    다음으로 Github API와의 상호 작용을 관리하기 위해 프로젝트에 githubclient 패키지를 생성했습니다. Client 구조체를 노출합니다.

    // Client -
    type Client struct {
        githubClient *github.Client
    }
    
    // NewClient -
    func NewClient(personalAccessToken string) (Client, error) {
        ctx := context.Background()
        ts := oauth2.StaticTokenSource(
            &oauth2.Token{AccessToken: personalAccessToken},
        )
        tc := oauth2.NewClient(ctx, ts)
    
        client := github.NewClient(tc)
    
        _, ghResp, err := client.Issues.List(ctx, false, nil)
        if err != nil {
            return Client{}, err
        }
        if ghResp.StatusCode > 299 {
            dat, err := io.ReadAll(ghResp.Body)
            if err != nil {
                return Client{}, err
            }
            return Client{}, fmt.Errorf("status code: %v, message: %v", ghResp.StatusCode, string(dat))
        }
    
        return Client{
            githubClient: client,
        }, nil
    }
    


    문제를 나열하기 위해 몇 가지 논리를 추가했음을 알 수 있습니다. 우리는 실제로 이러한 문제에 대해 아무 조치도 취하지 않으며 원하는 경우 해당 코드를 제거할 수 있습니다. 저에게는 응용 프로그램 시작 시 토큰이 작동하는지 테스트하는 것이 유용했습니다.

    다음으로 클라이언트에 간단한CreateIssue() 메서드를 작성했습니다.

    // CreateIssue creates an issue in the example-org/example-repo repository
    func (c Client) CreateIssue(exercisePath, fromUsername, userComment string) error {
        ctx := context.Background()
      const repoName = "example-repo"
      const orgName = "example-org"
    
        summary := userComment
        const summaryLength = 20
        if len(summary) > summaryLength {
            summary = summary[:summaryLength]
        }
    
        title := fmt.Sprintf("exercise: %v, Summary: %v", exercisePath, summary)
        body := fmt.Sprintf(`
    Comment: %v
    
    From: %v
    `, userComment, fromUsername)
    
        _, ghResp, err := c.githubClient.Issues.Create(ctx, orgName, repoName, &github.IssueRequest{
            Title:  &title,
            Body:   &body,
            Labels: &[]string{"course-feedback"},
        })
        if err != nil {
            return err
        }
    
        if ghResp.StatusCode > 299 {
            dat, err := io.ReadAll(ghResp.Body)
            if err != nil {
                return err
            }
            return fmt.Errorf("status code: %v, message: %v", ghResp.StatusCode, string(dat))
        }
        return nil
    }
    


    보시다시피 주어진...
  • 운동 경로(피드백을 받는 운동의 파일 경로)
  • 기자의 사용자 이름
  • 기자의 코멘트

  • ...the CreateIssue 메서드는 단순히 정적 레이블이 있는 저장소에 새 문제를 생성합니다. 가능한 한 빨리 문제를 해결할 수 있도록 필요에 따라 형식이 지정된 Github 문제 "제목"및 "본문"으로 입력을 분할했습니다.

    즉시 사용 가능한 솔루션을 사용하지 않는 이유는 무엇입니까?



    시장에서 구입할 수 있는 15억 개의 문제 추적 도구가 있다는 것을 알고 있지만 몇 가지 이유로 이 솔루션이 정말 마음에 들었습니다.
  • 처음부터 끝까지 코딩하는 데 약 1시간이 걸렸습니다
  • .
  • 무료입니다
  • 이미 매일 사용하는 툴링과 통합되어 있습니다(GitHub)

  • 앱에 대한 간단한 이슈 트래커가 필요한 경우 최소한 API가 작동을 멈출 때까지 API를 통해 Github 이슈를 사용하는 것이 좋습니다!

    좋은 웹페이지 즐겨찾기