Skip to content

Commit

Permalink
Merge pull request #89 from qase-tms/feat/auth
Browse files Browse the repository at this point in the history
Feat/auth
  • Loading branch information
serikovlearning committed May 5, 2024
2 parents 2220c8e + 9c3f6fe commit 38704f5
Show file tree
Hide file tree
Showing 18 changed files with 366 additions and 6 deletions.
29 changes: 29 additions & 0 deletions backend/dao/shelter_dao.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from sqlalchemy import select
from sqlalchemy.ext.asyncio import AsyncSession as Session

from backend.models.shelter import Shelter
from backend.schemas.shelter_schemas import CreateShelterSchema
from backend.dao.base_dao import BaseDao


class ShelterDao(BaseDao):
def __init__(self, session: Session):
super().__init__(session, Shelter)

async def create_shelter(self, body: CreateShelterSchema) -> Shelter:
shelter = Shelter(
username=body.username, password=body.password, slug=body.slug
)

self.session.add(shelter)
await self.session.flush()

return shelter

async def get_shelter_from_db(self, username: str):
query = select(Shelter).where(Shelter.username == username.lower())
return await self.session.scalar(query)

async def get_shelter_from_db_by_id(self, id: int):
query = select(Shelter).where(Shelter.id == id)
return await self.session.scalar(query)
43 changes: 43 additions & 0 deletions backend/database/versions/fdae3120f6f8_added_shelter_table.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
"""added_shelter_table
Revision ID: fdae3120f6f8
Revises: 3e3431180c42
Create Date: 2024-05-04 18:18:21.454167
"""
from typing import Sequence, Union

from alembic import op
import sqlalchemy as sa


# revision identifiers, used by Alembic.
revision: str = 'fdae3120f6f8'
down_revision: Union[str, None] = '3e3431180c42'
branch_labels: Union[str, Sequence[str], None] = None
depends_on: Union[str, Sequence[str], None] = None


def upgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.create_table('shelter',
sa.Column('id', sa.Integer(), autoincrement=True, nullable=False),
sa.Column('slug', sa.String(length=50), nullable=False),
sa.Column('username', sa.String(length=100), nullable=False),
sa.Column('password', sa.String(length=100), nullable=False),
sa.PrimaryKeyConstraint('id', name=op.f('pk__shelter')),
sa.UniqueConstraint('id', name=op.f('uq__shelter__id'))
)
op.add_column('animal', sa.Column('shelter_id', sa.Integer(), nullable=True))
op.create_index(op.f('ix__animal__shelter_id'), 'animal', ['shelter_id'], unique=False)
op.create_foreign_key(op.f('fk__animal__shelter_id__shelter'), 'animal', 'shelter', ['shelter_id'], ['id'], ondelete='CASCADE')
# ### end Alembic commands ###


def downgrade() -> None:
# ### commands auto generated by Alembic - please adjust! ###
op.drop_constraint(op.f('fk__animal__shelter_id__shelter'), 'animal', type_='foreignkey')
op.drop_index(op.f('ix__animal__shelter_id'), table_name='animal')
op.drop_column('animal', 'shelter_id')
op.drop_table('shelter')
# ### end Alembic commands ###
3 changes: 3 additions & 0 deletions backend/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from backend.settings import Settings
from backend.utils import bind_routes, bind_events, bind_exceptions, bind_static
from backend.utils.prepare_cors import prepare_cors_middleware


def make_app(settings: Settings):
Expand All @@ -30,6 +31,8 @@ def make_app(settings: Settings):
bind_static(app)
add_pagination(app)

prepare_cors_middleware(app, settings)

return app


Expand Down
5 changes: 3 additions & 2 deletions backend/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from backend.models import animal, animal_photo
from backend.models import animal, animal_photo, shelter

__all__ = [
"animal",
"animal_photo"
"animal_photo",
"shelter"
]
13 changes: 12 additions & 1 deletion backend/models/animal.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from sqlalchemy import Integer, Column, String
from sqlalchemy import Integer, Column, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.hybrid import hybrid_property
from backend.settings import Settings
Expand All @@ -24,6 +24,17 @@ class Animal(DeclarativeBase):
age = Column(String, nullable=False)
size = Column(String, nullable=False)

