upload volledige repo
This commit is contained in:
@@ -0,0 +1 @@
|
||||
"""API routes and schemas."""
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,11 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
|
||||
|
||||
@dataclass
|
||||
class AppError(Exception):
|
||||
code: str
|
||||
message: str
|
||||
status_code: int
|
||||
details: dict[str, str] | None = None
|
||||
@@ -0,0 +1,35 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from backend.app.api.schemas import (
|
||||
BookmarkCreateRequest,
|
||||
BookmarkDeleteResponse,
|
||||
BookmarkItem,
|
||||
BookmarkListResponse,
|
||||
)
|
||||
from backend.app.dependencies import get_bookmark_service
|
||||
from backend.app.services.bookmark_service import BookmarkService
|
||||
|
||||
router = APIRouter(prefix="/bookmarks")
|
||||
|
||||
|
||||
@router.post("", response_model=BookmarkItem)
|
||||
async def create_bookmark(
|
||||
request: BookmarkCreateRequest,
|
||||
service: BookmarkService = Depends(get_bookmark_service),
|
||||
) -> BookmarkItem:
|
||||
return service.create_bookmark(path=request.path, label=request.label)
|
||||
|
||||
|
||||
@router.get("", response_model=BookmarkListResponse)
|
||||
async def list_bookmarks(service: BookmarkService = Depends(get_bookmark_service)) -> BookmarkListResponse:
|
||||
return service.list_bookmarks()
|
||||
|
||||
|
||||
@router.delete("/{bookmark_id}", response_model=BookmarkDeleteResponse)
|
||||
async def delete_bookmark(
|
||||
bookmark_id: int,
|
||||
service: BookmarkService = Depends(get_bookmark_service),
|
||||
) -> BookmarkDeleteResponse:
|
||||
return service.delete_bookmark(bookmark_id)
|
||||
@@ -0,0 +1,18 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends, Query
|
||||
|
||||
from backend.app.api.schemas import BrowseResponse
|
||||
from backend.app.dependencies import get_browse_service
|
||||
from backend.app.services.browse_service import BrowseService
|
||||
|
||||
router = APIRouter()
|
||||
|
||||
|
||||
@router.get("/browse", response_model=BrowseResponse)
|
||||
async def browse(
|
||||
path: str = Query(...),
|
||||
show_hidden: bool = Query(False),
|
||||
service: BrowseService = Depends(get_browse_service),
|
||||
) -> BrowseResponse:
|
||||
return service.browse(path=path, show_hidden=show_hidden)
|
||||
@@ -0,0 +1,17 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from backend.app.api.schemas import CopyRequest, TaskCreateResponse
|
||||
from backend.app.dependencies import get_copy_task_service
|
||||
from backend.app.services.copy_task_service import CopyTaskService
|
||||
|
||||
router = APIRouter(prefix="/files")
|
||||
|
||||
|
||||
@router.post("/copy", response_model=TaskCreateResponse, status_code=202)
|
||||
async def copy_file(
|
||||
request: CopyRequest,
|
||||
service: CopyTaskService = Depends(get_copy_task_service),
|
||||
) -> TaskCreateResponse:
|
||||
return service.create_copy_task(source=request.source, destination=request.destination)
|
||||
@@ -0,0 +1,33 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from backend.app.api.schemas import DeleteRequest, DeleteResponse, MkdirRequest, MkdirResponse, RenameRequest, RenameResponse
|
||||
from backend.app.dependencies import get_file_ops_service
|
||||
from backend.app.services.file_ops_service import FileOpsService
|
||||
|
||||
router = APIRouter(prefix="/files")
|
||||
|
||||
|
||||
@router.post("/mkdir", response_model=MkdirResponse)
|
||||
async def mkdir(
|
||||
request: MkdirRequest,
|
||||
service: FileOpsService = Depends(get_file_ops_service),
|
||||
) -> MkdirResponse:
|
||||
return service.mkdir(parent_path=request.parent_path, name=request.name)
|
||||
|
||||
|
||||
@router.post("/rename", response_model=RenameResponse)
|
||||
async def rename(
|
||||
request: RenameRequest,
|
||||
service: FileOpsService = Depends(get_file_ops_service),
|
||||
) -> RenameResponse:
|
||||
return service.rename(path=request.path, new_name=request.new_name)
|
||||
|
||||
|
||||
@router.post("/delete", response_model=DeleteResponse)
|
||||
async def delete(
|
||||
request: DeleteRequest,
|
||||
service: FileOpsService = Depends(get_file_ops_service),
|
||||
) -> DeleteResponse:
|
||||
return service.delete(path=request.path)
|
||||
@@ -0,0 +1,17 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from backend.app.api.schemas import MoveRequest, TaskCreateResponse
|
||||
from backend.app.dependencies import get_move_task_service
|
||||
from backend.app.services.move_task_service import MoveTaskService
|
||||
|
||||
router = APIRouter(prefix="/files")
|
||||
|
||||
|
||||
@router.post("/move", response_model=TaskCreateResponse, status_code=202)
|
||||
async def move_file(
|
||||
request: MoveRequest,
|
||||
service: MoveTaskService = Depends(get_move_task_service),
|
||||
) -> TaskCreateResponse:
|
||||
return service.create_move_task(source=request.source, destination=request.destination)
|
||||
@@ -0,0 +1,19 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from fastapi import APIRouter, Depends
|
||||
|
||||
from backend.app.api.schemas import TaskDetailResponse, TaskListResponse
|
||||
from backend.app.dependencies import get_task_service
|
||||
from backend.app.services.task_service import TaskService
|
||||
|
||||
router = APIRouter(prefix="/tasks")
|
||||
|
||||
|
||||
@router.get("", response_model=TaskListResponse)
|
||||
async def list_tasks(service: TaskService = Depends(get_task_service)) -> TaskListResponse:
|
||||
return service.list_tasks()
|
||||
|
||||
|
||||
@router.get("/{task_id}", response_model=TaskDetailResponse)
|
||||
async def get_task(task_id: str, service: TaskService = Depends(get_task_service)) -> TaskDetailResponse:
|
||||
return service.get_task(task_id)
|
||||
@@ -0,0 +1,126 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from pydantic import BaseModel
|
||||
|
||||
|
||||
class ErrorBody(BaseModel):
|
||||
code: str
|
||||
message: str
|
||||
details: dict[str, str] | None = None
|
||||
|
||||
|
||||
class ErrorResponse(BaseModel):
|
||||
error: ErrorBody
|
||||
|
||||
|
||||
class DirectoryEntry(BaseModel):
|
||||
name: str
|
||||
path: str
|
||||
modified: str
|
||||
|
||||
|
||||
class FileEntry(BaseModel):
|
||||
name: str
|
||||
path: str
|
||||
size: int
|
||||
modified: str
|
||||
|
||||
|
||||
class BrowseResponse(BaseModel):
|
||||
path: str
|
||||
directories: list[DirectoryEntry]
|
||||
files: list[FileEntry]
|
||||
|
||||
|
||||
class MkdirRequest(BaseModel):
|
||||
parent_path: str
|
||||
name: str
|
||||
|
||||
|
||||
class MkdirResponse(BaseModel):
|
||||
path: str
|
||||
|
||||
|
||||
class RenameRequest(BaseModel):
|
||||
path: str
|
||||
new_name: str
|
||||
|
||||
|
||||
class RenameResponse(BaseModel):
|
||||
path: str
|
||||
|
||||
|
||||
class DeleteRequest(BaseModel):
|
||||
path: str
|
||||
|
||||
|
||||
class DeleteResponse(BaseModel):
|
||||
path: str
|
||||
|
||||
|
||||
class TaskListItem(BaseModel):
|
||||
id: str
|
||||
operation: str
|
||||
status: str
|
||||
source: str
|
||||
destination: str
|
||||
created_at: str
|
||||
finished_at: str | None = None
|
||||
|
||||
|
||||
class TaskListResponse(BaseModel):
|
||||
items: list[TaskListItem]
|
||||
|
||||
|
||||
class TaskDetailResponse(BaseModel):
|
||||
id: str
|
||||
operation: str
|
||||
status: str
|
||||
source: str
|
||||
destination: str
|
||||
done_bytes: int | None = None
|
||||
total_bytes: int | None = None
|
||||
done_items: int | None = None
|
||||
total_items: int | None = None
|
||||
current_item: str | None = None
|
||||
failed_item: str | None = None
|
||||
error_code: str | None = None
|
||||
error_message: str | None = None
|
||||
created_at: str
|
||||
started_at: str | None = None
|
||||
finished_at: str | None = None
|
||||
|
||||
|
||||
class CopyRequest(BaseModel):
|
||||
source: str
|
||||
destination: str
|
||||
|
||||
|
||||
class TaskCreateResponse(BaseModel):
|
||||
task_id: str
|
||||
status: str
|
||||
|
||||
|
||||
class MoveRequest(BaseModel):
|
||||
source: str
|
||||
destination: str
|
||||
|
||||
|
||||
class BookmarkCreateRequest(BaseModel):
|
||||
path: str
|
||||
label: str
|
||||
|
||||
|
||||
class BookmarkItem(BaseModel):
|
||||
id: int
|
||||
path: str
|
||||
label: str
|
||||
created_at: str
|
||||
|
||||
|
||||
class BookmarkListResponse(BaseModel):
|
||||
items: list[BookmarkItem]
|
||||
|
||||
|
||||
class BookmarkDeleteResponse(BaseModel):
|
||||
id: int
|
||||
Reference in New Issue
Block a user