Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
MAIL_USERNAME=xxxx
MAIL_PASSWORD=xxxx
SUPPRESS_SEND=xxxx
DATABASE_URI=xxxx
3 changes: 3 additions & 0 deletions .github/workflows/pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
4 changes: 4 additions & 0 deletions config/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@
TEMPLATE_FOLDER="templates",
SUPPRESS_SEND=getenv("SUPPRESS_SEND", 0),
)


class AppConfig:
SQLALCHEMY_DATABASE_URL = getenv("DATABASE_URI")
16 changes: 16 additions & 0 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
4 changes: 4 additions & 0 deletions requirements/prod.txt
Original file line number Diff line number Diff line change
Expand Up @@ -17,3 +17,7 @@ requests==2.25.1

# Dependencies for emails
fastapi-mail==0.4.0

# Dependency for database
SQLAlchemy==1.4.21
psycopg2-binary==2.9.1
15 changes: 15 additions & 0 deletions src/dependencies.py
Original file line number Diff line number Diff line change
@@ -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)
4 changes: 2 additions & 2 deletions src/routers/email/routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from pydantic import EmailStr


class Email(BaseModel):
class EmailSchema(BaseModel):
receiver: List[EmailStr]
subject: str
template_name: str
Expand Down
1 change: 1 addition & 0 deletions src/routers/user/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .routes import router
20 changes: 20 additions & 0 deletions src/routers/user/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from sqlalchemy import Boolean
from sqlalchemy import Column
from sqlalchemy import Integer
from sqlalchemy import String
from sqlalchemy.ext.declarative import declarative_base

from .utils import AnalyticsMixin
from .utils import UpdatesMixin


Base = declarative_base()


class User(Base, AnalyticsMixin, UpdatesMixin):
__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)
21 changes: 21 additions & 0 deletions src/routers/user/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
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)


class UpdatesMixin(Base):
created_on = Column(DateTime, default=datetime.utcnow)
updated_on = Column(DateTime, default=datetime.utcnow)