Skip to content

Commit c1b663d

Browse files
committed
getAnswerInformatioという関数を生やした
1 parent 5e2e1d7 commit c1b663d

File tree

3 files changed

+64
-16
lines changed

3 files changed

+64
-16
lines changed

vmdb-api/controller.go

Lines changed: 38 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"strings"
88
"time"
99

10+
"github.com/go-chi/chi/v5"
1011
"github.com/google/uuid"
1112
)
1213

@@ -140,7 +141,7 @@ func (c *Controller) listLatestUnconfirmedAnswersForLocalProblem(w http.Response
140141
for _, code := range strings.Split(value, ",") {
141142
code = strings.TrimSpace(code)
142143

143-
problem, err := c.repo.findProblemBy(ctx, code)
144+
problem, err := c.repo.findProblemByCode(ctx, code)
144145
if err != nil {
145146
slog.WarnContext(ctx, "failed to find Problem", "error", err, "code", code)
146147
continue
@@ -164,20 +165,7 @@ func (c *Controller) listLatestUnconfirmedAnswersForLocalProblem(w http.Response
164165
}
165166

166167
for _, answer := range latestAnswers {
167-
bodies := []string{}
168-
for _, b := range answer.Bodies {
169-
bodies = append(bodies, b...)
170-
}
171-
172-
response = append(response, listLatestUnconfirmedAnswersForLocalProblemResponseItem{
173-
ID: answer.ID,
174-
ProblemID: answer.ProblemID,
175-
ProblemCode: problem.Code,
176-
TeamID: answer.TeamID,
177-
CreatedAt: answer.CreatedAt,
178-
UpdatedAt: answer.UpdatedAt,
179-
Body: strings.Join(bodies, "\n"),
180-
})
168+
response = append(response, newAnswerResponseFrom(answer, *problem))
181169
}
182170
}
183171

@@ -186,3 +174,38 @@ func (c *Controller) listLatestUnconfirmedAnswersForLocalProblem(w http.Response
186174
w.WriteHeader(http.StatusInternalServerError)
187175
}
188176
}
177+
178+
type getAnswerInformationResponse answerResponse
179+
180+
func (c *Controller) getAnswerInformation(w http.ResponseWriter, r *http.Request) {
181+
ctx := r.Context()
182+
183+
answerIDStr := chi.URLParam(r, "answerID")
184+
answerID, err := uuid.Parse(answerIDStr)
185+
if err != nil {
186+
slog.WarnContext(ctx, "invalid query parameters", "answer_id", answerIDStr)
187+
w.WriteHeader(http.StatusBadRequest)
188+
return
189+
}
190+
191+
answer, err := c.repo.findAnswerBy(ctx, answerID)
192+
if err != nil {
193+
slog.WarnContext(ctx, "failed to find Answer", "error", err)
194+
w.WriteHeader(http.StatusNotFound)
195+
return
196+
}
197+
198+
problem, err := c.repo.findProblemBy(ctx, answer.ProblemID)
199+
if err != nil {
200+
slog.ErrorContext(ctx, "failed to find Problem", "error", err)
201+
w.WriteHeader(http.StatusInternalServerError)
202+
return
203+
}
204+
205+
response := getAnswerInformationResponse(newAnswerResponseFrom(*answer, *problem))
206+
207+
if err := renderJSON(w, http.StatusOK, response); err != nil {
208+
slog.ErrorContext(ctx, "failed to render JSON", "error", err)
209+
w.WriteHeader(http.StatusInternalServerError)
210+
}
211+
}

vmdb-api/main.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,13 @@ func (c *Command) RunE(cmd *cobra.Command, _ []string) error {
7575
r.Use(middleware.Heartbeat("/healthz"))
7676
r.Use(middleware.Recoverer)
7777

78+
// 後方互換性のために、そのままのI/Fで提供する
7879
r.Get("/", controller.hello)
7980
r.Get("/problem-environments", controller.listProblemEnvironments)
8081
r.Get("/answer-id", controller.getAnswerID)
82+
8183
r.Get("/local-problem-answers", controller.listLatestUnconfirmedAnswersForLocalProblem)
84+
r.Get("/answers/{answerID}", controller.getAnswerInformation)
8285

8386
server := Server{
8487
ListenAddr: c.listenAddr,

vmdb-api/repository.go

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,18 @@ func (r *Repository) findProblemEnvironmentBy(ctx context.Context, name string)
5050
return &result, nil
5151
}
5252

53-
func (r *Repository) findProblemBy(ctx context.Context, code string) (*Problem, error) {
53+
func (r *Repository) findProblemBy(ctx context.Context, problemID uuid.UUID) (*Problem, error) {
54+
var result Problem
55+
err := r.db.NewSelect().Model(&result).
56+
Where("id = ?", problemID).
57+
Scan(ctx)
58+
if err != nil {
59+
return nil, err
60+
}
61+
return &result, nil
62+
}
63+
64+
func (r *Repository) findProblemByCode(ctx context.Context, code string) (*Problem, error) {
5465
var result Problem
5566
err := r.db.NewSelect().Model(&result).
5667
Where("code = ?", code).
@@ -61,6 +72,17 @@ func (r *Repository) findProblemBy(ctx context.Context, code string) (*Problem,
6172
return &result, nil
6273
}
6374

75+
func (r *Repository) findAnswerBy(ctx context.Context, answerID uuid.UUID) (*Answer, error) {
76+
var result Answer
77+
err := r.db.NewSelect().Model(&result).
78+
Where("id = ?", answerID).
79+
Scan(ctx)
80+
if err != nil {
81+
return nil, err
82+
}
83+
return &result, nil
84+
}
85+
6486
func (r *Repository) listLatestUnscoredAnswersFor(ctx context.Context, problemID uuid.UUID) ([]Answer, error) {
6587
var result []Answer
6688
err := r.db.NewSelect().ColumnExpr("answers.*").

0 commit comments

Comments
 (0)