fix: add additional deletion confirmation, refs NOISSUE
This commit is contained in:
@@ -182,7 +182,7 @@ async def _run_generation(
|
||||
database_module.init_db()
|
||||
|
||||
manager = DatabaseManager(db)
|
||||
reusable_history = manager.get_project_by_id(preferred_project_id) if preferred_project_id else manager.get_latest_project_by_name(request.name)
|
||||
reusable_history = manager.get_project_by_id(preferred_project_id, include_archived=False) if preferred_project_id else manager.get_latest_project_by_name(request.name)
|
||||
if reusable_history and database_module.settings.gitea_url and database_module.settings.gitea_token:
|
||||
try:
|
||||
from .agents.gitea import GiteaAPI
|
||||
@@ -338,6 +338,9 @@ def read_api_info():
|
||||
'/audit/pull-requests',
|
||||
'/audit/lineage',
|
||||
'/audit/correlations',
|
||||
'/projects/{project_id}/archive',
|
||||
'/projects/{project_id}/unarchive',
|
||||
'/projects/{project_id}',
|
||||
'/projects/{project_id}/prompts/{prompt_id}/undo',
|
||||
'/projects/{project_id}/sync-repository',
|
||||
'/gitea/repos',
|
||||
@@ -392,7 +395,7 @@ async def generate_software_from_text(request: FreeformSoftwareRequest, db: DbSe
|
||||
context=interpreter_context,
|
||||
)
|
||||
routing = interpretation_trace.get('routing') or {}
|
||||
selected_history = manager.get_project_by_id(routing.get('project_id')) if routing.get('project_id') else None
|
||||
selected_history = manager.get_project_by_id(routing.get('project_id'), include_archived=False) if routing.get('project_id') else None
|
||||
if selected_history is not None and routing.get('intent') != 'new_project':
|
||||
interpreted['name'] = selected_history.project_name
|
||||
interpreted['description'] = selected_history.description or interpreted['description']
|
||||
@@ -440,10 +443,14 @@ async def generate_software_from_text(request: FreeformSoftwareRequest, db: DbSe
|
||||
|
||||
|
||||
@app.get('/projects')
|
||||
def list_projects(db: DbSession):
|
||||
def list_projects(
|
||||
db: DbSession,
|
||||
include_archived: bool = Query(default=False),
|
||||
archived_only: bool = Query(default=False),
|
||||
):
|
||||
"""List recorded projects."""
|
||||
manager = DatabaseManager(db)
|
||||
projects = manager.get_all_projects()
|
||||
projects = manager.get_all_projects(include_archived=include_archived, archived_only=archived_only)
|
||||
return {'projects': [_serialize_project(project) for project in projects]}
|
||||
|
||||
|
||||
@@ -572,16 +579,70 @@ def get_pull_request_audit(db: DbSession, project_id: str | None = Query(default
|
||||
@app.post('/projects/{project_id}/prompts/{prompt_id}/undo')
|
||||
async def undo_prompt_changes(project_id: str, prompt_id: int, db: DbSession):
|
||||
"""Undo all changes associated with a specific prompt."""
|
||||
manager = DatabaseManager(db)
|
||||
history = manager.get_project_by_id(project_id)
|
||||
if history is None:
|
||||
raise HTTPException(status_code=404, detail='Project not found')
|
||||
if history.status == 'archived':
|
||||
raise HTTPException(status_code=400, detail='Archived projects cannot be modified')
|
||||
result = await PromptWorkflowManager(db).undo_prompt(project_id=project_id, prompt_id=prompt_id)
|
||||
if result.get('status') == 'error':
|
||||
raise HTTPException(status_code=400, detail=result.get('message', 'Undo failed'))
|
||||
return result
|
||||
|
||||
|
||||
@app.post('/projects/{project_id}/archive')
|
||||
def archive_project(project_id: str, db: DbSession):
|
||||
"""Archive a project so it no longer participates in active automation."""
|
||||
manager = DatabaseManager(db)
|
||||
result = manager.archive_project(project_id)
|
||||
if result.get('status') == 'error':
|
||||
raise HTTPException(status_code=404, detail=result.get('message', 'Archive failed'))
|
||||
return result
|
||||
|
||||
|
||||
@app.post('/projects/{project_id}/unarchive')
|
||||
def unarchive_project(project_id: str, db: DbSession):
|
||||
"""Restore an archived project back into the active automation set."""
|
||||
manager = DatabaseManager(db)
|
||||
result = manager.unarchive_project(project_id)
|
||||
if result.get('status') == 'error':
|
||||
raise HTTPException(status_code=404, detail=result.get('message', 'Restore failed'))
|
||||
return result
|
||||
|
||||
|
||||
@app.delete('/projects/{project_id}')
|
||||
def delete_project(project_id: str, db: DbSession):
|
||||
"""Delete a project, its local project directory, and project-scoped DB traces."""
|
||||
manager = DatabaseManager(db)
|
||||
audit_data = manager.get_project_audit_data(project_id)
|
||||
if audit_data.get('project') is None:
|
||||
raise HTTPException(status_code=404, detail='Project not found')
|
||||
|
||||
repository = audit_data.get('repository') or audit_data['project'].get('repository') or {}
|
||||
remote_delete = None
|
||||
if repository and repository.get('mode') != 'shared' and repository.get('owner') and repository.get('name') and database_module.settings.gitea_url and database_module.settings.gitea_token:
|
||||
remote_delete = _create_gitea_api().delete_repo_sync(owner=repository.get('owner'), repo=repository.get('name'))
|
||||
if remote_delete.get('error') and remote_delete.get('status_code') not in {404, None}:
|
||||
raise HTTPException(status_code=502, detail=remote_delete.get('error'))
|
||||
|
||||
result = manager.delete_project(project_id)
|
||||
if result.get('status') == 'error':
|
||||
raise HTTPException(status_code=400, detail=result.get('message', 'Project deletion failed'))
|
||||
result['remote_repository_deleted'] = bool(remote_delete and not remote_delete.get('error'))
|
||||
result['remote_repository'] = repository if repository else None
|
||||
return result
|
||||
|
||||
|
||||
@app.post('/projects/{project_id}/sync-repository')
|
||||
def sync_project_repository(project_id: str, db: DbSession, commit_limit: int = Query(default=25, ge=1, le=200)):
|
||||
"""Import recent repository activity from Gitea for a tracked project."""
|
||||
manager = DatabaseManager(db)
|
||||
history = manager.get_project_by_id(project_id)
|
||||
if history is None:
|
||||
raise HTTPException(status_code=404, detail='Project not found')
|
||||
if history.status == 'archived':
|
||||
raise HTTPException(status_code=400, detail='Archived projects cannot be synced')
|
||||
gitea_api = _create_gitea_api()
|
||||
result = manager.sync_repository_activity(project_id=project_id, gitea_api=gitea_api, commit_limit=commit_limit)
|
||||
if result.get('status') == 'error':
|
||||
|
||||
Reference in New Issue
Block a user