mirror of
https://github.com/basicmachines-co/basic-memory
synced 2026-06-21 13:47:35 +00:00
fix(api): allow setting default project when none is currently set
The v2 set_default_project_by_id handler fetched the current default solely to echo it as old_project in the response, and raised 404 "No default project is currently set" when none existed. That guard (marked # pragma: no cover, never tested) made the bootstrap/recovery case impossible: with no default row in the DB, `bm project default <name>` always failed -- yet that is exactly the command you reach for when no default is set. ProjectStatusResponse.old_project is already Optional, so the guard served no schema requirement. Remove it and build old_project only when a previous default exists, else pass None. Add a regression test that clears is_default, sets a default via the endpoint, and asserts 200, old_project is None, the new project is default, and a follow-up read-back returns it. Closes #975 Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Drew Cain <groksrc@gmail.com>
This commit is contained in:
@@ -559,12 +559,10 @@ async def set_default_project_by_id(
|
||||
logger.info(f"API v2 request: set_default_project_by_id for project_id={project_id}")
|
||||
|
||||
try:
|
||||
# Get the old default project from database
|
||||
# Get the old default project from database. It may be absent during
|
||||
# bootstrap/recovery (no default row yet); that is a valid state, not an
|
||||
# error, so we only echo it back when one exists.
|
||||
default_project = await project_repository.get_default_project()
|
||||
if not default_project:
|
||||
raise HTTPException( # pragma: no cover
|
||||
status_code=404, detail="No default project is currently set"
|
||||
)
|
||||
|
||||
# Get the new default project by external_id
|
||||
new_default_project = await project_repository.get_by_external_id(project_id)
|
||||
@@ -576,17 +574,27 @@ async def set_default_project_by_id(
|
||||
# Set as default using project name (service layer still uses names internally)
|
||||
await project_service.set_default_project(new_default_project.name)
|
||||
|
||||
return ProjectStatusResponse(
|
||||
message=f"Project '{new_default_project.name}' set as default successfully",
|
||||
status="success",
|
||||
default=True,
|
||||
old_project=ProjectItem(
|
||||
# Trigger: a previous default existed
|
||||
# Why: ProjectStatusResponse.old_project is Optional; the no-default
|
||||
# bootstrap case must succeed with old_project=None
|
||||
# Outcome: response echoes the prior default only when there was one
|
||||
old_project = (
|
||||
ProjectItem(
|
||||
id=default_project.id,
|
||||
external_id=default_project.external_id,
|
||||
name=default_project.name,
|
||||
path=default_project.path,
|
||||
is_default=False,
|
||||
),
|
||||
)
|
||||
if default_project
|
||||
else None
|
||||
)
|
||||
|
||||
return ProjectStatusResponse(
|
||||
message=f"Project '{new_default_project.name}' set as default successfully",
|
||||
status="success",
|
||||
default=True,
|
||||
old_project=old_project,
|
||||
new_project=ProjectItem(
|
||||
id=new_default_project.id,
|
||||
external_id=new_default_project.external_id,
|
||||
|
||||
Reference in New Issue
Block a user