1+ // Package handlers provide functions used to handle gRPC.
12package handlers
23
34import (
5+ "errors"
46 "sort"
57
68 "github.com/codingpot/pr12er/server/internal/err"
9+ "github.com/codingpot/pr12er/server/pkg/handlers/gh"
710 "github.com/codingpot/pr12er/server/pkg/handlers/prutils"
811 "github.com/codingpot/pr12er/server/pkg/pr12er"
912)
1013
14+ // Handler depends on gh.GitHubService interface.
15+ type Handler struct {
16+ gh gh.GitHubService
17+ }
18+
19+ func New (service gh.GitHubService ) * Handler {
20+ return & Handler {gh : service }
21+ }
22+
1123// VideosResponseFromDB converts DB proto to GetVideosResponse.
12- func VideosResponseFromDB (db * pr12er.Database ) * pr12er.GetVideosResponse {
24+ func ( h * Handler ) VideosResponseFromDB (db * pr12er.Database ) * pr12er.GetVideosResponse {
1325 videos := make ([]* pr12er.Video , len (db .GetPrIdToVideo ()))
1426 i := 0
1527
@@ -38,6 +50,43 @@ func VideosResponseFromDB(db *pr12er.Database) *pr12er.GetVideosResponse {
3850 }
3951}
4052
53+ // DetailResponseFromDB builds DetailResponse from Database.
54+ func (h * Handler ) DetailResponseFromDB (prID int32 , db * pr12er.Database ) (* pr12er.GetDetailResponse , error ) {
55+ video , ok := db .GetPrIdToVideo ()[prID ]
56+ if ! ok {
57+ return nil , err.ErrorPrIDNotFound {PrID : prID }
58+ }
59+
60+ return & pr12er.GetDetailResponse {
61+ Detail : & pr12er.Detail {
62+ PrId : prID ,
63+ Papers : video .GetPapers (),
64+ },
65+ }, nil
66+ }
67+
68+ // Report handles when a client sends a bug report or a missing PR video report.
69+ func (h * Handler ) Report (in * pr12er.ReportRequest ) (* pr12er.ReportResponse , error ) {
70+ var issue * gh.GitHubIssue
71+ var e error
72+
73+ switch in .GetType () {
74+ case pr12er .ReportRequest_REPORT_TYPE_BUG :
75+ issue , e = h .gh .CreateIssue ("버그 리포트" , in .GetBody (), []string {"bug" })
76+ case pr12er .ReportRequest_REPORT_TYPE_MISSING_PR_VIDEO :
77+ issue , e = h .gh .CreateIssue ("PR12 누락 동영상" , in .GetBody (), []string {"data" })
78+ case pr12er .ReportRequest_REPORT_TYPE_UNSPECIFIED :
79+ issue , e = h .gh .CreateIssue ("기타" , in .GetBody (), nil )
80+ default :
81+ e = errors .New ("this bug report type is not supported" )
82+ }
83+
84+ if issue == nil || e != nil {
85+ return nil , e
86+ }
87+ return & pr12er.ReportResponse {IssueUrl : issue .URL }, e
88+ }
89+
4190// getKeywords returns all keywords by merging each paper's methods.
4291func getKeywords (prVideo * pr12er.PrVideo ) []string {
4392 var ret []string
@@ -53,18 +102,3 @@ func getKeywords(prVideo *pr12er.PrVideo) []string {
53102func getYouTubeLinkFromID (videoID string ) string {
54103 return "https://youtu.be/" + videoID
55104}
56-
57- // DetailResponseFromDB builds DetailResponse from Database.
58- func DetailResponseFromDB (prID int32 , db * pr12er.Database ) (* pr12er.GetDetailResponse , error ) {
59- video , ok := db .GetPrIdToVideo ()[prID ]
60- if ! ok {
61- return nil , err.ErrorPrIDNotFound {PrID : prID }
62- }
63-
64- return & pr12er.GetDetailResponse {
65- Detail : & pr12er.Detail {
66- PrId : prID ,
67- Papers : video .GetPapers (),
68- },
69- }, nil
70- }
0 commit comments