From 0edcecd0f5640cd7ad6a05552cf7bddc8fdec43d Mon Sep 17 00:00:00 2001 From: Olly Hearn Date: Sun, 24 Mar 2024 15:37:01 +0300 Subject: [PATCH] little of backend --- backend/Dockerfile | 8 ++++---- backend/app/__init__.py | 0 backend/app/db/__init__.py | 0 backend/app/db/database.py | 19 +++++++++++++++++ backend/app/db/models.py | 13 ++++++++++++ backend/app/db/schemas.py | 19 +++++++++++++++++ backend/app/dependencies.py | 9 ++++++++ backend/app/main.py | 21 +++++++++++-------- backend/app/views/__init__.py | 0 backend/app/views/auth/__init__.py | 0 backend/app/views/auth/api.py | 33 ++++++++++++++++++++++++++++++ backend/app/views/auth/crud.py | 24 ++++++++++++++++++++++ backend/requirements.txt | 3 ++- dev.yml | 2 +- frontend/Dockerfile | 5 ++++- 15 files changed, 140 insertions(+), 16 deletions(-) create mode 100644 backend/app/__init__.py create mode 100644 backend/app/db/__init__.py create mode 100644 backend/app/db/database.py create mode 100644 backend/app/db/models.py create mode 100644 backend/app/db/schemas.py create mode 100644 backend/app/dependencies.py create mode 100644 backend/app/views/__init__.py create mode 100644 backend/app/views/auth/__init__.py create mode 100644 backend/app/views/auth/api.py create mode 100644 backend/app/views/auth/crud.py diff --git a/backend/Dockerfile b/backend/Dockerfile index 0a90320..e83ae84 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,6 +1,6 @@ FROM python:3.12-alpine -WORKDIR /app -COPY ./requirements.txt /app/requirements.txt +WORKDIR /code +COPY ./requirements.txt /code/requirements.txt RUN pip install --no-cache-dir -r requirements.txt -COPY ./app /app -CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] \ No newline at end of file +COPY ./app /code/app +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"] \ No newline at end of file diff --git a/backend/app/__init__.py b/backend/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/db/__init__.py b/backend/app/db/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/db/database.py b/backend/app/db/database.py new file mode 100644 index 0000000..1c90b59 --- /dev/null +++ b/backend/app/db/database.py @@ -0,0 +1,19 @@ +from sqlalchemy import create_engine +from sqlalchemy.ext.declarative import declarative_base +from sqlalchemy.orm import sessionmaker +import os + +POSTGRES_USER = os.environ.get("POSTGRES_USER", "user") +POSTGRES_PASSWORD = os.environ.get("POSTGRES_PASSWORD", "password") +POSTGRES_DB = os.environ.get("POSTGRES_DB", "db") +POSTGRES_HOST = os.environ.get("POSTGRES_HOST", "postgres") + + +SQLALCHEMY_DATABASE_URL = ( + f"postgresql://{POSTGRES_USER}:{POSTGRES_PASSWORD}@{POSTGRES_HOST}/{POSTGRES_DB}" +) + +engine = create_engine(SQLALCHEMY_DATABASE_URL) +SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) + +Base = declarative_base() diff --git a/backend/app/db/models.py b/backend/app/db/models.py new file mode 100644 index 0000000..3fd26aa --- /dev/null +++ b/backend/app/db/models.py @@ -0,0 +1,13 @@ +from sqlalchemy import Boolean, Column, ForeignKey, Integer, String +from sqlalchemy.orm import relationship + +from .database import Base + + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True) + email = Column(String, unique=True, index=True) + hashed_password = Column(String) + is_active = Column(Boolean, default=True) diff --git a/backend/app/db/schemas.py b/backend/app/db/schemas.py new file mode 100644 index 0000000..eddef43 --- /dev/null +++ b/backend/app/db/schemas.py @@ -0,0 +1,19 @@ +from typing import Union +from pydantic import BaseModel + + +class UserBase(BaseModel): + username: str + email: str + + +class UserCreate(UserBase): + password: str + + +class User(UserBase): + id: int + is_active: bool + + class Config: + orm_mode = True diff --git a/backend/app/dependencies.py b/backend/app/dependencies.py new file mode 100644 index 0000000..254bf63 --- /dev/null +++ b/backend/app/dependencies.py @@ -0,0 +1,9 @@ +from .db.database import SessionLocal + + +def get_db(): + db = SessionLocal() + try: + yield db + finally: + db.close() diff --git a/backend/app/main.py b/backend/app/main.py index 9bed865..230c668 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,15 +1,18 @@ from typing import Union +from fastapi import FastAPI, Depends -from fastapi import FastAPI +from .db import models +from .db.database import SessionLocal, engine +from .dependencies import get_db -app = FastAPI() +from .views.auth.api import router as auth_router + +app = FastAPI(dependencies=[Depends(get_db)]) +models.Base.metadata.create_all(bind=engine) + +app.include_router(auth_router) -@app.get("/api/") +@app.get("/") def read_root(): - return {"Hello": "Woasrld"} - - -@app.get("/items/{item_id}") -def read_item(item_id: int, q: Union[str, None] = None): - return {"item_id": item_id, "q": q} + return {"message": "OK"} diff --git a/backend/app/views/__init__.py b/backend/app/views/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/views/auth/__init__.py b/backend/app/views/auth/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/app/views/auth/api.py b/backend/app/views/auth/api.py new file mode 100644 index 0000000..5d2c4ed --- /dev/null +++ b/backend/app/views/auth/api.py @@ -0,0 +1,33 @@ +from fastapi import APIRouter, Depends, FastAPI, HTTPException +from sqlalchemy.orm import Session +from . import crud +from ...dependencies import get_db +from ...db import schemas + +router = APIRouter( + prefix="/auth", + tags=["auth"], + dependencies=[Depends(get_db)], + responses={404: {"description": "Not found"}}, +) + + +@router.post("/users/", response_model=schemas.User) +def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)): + db_user = crud.get_user_by_email(db, email=user.email) + if db_user: + raise HTTPException(status_code=400, detail="Email already registered") + return crud.create_user(db=db, user=user) + + +@router.get("/", response_model=list[schemas.User]) +def read_users(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)): + users = crud.get_users(db, skip=skip, limit=limit) + return users + + +@router.get("/users/{user_id}", response_model=schemas.User) +def read_user(user_id: int, db: Session = Depends(get_db)): + db_user = crud.get_user(db, user_id=user_id) + if db_user is None: + raise HTTPException diff --git a/backend/app/views/auth/crud.py b/backend/app/views/auth/crud.py new file mode 100644 index 0000000..5acb98b --- /dev/null +++ b/backend/app/views/auth/crud.py @@ -0,0 +1,24 @@ +from sqlalchemy.orm import Session + +from ...db import models, schemas + + +def get_user(db: Session, user_id: int): + return db.query(models.User).filter(models.User.id == user_id).first() + + +def get_user_by_email(db: Session, email: str): + return db.query(models.User).filter(models.User.email == email).first() + + +def get_users(db: Session, skip: int = 0, limit: int = 100): + return db.query(models.User).offset(skip).limit(limit).all() + + +def create_user(db: Session, user: schemas.UserCreate): + fake_hashed_password = user.password + "notreallyhashed" + db_user = models.User(email=user.email, hashed_password=fake_hashed_password) + db.add(db_user) + db.commit() + db.refresh(db_user) + return db_user diff --git a/backend/requirements.txt b/backend/requirements.txt index a999d54..516838f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,3 +1,4 @@ fastapi[all] +pydantic sqlalchemy - +psycopg2-binary \ No newline at end of file diff --git a/dev.yml b/dev.yml index fc31279..9237f6d 100644 --- a/dev.yml +++ b/dev.yml @@ -8,7 +8,7 @@ services: - path: ./env/backend/dev.env required: true volumes: - - ./backend/app:/app:z + - ./backend/app:/code/app:z frontend: build: context: frontend diff --git a/frontend/Dockerfile b/frontend/Dockerfile index 8ae2a9f..49cc9a1 100644 --- a/frontend/Dockerfile +++ b/frontend/Dockerfile @@ -1,8 +1,11 @@ FROM node:21-alpine WORKDIR /app -COPY ./app /app +COPY ./app/package-lock.json /app/package-lock.json +COPY ./app/package.json /app/package.json RUN npm ci +COPY ./app /app + CMD [ "npm", "start" ]