diff --git a/API/app/application/__init__.py b/API/app/application/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/API/app/controllers/__init__.py b/API/app/controllers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/API/app/database/__init__.py b/API/app/database/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/API/app/database/database.py b/API/app/database/database.py new file mode 100644 index 0000000..9558185 --- /dev/null +++ b/API/app/database/database.py @@ -0,0 +1,12 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker + +from app.domain.models import Base +from app.settings import settings + +engine = create_engine(settings.DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + + +def init_db(): + Base.metadata.create_all(bind=engine) diff --git a/API/app/infrastructure/database/dependencies.py b/API/app/database/dependencies.py similarity index 69% rename from API/app/infrastructure/database/dependencies.py rename to API/app/database/dependencies.py index 4cf28dc..21b91e8 100644 --- a/API/app/infrastructure/database/dependencies.py +++ b/API/app/database/dependencies.py @@ -1,5 +1,5 @@ from sqlalchemy.orm import Session -from app.infrastructure.database.database import SessionLocal +from app.database.database import SessionLocal def get_db() -> Session: diff --git a/API/app/domain/__init__.py b/API/app/domain/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/API/app/domain/entities/__init__.py b/API/app/domain/entities/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/API/app/infrastructure/database/models/__init__.py b/API/app/domain/models/__init__.py similarity index 100% rename from API/app/infrastructure/database/models/__init__.py rename to API/app/domain/models/__init__.py diff --git a/API/app/infrastructure/database/models/answer_files.py b/API/app/domain/models/answer_files.py similarity index 89% rename from API/app/infrastructure/database/models/answer_files.py rename to API/app/domain/models/answer_files.py index 51c6d1e..3ac6965 100644 --- a/API/app/infrastructure/database/models/answer_files.py +++ b/API/app/domain/models/answer_files.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class AnswerFile(Base): diff --git a/API/app/infrastructure/database/models/answer_options.py b/API/app/domain/models/answer_options.py similarity index 91% rename from API/app/infrastructure/database/models/answer_options.py rename to API/app/domain/models/answer_options.py index 1aab522..4a89c89 100644 --- a/API/app/infrastructure/database/models/answer_options.py +++ b/API/app/domain/models/answer_options.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, Boolean, ForeignKey from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class AnswerOption(Base): diff --git a/API/app/infrastructure/database/models/appeals.py b/API/app/domain/models/appeals.py similarity index 95% rename from API/app/infrastructure/database/models/appeals.py rename to API/app/domain/models/appeals.py index 1fca48e..8ff9ead 100644 --- a/API/app/infrastructure/database/models/appeals.py +++ b/API/app/domain/models/appeals.py @@ -4,7 +4,7 @@ from sqlalchemy import Column, Integer, String, DateTime, Enum, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.sql import func -from app.infrastructure.database.models import Base +from app.domain.models import Base class AppealStatusEnum(PyEnum): diff --git a/API/app/infrastructure/database/models/appeals_topics.py b/API/app/domain/models/appeals_topics.py similarity index 86% rename from API/app/infrastructure/database/models/appeals_topics.py rename to API/app/domain/models/appeals_topics.py index cf2e32e..9e5adb1 100644 --- a/API/app/infrastructure/database/models/appeals_topics.py +++ b/API/app/domain/models/appeals_topics.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, VARCHAR from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class AppealsTopic(Base): diff --git a/API/app/infrastructure/database/models/categories.py b/API/app/domain/models/categories.py similarity index 87% rename from API/app/infrastructure/database/models/categories.py rename to API/app/domain/models/categories.py index bca2a3f..e067bcd 100644 --- a/API/app/infrastructure/database/models/categories.py +++ b/API/app/domain/models/categories.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, VARCHAR, String from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class Category(Base): diff --git a/API/app/infrastructure/database/models/course_students.py b/API/app/domain/models/course_students.py similarity index 92% rename from API/app/infrastructure/database/models/course_students.py rename to API/app/domain/models/course_students.py index c761c1f..5f593e2 100644 --- a/API/app/infrastructure/database/models/course_students.py +++ b/API/app/domain/models/course_students.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, ForeignKey, Date, Boolean from sqlalchemy.sql import func from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class CourseStudent(Base): diff --git a/API/app/infrastructure/database/models/courses.py b/API/app/domain/models/courses.py similarity index 94% rename from API/app/infrastructure/database/models/courses.py rename to API/app/domain/models/courses.py index 9e54e4d..89e781a 100644 --- a/API/app/infrastructure/database/models/courses.py +++ b/API/app/domain/models/courses.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, VARCHAR, String, ForeignKey from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class Course(Base): diff --git a/API/app/infrastructure/database/models/lectures.py b/API/app/domain/models/lectures.py similarity index 89% rename from API/app/infrastructure/database/models/lectures.py rename to API/app/domain/models/lectures.py index f8d9495..3f3bdcc 100644 --- a/API/app/infrastructure/database/models/lectures.py +++ b/API/app/domain/models/lectures.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class Lectures(Base): diff --git a/API/app/infrastructure/database/models/lessons.py b/API/app/domain/models/lessons.py similarity index 90% rename from API/app/infrastructure/database/models/lessons.py rename to API/app/domain/models/lessons.py index 9ecc5bb..d19543b 100644 --- a/API/app/infrastructure/database/models/lessons.py +++ b/API/app/domain/models/lessons.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey, VARCHAR from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class Lesson(Base): diff --git a/API/app/infrastructure/database/models/notification_types.py b/API/app/domain/models/notification_types.py similarity index 88% rename from API/app/infrastructure/database/models/notification_types.py rename to API/app/domain/models/notification_types.py index 67c5672..a3d1017 100644 --- a/API/app/infrastructure/database/models/notification_types.py +++ b/API/app/domain/models/notification_types.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, VARCHAR, String from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class NotificationType(Base): diff --git a/API/app/infrastructure/database/models/notifications.py b/API/app/domain/models/notifications.py similarity index 94% rename from API/app/infrastructure/database/models/notifications.py rename to API/app/domain/models/notifications.py index 1707fed..5b4d520 100644 --- a/API/app/infrastructure/database/models/notifications.py +++ b/API/app/domain/models/notifications.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, Boolean, String, DateTime, ForeignKey from sqlalchemy.sql import func from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class Notification(Base): diff --git a/API/app/infrastructure/database/models/roles.py b/API/app/domain/models/roles.py similarity index 85% rename from API/app/infrastructure/database/models/roles.py rename to API/app/domain/models/roles.py index e9435a0..77ac7e9 100644 --- a/API/app/infrastructure/database/models/roles.py +++ b/API/app/domain/models/roles.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, VARCHAR from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class Role(Base): diff --git a/API/app/infrastructure/database/models/step_tasks.py b/API/app/domain/models/step_tasks.py similarity index 93% rename from API/app/infrastructure/database/models/step_tasks.py rename to API/app/domain/models/step_tasks.py index 4821c4f..cb0d31a 100644 --- a/API/app/infrastructure/database/models/step_tasks.py +++ b/API/app/domain/models/step_tasks.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class StepTask(Base): diff --git a/API/app/infrastructure/database/models/step_types.py b/API/app/domain/models/step_types.py similarity index 87% rename from API/app/infrastructure/database/models/step_types.py rename to API/app/domain/models/step_types.py index 9ad8f3c..192656b 100644 --- a/API/app/infrastructure/database/models/step_types.py +++ b/API/app/domain/models/step_types.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, VARCHAR from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class StepType(Base): diff --git a/API/app/infrastructure/database/models/steps.py b/API/app/domain/models/steps.py similarity index 92% rename from API/app/infrastructure/database/models/steps.py rename to API/app/domain/models/steps.py index 680a206..bffb177 100644 --- a/API/app/infrastructure/database/models/steps.py +++ b/API/app/domain/models/steps.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, ForeignKey, VARCHAR from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class Step(Base): diff --git a/API/app/infrastructure/database/models/task_answers.py b/API/app/domain/models/task_answers.py similarity index 93% rename from API/app/infrastructure/database/models/task_answers.py rename to API/app/domain/models/task_answers.py index 4f7bcc2..eb8559b 100644 --- a/API/app/infrastructure/database/models/task_answers.py +++ b/API/app/domain/models/task_answers.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, ForeignKey, DateTime, String, Boolean from sqlalchemy.sql import func from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class TaskAnswer(Base): diff --git a/API/app/infrastructure/database/models/task_files.py b/API/app/domain/models/task_files.py similarity index 89% rename from API/app/infrastructure/database/models/task_files.py rename to API/app/domain/models/task_files.py index 6ee5b5a..7978629 100644 --- a/API/app/infrastructure/database/models/task_files.py +++ b/API/app/domain/models/task_files.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class TaskFile(Base): diff --git a/API/app/infrastructure/database/models/task_types.py b/API/app/domain/models/task_types.py similarity index 87% rename from API/app/infrastructure/database/models/task_types.py rename to API/app/domain/models/task_types.py index a914587..16e3f1d 100644 --- a/API/app/infrastructure/database/models/task_types.py +++ b/API/app/domain/models/task_types.py @@ -1,7 +1,7 @@ from sqlalchemy import Column, Integer, String, VARCHAR from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class TaskType(Base): diff --git a/API/app/infrastructure/database/models/test_answers.py b/API/app/domain/models/test_answers.py similarity index 92% rename from API/app/infrastructure/database/models/test_answers.py rename to API/app/domain/models/test_answers.py index 025e723..f9ac4c6 100644 --- a/API/app/infrastructure/database/models/test_answers.py +++ b/API/app/domain/models/test_answers.py @@ -2,7 +2,7 @@ from sqlalchemy import Column, Integer, ForeignKey, DateTime from sqlalchemy.sql import func from sqlalchemy.orm import relationship -from app.infrastructure.database.models import Base +from app.domain.models import Base class TestAnswer(Base): diff --git a/API/app/infrastructure/database/models/users.py b/API/app/domain/models/users.py similarity index 97% rename from API/app/infrastructure/database/models/users.py rename to API/app/domain/models/users.py index 5f7dc9d..469516e 100644 --- a/API/app/infrastructure/database/models/users.py +++ b/API/app/domain/models/users.py @@ -5,7 +5,7 @@ from sqlalchemy.orm import relationship from sqlalchemy.sql import func from werkzeug.security import check_password_hash, generate_password_hash -from app.infrastructure.database.models import Base +from app.domain.models import Base class UserGenderEnum(PyEnum): diff --git a/API/app/infrastructure/__init__.py b/API/app/infrastructure/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/API/app/infrastructure/database/database.py b/API/app/infrastructure/database/database.py deleted file mode 100644 index 6fe6eb5..0000000 --- a/API/app/infrastructure/database/database.py +++ /dev/null @@ -1,39 +0,0 @@ -import os - -from dotenv import load_dotenv -from sqlalchemy import create_engine -from sqlalchemy.orm import sessionmaker - -from app.infrastructure.database.models import Base - -load_dotenv() - -SQLALCHEMY_DATABASE_URL = os.getenv("DATABASE_URL") - -engine = create_engine(SQLALCHEMY_DATABASE_URL) -SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) - - -def init_db(): - import app.infrastructure.database.models.answer_files - import app.infrastructure.database.models.answer_options - import app.infrastructure.database.models.appeals - import app.infrastructure.database.models.appeals_topics - import app.infrastructure.database.models.categories - import app.infrastructure.database.models.course_students - import app.infrastructure.database.models.courses - import app.infrastructure.database.models.lectures - import app.infrastructure.database.models.lessons - import app.infrastructure.database.models.notification_types - import app.infrastructure.database.models.notifications - import app.infrastructure.database.models.roles - import app.infrastructure.database.models.step_tasks - import app.infrastructure.database.models.step_types - import app.infrastructure.database.models.steps - import app.infrastructure.database.models.task_answers - import app.infrastructure.database.models.task_files - import app.infrastructure.database.models.task_types - import app.infrastructure.database.models.test_answers - import app.infrastructure.database.models.users - - Base.metadata.create_all(bind=engine) diff --git a/API/app/main.py b/API/app/main.py index bc3eeb3..dea52a7 100644 --- a/API/app/main.py +++ b/API/app/main.py @@ -1,6 +1,6 @@ import logging -from app.infrastructure.database.database import init_db +from app.database.database import init_db from fastapi import FastAPI from starlette.middleware.cors import CORSMiddleware @@ -16,4 +16,4 @@ app.add_middleware( allow_headers=['*'], ) -init_db() \ No newline at end of file +init_db() diff --git a/API/app/settings.py b/API/app/settings.py new file mode 100644 index 0000000..e2b16d4 --- /dev/null +++ b/API/app/settings.py @@ -0,0 +1,19 @@ +from pydantic_settings import BaseSettings + + +class Settings(BaseSettings): + DATABASE_URL: str + SECRET_KEY: str + ALGORITHM: str + APP_PREFIX: str = '/api/v1' + + class Config: + env_file = '.env' + env_file_encoding = 'utf-8' + + +settings = Settings() + + +def get_auth_data(): + return {'secret_key': settings.SECRET_KEY, 'algorithm': settings.ALGORITHM} diff --git a/API/req.txt b/API/req.txt new file mode 100644 index 0000000..bdb4348 --- /dev/null +++ b/API/req.txt @@ -0,0 +1,13 @@ +annotated-types==0.7.0 +asn1crypto==1.5.1 +greenlet==3.1.1 +pg8000==1.31.2 +pydantic==2.10.6 +pydantic-settings==2.7.1 +pydantic_core==2.27.2 +python-dateutil==2.9.0.post0 +python-dotenv==1.0.1 +scramp==1.4.5 +six==1.17.0 +SQLAlchemy==2.0.38 +typing_extensions==4.12.2