From 39bc03cb6817b8d7a3f5bb619befc8df46c75e6b Mon Sep 17 00:00:00 2001 From: Aykhan Date: Tue, 19 Sep 2023 02:02:49 +0400 Subject: [PATCH] Added MongoDB --- config/{ => app}/app.env.example | 0 config/mongodb/mongodb.env.example | 4 + config/{ => nginx}/nginx.conf | 0 config/{ => postgres}/postgres.env.example | 0 docker-compose.yml | 22 ++++- src/app/core/config.py | 73 +++++++++++---- src/app/main.py | 19 ++++ src/app/utils/mongodb_utils.py | 12 +++ src/app/views/depends.py | 11 ++- src/poetry.lock | 103 ++++++++++++++++++++- src/pyproject.toml | 1 + 11 files changed, 220 insertions(+), 25 deletions(-) rename config/{ => app}/app.env.example (100%) create mode 100644 config/mongodb/mongodb.env.example rename config/{ => nginx}/nginx.conf (100%) rename config/{ => postgres}/postgres.env.example (100%) create mode 100644 src/app/utils/mongodb_utils.py diff --git a/config/app.env.example b/config/app/app.env.example similarity index 100% rename from config/app.env.example rename to config/app/app.env.example diff --git a/config/mongodb/mongodb.env.example b/config/mongodb/mongodb.env.example new file mode 100644 index 0000000..53c894e --- /dev/null +++ b/config/mongodb/mongodb.env.example @@ -0,0 +1,4 @@ +MONGO_INITDB_ROOT_USERNAME="USERNAME" +MONGO_INITDB_ROOT_PASSWORD="PASSWORD" + +MONGO_DB_LOGS_NAME="LOGS" diff --git a/config/nginx.conf b/config/nginx/nginx.conf similarity index 100% rename from config/nginx.conf rename to config/nginx/nginx.conf diff --git a/config/postgres.env.example b/config/postgres/postgres.env.example similarity index 100% rename from config/postgres.env.example rename to config/postgres/postgres.env.example diff --git a/docker-compose.yml b/docker-compose.yml index 521c586..f358798 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -8,17 +8,28 @@ services: volumes: - dbdata:/var/lib/postgresql/data env_file: - - ./config/postgres.env + - ./config/postgres/postgres.env + + mongodb: + image: mongo:latest + env_file: + - ./config/mongodb/mongodb.env + ports: + - 27017:27017 + volumes: + - mongodb_data:/data/db app: build: ./src/ env_file: - - ./config/postgres.env - - ./config/app.env + - ./config/postgres/postgres.env + - ./config/mongodb/mongodb.env + - ./config/app/app.env ports: - 8000:8000 depends_on: - db + - mongodb volumes: - ./src/app:/src/app - static:/src/static @@ -32,7 +43,7 @@ services: ports: - 80:80 volumes: - - ./config/nginx.conf:/etc/nginx/conf.d/default.conf + - ./config/nginx/nginx.conf:/etc/nginx/conf.d/default.conf - static:/static - media:/media depends_on: @@ -41,4 +52,5 @@ services: volumes: dbdata: static: - media: \ No newline at end of file + media: + mongodb_data: \ No newline at end of file diff --git a/src/app/core/config.py b/src/app/core/config.py index 49d5902..d60f0a5 100644 --- a/src/app/core/config.py +++ b/src/app/core/config.py @@ -3,44 +3,56 @@ from pathlib import Path from pydantic_settings import BaseSettings from pydantic import ( EmailStr, - PostgresDsn + PostgresDsn, + MongoDsn ) class Settings(BaseSettings): PROJECT_NAME: str = 'FastAPI Portfolio & Blog' - MAIN_PATH: Path = ( - Path(__file__). - resolve(). - parent. - parent. - parent - ) # path to src folder - APP_PATH: Path = MAIN_PATH / 'app' # path to app folder - MEDIA_FOLDER: Path = Path('media') # name of media folder - MEDIA_PATH: Path = MAIN_PATH / MEDIA_FOLDER # path to media folder - STATIC_FOLDER_NAME: Path = Path('static') # name of static folder - STATIC_FOLDER: Path =\ - MAIN_PATH / STATIC_FOLDER_NAME # path to static folder + # -------------------------------- Paths -------------------------------- + + # path to src folder + MAIN_PATH: Path = Path(__file__).resolve().parent.parent.parent + # path to app folder + APP_PATH: Path = MAIN_PATH / 'app' + # name of media folder + MEDIA_FOLDER: Path = Path('media') + # path to media folder + MEDIA_PATH: Path = MAIN_PATH / MEDIA_FOLDER + # name of static folder + STATIC_FOLDER_NAME: Path = Path('static') + # path to static folder + STATIC_FOLDER: Path = MAIN_PATH / STATIC_FOLDER_NAME FILE_FOLDERS: dict[str, Path] = { 'post_images': Path('post_images'), } + # ------------------------------ Paths End ------------------------------ + + + # --------------------------------- App --------------------------------- + SECRET_KEY: str ACCESS_TOKEN_EXPIRE_MINUTES: int = 43200 # 30 days + @property + def LOGIN_URL(self) -> str: + return self.SECRET_KEY[-10:] + + # ------------------------------- App End ------------------------------- + + + # ------------------------------ PostgreSQL ------------------------------ + POSTGRES_USER: str POSTGRES_PASSWORD: str POSTGRES_SERVER: str POSTGRES_PORT: int = 5432 POSTGRES_DB: str - @property - def LOGIN_URL(self) -> str: - return self.SECRET_KEY[-10:] - def get_postgres_dsn(self, _async: bool = False) -> PostgresDsn: scheme = 'postgresql+asyncpg' if _async else 'postgresql' @@ -53,6 +65,30 @@ class Settings(BaseSettings): path=self.POSTGRES_DB ) + # ---------------------------- PostgreSQL End ---------------------------- + + + # ------------------------------- MongoDB ------------------------------- + + MONGO_INITDB_ROOT_USERNAME: str + MONGO_INITDB_ROOT_PASSWORD: str + MONGO_DB_LOGS_NAME: str = 'logs' + + @property + def MONGO_DB_DSN(self) -> MongoDsn: + return MongoDsn.build( + scheme='mongodb', + username=self.MONGO_INITDB_ROOT_USERNAME, + password=self.MONGO_INITDB_ROOT_PASSWORD, + host='mongodb', + port=27017, + ) + + # ----------------------------- MongoDB End ----------------------------- + + + # -------------------------------- Email --------------------------------- + SMTP_SSL_TLS: bool = True SMTP_PORT: int = 587 SMTP_HOST: str = "smtp.gmail.com" @@ -62,5 +98,6 @@ class Settings(BaseSettings): EMAILS_FROM_NAME: str = PROJECT_NAME EMAIL_RECIPIENTS: list[EmailStr] = [] + # ------------------------------ Email End ------------------------------- settings = Settings() diff --git a/src/app/main.py b/src/app/main.py index b6943cb..92252dc 100644 --- a/src/app/main.py +++ b/src/app/main.py @@ -10,11 +10,13 @@ from slowapi.errors import RateLimitExceeded from app.core.config import settings from app.views.router import main_router from app.utils.rate_limiter import limiter +from app.utils.mongodb_utils import create_mongodb_database_if_not_exists app = FastAPI( title=settings.PROJECT_NAME ) + app.state.limiter = limiter # app.mount( @@ -23,8 +25,23 @@ app.state.limiter = limiter # name='static' # ) +# --------------------------------- Routers --------------------------------- + app.include_router(main_router) +# ------------------------------- Routers end ------------------------------- + + +# ---------------------------------- Events ---------------------------------- + +@app.on_event('startup') +async def app_startup(): + await create_mongodb_database_if_not_exists('logs') + +# -------------------------------- Events end -------------------------------- + + +# ---------------------------- Exception handlers ---------------------------- app.add_exception_handler(RateLimitExceeded, _rate_limit_exceeded_handler) @@ -37,3 +54,5 @@ async def validation_exception_handler(request, exc): @app.exception_handler(404) async def custom_404_handler(_, __): return FileResponse(settings.STATIC_FOLDER / '404.jpg') + +# -------------------------- Exception handlers end -------------------------- \ No newline at end of file diff --git a/src/app/utils/mongodb_utils.py b/src/app/utils/mongodb_utils.py new file mode 100644 index 0000000..deeb326 --- /dev/null +++ b/src/app/utils/mongodb_utils.py @@ -0,0 +1,12 @@ +from contextlib import contextmanager + +from app.views.depends import get_mongo_client + + +async def create_mongodb_database_if_not_exists( + db_name: str +) -> None: + + with contextmanager(get_mongo_client)() as client: + if db_name not in client.list_database_names(): + client[db_name].create_collection('init') \ No newline at end of file diff --git a/src/app/views/depends.py b/src/app/views/depends.py index df90e2f..9b04323 100644 --- a/src/app/views/depends.py +++ b/src/app/views/depends.py @@ -8,10 +8,14 @@ from typing import ( from PIL import Image from jose import jwt -from pydantic import ValidationError +from pydantic import ( + ValidationError +) from sqlalchemy.ext.asyncio import AsyncSession +from pymongo import MongoClient + from fastapi import ( Cookie, Depends, @@ -50,6 +54,11 @@ async def get_async_db() -> Generator: yield async_db +def get_mongo_client() -> Generator: + with MongoClient(str(settings.MONGO_DB_DSN)) as client: + yield client + + async def get_access_token_from_cookie_or_die( access_token: Annotated[str, Cookie()] ) -> str: diff --git a/src/poetry.lock b/src/poetry.lock index de6d41b..6205cf9 100644 --- a/src/poetry.lock +++ b/src/poetry.lock @@ -960,6 +960,107 @@ files = [ pydantic = ">=2.0.1" python-dotenv = ">=0.21.0" +[[package]] +name = "pymongo" +version = "4.5.0" +description = "Python driver for MongoDB " +optional = false +python-versions = ">=3.7" +files = [ + {file = "pymongo-4.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2d4fa1b01fa7e5b7bb8d312e3542e211b320eb7a4e3d8dc884327039d93cb9e0"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux1_i686.whl", hash = "sha256:dfcd2b9f510411de615ccedd47462dae80e82fdc09fe9ab0f0f32f11cf57eeb5"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:3e33064f1984db412b34d51496f4ea785a9cff621c67de58e09fb28da6468a52"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_i686.whl", hash = "sha256:33faa786cc907de63f745f587e9879429b46033d7d97a7b84b37f4f8f47b9b32"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_ppc64le.whl", hash = "sha256:76a262c41c1a7cbb84a3b11976578a7eb8e788c4b7bfbd15c005fb6ca88e6e50"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_s390x.whl", hash = "sha256:0f4b125b46fe377984fbaecf2af40ed48b05a4b7676a2ff98999f2016d66b3ec"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:40d5f6e853ece9bfc01e9129b228df446f49316a4252bb1fbfae5c3c9dedebad"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:152259f0f1a60f560323aacf463a3642a65a25557683f49cfa08c8f1ecb2395a"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d64878d1659d2a5bdfd0f0a4d79bafe68653c573681495e424ab40d7b6d6d41"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1bb3a62395ffe835dbef3a1cbff48fbcce709c78bd1f52e896aee990928432b"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe48f50fb6348511a3268a893bfd4ab5f263f5ac220782449d03cd05964d1ae7"}, + {file = "pymongo-4.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7591a3beea6a9a4fa3080d27d193b41f631130e3ffa76b88c9ccea123f26dc59"}, + {file = "pymongo-4.5.0-cp310-cp310-win32.whl", hash = "sha256:3a7166d57dc74d679caa7743b8ecf7dc3a1235a9fd178654dddb2b2a627ae229"}, + {file = "pymongo-4.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:21b953da14549ff62ea4ae20889c71564328958cbdf880c64a92a48dda4c9c53"}, + {file = "pymongo-4.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ead4f19d0257a756b21ac2e0e85a37a7245ddec36d3b6008d5bfe416525967dc"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9aff6279e405dc953eeb540ab061e72c03cf38119613fce183a8e94f31be608f"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cd4c8d6aa91d3e35016847cbe8d73106e3d1c9a4e6578d38e2c346bfe8edb3ca"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08819da7864f9b8d4a95729b2bea5fffed08b63d3b9c15b4fea47de655766cf5"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a253b765b7cbc4209f1d8ee16c7287c4268d3243070bf72d7eec5aa9dfe2a2c2"}, + {file = "pymongo-4.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8027c9063579083746147cf401a7072a9fb6829678076cd3deff28bb0e0f50c8"}, + {file = "pymongo-4.5.0-cp311-cp311-win32.whl", hash = "sha256:9d2346b00af524757576cc2406414562cced1d4349c92166a0ee377a2a483a80"}, + {file = "pymongo-4.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:c3c3525ea8658ee1192cdddf5faf99b07ebe1eeaa61bf32821126df6d1b8072b"}, + {file = "pymongo-4.5.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:e5a27f348909235a106a3903fc8e70f573d89b41d723a500869c6569a391cff7"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c9a9a39b7cac81dca79fca8c2a6479ef4c7b1aab95fad7544cc0e8fd943595a2"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:496c9cbcb4951183d4503a9d7d2c1e3694aab1304262f831d5e1917e60386036"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:23cc6d7eb009c688d70da186b8f362d61d5dd1a2c14a45b890bd1e91e9c451f2"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fff7d17d30b2cd45afd654b3fc117755c5d84506ed25fda386494e4e0a3416e1"}, + {file = "pymongo-4.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6422b6763b016f2ef2beedded0e546d6aa6ba87910f9244d86e0ac7690f75c96"}, + {file = "pymongo-4.5.0-cp312-cp312-win32.whl", hash = "sha256:77cfff95c1fafd09e940b3fdcb7b65f11442662fad611d0e69b4dd5d17a81c60"}, + {file = "pymongo-4.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:e57d859b972c75ee44ea2ef4758f12821243e99de814030f69a3decb2aa86807"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2b0176f9233a5927084c79ff80b51bd70bfd57e4f3d564f50f80238e797f0c8a"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:89b3f2da57a27913d15d2a07d58482f33d0a5b28abd20b8e643ab4d625e36257"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:5caee7bd08c3d36ec54617832b44985bd70c4cbd77c5b313de6f7fce0bb34f93"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:1d40ad09d9f5e719bc6f729cc6b17f31c0b055029719406bd31dde2f72fca7e7"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:076afa0a4a96ca9f77fec0e4a0d241200b3b3a1766f8d7be9a905ecf59a7416b"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:3fa3648e4f1e63ddfe53563ee111079ea3ab35c3b09cd25bc22dadc8269a495f"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:44ee985194c426ddf781fa784f31ffa29cb59657b2dba09250a4245431847d73"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b33c17d9e694b66d7e96977e9e56df19d662031483efe121a24772a44ccbbc7e"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3d79ae3bb1ff041c0db56f138c88ce1dfb0209f3546d8d6e7c3f74944ecd2439"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d67225f05f6ea27c8dc57f3fa6397c96d09c42af69d46629f71e82e66d33fa4f"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:41771b22dd2822540f79a877c391283d4e6368125999a5ec8beee1ce566f3f82"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a1f26bc1f5ce774d99725773901820dfdfd24e875028da4a0252a5b48dcab5c"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3236cf89d69679eaeb9119c840f5c7eb388a2110b57af6bb6baf01a1da387c18"}, + {file = "pymongo-4.5.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:e1f61355c821e870fb4c17cdb318669cfbcf245a291ce5053b41140870c3e5cc"}, + {file = "pymongo-4.5.0-cp37-cp37m-win32.whl", hash = "sha256:49dce6957598975d8b8d506329d2a3a6c4aee911fa4bbcf5e52ffc6897122950"}, + {file = "pymongo-4.5.0-cp37-cp37m-win_amd64.whl", hash = "sha256:f2227a08b091bd41df5aadee0a5037673f691e2aa000e1968b1ea2342afc6880"}, + {file = "pymongo-4.5.0-cp38-cp38-macosx_11_0_universal2.whl", hash = "sha256:435228d3c16a375274ac8ab9c4f9aef40c5e57ddb8296e20ecec9e2461da1017"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:8e559116e4128630ad3b7e788e2e5da81cbc2344dee246af44471fa650486a70"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:840eaf30ccac122df260b6005f9dfae4ac287c498ee91e3e90c56781614ca238"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:b4fe46b58010115514b842c669a0ed9b6a342017b15905653a5b1724ab80917f"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:a8127437ebc196a6f5e8fddd746bd0903a400dc6b5ae35df672dd1ccc7170a2a"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:2988ef5e6b360b3ff1c6d55c53515499de5f48df31afd9f785d788cdacfbe2d3"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:e249190b018d63c901678053b4a43e797ca78b93fb6d17633e3567d4b3ec6107"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:1240edc1a448d4ada4bf1a0e55550b6292420915292408e59159fd8bbdaf8f63"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6d2a56fc2354bb6378f3634402eec788a8f3facf0b3e7d468db5f2b5a78d763"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a0aade2b11dc0c326ccd429ee4134d2d47459ff68d449c6d7e01e74651bd255"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74c0da07c04d0781490b2915e7514b1adb265ef22af039a947988c331ee7455b"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f3754acbd7efc7f1b529039fcffc092a15e1cf045e31f22f6c9c5950c613ec4d"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:631492573a1bef2f74f9ac0f9d84e0ce422c251644cd81207530af4aa2ee1980"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e2654d1278384cff75952682d17c718ecc1ad1d6227bb0068fd826ba47d426a5"}, + {file = "pymongo-4.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:168172ef7856e20ec024fe2a746bfa895c88b32720138e6438fd765ebd2b62dd"}, + {file = "pymongo-4.5.0-cp38-cp38-win32.whl", hash = "sha256:b25f7bea162b3dbec6d33c522097ef81df7c19a9300722fa6853f5b495aecb77"}, + {file = "pymongo-4.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:b520aafc6cb148bac09ccf532f52cbd31d83acf4d3e5070d84efe3c019a1adbf"}, + {file = "pymongo-4.5.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8543253adfaa0b802bfa88386db1009c6ebb7d5684d093ee4edc725007553d21"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:bc5d8c3647b8ae28e4312f1492b8f29deebd31479cd3abaa989090fb1d66db83"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:505f8519c4c782a61d94a17b0da50be639ec462128fbd10ab0a34889218fdee3"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:53f2dda54d76a98b43a410498bd12f6034b2a14b6844ca08513733b2b20b7ad8"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:9c04b9560872fa9a91251030c488e0a73bce9321a70f991f830c72b3f8115d0d"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:58a63a26a1e3dc481dd3a18d6d9f8bd1d576cd1ffe0d479ba7dd38b0aeb20066"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:f076b779aa3dc179aa3ed861be063a313ed4e48ae9f6a8370a9b1295d4502111"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:1b1d7d9aabd8629a31d63cd106d56cca0e6420f38e50563278b520f385c0d86e"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:37df8f6006286a5896d1cbc3efb8471ced42e3568d38e6cb00857277047b0d63"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:56320c401f544d762fc35766936178fbceb1d9261cd7b24fbfbc8fb6f67aa8a5"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bbd705d5f3c3d1ff2d169e418bb789ff07ab3c70d567cc6ba6b72b04b9143481"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80a167081c75cf66b32f30e2f1eaee9365af935a86dbd76788169911bed9b5d5"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c42748ccc451dfcd9cef6c5447a7ab727351fd9747ad431db5ebb18a9b78a4d"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cf62da7a4cdec9a4b2981fcbd5e08053edffccf20e845c0b6ec1e77eb7fab61d"}, + {file = "pymongo-4.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b5bbb87fa0511bd313d9a2c90294c88db837667c2bda2ea3fa7a35b59fd93b1f"}, + {file = "pymongo-4.5.0-cp39-cp39-win32.whl", hash = "sha256:465fd5b040206f8bce7016b01d7e7f79d2fcd7c2b8e41791be9632a9df1b4999"}, + {file = "pymongo-4.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:63d8019eee119df308a075b8a7bdb06d4720bf791e2b73d5ab0e7473c115d79c"}, + {file = "pymongo-4.5.0.tar.gz", hash = "sha256:681f252e43b3ef054ca9161635f81b730f4d8cadd28b3f2b2004f5a72f853982"}, +] + +[package.dependencies] +dnspython = ">=1.16.0,<3.0.0" + +[package.extras] +aws = ["pymongo-auth-aws (<2.0.0)"] +encryption = ["certifi", "pymongo[aws]", "pymongocrypt (>=1.6.0,<2.0.0)"] +gssapi = ["pykerberos", "winkerberos (>=0.5.0)"] +ocsp = ["certifi", "cryptography (>=2.5)", "pyopenssl (>=17.2.0)", "requests (<3.0.0)", "service-identity (>=18.1.0)"] +snappy = ["python-snappy"] +zstd = ["zstandard"] + [[package]] name = "python-dotenv" version = "1.0.0" @@ -1340,4 +1441,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10" -content-hash = "ae1ced6c2132d6eeb69d2cfba3528570694a9d18509c0f9ef5ffaba6744e07aa" +content-hash = "5a3cb17b1da94627d9b9e26bbd8688249f52772d14645ab60f1561a6744f842f" diff --git a/src/pyproject.toml b/src/pyproject.toml index 35fee25..c9d3993 100644 --- a/src/pyproject.toml +++ b/src/pyproject.toml @@ -26,6 +26,7 @@ fastapi-mail = "^1.4.1" beautifulsoup4 = "^4.12.2" slowapi = "^0.1.8" ruff = "^0.0.290" +pymongo = "^4.5.0" [build-system]