diff --git a/slopserver/db.py b/slopserver/db.py index 58d3f27..c75ecb2 100644 --- a/slopserver/db.py +++ b/slopserver/db.py @@ -9,4 +9,38 @@ def select_slop(urls: list[ParseResult], engine: Engine) -> Iterable[Domain]: query = select(Domain).where(Domain.domain_name.in_(url[1] for url in urls)) with Session(engine) as session: rows = session.scalars(query).all() - return rows \ No newline at end of file + return rows + +def insert_slop(urls: list[ParseResult], engine: Engine): + domain_dict: dict[str. set[str]] = dict() + for url in urls: + if not domain_dict.get(url[1]): + domain_dict[url[1]] = set() + + if url.path: + domain_dict[url[1]].add(url.path) + + # get existing domains + query = select(Domain).where(Domain.domain_name.in_(domain_dict.keys())) + + existing_dict: dict[str, Domain] = dict() + with Session(engine) as session: + existing_domains = session.scalars(query).all() + for domain in existing_domains: + existing_dict[domain.domain_name] = domain + + for domain, paths in domain_dict.items(): + if not domain in existing_dict: + # create a new domain object and paths + new_domain = Domain(domain_name=domain, paths=list()) + new_domain.paths = [Path(path=path) for path in paths] + session.add(new_domain) + + else: + existing_domain = existing_dict[domain] + existing_paths = set((path.path for path in existing_domain.paths)) + for path in paths: + if not path in existing_paths: + existing_domain.paths.append(Path(path=path)) + + session.commit() diff --git a/slopserver/models.py b/slopserver/models.py index af9691e..1d3594c 100644 --- a/slopserver/models.py +++ b/slopserver/models.py @@ -29,7 +29,7 @@ class Path(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) path: str - domain_id: int = Field(foreign_key="domain.id") + domain_id: int | None = Field(foreign_key="domain.id") domain: Domain = Relationship(back_populates="paths") class User(SQLModel, table=True): diff --git a/slopserver/server.py b/slopserver/server.py index edde8a3..688cee9 100644 --- a/slopserver/server.py +++ b/slopserver/server.py @@ -7,12 +7,12 @@ - get reports for given domains/pages - post report """ - +import uvicorn from fastapi import FastAPI from sqlalchemy import create_engine from slopserver.models import Domain, Path, User from slopserver.models import SlopReport -from slopserver.db import select_slop +from slopserver.db import select_slop, insert_slop app = FastAPI() @@ -20,9 +20,12 @@ temp_engine = create_engine("postgresql+psycopg://slop-farmer@192.168.1.163/slop @app.post("/report/") async def report_slop(report: SlopReport): - pass + insert_slop(report.slop_urls, temp_engine) @app.post("/check/") async def check_slop(check: SlopReport): slop_results = select_slop(check.slop_urls, temp_engine) - return slop_results \ No newline at end of file + return slop_results + +if __name__ == "__main__": + uvicorn.run(app, host="0.0.0.0", port=8000) \ No newline at end of file