diff --git a/server/README.md b/server/README.md index 2492aaa..7df3b44 100644 --- a/server/README.md +++ b/server/README.md @@ -7,11 +7,17 @@ fastapi dev main.py ``` # Best Practice + +**To alpha-2 switch to** +## SQLEModel-boilerplate +https://github.com/benavlabs/SQLModel-boilerplate/tree/main + +----- + ## Simple Boilerplate https://github.com/anthonycepeda/fastapi-sqlmodel/tree/main ## Global Boilerplate https://github.com/zhanymkanov/fastapi-best-practices?tab=readme-ov-file#excessively-use-pydantic -## SQLEModel-boilerplate -https://github.com/benavlabs/SQLModel-boilerplate/tree/main + diff --git a/server/src/knowledges/router.py b/server/setup.py similarity index 100% rename from server/src/knowledges/router.py rename to server/setup.py diff --git a/server/src/app.py b/server/src/app.py deleted file mode 100644 index bff65bb..0000000 --- a/server/src/app.py +++ /dev/null @@ -1,27 +0,0 @@ -from contextlib import asynccontextmanager -from fastapi import FastAPI - -from src.database import create_db_and_tables -#TODO : best practice to manage models import -from src.questions.models import Question -from src.knowledges.models import Knowledge -from src.metrics.models import Metric - -#Test -from src.questions.controller import create_question, read_question -from src.knowledges.controller import create_knowledge, read_knowledges, delete_knowledge - -#TODO : alternative @app.on_event("startup") ? -@asynccontextmanager -async def lifespan(app: FastAPI): - #startup - create_db_and_tables() - delete_knowledge() - yield - #shutdown - -app = FastAPI(lifespan=lifespan) - -@app.get("/") -async def root(): - return {"message": "Hello World"} \ No newline at end of file diff --git a/server/src/metrics/router.py b/server/src/app/__init__.py similarity index 100% rename from server/src/metrics/router.py rename to server/src/app/__init__.py diff --git a/server/src/app/__pycache__/__init__.cpython-311.pyc b/server/src/app/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..66ff341 Binary files /dev/null and b/server/src/app/__pycache__/__init__.cpython-311.pyc differ diff --git a/server/src/app/__pycache__/database.cpython-311.pyc b/server/src/app/__pycache__/database.cpython-311.pyc new file mode 100644 index 0000000..0079941 Binary files /dev/null and b/server/src/app/__pycache__/database.cpython-311.pyc differ diff --git a/server/src/app/__pycache__/faker_seed.cpython-311.pyc b/server/src/app/__pycache__/faker_seed.cpython-311.pyc new file mode 100644 index 0000000..0acdbaf Binary files /dev/null and b/server/src/app/__pycache__/faker_seed.cpython-311.pyc differ diff --git a/server/src/app/__pycache__/main.cpython-311.pyc b/server/src/app/__pycache__/main.cpython-311.pyc new file mode 100644 index 0000000..eec9226 Binary files /dev/null and b/server/src/app/__pycache__/main.cpython-311.pyc differ diff --git a/server/src/knowledges/__pycache__/crud.cpython-311.pyc b/server/src/app/crud/__pycache__/crud_knowledges.cpython-311.pyc similarity index 64% rename from server/src/knowledges/__pycache__/crud.cpython-311.pyc rename to server/src/app/crud/__pycache__/crud_knowledges.cpython-311.pyc index 58bc112..cd24307 100644 Binary files a/server/src/knowledges/__pycache__/crud.cpython-311.pyc and b/server/src/app/crud/__pycache__/crud_knowledges.cpython-311.pyc differ diff --git a/server/src/app/crud/__pycache__/crud_metrics.cpython-311.pyc b/server/src/app/crud/__pycache__/crud_metrics.cpython-311.pyc new file mode 100644 index 0000000..db7e475 Binary files /dev/null and b/server/src/app/crud/__pycache__/crud_metrics.cpython-311.pyc differ diff --git a/server/src/app/crud/__pycache__/crud_questions.cpython-311.pyc b/server/src/app/crud/__pycache__/crud_questions.cpython-311.pyc new file mode 100644 index 0000000..eb76b0b Binary files /dev/null and b/server/src/app/crud/__pycache__/crud_questions.cpython-311.pyc differ diff --git a/server/src/knowledges/crud.py b/server/src/app/crud/crud_knowledges.py similarity index 90% rename from server/src/knowledges/crud.py rename to server/src/app/crud/crud_knowledges.py index d0d2e57..edd06a5 100644 --- a/server/src/knowledges/crud.py +++ b/server/src/app/crud/crud_knowledges.py @@ -1,12 +1,13 @@ from sqlmodel import Session, select -from src.knowledges.models import Knowledge -from src.database import engine +from src.app.models.knowledge import Knowledge +from src.app.database import engine def create_knowledge(knowledge: Knowledge): with Session(engine) as session: session.add(knowledge) session.commit() + return knowledge def read_knowledges(): with Session(engine) as session: @@ -38,5 +39,4 @@ def delete_knowledge(knowledge_id: int): with Session(engine) as session: knowledge = session.get(Knowledge, knowledge_id) session.delete(knowledge) - session.commit() - #TODO : delete join questions \ No newline at end of file + session.commit() \ No newline at end of file diff --git a/server/src/metrics/crud.py b/server/src/app/crud/crud_metrics.py similarity index 76% rename from server/src/metrics/crud.py rename to server/src/app/crud/crud_metrics.py index 6077527..781f21a 100644 --- a/server/src/metrics/crud.py +++ b/server/src/app/crud/crud_metrics.py @@ -1,14 +1,14 @@ from sqlmodel import Session, select -from src.metrics.models import Metric -from src.questions.models import Question -from src.database import engine +from src.app.models.metric import Metric +from src.app.models.question import Question +from src.app.database import engine -def create_metric(Metric: Metric): +def create_metric(metric: Metric): with Session(engine) as session: - session.add(Metric) + session.add(metric) session.commit() - + return metric def read_metrics(question): with Session(engine) as session: diff --git a/server/src/questions/crud.py b/server/src/app/crud/crud_questions.py similarity index 83% rename from server/src/questions/crud.py rename to server/src/app/crud/crud_questions.py index 0eae63d..a95f316 100644 --- a/server/src/questions/crud.py +++ b/server/src/app/crud/crud_questions.py @@ -1,14 +1,14 @@ from sqlmodel import Session, select -from src.questions.models import Question -from src.knowledges.models import Knowledge -from src.database import engine +from src.app.models.question import Question +from src.app.models.knowledge import Knowledge +from src.app.database import engine -def create_question(Question: Question): +def create_question(question: Question): with Session(engine) as session: - session.add(Question) + session.add(question) session.commit() - + return question def read_questions(knowledge): with Session(engine) as session: diff --git a/server/src/database.py b/server/src/app/database.py similarity index 100% rename from server/src/database.py rename to server/src/app/database.py diff --git a/server/src/app/faker_seed.py b/server/src/app/faker_seed.py new file mode 100644 index 0000000..5a31d65 --- /dev/null +++ b/server/src/app/faker_seed.py @@ -0,0 +1,39 @@ +from src.app.models.knowledge import Knowledge +from src.app.crud.crud_knowledges import create_knowledge, read_knowledges, read_knowledge, update_knowledge, delete_knowledge +from src.app.models.question import Question +from src.app.crud.crud_questions import create_question, read_questions, read_question +from src.app.models.metric import Metric +from src.app.crud.crud_metrics import create_metric + +def faker(): + knowledge1 = Knowledge(content="La connaissance est une notion aux sens multiples, à la fois utilisée dans le langage courant et objet d'étude poussée de la part des sciences cognitives et des philosophes contemporains. ", uri="https://fr.wikipedia.org/wiki/Connaissance") + knowledge2 = Knowledge(content="faculté mentale produisant une assimilation par l'esprit d'un contenu objectif préalablement traduit en signes et en idées ;", uri="https://fr.wikipedia.org/wiki/Connaissance#D%C3%A9finition") + knowledge3 = Knowledge(content="Pour l'anthropologue, la première connaissance est celle que les hommes ont d'eux-mêmes et de leur environnement, et qui, dans les sociétés primitives, assure leur survie quotidienne.", uri="https://fr.wikipedia.org/wiki/Connaissance#En_anthropologie") + + create_knowledge(knowledge1) + create_knowledge(knowledge2) + create_knowledge(knowledge3) + + question1 = Question(knowledge = knowledge1, question = "Quel est le sens du mot connaissance ?") + question2 = Question(knowledge = knowledge1, question = "Quel est la nature de la connaissance ?") + question3 = Question(knowledge = knowledge1, question = "Quel est le moyen de la connaissance ?") + question4 = Question(knowledge = knowledge2, question = "Qu'est ce qu'une faculté mentale ?") + question5 = Question(knowledge = knowledge3, question = "Qu'est ce qu'une connaissance pour l'anthropologue ?") + + create_question(question1) + create_question(question2) + create_question(question3) + create_question(question4) + create_question(question5) + + metric1 = Metric(question = question1, need_index = 89) + metric2 = Metric(question = question2, need_index = 28) + metric3 = Metric(question = question3, need_index = 12) + metric4 = Metric(question = question4, need_index = 59) + metric5 = Metric(question = question5, need_index = 91) + + create_metric(metric1) + create_metric(metric2) + create_metric(metric3) + create_metric(metric4) + create_metric(metric5) diff --git a/server/src/app/main.py b/server/src/app/main.py new file mode 100644 index 0000000..2be1c3d --- /dev/null +++ b/server/src/app/main.py @@ -0,0 +1,26 @@ +from contextlib import asynccontextmanager +from fastapi import FastAPI + +from src.app.database import create_db_and_tables +#TODO : best practice to manage models import +from src.app.models.question import Question +from src.app.models.knowledge import Knowledge +from src.app.models.metric import Metric + +#Test +from src.app.faker_seed import faker + +#TODO : alternative @app.on_event("startup") ? +@asynccontextmanager +async def lifespan(app: FastAPI): + #startup + create_db_and_tables() + faker() + yield + #shutdown + +app = FastAPI(lifespan=lifespan) + +@app.get("/") +async def root(): + return {"message": "Hello World"} \ No newline at end of file diff --git a/server/src/knowledges/__pycache__/models.cpython-311.pyc b/server/src/app/models/__pycache__/knowledge.cpython-311.pyc similarity index 76% rename from server/src/knowledges/__pycache__/models.cpython-311.pyc rename to server/src/app/models/__pycache__/knowledge.cpython-311.pyc index f942fba..728ab7f 100644 Binary files a/server/src/knowledges/__pycache__/models.cpython-311.pyc and b/server/src/app/models/__pycache__/knowledge.cpython-311.pyc differ diff --git a/server/src/app/models/__pycache__/metric.cpython-311.pyc b/server/src/app/models/__pycache__/metric.cpython-311.pyc new file mode 100644 index 0000000..2b00308 Binary files /dev/null and b/server/src/app/models/__pycache__/metric.cpython-311.pyc differ diff --git a/server/src/app/models/__pycache__/question.cpython-311.pyc b/server/src/app/models/__pycache__/question.cpython-311.pyc new file mode 100644 index 0000000..f83ea23 Binary files /dev/null and b/server/src/app/models/__pycache__/question.cpython-311.pyc differ diff --git a/server/src/knowledges/models.py b/server/src/app/models/knowledge.py similarity index 100% rename from server/src/knowledges/models.py rename to server/src/app/models/knowledge.py diff --git a/server/src/metrics/models.py b/server/src/app/models/metric.py similarity index 57% rename from server/src/metrics/models.py rename to server/src/app/models/metric.py index fdafd4f..75a72ad 100644 --- a/server/src/metrics/models.py +++ b/server/src/app/models/metric.py @@ -1,7 +1,12 @@ -from sqlmodel import Field, SQLModel +from sqlmodel import Field, SQLModel, Relationship +from src.app.models.question import Question + #TODO : add pydantic validation class Metric(SQLModel, table=True): id: int | None = Field(default=None, primary_key=True) + question_id: int | None = Field(default=None, foreign_key="question.id", ondelete="CASCADE") + question: Question | None = Relationship(back_populates="metrics") + need_index: int diff --git a/server/src/questions/models.py b/server/src/app/models/question.py similarity index 71% rename from server/src/questions/models.py rename to server/src/app/models/question.py index 923ebe7..4da7d02 100644 --- a/server/src/questions/models.py +++ b/server/src/app/models/question.py @@ -1,5 +1,5 @@ from sqlmodel import Field, SQLModel, Relationship -from src.knowledges.models import Knowledge +from src.app.models.knowledge import Knowledge #TODO : add pydantic validation class Question(SQLModel, table=True): @@ -9,4 +9,4 @@ class Question(SQLModel, table=True): knowledge_id: int | None = Field(default=None, foreign_key="knowledge.id", ondelete="CASCADE") knowledge: Knowledge | None = Relationship(back_populates="questions") - metrics: list["Metrics"] = Relationship(back_populates="question", cascade_delete=True) # type: ignore + metrics: list["Metric"] = Relationship(back_populates="question", cascade_delete=True) # type: ignore diff --git a/server/src/knowledges/__pycache__/controller.cpython-311.pyc b/server/src/knowledges/__pycache__/controller.cpython-311.pyc deleted file mode 100644 index 9e8776d..0000000 Binary files a/server/src/knowledges/__pycache__/controller.cpython-311.pyc and /dev/null differ diff --git a/server/src/knowledges/__pycache__/cruds.cpython-311.pyc b/server/src/knowledges/__pycache__/cruds.cpython-311.pyc deleted file mode 100644 index 652e680..0000000 Binary files a/server/src/knowledges/__pycache__/cruds.cpython-311.pyc and /dev/null differ diff --git a/server/src/knowledges/controller.py b/server/src/knowledges/controller.py deleted file mode 100644 index d9b05e7..0000000 --- a/server/src/knowledges/controller.py +++ /dev/null @@ -1,19 +0,0 @@ -from src.knowledges.models import Knowledge -from src.knowledges.crud import create_knowledge as create_knowledge_model, read_knowledges as read_knowledges_model, read_knowledge as read_knowledge_model, update_knowledge as update_knowledge_model, delete_knowledge as delete_knowledge_model - -def create_knowledge(): - connaissance = Knowledge(content="La connaissance n'est pas.", uri="https://perdu.fr") - create_knowledge_model(connaissance) - return read_knowledges()[-1] - -def read_knowledges(): - return read_knowledges_model() - -def read_knowledge(knowledge_id): - return read_knowledge_model(knowledge_id) - -def update_knowledge(): - return update_knowledge_model(2, "faculté mentale produisant une assimilation par l'esprit d'un contenu objectif préalablement traduit en signes et en idées ;", "https://fr.wikipedia.org/wiki/Connaissance#D%C3%A9finition") - -def delete_knowledge(): - return delete_knowledge_model(7) diff --git a/server/src/metrics/__pycache__/models.cpython-311.pyc b/server/src/metrics/__pycache__/models.cpython-311.pyc deleted file mode 100644 index 95351cb..0000000 Binary files a/server/src/metrics/__pycache__/models.cpython-311.pyc and /dev/null differ diff --git a/server/src/questions/__pycache__/controller.cpython-311.pyc b/server/src/questions/__pycache__/controller.cpython-311.pyc deleted file mode 100644 index b8d4cf3..0000000 Binary files a/server/src/questions/__pycache__/controller.cpython-311.pyc and /dev/null differ diff --git a/server/src/questions/__pycache__/crud.cpython-311.pyc b/server/src/questions/__pycache__/crud.cpython-311.pyc deleted file mode 100644 index 5ce8e5d..0000000 Binary files a/server/src/questions/__pycache__/crud.cpython-311.pyc and /dev/null differ diff --git a/server/src/questions/__pycache__/models.cpython-311.pyc b/server/src/questions/__pycache__/models.cpython-311.pyc deleted file mode 100644 index 4450c54..0000000 Binary files a/server/src/questions/__pycache__/models.cpython-311.pyc and /dev/null differ diff --git a/server/src/questions/controller.py b/server/src/questions/controller.py deleted file mode 100644 index 70e0aa6..0000000 --- a/server/src/questions/controller.py +++ /dev/null @@ -1,13 +0,0 @@ -from src.questions.models import Question -from src.questions.crud import create_question as create_question_model, read_questions as read_questions_model, read_question as read_question_model -from src.knowledges.models import Knowledge - -def create_question(knowledge: Knowledge): - question = Question(knowledge = knowledge, question = "Quel est le sens du mot connaissance ?") - create_question_model(question) - -def read_questions(knowledge): - return read_questions_model(knowledge) - -def read_question(question_id): - return read_question_model(question_id) \ No newline at end of file diff --git a/server/src/questions/router.py b/server/src/questions/router.py deleted file mode 100644 index e69de29..0000000 diff --git a/server/src/questions/service.py b/server/src/questions/service.py deleted file mode 100644 index e69de29..0000000 diff --git a/server/src/questions/utils.py b/server/src/questions/utils.py deleted file mode 100644 index e69de29..0000000