shelter_id = Column(
ForeignKey("shelter.id", ondelete="CASCADE"),
index=True,
nullable=True,
)
shelter = relationship(
"Shelter",
foreign_keys=[shelter_id],
lazy="noload",
)

@hybrid_property
def photo_urls(self):
return [photo.full_url for photo in self.photos]
Expand Down
15 changes: 15 additions & 0 deletions backend/models/shelter.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
from backend.database.metadata import DeclarativeBase
from sqlalchemy import Integer, Column, String



class Shelter(DeclarativeBase):
__tablename__ = "shelter"

id = Column(Integer, primary_key=True, autoincrement=True, unique=True)
slug = Column(String(50), nullable=False)

username = Column(String(100), nullable=False)
password = Column(String(100), nullable=False)


94 changes: 93 additions & 1 deletion backend/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 2 additions & 0 deletions backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@ fastapi-pagination = "^0.12.14"
asyncpg = "^0.29.0"
python-multipart = "^0.0.6"
jinja2 = "^3.1.2"
passlib = "^1.7.4"
python-jose = "^3.3.0"


[build-system]
Expand Down
4 changes: 3 additions & 1 deletion backend/routers/__init__.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
from backend.routers.animal_router import router as animals_router
from backend.routers.animal_photo_router import router as animals_photo_router
from backend.routers.shelter_router import router as shelter_router

routes = [
animals_router,
animals_photo_router
animals_photo_router,
shelter_router
]
5 changes: 5 additions & 0 deletions backend/routers/animal_router.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
AnimalFullResponseSchema
)
from backend.schemas.base_schema import BaseOkResponse
from services.shelter_service import ShelterService
from backend.services.animal_service import AnimalService
from backend.services.animal_template_service import AnimalTemplateService


router = APIRouter(
tags=["animals"],
prefix="/animals"
Expand Down Expand Up @@ -48,6 +50,7 @@ async def create_animal(
schema: AnimalCreateSchema
) -> BaseOkResponse:
async with request.app.state.db.get_master_session() as session:
await ShelterService(session).check_is_auth_active(request)
await AnimalService(session).create_new_animal(schema)
return BaseOkResponse()

Expand All @@ -59,6 +62,7 @@ async def update_animal(
schema: AnimalUpdateSchema
) -> BaseOkResponse:
async with request.app.state.db.get_master_session() as session:
await ShelterService(session).check_is_auth_active(request)
await AnimalService(session).update_animal(animal_id, schema)
return BaseOkResponse()

Expand All @@ -69,5 +73,6 @@ async def update_animal(
animal_id: int
) -> BaseOkResponse:
async with request.app.state.db.get_master_session() as session:
await ShelterService(session).check_is_auth_active(request)
await AnimalService(session).delete_animal_by_id(animal_id)
return BaseOkResponse()
27 changes: 27 additions & 0 deletions backend/routers/shelter_router.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
from fastapi import APIRouter, Request, Response

from backend.schemas.shelter_schemas import (
CreateShelterSchema,
BaseShelterSchema,
)
from backend.schemas.base_schema import BaseOkResponse
from services.shelter_service import ShelterService


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


@router.post("/auth")
async def auth(request: Request, body: BaseShelterSchema, response: Response):
async with request.app.state.db.get_master_session() as session:
return await ShelterService(session).authenticate_shelter(body, response)


@router.post("/")
async def create_shelter(
request: Request, schema: CreateShelterSchema
) -> BaseOkResponse:
print(request.cookies)
async with request.app.state.db.get_master_session() as session:
await ShelterService(session).create_shelter(schema)
return BaseOkResponse()
1 change: 1 addition & 0 deletions backend/schemas/animal_schemas.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ class AnimalCreateSchema(AnimalBaseSchema):
sex: str
age: str
size: str
shelter_id: int


class AnimalUpdateSchema(AnimalBaseSchema):
Expand Down
10 changes: 10 additions & 0 deletions backend/schemas/shelter_schemas.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from backend.schemas.base_schema import BaseSchema

from pydantic import Field

class BaseShelterSchema(BaseSchema):
username: str = Field(max_length=100)
password: str = Field(max_length=100)

class CreateShelterSchema(BaseShelterSchema):
slug: str = Field(max_length=50)
Loading

0 comments on commit 38704f5

Please sign in to comment.