From de1e861fd7d40711d9a69ba7af2c8f319a6aadf6 Mon Sep 17 00:00:00 2001 From: dvcdsys Date: Thu, 14 May 2026 12:02:06 +0100 Subject: [PATCH] feat(workspaces): Add repo button on /projects via default workspace MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adding a GitHub repo previously required navigating into a specific workspace, which is awkward when projects in this codebase exist independently of workspaces (workspaces are aggregations). The dashboard's /projects page now has an Add repo button next to the title that runs the same clone+index pipeline without forcing the user to think about workspace assignment first. Backend: workspaces gain an is_default flag (partial-UNIQUE index + ALTER-TABLE migration) and a singleton default row is created at startup via workspaces.EnsureDefault. POST /api/v1/git-repos resolves that row and proxies into AddWorkspaceRepo so the existing job queue, webhook, and link flows stay untouched. The default workspace is protected from delete (409) so the standalone endpoint always has a home. EnsureDefault is idempotent and side-steps name collisions ("Personal" → "Personal (2)") so an operator-created workspace with the same name is never reassigned. Frontend: AddRepoDialog's workspaceID prop is now optional; the component routes to /git-repos when omitted. ProjectsListPage gets the trigger button + an updated empty-state copy that points users at it. Co-Authored-By: Claude Opus 4.7 --- doc/openapi.yaml | 48 +- server/cmd/cix-server/main.go | 9 + .../src/modules/projects/ProjectsListPage.tsx | 24 +- .../workspaces/components/AddRepoDialog.tsx | 16 +- server/internal/db/db.go | 60 ++ server/internal/db/schema.go | 10 + .../internal/httpapi/openapi/openapi.gen.go | 758 ++++++++++-------- server/internal/httpapi/workspacerepos.go | 28 + .../internal/httpapi/workspacerepos_test.go | 103 +++ server/internal/httpapi/workspaces.go | 11 +- server/internal/workspaces/workspaces.go | 92 ++- server/internal/workspaces/workspaces_test.go | 118 +++ 12 files changed, 898 insertions(+), 379 deletions(-) diff --git a/doc/openapi.yaml b/doc/openapi.yaml index 4990567..57d3047 100644 --- a/doc/openapi.yaml +++ b/doc/openapi.yaml @@ -1250,6 +1250,45 @@ paths: "503": $ref: "#/components/responses/WorkspacesDisabled" + /api/v1/git-repos: + post: + operationId: addStandaloneGitRepo + tags: [workspaces] + summary: Clone + index a GitHub repository outside any specific workspace + description: | + Convenience endpoint for the dashboard's `/projects` → Add repo + button. Internally resolves the singleton "default" workspace + (see `workspaces.is_default`) and proxies to the same code path + as POST `/api/v1/workspaces/{id}/repos`. The resulting project + appears in `/api/v1/projects` and can later be linked into any + regular workspace via `/api/v1/workspaces/{id}/repos/link`. + + Request and response shapes are identical to the per-workspace + Add repo endpoint, with one exception: the response's `repo` + field carries the default workspace's id in `workspace_id` so + the dashboard can show the resulting project in context. + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/AddWorkspaceRepoRequest" + responses: + "201": + description: Repo attached to default workspace + clone enqueued + content: + application/json: + schema: + $ref: "#/components/schemas/WorkspaceRepoCreated" + "401": + $ref: "#/components/responses/Unauthorized" + "409": + $ref: "#/components/responses/Conflict" + "422": + $ref: "#/components/responses/Unprocessable" + "503": + $ref: "#/components/responses/WorkspacesDisabled" + /api/v1/workspaces/{id}/repos: parameters: - name: id @@ -3097,7 +3136,7 @@ components: Workspace: type: object - required: [id, name, description, created_at, updated_at] + required: [id, name, description, is_default, created_at, updated_at] properties: id: type: string @@ -3108,6 +3147,13 @@ components: description: type: string description: Free-form description. Empty string when absent. + is_default: + type: boolean + description: | + True for the singleton workspace that receives repositories + added via the standalone `/api/v1/git-repos` endpoint (the + dashboard's `/projects` → Add repo flow). Exactly one + workspace is flagged; deleting it returns 409. created_at: type: string format: date-time diff --git a/server/cmd/cix-server/main.go b/server/cmd/cix-server/main.go index 7fe85fd..e935291 100644 --- a/server/cmd/cix-server/main.go +++ b/server/cmd/cix-server/main.go @@ -249,6 +249,15 @@ func run() error { logger.Info("workspaces: encryption key loaded", "source", secSvc.Source()) } wsSvc = workspaces.New(database) + // Make sure the singleton default workspace exists so the + // /git-repos endpoint and the dashboard's /projects "Add repo" + // button always have a target. Idempotent — boots after the + // first one are no-ops. + if def, err := wsSvc.EnsureDefault(context.Background()); err != nil { + return fmt.Errorf("ensure default workspace: %w", err) + } else { + logger.Info("workspaces: default workspace ready", "id", def.ID, "name", def.Name) + } wrSvc = workspacerepos.New(database) // Persistent job queue + worker pool. Worker concurrency comes diff --git a/server/dashboard/src/modules/projects/ProjectsListPage.tsx b/server/dashboard/src/modules/projects/ProjectsListPage.tsx index 97bfc5d..d2b93ef 100644 --- a/server/dashboard/src/modules/projects/ProjectsListPage.tsx +++ b/server/dashboard/src/modules/projects/ProjectsListPage.tsx @@ -2,19 +2,27 @@ import { AlertCircle, FolderPlus } from 'lucide-react'; import { Alert, AlertDescription, AlertTitle } from '@/ui/alert'; import { Skeleton } from '@/ui/skeleton'; import { ApiError } from '@/api/client'; +import { AddRepoDialog } from '@/modules/workspaces/components/AddRepoDialog'; import { ProjectCard } from './components/ProjectCard'; import { useProjects } from './hooks'; export function ProjectsListPage() { - const { data, error, isLoading } = useProjects(); + const { data, error, isLoading, refetch } = useProjects(); return (
-
-

