From 5f3cb442954be523ed529c5cebf68aadbc6dacd7 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 11:58:01 +0530 Subject: [PATCH 01/17] Adds dependency for db --- requirements/prod.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/requirements/prod.txt b/requirements/prod.txt index 257fc94..9e68e83 100644 --- a/requirements/prod.txt +++ b/requirements/prod.txt @@ -17,3 +17,6 @@ requests==2.25.1 # Dependencies for emails fastapi-mail==0.4.0 + +# Dependency for database +SQLAlchemy==1.4.21 From c612dce2a51b14cb499e0cb3fcd84867459ab387 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 12:24:41 +0530 Subject: [PATCH 02/17] Adds db service in compose file --- docker-compose.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 4afeaf0..fddd70e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,3 +21,19 @@ services: - 8000:8000 volumes: - .:/usr/src/app + + postgres: + image: postgres:13.3-alpine + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: postgres + networks: + - backend + volumes: + - gambley_data:/var/lib/postgresql/data + + +volumes: + gambley_data: + name: gambley_data From 24d854dfeecc778c1b810e2e3b249f78f6886793 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 12:49:43 +0530 Subject: [PATCH 03/17] Adds db uri string as config --- .env.example | 1 + config/settings.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/.env.example b/.env.example index 9dddec0..200a7ff 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,4 @@ MAIL_USERNAME=xxxx MAIL_PASSWORD=xxxx SUPPRESS_SEND=xxxx +DATABASE_URI=xxxx diff --git a/config/settings.py b/config/settings.py index 0ad8198..c588f21 100644 --- a/config/settings.py +++ b/config/settings.py @@ -17,3 +17,7 @@ TEMPLATE_FOLDER="templates", SUPPRESS_SEND=getenv("SUPPRESS_SEND", 0), ) + + +class AppConfig: + SQLALCHEMY_DATABASE_URL = getenv("DATABASE_URI") From 0275e52aa511804af5f1ddf7b01555b8cfeb55d3 Mon Sep 17 00:00:00 2001 From: onlinejudge95 <44158581+onlinejudge95@users.noreply.github.com> Date: Sat, 17 Jul 2021 18:06:22 +0530 Subject: [PATCH 04/17] Adds debug statements for unit-test (#40) --- .github/workflows/pipeline.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml index 43e76d0..f6da36e 100644 --- a/.github/workflows/pipeline.yml +++ b/.github/workflows/pipeline.yml @@ -119,6 +119,9 @@ jobs: runs-on: "ubuntu-18.04" steps: - uses: actions/checkout@v2 + with: + fetch-depth: 1 + ref: ${{ github.event.pull_request.head.sha }} - name: "Prepare test data directory" env: From 85b467f18b2d33edc5be3ef8ca7ebacf5c2d397d Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 11:58:01 +0530 Subject: [PATCH 05/17] Adds dependency for db --- requirements/prod.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/requirements/prod.txt b/requirements/prod.txt index 257fc94..9e68e83 100644 --- a/requirements/prod.txt +++ b/requirements/prod.txt @@ -17,3 +17,6 @@ requests==2.25.1 # Dependencies for emails fastapi-mail==0.4.0 + +# Dependency for database +SQLAlchemy==1.4.21 From ff3e6ad27a1177e2e5930a1e2a1a2c718fa53c68 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 12:24:41 +0530 Subject: [PATCH 06/17] Adds db service in compose file --- docker-compose.yml | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docker-compose.yml b/docker-compose.yml index 4afeaf0..fddd70e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -21,3 +21,19 @@ services: - 8000:8000 volumes: - .:/usr/src/app + + postgres: + image: postgres:13.3-alpine + environment: + POSTGRES_PASSWORD: postgres + POSTGRES_USER: postgres + POSTGRES_DB: postgres + networks: + - backend + volumes: + - gambley_data:/var/lib/postgresql/data + + +volumes: + gambley_data: + name: gambley_data From cbd89ed31f4c1a6d85860f98cd0eae37e974a02b Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 12:49:43 +0530 Subject: [PATCH 07/17] Adds db uri string as config --- .env.example | 1 + config/settings.py | 4 ++++ 2 files changed, 5 insertions(+) diff --git a/.env.example b/.env.example index 9dddec0..200a7ff 100644 --- a/.env.example +++ b/.env.example @@ -1,3 +1,4 @@ MAIL_USERNAME=xxxx MAIL_PASSWORD=xxxx SUPPRESS_SEND=xxxx +DATABASE_URI=xxxx diff --git a/config/settings.py b/config/settings.py index 0ad8198..c588f21 100644 --- a/config/settings.py +++ b/config/settings.py @@ -17,3 +17,7 @@ TEMPLATE_FOLDER="templates", SUPPRESS_SEND=getenv("SUPPRESS_SEND", 0), ) + + +class AppConfig: + SQLALCHEMY_DATABASE_URL = getenv("DATABASE_URI") From 647b8f64b888eb4d362267a14a5267acd9986788 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 18:34:11 +0530 Subject: [PATCH 08/17] Adds dependency for adding psycopg2 --- requirements/prod.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements/prod.txt b/requirements/prod.txt index 9e68e83..ec1a817 100644 --- a/requirements/prod.txt +++ b/requirements/prod.txt @@ -20,3 +20,4 @@ fastapi-mail==0.4.0 # Dependency for database SQLAlchemy==1.4.21 +psycopg2==2.9.1 From a63e6fc4fdc8fc67feb3784f7fd572e2b4739d3c Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 18:34:33 +0530 Subject: [PATCH 09/17] Adds system dependencies in Dockerfile --- .docker/Dockerfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 9b51536..a87dbb2 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,5 +1,9 @@ FROM python:3.9.6-slim +RUN apt-get update \ + && apt-get install --assume-yes libpq-dev gcc \ + && rm -rf /var/lib/apt/lists/* + WORKDIR /app COPY requirements/prod.txt requirements.txt From 438dc7a782b094ac51942c4e114105f1d7edbe25 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 18:48:11 +0530 Subject: [PATCH 10/17] Pins version of system dependencies in Dockerfile --- .docker/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index a87dbb2..6d25096 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,7 +1,7 @@ FROM python:3.9.6-slim RUN apt-get update \ - && apt-get install --assume-yes libpq-dev gcc \ + && apt-get install --assume-yes libpq-dev=11.12-0+deb10u1 gcc=4:8.3.0-1 \ && rm -rf /var/lib/apt/lists/* WORKDIR /app From 09936dd8e2ea23caf6014827d349850b4e1c277d Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sat, 17 Jul 2021 19:17:13 +0530 Subject: [PATCH 11/17] Uses binary dependency to shrink the image size --- .docker/Dockerfile | 4 ---- requirements/prod.txt | 2 +- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/.docker/Dockerfile b/.docker/Dockerfile index 6d25096..9b51536 100644 --- a/.docker/Dockerfile +++ b/.docker/Dockerfile @@ -1,9 +1,5 @@ FROM python:3.9.6-slim -RUN apt-get update \ - && apt-get install --assume-yes libpq-dev=11.12-0+deb10u1 gcc=4:8.3.0-1 \ - && rm -rf /var/lib/apt/lists/* - WORKDIR /app COPY requirements/prod.txt requirements.txt diff --git a/requirements/prod.txt b/requirements/prod.txt index ec1a817..29f329c 100644 --- a/requirements/prod.txt +++ b/requirements/prod.txt @@ -20,4 +20,4 @@ fastapi-mail==0.4.0 # Dependency for database SQLAlchemy==1.4.21 -psycopg2==2.9.1 +psycopg2-binary==2.9.1 From 0453fc1e49ab94a175bcaba86405ee8be798cfe4 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sun, 18 Jul 2021 19:42:19 +0530 Subject: [PATCH 12/17] Adds db factory in dependency --- src/dependencies.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/dependencies.py b/src/dependencies.py index 59a4923..0d24a54 100644 --- a/src/dependencies.py +++ b/src/dependencies.py @@ -1,6 +1,21 @@ from fastapi_mail import FastMail +from sqlalchemy import create_engine +from sqlalchemy.orm import sessionmaker +from config.settings import AppConfig from config.settings import mail_config +def db_factory(): + _engine = create_engine(AppConfig.SQLALCHEMY_DATABASE_URL) + SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=_engine) + + db = SessionLocal() + + try: + yield db + finally: + db.close() + + fast_mail = FastMail(mail_config) From c68b9d61a1f4707c42987bcb11adf0741e6133ce Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sun, 18 Jul 2021 19:45:13 +0530 Subject: [PATCH 13/17] Updates file name in schema --- src/routers/email/routes.py | 4 ++-- src/routers/email/{models.py => schema.py} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename src/routers/email/{models.py => schema.py} (100%) diff --git a/src/routers/email/routes.py b/src/routers/email/routes.py index 0cf3b42..d781691 100644 --- a/src/routers/email/routes.py +++ b/src/routers/email/routes.py @@ -4,14 +4,14 @@ from fastapi_mail import MessageSchema from ...dependencies import fast_mail -from .models import Email +from .schema import EmailSchema router = APIRouter() @router.post("/new", response_class=UJSONResponse, status_code=202) -async def send_email(background_task: BackgroundTasks, email: Email) -> UJSONResponse: +async def send_email(background_task: BackgroundTasks, email: EmailSchema) -> UJSONResponse: request_body = email.dict() message = MessageSchema( diff --git a/src/routers/email/models.py b/src/routers/email/schema.py similarity index 100% rename from src/routers/email/models.py rename to src/routers/email/schema.py From c4dccf963aeef3e37f9c293d4a82916b67b2b7f6 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sun, 18 Jul 2021 19:48:28 +0530 Subject: [PATCH 14/17] Fixes failing unit tests --- src/routers/email/schema.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routers/email/schema.py b/src/routers/email/schema.py index d42f9df..08b8dd1 100644 --- a/src/routers/email/schema.py +++ b/src/routers/email/schema.py @@ -4,7 +4,7 @@ from pydantic import EmailStr -class Email(BaseModel): +class EmailSchema(BaseModel): receiver: List[EmailStr] subject: str template_name: str From ee77dd1931e25936338619c98976822eba75e229 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sun, 18 Jul 2021 20:28:56 +0530 Subject: [PATCH 15/17] Adds user model class --- src/routers/user/__init__.py | 1 + src/routers/user/models.py | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 src/routers/user/__init__.py create mode 100644 src/routers/user/models.py diff --git a/src/routers/user/__init__.py b/src/routers/user/__init__.py new file mode 100644 index 0000000..3a27ef1 --- /dev/null +++ b/src/routers/user/__init__.py @@ -0,0 +1 @@ +from .routes import router diff --git a/src/routers/user/models.py b/src/routers/user/models.py new file mode 100644 index 0000000..0e0e064 --- /dev/null +++ b/src/routers/user/models.py @@ -0,0 +1,16 @@ +from sqlalchemy import Boolean +from sqlalchemy import Column +from sqlalchemy import Integer +from sqlalchemy import String +from sqlalchemy.ext.declarative import declarative_base + +Base = declarative_base() + + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True) + is_active = Column(Boolean, default=True) + username = Column(String, unique=True) + email = Column(String, unique=True) From 3012bf7a4054cc550d56aa41f27523dd25bcc0d3 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sun, 18 Jul 2021 20:57:40 +0530 Subject: [PATCH 16/17] Adds AnalyticsMixin to user model --- src/routers/user/models.py | 5 ++++- src/routers/user/utils.py | 15 +++++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 src/routers/user/utils.py diff --git a/src/routers/user/models.py b/src/routers/user/models.py index 0e0e064..e2653b6 100644 --- a/src/routers/user/models.py +++ b/src/routers/user/models.py @@ -4,10 +4,13 @@ from sqlalchemy import String from sqlalchemy.ext.declarative import declarative_base +from .utils import AnalyticsMixin + + Base = declarative_base() -class User(Base): +class User(Base, AnalyticsMixin): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) diff --git a/src/routers/user/utils.py b/src/routers/user/utils.py new file mode 100644 index 0000000..b0d760b --- /dev/null +++ b/src/routers/user/utils.py @@ -0,0 +1,15 @@ +from datetime import datetime + +from sqlalchemy import Column +from sqlalchemy import DateTime +from sqlalchemy import String +from sqlalchemy.ext.declarative import declarative_base + +Base = declarative_base() + + +class AnalyticsMixin(Base): + current_sign_in_on = Column(DateTime, default=datetime.utcnow) + last_sign_in_on = Column(DateTime, default=datetime.utcnow) + current_sign_in_ip = Column(String) + last_sign_in_ip = Column(String) From 1a77d813f04d86cb3b844bd51496eb3e28fc90b8 Mon Sep 17 00:00:00 2001 From: Mayank Pathak Date: Sun, 18 Jul 2021 21:05:54 +0530 Subject: [PATCH 17/17] Adds UpdatesMixin to user model --- src/routers/user/models.py | 3 ++- src/routers/user/utils.py | 6 ++++++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/routers/user/models.py b/src/routers/user/models.py index e2653b6..c24c477 100644 --- a/src/routers/user/models.py +++ b/src/routers/user/models.py @@ -5,12 +5,13 @@ from sqlalchemy.ext.declarative import declarative_base from .utils import AnalyticsMixin +from .utils import UpdatesMixin Base = declarative_base() -class User(Base, AnalyticsMixin): +class User(Base, AnalyticsMixin, UpdatesMixin): __tablename__ = "users" id = Column(Integer, primary_key=True, index=True) diff --git a/src/routers/user/utils.py b/src/routers/user/utils.py index b0d760b..9ff5240 100644 --- a/src/routers/user/utils.py +++ b/src/routers/user/utils.py @@ -5,6 +5,7 @@ from sqlalchemy import String from sqlalchemy.ext.declarative import declarative_base + Base = declarative_base() @@ -13,3 +14,8 @@ class AnalyticsMixin(Base): last_sign_in_on = Column(DateTime, default=datetime.utcnow) current_sign_in_ip = Column(String) last_sign_in_ip = Column(String) + + +class UpdatesMixin(Base): + created_on = Column(DateTime, default=datetime.utcnow) + updated_on = Column(DateTime, default=datetime.utcnow)