diff --git a/internal/workspace/dto.go b/internal/workspace/dto.go index 093be2b..785b352 100644 --- a/internal/workspace/dto.go +++ b/internal/workspace/dto.go @@ -115,3 +115,7 @@ func toFileStatusResp(f git.FileStatus) fileStatusResp { type commitResp struct { SHA string `json:"sha"` } + +type branchListResp struct { + Branches []string `json:"branches"` +} diff --git a/internal/workspace/handler.go b/internal/workspace/handler.go index 43328c0..4e85c0d 100644 --- a/internal/workspace/handler.go +++ b/internal/workspace/handler.go @@ -62,6 +62,7 @@ func (h *Handler) Mount(r chi.Router) { r.Get("/worktrees", h.listWorktrees) r.Post("/worktrees", h.createWorktree) + r.Get("/branches", h.listBranches) }) r.With(auth).Route("/api/v1/worktrees/{wtID}", func(r chi.Router) { r.Delete("/", h.deleteWorktree) @@ -340,6 +341,25 @@ func (h *Handler) createWorktree(w http.ResponseWriter, r *http.Request) { writeJSON(w, http.StatusCreated, toWorktreeResp(wt)) } +func (h *Handler) listBranches(w http.ResponseWriter, r *http.Request) { + c, err := h.caller(r) + if err != nil { + writeErr(w, r, err) + return + } + id, err := parseUUID(chi.URLParam(r, "wsID")) + if err != nil { + writeErr(w, r, err) + return + } + branches, err := h.ws.ListBranches(r.Context(), c, id) + if err != nil { + writeErr(w, r, err) + return + } + writeJSON(w, http.StatusOK, branchListResp{Branches: branches}) +} + func (h *Handler) deleteWorktree(w http.ResponseWriter, r *http.Request) { c, err := h.caller(r) if err != nil { diff --git a/internal/workspace/handler_test.go b/internal/workspace/handler_test.go index a6ab07b..3527432 100644 --- a/internal/workspace/handler_test.go +++ b/internal/workspace/handler_test.go @@ -49,7 +49,7 @@ func (f *fakeWS) GetCredentialMeta(_ context.Context, _ Caller, _ uuid.UUID) (*C } func (f *fakeWS) ListBranches(_ context.Context, _ Caller, _ uuid.UUID) ([]string, error) { - return nil, nil + return []string{"main", "develop"}, nil } // fakeResolver 把固定 token 解码为 uuid(沿 internal/project handler_test.go 模式)。 @@ -86,3 +86,26 @@ func TestHandler_CreateWorkspace_Smoke(t *testing.T) { r.ServeHTTP(w, req) require.Equal(t, http.StatusCreated, w.Code) } + +func TestHandler_ListBranches_Smoke(t *testing.T) { + t.Parallel() + ws := &fakeWS{} + uid := uuid.New() + tok := "tok-branches" + resolver := &fakeResolver{valid: map[string]uuid.UUID{tok: uid}} + h := NewHandler(ws, nil, nil, resolver, fakeAdmin{}) + r := chi.NewRouter() + r.Use(middleware.RequestID) + h.Mount(r) + + wsID := uuid.New() + req := httptest.NewRequest("GET", "/api/v1/workspaces/"+wsID.String()+"/branches", nil) + req.Header.Set("Authorization", "Bearer "+tok) + w := httptest.NewRecorder() + r.ServeHTTP(w, req) + require.Equal(t, http.StatusOK, w.Code) + + var resp branchListResp + require.NoError(t, json.NewDecoder(w.Body).Decode(&resp)) + require.Equal(t, []string{"main", "develop"}, resp.Branches) +}