From bbe0df9546091e9b8f220d2c8528c7eb96bdc344 Mon Sep 17 00:00:00 2001 From: Hannah dagemark Date: Thu, 6 Aug 2026 18:26:24 +0200 Subject: [PATCH] Add project model, routes and logic. WIP --- app/logic/project_logic.py | 23 +++++++++++++++++++++++ app/main.py | 6 +++++- app/models/project.py | 19 +++++++++++++++++++ app/routers/project_route.py | 29 +++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 app/logic/project_logic.py create mode 100644 app/models/project.py create mode 100644 app/routers/project_route.py diff --git a/app/logic/project_logic.py b/app/logic/project_logic.py new file mode 100644 index 0000000..9daa702 --- /dev/null +++ b/app/logic/project_logic.py @@ -0,0 +1,23 @@ +from app.models.project import Project +from app.database import add_to_database, get_from_database, get_from_database_where, get_from_database_where_id + +# For now, this is a manifest for the project model architecture: + +# A project consists of: +# ID (Autoincrement num, required), +# Parent (Num, optional, if this field contains a number (not none or 0), it is considered a child project of project with ID = num) +# Title (Required, text), +# Content (Optional, for now is string text but needs to store full Markdown including images in the future) + +def get_all(): + return {"projects": get_from_database(Project)} + +def get_by_id(project_id): + return {"project": get_from_database_where_id(Project, project_id)[0]} + +def get_with_parent(project_id): + return {"projects": get_from_database_where(Project, Project.parent_id, project_id)} + +def create(project: Project): + add_to_database(project) + return project \ No newline at end of file diff --git a/app/main.py b/app/main.py index 7fad475..0bc0df9 100644 --- a/app/main.py +++ b/app/main.py @@ -2,7 +2,7 @@ from fastapi import FastAPI from app.config import settings from app.database import create_database -from app.routers import example_route +from app.routers import example_route, project_route app = FastAPI( title=settings.app_name, @@ -15,4 +15,8 @@ def startup(): app.include_router( example_route.router +) + +app.include_router( + project_route.router ) \ No newline at end of file diff --git a/app/models/project.py b/app/models/project.py new file mode 100644 index 0000000..72f53b9 --- /dev/null +++ b/app/models/project.py @@ -0,0 +1,19 @@ +from sqlmodel import SQLModel, Field + +class Project(SQLModel, table=True): + + id: int | None = Field( + default=None, + primary_key=True + ) + + parent_id: int | None = Field( + default=None, + foreign_key="project.id" + ) + + title: str + + content: str | None = Field(default=None) + + \ No newline at end of file diff --git a/app/routers/project_route.py b/app/routers/project_route.py new file mode 100644 index 0000000..2c9bffb --- /dev/null +++ b/app/routers/project_route.py @@ -0,0 +1,29 @@ +from app.models.project import Project +from fastapi import APIRouter +from app.logic.project_logic import create, get_all, get_by_id, get_with_parent + +router = APIRouter( + prefix="/projects", + tags=["projects"] +) + +@router.get("/") +def get_default(): + + return { + "message": "Root for Projects API" + } + +@router.get("/all") +def get_all_projects(parent: int | None = None): + if parent: + return get_with_parent(parent) + return get_all() + +@router.get("/project/{project_id}") +def get_project_by_id(project_id: int): + return get_by_id(project_id) + +@router.post("/") +def create_project(project: Project): + return create(project) \ No newline at end of file