From 6ad7c29a4851754e86a9ddf15acac69ba0b8528e Mon Sep 17 00:00:00 2001 From: L-Nafaryus Date: Wed, 31 Jul 2024 16:37:04 +0500 Subject: [PATCH] rename materia_server -> materia, serve spa via backend + assets --- alembic.ini | 2 +- pyproject.toml | 16 +++++------ src/materia/__main__.py | 3 +++ src/{materia_server => materia}/_logging.py | 6 ++--- src/materia/app/__init__.py | 1 + src/{materia_server => materia}/app/app.py | 11 ++++---- src/{materia_server => materia}/app/asgi.py | 4 +-- src/{materia_server => materia}/app/wsgi.py | 4 +-- src/{materia_server => materia}/config.py | 0 src/{materia_server => materia}/main.py | 22 +++++++-------- src/materia/models/__init__.py | 27 +++++++++++++++++++ src/materia/models/auth/__init__.py | 3 +++ .../models/auth/access_token.py | 0 .../models/auth/oauth2.py | 8 +++--- .../models/auth/source.py | 2 +- .../models/base.py | 0 src/materia/models/database/__init__.py | 2 ++ .../models/database/cache.py | 0 .../models/database/database.py | 4 +-- .../models/directory.py | 8 +++--- .../models/file.py | 8 +++--- .../models/migrations/env.py | 14 +++++----- .../models/migrations/script.py.mako | 0 .../models/migrations/versions/.gitkeep | 0 .../migrations/versions/86dd738cbd40_.py | 0 .../migrations/versions/939b37d98be0_.py | 0 .../models/repository.py | 10 +++---- .../models/user.py | 8 +++--- src/materia/routers/__init__.py | 1 + .../routers/api/__init__.py | 4 +-- .../routers/api/auth/auth.py | 6 ++--- .../routers/api/auth/oauth.py | 4 +-- .../routers/api/directory.py | 6 ++--- .../routers/api/file.py | 6 ++--- .../routers/api/repository.py | 6 ++--- .../routers/api/user.py | 6 ++--- .../routers/middleware.py | 4 +-- .../routers/resources.py | 25 ++++++++++++++--- src/materia/routers/root.py | 14 ++++++++++ src/materia/security/__init__.py | 3 +++ .../security/password.py | 0 .../security/secret_key.py | 0 .../security/token.py | 0 src/materia_server/app/__init__.py | 1 - src/materia_server/models/__init__.py | 27 ------------------- src/materia_server/models/auth/__init__.py | 3 --- .../models/database/__init__.py | 2 -- src/materia_server/routers/__init__.py | 1 - src/materia_server/security/__init__.py | 3 --- tests/test_database.py | 6 ++--- workspaces/frontend/pyproject.toml | 2 +- 51 files changed, 164 insertions(+), 129 deletions(-) create mode 100644 src/materia/__main__.py rename src/{materia_server => materia}/_logging.py (93%) create mode 100644 src/materia/app/__init__.py rename src/{materia_server => materia}/app/app.py (90%) rename src/{materia_server => materia}/app/asgi.py (74%) rename src/{materia_server => materia}/app/wsgi.py (84%) rename src/{materia_server => materia}/config.py (100%) rename src/{materia_server => materia}/main.py (92%) create mode 100644 src/materia/models/__init__.py create mode 100644 src/materia/models/auth/__init__.py rename src/{materia_server => materia}/models/auth/access_token.py (100%) rename src/{materia_server => materia}/models/auth/oauth2.py (96%) rename src/{materia_server => materia}/models/auth/source.py (94%) rename src/{materia_server => materia}/models/base.py (100%) create mode 100644 src/materia/models/database/__init__.py rename src/{materia_server => materia}/models/database/cache.py (100%) rename src/{materia_server => materia}/models/database/database.py (98%) rename src/{materia_server => materia}/models/directory.py (94%) rename src/{materia_server => materia}/models/file.py (93%) rename src/{materia_server => materia}/models/migrations/env.py (90%) rename src/{materia_server => materia}/models/migrations/script.py.mako (100%) rename src/{materia_server => materia}/models/migrations/versions/.gitkeep (100%) rename src/{materia_server => materia}/models/migrations/versions/86dd738cbd40_.py (100%) rename src/{materia_server => materia}/models/migrations/versions/939b37d98be0_.py (100%) rename src/{materia_server => materia}/models/repository.py (90%) rename src/{materia_server => materia}/models/user.py (94%) create mode 100644 src/materia/routers/__init__.py rename src/{materia_server => materia}/routers/api/__init__.py (68%) rename src/{materia_server => materia}/routers/api/auth/auth.py (95%) rename src/{materia_server => materia}/routers/api/auth/oauth.py (96%) rename src/{materia_server => materia}/routers/api/directory.py (96%) rename src/{materia_server => materia}/routers/api/file.py (96%) rename src/{materia_server => materia}/routers/api/repository.py (95%) rename src/{materia_server => materia}/routers/api/user.py (95%) rename src/{materia_server => materia}/routers/middleware.py (97%) rename src/{materia_server => materia}/routers/resources.py (62%) create mode 100644 src/materia/routers/root.py create mode 100644 src/materia/security/__init__.py rename src/{materia_server => materia}/security/password.py (100%) rename src/{materia_server => materia}/security/secret_key.py (100%) rename src/{materia_server => materia}/security/token.py (100%) delete mode 100644 src/materia_server/app/__init__.py delete mode 100644 src/materia_server/models/__init__.py delete mode 100644 src/materia_server/models/auth/__init__.py delete mode 100644 src/materia_server/models/database/__init__.py delete mode 100644 src/materia_server/routers/__init__.py delete mode 100644 src/materia_server/security/__init__.py diff --git a/alembic.ini b/alembic.ini index 85620af..124faf5 100644 --- a/alembic.ini +++ b/alembic.ini @@ -2,7 +2,7 @@ [alembic] # path to migration scripts -script_location = ./src/materia_server/models/migrations +script_location = ./src/materia/models/migrations # template used to generate migration file names; The default value is %%(rev)s_%%(slug)s # Uncomment the line below if you want the files to be prepended with date and time diff --git a/pyproject.toml b/pyproject.toml index 5e68f65..5a24139 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,5 @@ [project] -name = "materia-server" +name = "materia" version = "0.1.1" description = "Materia is a file server" authors = [ @@ -52,7 +52,7 @@ requires = ["pdm-backend"] build-backend = "pdm.backend" [project.scripts] -materia-server = "materia_server.main:server" +materia = "materia.main:main" [tool.pyright] reportGeneralTypeIssues = false @@ -65,14 +65,14 @@ testpaths = ["tests"] distribution = true [tool.pdm.build] -includes = ["src/materia_server"] +includes = ["src/materia"] [tool.pdm.scripts] -start-server.cmd = "python ./src/materia_server/main.py {args:start --app-mode development --log-level debug}" -db-upgrade.cmd = "alembic -c ./src/materia_server/alembic.ini upgrade {args:head}" -db-downgrade.shell = "alembic -c ./src/materia_server/alembic.ini downgrade {args:base}" -db-revision.cmd = "alembic revision {args:--autogenerate}" -remove-revisions.shell = "rm -v ./src/materia_server/models/migrations/versions/*.py" +start.cmd = "python ./src/materia/main.py {args:start --app-mode development --log-level debug}" +upgrade.cmd = "alembic -c ./src/materia/alembic.ini upgrade {args:head}" +downgrade.shell = "alembic -c ./src/materia/alembic.ini downgrade {args:base}" +rev.cmd = "alembic revision {args:--autogenerate}" +rm-revs.shell = "rm -v ./src/materia/models/migrations/versions/*.py" diff --git a/src/materia/__main__.py b/src/materia/__main__.py new file mode 100644 index 0000000..158d525 --- /dev/null +++ b/src/materia/__main__.py @@ -0,0 +1,3 @@ +from materia.main import main + +main() diff --git a/src/materia_server/_logging.py b/src/materia/_logging.py similarity index 93% rename from src/materia_server/_logging.py rename to src/materia/_logging.py index 7db4ae7..4f92232 100644 --- a/src/materia_server/_logging.py +++ b/src/materia/_logging.py @@ -5,7 +5,7 @@ from loguru._logger import Logger import logging import inspect -from materia_server.config import Config +from materia.config import Config class InterceptHandler(logging.Handler): @@ -69,10 +69,10 @@ def uvicorn_log_config(config: Config) -> dict: "disable_existing_loggers": False, "handlers": { "default": { - "class": "materia_server._logging.InterceptHandler" + "class": "materia._logging.InterceptHandler" }, "access": { - "class": "materia_server._logging.InterceptHandler" + "class": "materia._logging.InterceptHandler" }, }, "loggers": { diff --git a/src/materia/app/__init__.py b/src/materia/app/__init__.py new file mode 100644 index 0000000..a315174 --- /dev/null +++ b/src/materia/app/__init__.py @@ -0,0 +1 @@ +from materia.app.app import AppContext, make_lifespan, make_application diff --git a/src/materia_server/app/app.py b/src/materia/app/app.py similarity index 90% rename from src/materia_server/app/app.py rename to src/materia/app/app.py index b3d0e88..f119037 100644 --- a/src/materia_server/app/app.py +++ b/src/materia/app/app.py @@ -14,17 +14,17 @@ import uvicorn from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from materia_server import config as _config -from materia_server.config import Config -from materia_server._logging import make_logger, uvicorn_log_config, Logger -from materia_server.models import ( +from materia import config as _config +from materia.config import Config +from materia._logging import make_logger, uvicorn_log_config, Logger +from materia.models import ( Database, DatabaseError, DatabaseMigrationError, Cache, CacheError, ) -from materia_server import routers +from materia import routers class AppContext(TypedDict): @@ -81,5 +81,6 @@ def make_application(config: Config, logger: Logger): ) app.include_router(routers.api.router) app.include_router(routers.resources.router) + app.include_router(routers.root.router) return app diff --git a/src/materia_server/app/asgi.py b/src/materia/app/asgi.py similarity index 74% rename from src/materia_server/app/asgi.py rename to src/materia/app/asgi.py index 7819376..716ae5f 100644 --- a/src/materia_server/app/asgi.py +++ b/src/materia/app/asgi.py @@ -1,8 +1,8 @@ from os import environ from pathlib import Path from uvicorn.workers import UvicornWorker -from materia_server.config import Config -from materia_server._logging import uvicorn_log_config +from materia.config import Config +from materia._logging import uvicorn_log_config class MateriaWorker(UvicornWorker): diff --git a/src/materia_server/app/wsgi.py b/src/materia/app/wsgi.py similarity index 84% rename from src/materia_server/app/wsgi.py rename to src/materia/app/wsgi.py index ca71085..5565b7e 100644 --- a/src/materia_server/app/wsgi.py +++ b/src/materia/app/wsgi.py @@ -21,9 +21,9 @@ def run(): options = { "bind": "0.0.0.0:8000", "workers": (multiprocessing.cpu_count() * 2) + 1, - "worker_class": "materia_server.app.wsgi.MateriaWorker", + "worker_class": "materia.app.wsgi.MateriaWorker", "raw_env": ["FOO=1"], "user": None, "group": None } - MateriaProcessManager("materia_server.app.app:run", options).run() + MateriaProcessManager("materia.app.app:run", options).run() diff --git a/src/materia_server/config.py b/src/materia/config.py similarity index 100% rename from src/materia_server/config.py rename to src/materia/config.py diff --git a/src/materia_server/main.py b/src/materia/main.py similarity index 92% rename from src/materia_server/main.py rename to src/materia/main.py index 4c20664..fedc60c 100644 --- a/src/materia_server/main.py +++ b/src/materia/main.py @@ -14,20 +14,20 @@ import uvicorn from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from materia_server import config as _config -from materia_server.config import Config -from materia_server._logging import make_logger, uvicorn_log_config, Logger -from materia_server.models import Database, DatabaseError, Cache -from materia_server import routers -from materia_server.app import make_application +from materia import config as _config +from materia.config import Config +from materia._logging import make_logger, uvicorn_log_config, Logger +from materia.models import Database, DatabaseError, Cache +from materia import routers +from materia.app import make_application @click.group() -def server(): +def main(): pass -@server.command() +@main.command() @click.option("--config_path", type=Path) @from_pydantic("application", _config.Application, prefix="app") @from_pydantic("log", _config.Log, prefix="log") @@ -104,7 +104,7 @@ def start(application: _config.Application, config_path: Path, log: _config.Log) pass -@server.group() +@main.group() def config(): pass @@ -131,7 +131,7 @@ def config_create(path: Path, force: bool): if not path.parent.exists(): logger.info("Creating directory at {}", path) - path.mkdir(parents=True) + path.parent.mkdir(parents=True) logger.info("Writing configuration file at {}", path) config.write(path) @@ -164,4 +164,4 @@ def config_check(path: Path): if __name__ == "__main__": - server() + main() diff --git a/src/materia/models/__init__.py b/src/materia/models/__init__.py new file mode 100644 index 0000000..97446b5 --- /dev/null +++ b/src/materia/models/__init__.py @@ -0,0 +1,27 @@ +from materia.models.auth import ( + LoginType, + LoginSource, + OAuth2Application, + OAuth2Grant, + OAuth2AuthorizationCode, +) + +from materia.models.database import ( + Database, + DatabaseError, + DatabaseMigrationError, + Cache, + CacheError, +) + +from materia.models.user import User, UserCredentials, UserInfo + +from materia.models.repository import ( + Repository, + RepositoryInfo, + RepositoryContent, +) + +from materia.models.directory import Directory, DirectoryLink, DirectoryInfo + +from materia.models.file import File, FileLink, FileInfo diff --git a/src/materia/models/auth/__init__.py b/src/materia/models/auth/__init__.py new file mode 100644 index 0000000..47f91d5 --- /dev/null +++ b/src/materia/models/auth/__init__.py @@ -0,0 +1,3 @@ +from materia.models.auth.source import LoginType, LoginSource +from materia.models.auth.oauth2 import OAuth2Application, OAuth2Grant, OAuth2AuthorizationCode + diff --git a/src/materia_server/models/auth/access_token.py b/src/materia/models/auth/access_token.py similarity index 100% rename from src/materia_server/models/auth/access_token.py rename to src/materia/models/auth/access_token.py diff --git a/src/materia_server/models/auth/oauth2.py b/src/materia/models/auth/oauth2.py similarity index 96% rename from src/materia_server/models/auth/oauth2.py rename to src/materia/models/auth/oauth2.py index 656f8b1..d456414 100644 --- a/src/materia_server/models/auth/oauth2.py +++ b/src/materia/models/auth/oauth2.py @@ -8,10 +8,10 @@ from sqlalchemy import BigInteger, ExceptionContext, ForeignKey, JSON, and_, del from sqlalchemy.orm import mapped_column, Mapped, relationship from pydantic import BaseModel, HttpUrl -from materia_server.models.base import Base -from materia_server.models.database import Database, Cache -from materia_server import security -from materia_server.models import user +from materia.models.base import Base +from materia.models.database import Database, Cache +from materia import security +from materia.models import user class OAuth2Application(Base): __tablename__ = "oauth2_application" diff --git a/src/materia_server/models/auth/source.py b/src/materia/models/auth/source.py similarity index 94% rename from src/materia_server/models/auth/source.py rename to src/materia/models/auth/source.py index 658324f..576c526 100644 --- a/src/materia_server/models/auth/source.py +++ b/src/materia/models/auth/source.py @@ -6,7 +6,7 @@ from time import time from sqlalchemy import BigInteger, Enum from sqlalchemy.orm import Mapped, mapped_column -from materia_server.models.base import Base +from materia.models.base import Base class LoginType(enum.Enum): diff --git a/src/materia_server/models/base.py b/src/materia/models/base.py similarity index 100% rename from src/materia_server/models/base.py rename to src/materia/models/base.py diff --git a/src/materia/models/database/__init__.py b/src/materia/models/database/__init__.py new file mode 100644 index 0000000..615a9eb --- /dev/null +++ b/src/materia/models/database/__init__.py @@ -0,0 +1,2 @@ +from materia.models.database.database import DatabaseError, DatabaseMigrationError, Database +from materia.models.database.cache import Cache, CacheError diff --git a/src/materia_server/models/database/cache.py b/src/materia/models/database/cache.py similarity index 100% rename from src/materia_server/models/database/cache.py rename to src/materia/models/database/cache.py diff --git a/src/materia_server/models/database/database.py b/src/materia/models/database/database.py similarity index 98% rename from src/materia_server/models/database/database.py rename to src/materia/models/database/database.py index 01995d3..404023c 100644 --- a/src/materia_server/models/database/database.py +++ b/src/materia/models/database/database.py @@ -18,8 +18,8 @@ from alembic.operations import Operations from alembic.runtime.migration import MigrationContext from alembic.script.base import ScriptDirectory -from materia_server.config import Config -from materia_server.models.base import Base +from materia.config import Config +from materia.models.base import Base __all__ = ["Database"] diff --git a/src/materia_server/models/directory.py b/src/materia/models/directory.py similarity index 94% rename from src/materia_server/models/directory.py rename to src/materia/models/directory.py index 722c073..af8767b 100644 --- a/src/materia_server/models/directory.py +++ b/src/materia/models/directory.py @@ -7,8 +7,8 @@ from sqlalchemy.orm import mapped_column, Mapped, relationship import sqlalchemy as sa from pydantic import BaseModel, ConfigDict -from materia_server.models.base import Base -from materia_server.models import database +from materia.models.base import Base +from materia.models import database class Directory(Base): @@ -91,5 +91,5 @@ class DirectoryInfo(BaseModel): used: Optional[int] = None -from materia_server.models.repository import Repository -from materia_server.models.file import File +from materia.models.repository import Repository +from materia.models.file import File diff --git a/src/materia_server/models/file.py b/src/materia/models/file.py similarity index 93% rename from src/materia_server/models/file.py rename to src/materia/models/file.py index 25cb041..a5b127f 100644 --- a/src/materia_server/models/file.py +++ b/src/materia/models/file.py @@ -7,8 +7,8 @@ from sqlalchemy.orm import mapped_column, Mapped, relationship import sqlalchemy as sa from pydantic import BaseModel, ConfigDict -from materia_server.models.base import Base -from materia_server.models import database +from materia.models.base import Base +from materia.models import database class File(Base): @@ -85,5 +85,5 @@ class FileInfo(BaseModel): size: int -from materia_server.models.repository import Repository -from materia_server.models.directory import Directory +from materia.models.repository import Repository +from materia.models.directory import Directory diff --git a/src/materia_server/models/migrations/env.py b/src/materia/models/migrations/env.py similarity index 90% rename from src/materia_server/models/migrations/env.py rename to src/materia/models/migrations/env.py index 44736d4..2f5cc09 100644 --- a/src/materia_server/models/migrations/env.py +++ b/src/materia/models/migrations/env.py @@ -8,13 +8,13 @@ from sqlalchemy.ext.asyncio import async_engine_from_config from alembic import context import alembic_postgresql_enum -from materia_server.config import Config -from materia_server.models.base import Base -import materia_server.models.user -import materia_server.models.auth -import materia_server.models.repository -import materia_server.models.directory -import materia_server.models.file +from materia.config import Config +from materia.models.base import Base +import materia.models.user +import materia.models.auth +import materia.models.repository +import materia.models.directory +import materia.models.file # this is the Alembic Config object, which provides diff --git a/src/materia_server/models/migrations/script.py.mako b/src/materia/models/migrations/script.py.mako similarity index 100% rename from src/materia_server/models/migrations/script.py.mako rename to src/materia/models/migrations/script.py.mako diff --git a/src/materia_server/models/migrations/versions/.gitkeep b/src/materia/models/migrations/versions/.gitkeep similarity index 100% rename from src/materia_server/models/migrations/versions/.gitkeep rename to src/materia/models/migrations/versions/.gitkeep diff --git a/src/materia_server/models/migrations/versions/86dd738cbd40_.py b/src/materia/models/migrations/versions/86dd738cbd40_.py similarity index 100% rename from src/materia_server/models/migrations/versions/86dd738cbd40_.py rename to src/materia/models/migrations/versions/86dd738cbd40_.py diff --git a/src/materia_server/models/migrations/versions/939b37d98be0_.py b/src/materia/models/migrations/versions/939b37d98be0_.py similarity index 100% rename from src/materia_server/models/migrations/versions/939b37d98be0_.py rename to src/materia/models/migrations/versions/939b37d98be0_.py diff --git a/src/materia_server/models/repository.py b/src/materia/models/repository.py similarity index 90% rename from src/materia_server/models/repository.py rename to src/materia/models/repository.py index 7092632..4bfffd1 100644 --- a/src/materia_server/models/repository.py +++ b/src/materia/models/repository.py @@ -8,8 +8,8 @@ from sqlalchemy.orm.attributes import InstrumentedAttribute import sqlalchemy as sa from pydantic import BaseModel, ConfigDict -from materia_server.models.base import Base -from materia_server.models import database +from materia.models.base import Base +from materia.models import database class Repository(Base): @@ -73,6 +73,6 @@ class RepositoryContent(BaseModel): directories: list["DirectoryInfo"] -from materia_server.models.user import User -from materia_server.models.directory import Directory, DirectoryInfo -from materia_server.models.file import File, FileInfo +from materia.models.user import User +from materia.models.directory import Directory, DirectoryInfo +from materia.models.file import File, FileInfo diff --git a/src/materia_server/models/user.py b/src/materia/models/user.py similarity index 94% rename from src/materia_server/models/user.py rename to src/materia/models/user.py index 3e27bdc..2c63289 100644 --- a/src/materia_server/models/user.py +++ b/src/materia/models/user.py @@ -9,9 +9,9 @@ from sqlalchemy import BigInteger, Enum from sqlalchemy.orm import mapped_column, Mapped, relationship import sqlalchemy as sa -from materia_server.models.base import Base -from materia_server.models.auth.source import LoginType -from materia_server.models import database +from materia.models.base import Base +from materia.models.auth.source import LoginType +from materia.models import database from loguru import logger valid_username = re.compile(r"^[\da-zA-Z][-.\w]*$") @@ -115,4 +115,4 @@ class UserInfo(BaseModel): avatar: Optional[str] -from materia_server.models.repository import Repository +from materia.models.repository import Repository diff --git a/src/materia/routers/__init__.py b/src/materia/routers/__init__.py new file mode 100644 index 0000000..432e0a0 --- /dev/null +++ b/src/materia/routers/__init__.py @@ -0,0 +1 @@ +from materia.routers import middleware, api, resources, root diff --git a/src/materia_server/routers/api/__init__.py b/src/materia/routers/api/__init__.py similarity index 68% rename from src/materia_server/routers/api/__init__.py rename to src/materia/routers/api/__init__.py index 80af910..6b58e57 100644 --- a/src/materia_server/routers/api/__init__.py +++ b/src/materia/routers/api/__init__.py @@ -1,6 +1,6 @@ from fastapi import APIRouter -from materia_server.routers.api.auth import auth, oauth -from materia_server.routers.api import user, repository, directory, file +from materia.routers.api.auth import auth, oauth +from materia.routers.api import user, repository, directory, file router = APIRouter(prefix="/api") router.include_router(auth.router) diff --git a/src/materia_server/routers/api/auth/auth.py b/src/materia/routers/api/auth/auth.py similarity index 95% rename from src/materia_server/routers/api/auth/auth.py rename to src/materia/routers/api/auth/auth.py index a924e43..737eb2c 100644 --- a/src/materia_server/routers/api/auth/auth.py +++ b/src/materia/routers/api/auth/auth.py @@ -2,9 +2,9 @@ from typing import Optional from fastapi import APIRouter, Depends, HTTPException, Response, status -from materia_server import security -from materia_server.routers.middleware import Context -from materia_server.models import LoginType, User, UserCredentials +from materia import security +from materia.routers.middleware import Context +from materia.models import LoginType, User, UserCredentials router = APIRouter(tags = ["auth"]) diff --git a/src/materia_server/routers/api/auth/oauth.py b/src/materia/routers/api/auth/oauth.py similarity index 96% rename from src/materia_server/routers/api/auth/oauth.py rename to src/materia/routers/api/auth/oauth.py index c8419b2..2352281 100644 --- a/src/materia_server/routers/api/auth/oauth.py +++ b/src/materia/routers/api/auth/oauth.py @@ -7,8 +7,8 @@ from fastapi.security.oauth2 import OAuth2PasswordRequestForm from pydantic import BaseModel, HttpUrl from starlette.status import HTTP_500_INTERNAL_SERVER_ERROR -from materia_server.models import User -from materia_server.routers.middleware import Context +from materia.models import User +from materia.routers.middleware import Context router = APIRouter(tags = ["oauth2"]) diff --git a/src/materia_server/routers/api/directory.py b/src/materia/routers/api/directory.py similarity index 96% rename from src/materia_server/routers/api/directory.py rename to src/materia/routers/api/directory.py index b2431c9..2752bf2 100644 --- a/src/materia_server/routers/api/directory.py +++ b/src/materia/routers/api/directory.py @@ -4,9 +4,9 @@ import shutil from fastapi import APIRouter, Depends, HTTPException, status -from materia_server.models import User, Directory, DirectoryInfo -from materia_server.routers import middleware -from materia_server.config import Config +from materia.models import User, Directory, DirectoryInfo +from materia.routers import middleware +from materia.config import Config router = APIRouter(tags=["directory"]) diff --git a/src/materia_server/routers/api/file.py b/src/materia/routers/api/file.py similarity index 96% rename from src/materia_server/routers/api/file.py rename to src/materia/routers/api/file.py index ead8bf5..80c99e3 100644 --- a/src/materia_server/routers/api/file.py +++ b/src/materia/routers/api/file.py @@ -3,9 +3,9 @@ from pathlib import Path from fastapi import APIRouter, Depends, HTTPException, status, UploadFile -from materia_server.models import User, File, FileInfo, Directory -from materia_server.routers import middleware -from materia_server.config import Config +from materia.models import User, File, FileInfo, Directory +from materia.routers import middleware +from materia.config import Config router = APIRouter(tags=["file"]) diff --git a/src/materia_server/routers/api/repository.py b/src/materia/routers/api/repository.py similarity index 95% rename from src/materia_server/routers/api/repository.py rename to src/materia/routers/api/repository.py index 767a797..c2d0a9b 100644 --- a/src/materia_server/routers/api/repository.py +++ b/src/materia/routers/api/repository.py @@ -2,7 +2,7 @@ import shutil from pathlib import Path from fastapi import APIRouter, Depends, HTTPException, status -from materia_server.models import ( +from materia.models import ( User, Repository, RepositoryInfo, @@ -10,8 +10,8 @@ from materia_server.models import ( FileInfo, DirectoryInfo, ) -from materia_server.routers import middleware -from materia_server.config import Config +from materia.routers import middleware +from materia.config import Config router = APIRouter(tags=["repository"]) diff --git a/src/materia_server/routers/api/user.py b/src/materia/routers/api/user.py similarity index 95% rename from src/materia_server/routers/api/user.py rename to src/materia/routers/api/user.py index 3ecba82..d8b8730 100644 --- a/src/materia_server/routers/api/user.py +++ b/src/materia/routers/api/user.py @@ -7,9 +7,9 @@ import sqlalchemy as sa from sqids.sqids import Sqids from PIL import Image -from materia_server.config import Config -from materia_server.models import User, UserInfo -from materia_server.routers import middleware +from materia.config import Config +from materia.models import User, UserInfo +from materia.routers import middleware router = APIRouter(tags=["user"]) diff --git a/src/materia_server/routers/middleware.py b/src/materia/routers/middleware.py similarity index 97% rename from src/materia_server/routers/middleware.py rename to src/materia/routers/middleware.py index dce8aec..1f0b383 100644 --- a/src/materia_server/routers/middleware.py +++ b/src/materia/routers/middleware.py @@ -18,8 +18,8 @@ from fastapi.security import ( APIKeyHeader, ) -from materia_server import security -from materia_server.models import User, Repository +from materia import security +from materia.models import User, Repository class Context: diff --git a/src/materia_server/routers/resources.py b/src/materia/routers/resources.py similarity index 62% rename from src/materia_server/routers/resources.py rename to src/materia/routers/resources.py index 6617fef..3be7816 100644 --- a/src/materia_server/routers/resources.py +++ b/src/materia/routers/resources.py @@ -1,11 +1,13 @@ from fastapi import APIRouter, Depends, HTTPException, status, Response -from fastapi.responses import FileResponse +from fastapi.staticfiles import StaticFiles from PIL import Image import io +from pathlib import Path +import mimetypes -from materia_server.routers import middleware -from materia_server.config import Config - +from materia.routers import middleware +from materia.config import Config +import materia_frontend router = APIRouter(tags=["resources"], prefix="/resources") @@ -37,3 +39,18 @@ async def avatar( ) return Response(content=buffer.getvalue(), media_type=Image.MIME[format]) + + +@router.get("/assets/{filename}") +async def assets(filename: str): + path = Path(materia_frontend.__path__[0]).joinpath( + "dist", "resources", "assets", filename + ) + + if not path.exists(): + return Response(status_code=status.HTTP_404_NOT_FOUND) + + content = path.read_bytes() + mime = mimetypes.guess_type(path)[0] + + return Response(content, media_type=mime) diff --git a/src/materia/routers/root.py b/src/materia/routers/root.py new file mode 100644 index 0000000..dfa1654 --- /dev/null +++ b/src/materia/routers/root.py @@ -0,0 +1,14 @@ +from pathlib import Path +from fastapi import APIRouter, Request +from fastapi.responses import HTMLResponse +from fastapi.templating import Jinja2Templates +import materia_frontend + + +router = APIRouter(tags=["root"]) +templates = Jinja2Templates(directory=Path(materia_frontend.__path__[0]) / "dist") + + +@router.get("/{spa:path}", response_class=HTMLResponse) +async def root(request: Request): + return templates.TemplateResponse("base.html", {"request": request, "view": "app"}) diff --git a/src/materia/security/__init__.py b/src/materia/security/__init__.py new file mode 100644 index 0000000..f4547df --- /dev/null +++ b/src/materia/security/__init__.py @@ -0,0 +1,3 @@ +from materia.security.secret_key import generate_key, encrypt_payload +from materia.security.token import TokenClaims, generate_token, validate_token +from materia.security.password import hash_password, validate_password diff --git a/src/materia_server/security/password.py b/src/materia/security/password.py similarity index 100% rename from src/materia_server/security/password.py rename to src/materia/security/password.py diff --git a/src/materia_server/security/secret_key.py b/src/materia/security/secret_key.py similarity index 100% rename from src/materia_server/security/secret_key.py rename to src/materia/security/secret_key.py diff --git a/src/materia_server/security/token.py b/src/materia/security/token.py similarity index 100% rename from src/materia_server/security/token.py rename to src/materia/security/token.py diff --git a/src/materia_server/app/__init__.py b/src/materia_server/app/__init__.py deleted file mode 100644 index 944069f..0000000 --- a/src/materia_server/app/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from materia_server.app.app import AppContext, make_lifespan, make_application diff --git a/src/materia_server/models/__init__.py b/src/materia_server/models/__init__.py deleted file mode 100644 index b18cf19..0000000 --- a/src/materia_server/models/__init__.py +++ /dev/null @@ -1,27 +0,0 @@ -from materia_server.models.auth import ( - LoginType, - LoginSource, - OAuth2Application, - OAuth2Grant, - OAuth2AuthorizationCode, -) - -from materia_server.models.database import ( - Database, - DatabaseError, - DatabaseMigrationError, - Cache, - CacheError, -) - -from materia_server.models.user import User, UserCredentials, UserInfo - -from materia_server.models.repository import ( - Repository, - RepositoryInfo, - RepositoryContent, -) - -from materia_server.models.directory import Directory, DirectoryLink, DirectoryInfo - -from materia_server.models.file import File, FileLink, FileInfo diff --git a/src/materia_server/models/auth/__init__.py b/src/materia_server/models/auth/__init__.py deleted file mode 100644 index 66f0be9..0000000 --- a/src/materia_server/models/auth/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from materia_server.models.auth.source import LoginType, LoginSource -from materia_server.models.auth.oauth2 import OAuth2Application, OAuth2Grant, OAuth2AuthorizationCode - diff --git a/src/materia_server/models/database/__init__.py b/src/materia_server/models/database/__init__.py deleted file mode 100644 index 2ebc3c1..0000000 --- a/src/materia_server/models/database/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -from materia_server.models.database.database import DatabaseError, DatabaseMigrationError, Database -from materia_server.models.database.cache import Cache, CacheError diff --git a/src/materia_server/routers/__init__.py b/src/materia_server/routers/__init__.py deleted file mode 100644 index e250277..0000000 --- a/src/materia_server/routers/__init__.py +++ /dev/null @@ -1 +0,0 @@ -from materia_server.routers import middleware, api, resources diff --git a/src/materia_server/security/__init__.py b/src/materia_server/security/__init__.py deleted file mode 100644 index 9561e07..0000000 --- a/src/materia_server/security/__init__.py +++ /dev/null @@ -1,3 +0,0 @@ -from materia_server.security.secret_key import generate_key, encrypt_payload -from materia_server.security.token import TokenClaims, generate_token, validate_token -from materia_server.security.password import hash_password, validate_password diff --git a/tests/test_database.py b/tests/test_database.py index 796ce2f..254e462 100644 --- a/tests/test_database.py +++ b/tests/test_database.py @@ -1,9 +1,9 @@ import pytest_asyncio import pytest import os -from materia_server.config import Config -from materia_server.models import Database, User, LoginType, Repository, Directory -from materia_server import security +from materia.config import Config +from materia.models import Database, User, LoginType, Repository, Directory +from materia import security import sqlalchemy as sa from sqlalchemy.pool import NullPool from dataclasses import dataclass diff --git a/workspaces/frontend/pyproject.toml b/workspaces/frontend/pyproject.toml index 4863f72..94f9d6d 100644 --- a/workspaces/frontend/pyproject.toml +++ b/workspaces/frontend/pyproject.toml @@ -28,7 +28,7 @@ includes = [ "src/materia_frontend" ] [tool.pdm.scripts] npm-install.cmd = "npm install --prefix ./" npm-run-build.cmd = "npm run build --prefix ./" -move-dist.shell = "rm -rf src/materia_frontend/dist && mv dist src/materia_frontend/" +move-dist.shell = "rm -vrf src/materia_frontend/dist && mv -v dist src/materia_frontend/ && cp -v templates/* src/materia_frontend/dist" pre_build.composite = [ "npm-install", "npm-run-build", "move-dist" ] materia-frontend.call = "materia_frontend.main:client"