Skip to content
Merged
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 .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ activemq-data/

# Environments
.env
.env.production
.envrc
.venv
env/
Expand Down
89 changes: 89 additions & 0 deletions backend/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
# Git
.git
.gitignore
.gitattributes


# CI
.codeclimate.yml
.travis.yml
.taskcluster.yml

# Docker
docker-compose.yml
Dockerfile
.docker
.dockerignore

# Byte-compiled / optimized / DLL files
**/__pycache__/
**/*.py[cod]

# C extensions
*.so

# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml

# Translations
*.mo
*.pot

# Django stuff:
*.log

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# Virtual environment
.env
.venv/
venv/

# PyCharm
.idea

# Python mode for VIM
.ropeproject
**/.ropeproject

# Vim swap files
**/*.swp

# VS Code
.vscode/
18 changes: 18 additions & 0 deletions backend/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
FROM python:3.13-slim

ENV PYTHONUNBUFFERED=1
ENV PYTHONDONTWRITEBYTECODE=1

COPY --from=ghcr.io/astral-sh/uv:0.9.29 /uv /uvx /bin/

WORKDIR /app

COPY ./pyproject.toml ./
COPY ./uv.lock ./
COPY ./backlog_app ./backlog_app

RUN uv sync

EXPOSE 8000

CMD ["uv", "run", "fastapi", "run", "backlog_app/main.py", "--port", "8000"]
5 changes: 3 additions & 2 deletions backend/backlog_app/alembic/env.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@
from logging.config import fileConfig

from alembic import context
from config import settings
from models.base import Base
from sqlalchemy import pool
from sqlalchemy.ext.asyncio import AsyncConnection, create_async_engine

from backlog_app.config import settings
from backlog_app.models import Base

config = context.config

if config.config_file_name is not None:
Expand Down
7 changes: 4 additions & 3 deletions backend/backlog_app/api/crud.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
import logging

from fastapi import HTTPException
from models import User
from models.movie import Movie
from schemas.movie import MovieCreate, MovieRead, MovieUpdate
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.future import select
from sqlalchemy.orm import selectinload

from backlog_app.models import User
from backlog_app.models.movie import Movie
from backlog_app.schemas.movie import MovieCreate, MovieRead, MovieUpdate

logger = logging.getLogger(__name__)


Expand Down
9 changes: 6 additions & 3 deletions backend/backlog_app/api/view/auth_view.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,10 @@
from dependencies.authentification.backend import authentication_backend
from dependencies.authentification.fastapi_users_routers import fastapi_users
from fastapi import APIRouter
from schemas.user import UserCreate, UserRead

from backlog_app.dependencies.authentification.backend import authentication_backend
from backlog_app.dependencies.authentification.fastapi_users_routers import (
fastapi_users,
)
from backlog_app.schemas.user import UserCreate, UserRead

router = APIRouter(
prefix="/auth",
Expand Down
13 changes: 8 additions & 5 deletions backend/backlog_app/api/view/movie_view.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
from typing import Annotated, List

from api import crud
from dependencies.authentification.fastapi_users_routers import current_active_user
from fastapi import APIRouter, Depends
from models.users import User
from schemas.movie import MovieCreate, MovieRead, MovieUpdate
from sqlalchemy.ext.asyncio import AsyncSession
from storages.database import get_async_session

from backlog_app.api import crud
from backlog_app.dependencies.authentification.fastapi_users_routers import (
current_active_user,
)
from backlog_app.models.users import User
from backlog_app.schemas.movie import MovieCreate, MovieRead, MovieUpdate
from backlog_app.storages.database import get_async_session

router = APIRouter(prefix="/movies", tags=["Movies"])

Expand Down
7 changes: 5 additions & 2 deletions backend/backlog_app/api/view/users_view.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
from dependencies.authentification.fastapi_users_routers import fastapi_users
from fastapi import APIRouter
from schemas.user import UserRead, UserUpdate

from backlog_app.dependencies.authentification.fastapi_users_routers import (
fastapi_users,
)
from backlog_app.schemas.user import UserRead, UserUpdate

router = APIRouter(prefix="/users", tags=["Users"])

Expand Down
2 changes: 1 addition & 1 deletion backend/backlog_app/app_lifespan.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@
from contextlib import asynccontextmanager

from fastapi import FastAPI
from storages.database import engine

from .storages.database import engine
from .taskiq_broker import broker


Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from typing import TYPE_CHECKING, Annotated

from fastapi import Depends
from models import AccessToken
from storages.database import get_async_session

from backlog_app.models import AccessToken
from backlog_app.storages.database import get_async_session

if TYPE_CHECKING:
from sqlalchemy.ext.asyncio import AsyncSession
Expand Down
3 changes: 2 additions & 1 deletion backend/backlog_app/dependencies/authentification/backend.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from fastapi_users.authentication import AuthenticationBackend
from servicies.authentification import bearer_transport

from backlog_app.servicies.authentification import bearer_transport

from .strategy import get_database_strategy

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
import uuid

from fastapi_users import FastAPIUsers
from models import User

from backlog_app.models import User

from .backend import authentication_backend
from .user_manager import get_user_manager
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
from typing import TYPE_CHECKING, Annotated

from config import settings
from fastapi import Depends
from fastapi_users.authentication.strategy.db import DatabaseStrategy

from backlog_app.config import settings

from .access_tokens import get_access_token_db

if TYPE_CHECKING:
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
from typing import TYPE_CHECKING, Annotated

from fastapi import Depends
from servicies.authentification import UserManager

from backlog_app.servicies.authentification import UserManager

from .users import get_user_db

Expand Down
5 changes: 3 additions & 2 deletions backend/backlog_app/dependencies/authentification/users.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
from typing import TYPE_CHECKING, Annotated

from fastapi import Depends
from models import User
from storages.database import get_async_session

from backlog_app.models import User
from backlog_app.storages.database import get_async_session

if TYPE_CHECKING:
from sqlalchemy.ext.asyncio import AsyncSession
Expand Down
3 changes: 2 additions & 1 deletion backend/backlog_app/jinja2_templates.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
__all__ = ("templates",)

from config import BASE_DIR
from fastapi.templating import Jinja2Templates

from backlog_app.config import BASE_DIR

templates = Jinja2Templates(directory=BASE_DIR / "templates")
8 changes: 4 additions & 4 deletions backend/backlog_app/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@
from datetime import datetime

import uvicorn
from api import router as api_router
from api.view.main_view import router as main_router
from config import settings
from fastapi import FastAPI
from fastapi.middleware.cors import CORSMiddleware

from backend.backlog_app.app_lifespan import lifespan
from backlog_app.api import router as api_router
from backlog_app.api.view.main_view import router as main_router
from backlog_app.app_lifespan import lifespan
from backlog_app.config import settings

logging.basicConfig(
format=settings.logging.log_format,
Expand Down
3 changes: 2 additions & 1 deletion backend/backlog_app/models/movie.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
from datetime import datetime
from typing import TYPE_CHECKING

from models.base import Base
from sqlalchemy import Boolean, DateTime, Float, ForeignKey, Integer, String, func
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.orm import Mapped, mapped_column, relationship

from .base import Base

if TYPE_CHECKING:
from .users import User

Expand Down
3 changes: 2 additions & 1 deletion backend/backlog_app/models/users.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@
SQLAlchemyBaseUserTableUUID,
SQLAlchemyUserDatabase,
)
from models.base import Base
from sqlalchemy.orm import Mapped, relationship

from .base import Base

if TYPE_CHECKING:
from sqlalchemy.ext.asyncio import AsyncSession

Expand Down
10 changes: 10 additions & 0 deletions backend/backlog_app/prestart.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/usr/bin/env bash

set -e
set -x

echo "Run apply migrations.."
alembic upgrade head
echo "Migrations applied!"

exec "$@"
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@
import uuid
from typing import TYPE_CHECKING, Optional

from config import settings
from fastapi_users import BaseUserManager, UUIDIDMixin
from models import User
from tasks.email_task import send_email_confirmed, send_verification_email

from backlog_app.config import settings
from backlog_app.models import User
from backlog_app.tasks.email_task import send_email_confirmed, send_verification_email

if TYPE_CHECKING:
from fastapi import Request
Expand Down
3 changes: 2 additions & 1 deletion backend/backlog_app/storages/database.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from config import settings
from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine

from backlog_app.config import settings

engine = create_async_engine(
settings.db.connection.database_url_asyncpg,
echo=False,
Expand Down
6 changes: 3 additions & 3 deletions backend/backlog_app/tasks/email_task.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
from textwrap import dedent

from jinja2_templates import templates
from servicies.mailing import send_email
from taskiq_broker import broker
from backlog_app.jinja2_templates import templates
from backlog_app.servicies.mailing import send_email
from backlog_app.taskiq_broker import broker


@broker.task
Expand Down
24 changes: 24 additions & 0 deletions docker-compose.dev.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
services:

pg:
image: postgres:18
env_file:
- .env
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
PGDATA: /var/lib/postgresql/data/pgdata
ports:
- "5432:5432"
volumes:
- pgdata:/var/lib/postgresql/data/pgdata
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER}"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped

volumes:
pgdata:
Loading