Projects

-

- {data ? `${data.total} indexed ${data.total === 1 ? 'project' : 'projects'}` : ' '} -

+
+
+

Projects

+

+ {data ? `${data.total} indexed ${data.total === 1 ? 'project' : 'projects'}` : ' '} +

+
+ {/* Add repo here clones + indexes a GitHub repository into the + default workspace so the resulting project shows up in this + list. Standalone projects can later be linked into specific + workspaces from the Workspaces page. */} + void refetch()} />
{isLoading ? ( @@ -51,9 +59,9 @@ function EmptyState() {

No projects yet

- Register a project from the CLI with{' '} + Use Add repo above to clone + index a GitHub + repository, or register a local project from the CLI with{' '} cix init <path>. - A GitHub source will land here in a future PR.

diff --git a/server/dashboard/src/modules/workspaces/components/AddRepoDialog.tsx b/server/dashboard/src/modules/workspaces/components/AddRepoDialog.tsx index 88a3ce1..ecf82ec 100644 --- a/server/dashboard/src/modules/workspaces/components/AddRepoDialog.tsx +++ b/server/dashboard/src/modules/workspaces/components/AddRepoDialog.tsx @@ -42,11 +42,17 @@ const NO_TOKEN = '__none__'; // can't pick a repository before choosing a token, and can't submit // before pinning down a branch + webhook mode. The shape mirrors how // people actually fill it in: PAT → repo → branch → webhook policy. +// +// Two scopes: +// - workspaceID provided → POST /workspaces/{id}/repos (standard flow). +// - workspaceID omitted → POST /git-repos (server resolves +// the singleton default workspace; surfaced from /projects so users +// can add a repo without picking a workspace first). export function AddRepoDialog({ workspaceID, onAdded, }: { - workspaceID: string; + workspaceID?: string; onAdded: () => void; }) { const [open, setOpen] = useState(false); @@ -193,10 +199,10 @@ export function AddRepoDialog({ if (tokenID && tokenID !== NO_TOKEN) { payload.token_id = tokenID; } - const resp = await api.post( - `/workspaces/${workspaceID}/repos`, - payload, - ); + const endpoint = workspaceID + ? `/workspaces/${workspaceID}/repos` + : `/git-repos`; + const resp = await api.post(endpoint, payload); setCreated(resp); onAdded(); } catch (e) { diff --git a/server/internal/db/db.go b/server/internal/db/db.go index c696718..01fe9a4 100644 --- a/server/internal/db/db.go +++ b/server/internal/db/db.go @@ -87,6 +87,14 @@ func Open(path string) (*sql.DB, error) { return nil, fmt.Errorf("migrate webhook_mode: %w", err) } + // Standalone /git-repos feature — add workspaces.is_default + the + // partial UNIQUE index. The default workspace row itself is created + // at server startup via workspaces.Service.EnsureDefault, not here. + if err := migrateWorkspacesDefault(db); err != nil { + _ = db.Close() + return nil, fmt.Errorf("migrate workspaces is_default: %w", err) + } + // PR13 — workspace_repos.is_linked + drop the legacy global UNIQUE // on project_path. The rebuild path is taken only when the old // constraint is still present; freshly-created DBs hit the new @@ -389,6 +397,58 @@ func migrateIndexedWithModel(db *sql.DB) error { return nil } +// migrateWorkspacesDefault adds workspaces.is_default to pre-feature +// databases plus the partial UNIQUE index that enforces "at most one +// default workspace". Idempotent: re-runs are no-ops. The actual +// bootstrap (inserting the singleton row) happens at server startup +// via workspaces.Service.EnsureDefault — keeping it out of the DB +// migration so tests can opt in/out by skipping the call. +func migrateWorkspacesDefault(db *sql.DB) error { + rows, err := db.Query(`PRAGMA table_info(workspaces)`) + if err != nil { + return fmt.Errorf("table_info workspaces: %w", err) + } + have := false + tableExists := false + for rows.Next() { + var ( + cid int + name, typ string + notnull, pk int + dflt sql.NullString + ) + if err := rows.Scan(&cid, &name, &typ, ¬null, &dflt, &pk); err != nil { + rows.Close() + return err + } + tableExists = true + if name == "is_default" { + have = true + } + } + rows.Close() + if !tableExists { + return nil + } + if !have { + if _, err := db.Exec( + `ALTER TABLE workspaces ADD COLUMN is_default INTEGER NOT NULL DEFAULT 0`, + ); err != nil { + return fmt.Errorf("add is_default column: %w", err) + } + } + // The partial UNIQUE index is in Schema's CREATE INDEX IF NOT + // EXISTS so fresh DBs already have it; create it here for older + // installs that just got the column added. + if _, err := db.Exec( + `CREATE UNIQUE INDEX IF NOT EXISTS idx_workspaces_default + ON workspaces(is_default) WHERE is_default = 1`, + ); err != nil { + return fmt.Errorf("create idx_workspaces_default: %w", err) + } + return nil +} + // migrateWebhookMode adds workspace_repos.webhook_mode to pre-PR10 // databases and backfills it from the older auto_webhook bool so rows // inserted before this migration keep their effective behaviour. Same diff --git a/server/internal/db/schema.go b/server/internal/db/schema.go index d55f788..45cad93 100644 --- a/server/internal/db/schema.go +++ b/server/internal/db/schema.go @@ -159,6 +159,16 @@ CREATE TABLE IF NOT EXISTS workspaces ( id TEXT PRIMARY KEY, name TEXT NOT NULL UNIQUE, description TEXT, + -- is_default flags the singleton "Personal" workspace that holds + -- repos added from /projects (the standalone Add repo flow). At + -- most one row carries is_default=1 — enforced by the partial + -- UNIQUE index created in migrateWorkspacesDefault + the + -- EnsureDefault bootstrap. The index is intentionally NOT here: + -- a pre-feature DB whose workspaces table lacks is_default would + -- fail the multi-statement Schema.Exec before the migration has + -- a chance to ALTER TABLE ADD COLUMN (same pattern as + -- idx_projects_path_hash). + is_default INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL, updated_at TEXT NOT NULL ); diff --git a/server/internal/httpapi/openapi/openapi.gen.go b/server/internal/httpapi/openapi/openapi.gen.go index 94436b0..ab8f337 100644 --- a/server/internal/httpapi/openapi/openapi.gen.go +++ b/server/internal/httpapi/openapi/openapi.gen.go @@ -1308,8 +1308,10 @@ type SemanticSearchRequest struct { // Limit Maximum number of FILE groups (not chunks) to return. Limit *int `json:"limit,omitempty"` - // MinScore Minimum cosine similarity. Omit for server default (0.4 for - // CodeRankEmbed-Q8). Send `0` explicitly to disable the floor. + // MinScore Minimum cosine similarity. Omit for server default (0.2 — + // light floor that keeps abstract NL queries non-empty). Send + // `0` to disable; pass `0.4+` for strict code-symbol searches + // calibrated for CodeRankEmbed-Q8. MinScore *float32 `json:"min_score,omitempty"` // Paths Whitelist — keep only results whose path matches any prefix or substring. @@ -1561,6 +1563,12 @@ type Workspace struct { // Id ULID-like opaque identifier. Id string `json:"id"` + // IsDefault True for the singleton workspace that receives repositories + // added via the standalone `/api/v1/git-repos` endpoint (the + // dashboard's `/projects` → Add repo flow). Exactly one + // workspace is flagged; deleting it returns 409. + IsDefault bool `json:"is_default"` + // Name Unique workspace name. Name string `json:"name"` UpdatedAt time.Time `json:"updated_at"` @@ -1863,11 +1871,13 @@ type WorkspaceSearchParams struct { TopChunks *int `form:"top_chunks,omitempty" json:"top_chunks,omitempty"` // MinScore Floor on raw cosine similarity. Chunks below this are - // dropped before aggregation. Default 0 — relies on - // chromem's natural ordering. Set higher (e.g. 0.3) to cut - // noise when querying long natural-language sentences; - // keep at 0 for short tokens / acronyms where embedding - // magnitudes are inherently smaller. + // dropped before aggregation. Default 0.4 — symmetric with + // per-project search default so an unfiltered workspace + // query doesn't return cross-repo noise that a single-repo + // query would have rejected. Pass 0 explicitly for + // intentional cross-project sweeps that need long-tail + // recall (e.g. "authentication and authorization" across a + // mixed-domain workspace). MinScore *float32 `form:"min_score,omitempty" json:"min_score,omitempty"` } @@ -1889,6 +1899,9 @@ type ChangePasswordJSONRequestBody = ChangePasswordRequest // LoginJSONRequestBody defines body for Login for application/json ContentType. type LoginJSONRequestBody = LoginRequest +// AddStandaloneGitRepoJSONRequestBody defines body for AddStandaloneGitRepo for application/json ContentType. +type AddStandaloneGitRepoJSONRequestBody = AddWorkspaceRepoRequest + // CreateGithubTokenJSONRequestBody defines body for CreateGithubToken for application/json ContentType. type CreateGithubTokenJSONRequestBody = CreateGithubTokenRequest @@ -1996,6 +2009,9 @@ type ServerInterface interface { // End one of my sessions (sign out a single device) // (DELETE /api/v1/auth/sessions/{id}) DeleteMySession(w http.ResponseWriter, r *http.Request, id string) + // Clone + index a GitHub repository outside any specific workspace + // (POST /api/v1/git-repos) + AddStandaloneGitRepo(w http.ResponseWriter, r *http.Request) // List stored GitHub PATs (metadata only) // (GET /api/v1/github-tokens) ListGithubTokens(w http.ResponseWriter, r *http.Request) @@ -2230,6 +2246,12 @@ func (_ Unimplemented) DeleteMySession(w http.ResponseWriter, r *http.Request, i w.WriteHeader(http.StatusNotImplemented) } +// Clone + index a GitHub repository outside any specific workspace +// (POST /api/v1/git-repos) +func (_ Unimplemented) AddStandaloneGitRepo(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusNotImplemented) +} + // List stored GitHub PATs (metadata only) // (GET /api/v1/github-tokens) func (_ Unimplemented) ListGithubTokens(w http.ResponseWriter, r *http.Request) { @@ -2902,6 +2924,26 @@ func (siw *ServerInterfaceWrapper) DeleteMySession(w http.ResponseWriter, r *htt handler.ServeHTTP(w, r) } +// AddStandaloneGitRepo operation middleware +func (siw *ServerInterfaceWrapper) AddStandaloneGitRepo(w http.ResponseWriter, r *http.Request) { + + ctx := r.Context() + + ctx = context.WithValue(ctx, BearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.AddStandaloneGitRepo(w, r) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // ListGithubTokens operation middleware func (siw *ServerInterfaceWrapper) ListGithubTokens(w http.ResponseWriter, r *http.Request) { @@ -4404,6 +4446,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Delete(options.BaseURL+"/api/v1/auth/sessions/{id}", wrapper.DeleteMySession) }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/api/v1/git-repos", wrapper.AddStandaloneGitRepo) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/v1/github-tokens", wrapper.ListGithubTokens) }) @@ -4527,352 +4572,361 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl // const string: with thousands of chunks the chained `+` fold is several // times slower for the Go compiler than parsing a slice literal. var swaggerSpec = []string{ - "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", - "IPMVPch1a1RzbHzR2Jxm6+pPP3/6/wMAAP//", + "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", + "XV03fTXH5iCNzWm29/7006f/PwAA//8=", } // decodeSpec returns the embedded OpenAPI spec as raw JSON bytes, diff --git a/server/internal/httpapi/workspacerepos.go b/server/internal/httpapi/workspacerepos.go index d135149..7aeb385 100644 --- a/server/internal/httpapi/workspacerepos.go +++ b/server/internal/httpapi/workspacerepos.go @@ -207,6 +207,34 @@ func (s *Server) AddWorkspaceRepo(w http.ResponseWriter, r *http.Request, id str writeJSON(w, http.StatusCreated, resp) } +// AddStandaloneGitRepo — POST /api/v1/git-repos. +// +// Convenience wrapper around AddWorkspaceRepo: resolves the singleton +// default workspace (created at startup via workspaces.EnsureDefault) +// and proxies to the same clone+index pipeline. Used by the dashboard's +// /projects → Add repo button so users can add a GitHub repo without +// having to think about workspaces first; the resulting project still +// shows up in /projects and can later be linked into any other +// workspace via the existing link flow. +func (s *Server) AddStandaloneGitRepo(w http.ResponseWriter, r *http.Request) { + if s.workspaceReposUnavailable(w) { + return + } + def, err := s.Deps.Workspaces.GetDefault(r.Context()) + if err != nil { + // EnsureDefault should have run at startup. If it somehow + // didn't, retry once here so the endpoint stays usable. + fresh, ensureErr := s.Deps.Workspaces.EnsureDefault(r.Context()) + if ensureErr != nil { + writeError(w, http.StatusInternalServerError, + "could not resolve default workspace: "+ensureErr.Error()) + return + } + def = fresh + } + s.AddWorkspaceRepo(w, r, def.ID) +} + // tryAutoRegisterWebhook calls the GitHub API to register a push hook for // the given repo. Best-effort — failure does NOT roll back the // workspace_repos row; the operator can rerun manually via the diff --git a/server/internal/httpapi/workspacerepos_test.go b/server/internal/httpapi/workspacerepos_test.go index cf137ee..87c2a93 100644 --- a/server/internal/httpapi/workspacerepos_test.go +++ b/server/internal/httpapi/workspacerepos_test.go @@ -218,6 +218,109 @@ func TestRepos_WebhookModeRejectsUnknown(t *testing.T) { } } +// TestStandaloneGitRepo_LandsInDefaultWorkspace covers the +// /api/v1/git-repos shortcut used by the dashboard's /projects → Add +// repo button. The endpoint must resolve (or lazily create) the +// default workspace and run the same clone+enqueue logic as the +// per-workspace endpoint. Critical assertions: the new row points at +// the default workspace, a clone_repo job is enqueued, and the +// resulting project_path matches the canonical shape. +func TestStandaloneGitRepo_LandsInDefaultWorkspace(t *testing.T) { + router, jobsSvc := reposRouter(t) + + rr := doJSON(t, router, http.MethodPost, "/api/v1/git-repos", map[string]any{ + "github_url": "https://github.com/spf13/cobra", + "branch": "main", + }) + if rr.Code != http.StatusCreated { + t.Fatalf("standalone add: %d (%s)", rr.Code, rr.Body.String()) + } + var resp struct { + Repo workspaceRepoPayload `json:"repo"` + } + if err := json.Unmarshal(rr.Body.Bytes(), &resp); err != nil { + t.Fatalf("decode: %v", err) + } + if resp.Repo.WorkspaceID == "" { + t.Fatalf("workspace_id must be populated, got empty payload: %+v", resp.Repo) + } + if resp.Repo.ProjectPath != "github.com/spf13/cobra@main" { + t.Fatalf("unexpected project_path %q", resp.Repo.ProjectPath) + } + if resp.Repo.Status != workspacerepos.StatusPending { + t.Fatalf("expected status=pending, got %q", resp.Repo.Status) + } + + // Pull the default workspace through the service-level GetDefault + // to verify the row actually lives there, not just "some workspace". + rr2 := doJSON(t, router, http.MethodGet, "/api/v1/workspaces", nil) + if rr2.Code != http.StatusOK { + t.Fatalf("list workspaces: %d", rr2.Code) + } + var list struct { + Workspaces []workspacePayload `json:"workspaces"` + } + _ = json.Unmarshal(rr2.Body.Bytes(), &list) + var defaultID string + for _, w := range list.Workspaces { + if w.IsDefault { + defaultID = w.ID + } + } + if defaultID == "" { + t.Fatalf("no default workspace surfaced in list response: %+v", list.Workspaces) + } + if resp.Repo.WorkspaceID != defaultID { + t.Fatalf("standalone repo landed in workspace=%q, want default=%q", + resp.Repo.WorkspaceID, defaultID) + } + + jobList, err := jobsSvc.List(context.Background(), jobs.StatusPending, "clone_repo", 10) + if err != nil { + t.Fatalf("jobs list: %v", err) + } + if len(jobList) != 1 { + t.Fatalf("expected 1 clone_repo job for the standalone add, got %d", len(jobList)) + } +} + +// TestStandaloneGitRepo_DeleteDefaultWorkspaceConflict pins the +// invariant the dashboard relies on: the default workspace cannot be +// removed via the regular delete endpoint, so /projects → Add repo +// always has a home to drop the row into. +func TestStandaloneGitRepo_DeleteDefaultWorkspaceConflict(t *testing.T) { + router, _ := reposRouter(t) + + // Force the default workspace to exist by hitting /git-repos once. + if rr := doJSON(t, router, http.MethodPost, "/api/v1/git-repos", map[string]any{ + "github_url": "https://github.com/a/b", + "branch": "main", + }); rr.Code != http.StatusCreated { + t.Fatalf("seed: %d (%s)", rr.Code, rr.Body.String()) + } + + rr := doJSON(t, router, http.MethodGet, "/api/v1/workspaces", nil) + var list struct { + Workspaces []workspacePayload `json:"workspaces"` + } + _ = json.Unmarshal(rr.Body.Bytes(), &list) + var defaultID string + for _, w := range list.Workspaces { + if w.IsDefault { + defaultID = w.ID + } + } + if defaultID == "" { + t.Fatalf("no default workspace found") + } + + rr = doJSON(t, router, http.MethodDelete, "/api/v1/workspaces/"+defaultID, nil) + if rr.Code != http.StatusConflict { + t.Fatalf("expected 409 on default-workspace delete, got %d (%s)", + rr.Code, rr.Body.String()) + } +} + func TestRepos_BadURLRejected(t *testing.T) { router, _ := reposRouter(t) wsID := createWS(t, router, "platform") diff --git a/server/internal/httpapi/workspaces.go b/server/internal/httpapi/workspaces.go index 3d9d0e3..07b8e9b 100644 --- a/server/internal/httpapi/workspaces.go +++ b/server/internal/httpapi/workspaces.go @@ -17,6 +17,7 @@ type workspacePayload struct { ID string `json:"id"` Name string `json:"name"` Description string `json:"description"` + IsDefault bool `json:"is_default"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } @@ -26,6 +27,7 @@ func workspaceToPayload(w workspaces.Workspace) workspacePayload { ID: w.ID, Name: w.Name, Description: w.Description, + IsDefault: w.IsDefault, CreatedAt: w.CreatedAt, UpdatedAt: w.UpdatedAt, } @@ -141,11 +143,14 @@ func (s *Server) DeleteWorkspace(w http.ResponseWriter, r *http.Request, id stri return } if err := s.Deps.Workspaces.Delete(r.Context(), id); err != nil { - if errors.Is(err, workspaces.ErrNotFound) { + switch { + case errors.Is(err, workspaces.ErrNotFound): writeError(w, http.StatusNotFound, "workspace not found") - return + case errors.Is(err, workspaces.ErrDefaultProtected): + writeError(w, http.StatusConflict, err.Error()) + default: + writeError(w, http.StatusInternalServerError, "could not delete workspace") } - writeError(w, http.StatusInternalServerError, "could not delete workspace") return } w.WriteHeader(http.StatusNoContent) diff --git a/server/internal/workspaces/workspaces.go b/server/internal/workspaces/workspaces.go index efb7cf7..80c0c9e 100644 --- a/server/internal/workspaces/workspaces.go +++ b/server/internal/workspaces/workspaces.go @@ -23,9 +23,10 @@ import ( // Errors. ErrNotFound is the not-found sentinel used by handlers; ErrNameTaken // surfaces UNIQUE-name collisions so handlers can return 409 instead of 500. var ( - ErrNotFound = errors.New("workspace not found") - ErrNameTaken = errors.New("workspace name already in use") - ErrNameEmpty = errors.New("workspace name is required") + ErrNotFound = errors.New("workspace not found") + ErrNameTaken = errors.New("workspace name already in use") + ErrNameEmpty = errors.New("workspace name is required") + ErrDefaultProtected = errors.New("the default workspace cannot be deleted — rename it instead if you want a different label") ) // Workspace is the metadata view. Pointers are NOT used for description @@ -35,6 +36,12 @@ type Workspace struct { ID string Name string Description string + // IsDefault marks the singleton workspace that owns repos added via + // the standalone /git-repos endpoint. Exactly one row should carry + // it (enforced by a partial UNIQUE index on the DB side). The + // operator can rename this workspace freely; the flag is the source + // of truth for "which workspace receives standalone Add repo". + IsDefault bool CreatedAt time.Time UpdatedAt time.Time } @@ -75,15 +82,70 @@ func (s *Service) Create(ctx context.Context, name, description string) (Workspa // GetByID returns one workspace. ErrNotFound when absent. func (s *Service) GetByID(ctx context.Context, id string) (Workspace, error) { row := s.DB.QueryRowContext(ctx, - `SELECT id, name, description, created_at, updated_at + `SELECT id, name, description, is_default, created_at, updated_at FROM workspaces WHERE id = ?`, id) return scanRow(row) } +// GetDefault returns the singleton default workspace (the one with +// is_default=1). ErrNotFound when EnsureDefault has not yet run on +// this database — handlers should call EnsureDefault on startup or +// fall back to it on first /git-repos hit. +func (s *Service) GetDefault(ctx context.Context) (Workspace, error) { + row := s.DB.QueryRowContext(ctx, + `SELECT id, name, description, is_default, created_at, updated_at + FROM workspaces WHERE is_default = 1 LIMIT 1`) + return scanRow(row) +} + +// EnsureDefault creates the singleton default workspace if it does +// not already exist, otherwise returns the existing one. Idempotent +// — safe to call from server startup on every boot. Name collisions +// with operator-created workspaces named "Personal" are resolved by +// appending a numeric suffix; the operator can rename the workspace +// later through the regular Update flow. +func (s *Service) EnsureDefault(ctx context.Context) (Workspace, error) { + if existing, err := s.GetDefault(ctx); err == nil { + return existing, nil + } else if !errors.Is(err, ErrNotFound) { + return Workspace{}, err + } + + // Pick a non-colliding name. The vast majority of installs end at + // "Personal" on the first try; the loop handles the (rare) case + // where an operator already has a manually-created workspace named + // "Personal" — we don't want to steal it. + base := "Personal" + name := base + for attempt := 1; attempt < 50; attempt++ { + id := uuid.NewString() + now := time.Now().UTC().Format(time.RFC3339Nano) + _, err := s.DB.ExecContext(ctx, + `INSERT INTO workspaces (id, name, description, is_default, created_at, updated_at) + VALUES (?, ?, ?, 1, ?, ?)`, + id, name, nullableString("Standalone projects added from the Projects page."), now, now, + ) + if err == nil { + return s.GetByID(ctx, id) + } + if !isUniqueConstraintViolation(err) { + return Workspace{}, fmt.Errorf("insert default workspace: %w", err) + } + // UNIQUE could be on the name (collision) or on is_default + // (another goroutine raced us). If a default exists now, + // return it; otherwise bump the name suffix and retry. + if existing, ferr := s.GetDefault(ctx); ferr == nil { + return existing, nil + } + name = fmt.Sprintf("%s (%d)", base, attempt+1) + } + return Workspace{}, fmt.Errorf("could not allocate a unique name for the default workspace after 50 attempts") +} + // List returns every workspace, newest first. func (s *Service) List(ctx context.Context) ([]Workspace, error) { rows, err := s.DB.QueryContext(ctx, - `SELECT id, name, description, created_at, updated_at + `SELECT id, name, description, is_default, created_at, updated_at FROM workspaces ORDER BY created_at DESC`) if err != nil { return nil, fmt.Errorf("list workspaces: %w", err) @@ -127,7 +189,15 @@ func (s *Service) Update(ctx context.Context, id string, name *string, descripti // Delete removes a workspace. Idempotent — deleting an absent workspace // returns ErrNotFound so the handler can choose between 404 and 204. +// The default workspace is protected: removing it would orphan the +// /git-repos endpoint until the next boot's EnsureDefault. Callers get +// ErrDefaultProtected and decide how to surface it (typically 409). func (s *Service) Delete(ctx context.Context, id string) error { + if w, err := s.GetByID(ctx, id); err == nil && w.IsDefault { + return ErrDefaultProtected + } else if err != nil && !errors.Is(err, ErrNotFound) { + return err + } res, err := s.DB.ExecContext(ctx, `DELETE FROM workspaces WHERE id = ?`, id) if err != nil { return fmt.Errorf("delete workspace: %w", err) @@ -146,12 +216,13 @@ func (s *Service) Delete(ctx context.Context, id string) error { func scanRow(r interface{ Scan(dest ...any) error }) (Workspace, error) { var ( - w Workspace - description sql.NullString - createdAt string - updatedAt string + w Workspace + description sql.NullString + isDefault int + createdAt string + updatedAt string ) - err := r.Scan(&w.ID, &w.Name, &description, &createdAt, &updatedAt) + err := r.Scan(&w.ID, &w.Name, &description, &isDefault, &createdAt, &updatedAt) if err != nil { if errors.Is(err, sql.ErrNoRows) { return Workspace{}, ErrNotFound @@ -159,6 +230,7 @@ func scanRow(r interface{ Scan(dest ...any) error }) (Workspace, error) { return Workspace{}, fmt.Errorf("scan workspace: %w", err) } w.Description = description.String + w.IsDefault = isDefault == 1 w.CreatedAt, _ = time.Parse(time.RFC3339Nano, createdAt) w.UpdatedAt, _ = time.Parse(time.RFC3339Nano, updatedAt) return w, nil diff --git a/server/internal/workspaces/workspaces_test.go b/server/internal/workspaces/workspaces_test.go index f6b17a0..f1fb71c 100644 --- a/server/internal/workspaces/workspaces_test.go +++ b/server/internal/workspaces/workspaces_test.go @@ -119,3 +119,121 @@ func TestDelete(t *testing.T) { t.Fatalf("second delete should be ErrNotFound, got %v", err) } } + +// TestEnsureDefault_CreatesOnFirstCall verifies the bootstrap path: +// a fresh DB has no default workspace; EnsureDefault must create the +// singleton row and stamp it with IsDefault=true. +func TestEnsureDefault_CreatesOnFirstCall(t *testing.T) { + svc := mustOpen(t) + ctx := context.Background() + + // Sanity: GetDefault returns ErrNotFound before EnsureDefault runs. + if _, err := svc.GetDefault(ctx); !errors.Is(err, ErrNotFound) { + t.Fatalf("expected ErrNotFound before EnsureDefault, got %v", err) + } + + def, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("EnsureDefault: %v", err) + } + if !def.IsDefault { + t.Fatalf("expected IsDefault=true, got %+v", def) + } + if def.Name != "Personal" { + t.Fatalf("expected name=Personal, got %q", def.Name) + } +} + +// TestEnsureDefault_Idempotent verifies a second call returns the +// existing row without inserting a duplicate. The partial UNIQUE index +// on is_default would catch a regression here. +func TestEnsureDefault_Idempotent(t *testing.T) { + svc := mustOpen(t) + ctx := context.Background() + + first, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("first EnsureDefault: %v", err) + } + second, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("second EnsureDefault: %v", err) + } + if first.ID != second.ID { + t.Fatalf("EnsureDefault should be idempotent — got %q then %q", first.ID, second.ID) + } + + // And only one row total should be flagged as default. + list, err := svc.List(ctx) + if err != nil { + t.Fatalf("List: %v", err) + } + var defaults int + for _, w := range list { + if w.IsDefault { + defaults++ + } + } + if defaults != 1 { + t.Fatalf("expected exactly one default workspace, got %d", defaults) + } +} + +// TestEnsureDefault_AvoidsNameCollision verifies the loop that bumps +// the name suffix when an operator-created workspace already occupies +// the natural "Personal" name. The default workspace lands at +// "Personal (2)" without stealing the existing row's identity. +func TestEnsureDefault_AvoidsNameCollision(t *testing.T) { + svc := mustOpen(t) + ctx := context.Background() + + existing, err := svc.Create(ctx, "Personal", "operator's own workspace") + if err != nil { + t.Fatalf("seed: %v", err) + } + def, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("EnsureDefault: %v", err) + } + if def.ID == existing.ID { + t.Fatalf("EnsureDefault stole the operator's workspace — got %+v", def) + } + if def.Name == existing.Name { + t.Fatalf("default workspace should have a distinct name, got %q", def.Name) + } + if !def.IsDefault { + t.Fatalf("default flag missing on the freshly-allocated row") + } + // The pre-existing row is unchanged. + again, err := svc.GetByID(ctx, existing.ID) + if err != nil { + t.Fatalf("re-get: %v", err) + } + if again.IsDefault { + t.Fatalf("pre-existing row must not be flagged as default, got %+v", again) + } +} + +// TestDelete_DefaultProtected guards the bootstrap invariant: even if +// /git-repos is unused, the default workspace must survive operator +// deletes. The error type lets the HTTP layer map this to 409. +func TestDelete_DefaultProtected(t *testing.T) { + svc := mustOpen(t) + ctx := context.Background() + + def, err := svc.EnsureDefault(ctx) + if err != nil { + t.Fatalf("EnsureDefault: %v", err) + } + if err := svc.Delete(ctx, def.ID); !errors.Is(err, ErrDefaultProtected) { + t.Fatalf("expected ErrDefaultProtected, got %v", err) + } + // Sanity: regular workspaces remain deletable. + other, err := svc.Create(ctx, "platform", "") + if err != nil { + t.Fatalf("seed: %v", err) + } + if err := svc.Delete(ctx, other.ID); err != nil { + t.Fatalf("Delete on non-default workspace failed: %v", err) + } +}