repository CRUD

This commit is contained in:
2026-04-26 00:29:07 +02:00
parent 29e855e5b3
commit 6da0e8966b
6 changed files with 159 additions and 1 deletions

View File

@@ -62,6 +62,24 @@ class RegistryService:
def get_repository(self, repository_id: int) -> Repository:
return self.store.get_repository(repository_id)
def update_repository(
self,
repository_id: int,
*,
name: str | None = None,
description: str | None = None,
branch: str | None = None,
) -> Repository:
return self.store.update_repository(
repository_id,
name=name,
description=description,
branch=branch,
)
def delete_repository(self, repository_id: int) -> None:
self.store.delete_repository(repository_id)
def analyze_repository(
self,
repository_id: int,

View File

@@ -82,6 +82,52 @@ class RegistryStore:
repository_id = int(cursor.lastrowid)
return self.get_repository(repository_id)
def update_repository(
self,
repository_id: int,
*,
name: str | None = None,
description: str | None = None,
branch: str | None = None,
) -> Repository:
self.get_repository(repository_id)
assignments: list[str] = []
values: list[str | int | None] = []
if name is not None:
assignments.append("name = ?")
values.append(name)
if description is not None:
assignments.append("description = ?")
values.append(description)
if branch is not None:
assignments.append("branch = ?")
values.append(branch)
if not assignments:
return self.get_repository(repository_id)
values.append(repository_id)
with self.connect() as connection:
cursor = connection.execute(
f"""
UPDATE repositories
SET {", ".join(assignments)}, updated_at = CURRENT_TIMESTAMP
WHERE id = ?
""",
values,
)
if cursor.rowcount == 0:
raise NotFoundError(f"repository {repository_id} was not found")
return self.get_repository(repository_id)
def delete_repository(self, repository_id: int) -> None:
with self.connect() as connection:
cursor = connection.execute(
"DELETE FROM repositories WHERE id = ?",
(repository_id,),
)
if cursor.rowcount == 0:
raise NotFoundError(f"repository {repository_id} was not found")
def update_repository_status(self, repository_id: int, status: str) -> None:
with self.connect() as connection:
cursor = connection.execute(

View File

@@ -48,6 +48,24 @@ class RepositoryCreate(BaseModel):
}
class RepositoryUpdate(BaseModel):
name: str | None = None
description: str | None = None
branch: str | None = None
model_config = {
"json_schema_extra": {
"examples": [
{
"name": "Renamed Repository",
"description": "Updated curator-facing summary.",
"branch": "main",
}
]
}
}
class AbilityCreate(BaseModel):
name: str
description: str = ""
@@ -305,6 +323,34 @@ def get_repository(
raise HTTPException(status_code=404, detail=str(exc)) from exc
@app.patch("/repos/{repository_id}")
def update_repository(
repository_id: int,
payload: RepositoryUpdate,
service: RegistryService = Depends(get_service),
) -> dict[str, object]:
try:
return asdict(
service.update_repository(
repository_id,
**payload.model_dump(exclude_unset=True),
)
)
except NotFoundError as exc:
raise HTTPException(status_code=404, detail=str(exc)) from exc
@app.delete("/repos/{repository_id}", status_code=204)
def delete_repository(
repository_id: int,
service: RegistryService = Depends(get_service),
) -> None:
try:
service.delete_repository(repository_id)
except NotFoundError as exc:
raise HTTPException(status_code=404, detail=str(exc)) from exc
@app.post("/repos/{repository_id}/analysis-runs", status_code=201)
def create_analysis_run(
repository_id: int,