[rewrite] WIP login and register
This commit is contained in:
		
							parent
							
								
									f5547be799
								
							
						
					
					
						commit
						cd8fdb9c21
					
				@ -1,12 +1,11 @@
 | 
				
			|||||||
from fastapi import APIRouter
 | 
					from fastapi import APIRouter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from app.api.routes import cart_routes, shop_routes, user_routes, utils_routes
 | 
					from app.api.routes import cart_routes, user_routes, utils_routes, shop
 | 
				
			||||||
from app.api.routes.shop import shop_login_routes, shop_user_routes
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
api_router = APIRouter()
 | 
					api_router = APIRouter()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
api_router.include_router(cart_routes.router)
 | 
					api_router.include_router(cart_routes.router)
 | 
				
			||||||
api_router.include_router(shop_routes.router)
 | 
					 | 
				
			||||||
api_router.include_router(user_routes.router)
 | 
					api_router.include_router(user_routes.router)
 | 
				
			||||||
api_router.include_router(utils_routes.router)
 | 
					api_router.include_router(utils_routes.router)
 | 
				
			||||||
 | 
					api_router.include_router(shop.shop_router)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,14 @@
 | 
				
			|||||||
 | 
					from typing import Annotated
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from fastapi import APIRouter
 | 
					from fastapi import APIRouter
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from app.api.routes.shop import shop_login_routes, shop_user_routes
 | 
					from app.api.routes.shop import shop_login_routes, shop_user_routes
 | 
				
			||||||
 | 
					
 | 
				
			||||||
api_router = APIRouter()
 | 
					shop_router = APIRouter(
 | 
				
			||||||
 | 
					    prefix="/shop/{shop_uuid}",
 | 
				
			||||||
 | 
					    tags=["Shop"]
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
api_router.include_router(shop_login_routes.router)
 | 
					
 | 
				
			||||||
api_router.include_router(shop_user_routes.router)
 | 
					shop_router.include_router(shop_login_routes.router)
 | 
				
			||||||
 | 
					shop_router.include_router(shop_user_routes.router)
 | 
				
			||||||
 | 
				
			|||||||
@ -3,7 +3,7 @@ from typing import Annotated
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
from fastapi import APIRouter, Body, Path
 | 
					from fastapi import APIRouter, Body, Path
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from app.schemas.user_schemas import UserRegisterSchema, UserLoginSchema
 | 
					from app.schemas.user_schemas import UserRegister
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
router = APIRouter(
 | 
					router = APIRouter(
 | 
				
			||||||
@ -17,18 +17,13 @@ async def delete_user(shop_uuid=Annotated[uuid.UUID, Path(title="UUID of the sho
 | 
				
			|||||||
    raise NotImplementedError("delete_user() needs to be implemented.")
 | 
					    raise NotImplementedError("delete_user() needs to be implemented.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@router.post("/login", summary="User login")
 | 
					 | 
				
			||||||
async def login(login_data: UserLoginSchema, shop_uuid=Annotated[uuid.UUID, Path(title="UUID of the shop")]):
 | 
					 | 
				
			||||||
    raise NotImplementedError("login() needs to be implemented.")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@router.delete("/logout", summary="User logout")
 | 
					@router.delete("/logout", summary="User logout")
 | 
				
			||||||
async def logout():
 | 
					async def logout():
 | 
				
			||||||
    raise NotImplementedError("logout() needs to be implemented.")
 | 
					    raise NotImplementedError("logout() needs to be implemented.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@router.post("/register", summary="Register new user")
 | 
					@router.post("/register", summary="Register new user")
 | 
				
			||||||
async def register(user_data: UserRegisterSchema):
 | 
					async def register(user_data: UserRegister):
 | 
				
			||||||
    raise NotImplementedError()
 | 
					    raise NotImplementedError()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -1,14 +0,0 @@
 | 
				
			|||||||
import uuid
 | 
					 | 
				
			||||||
from typing import Annotated
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from fastapi import APIRouter, Path
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
router = APIRouter(
 | 
					 | 
				
			||||||
    prefix="/shop/{shop_uuid}",
 | 
					 | 
				
			||||||
    tags=["Shop"]
 | 
					 | 
				
			||||||
)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@router.get("/login")
 | 
					 | 
				
			||||||
async def get_shop_info(shop_uuid=Annotated[uuid.UUID, Path(title="UUID of the shop")]):
 | 
					 | 
				
			||||||
    raise NotImplementedError
 | 
					 | 
				
			||||||
@ -1,7 +1,9 @@
 | 
				
			|||||||
from fastapi import APIRouter, Body
 | 
					from fastapi import APIRouter, Body
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from app.schemas.user_schemas import UserRegisterSchema, UserLoginSchema
 | 
					from app.schemas.user_schemas import UserRegister
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from app.api.dependencies import SessionDep
 | 
				
			||||||
 | 
					from app.crud import user_crud
 | 
				
			||||||
 | 
					
 | 
				
			||||||
router = APIRouter(
 | 
					router = APIRouter(
 | 
				
			||||||
    prefix="/user",
 | 
					    prefix="/user",
 | 
				
			||||||
@ -14,35 +16,18 @@ async def delete_user():
 | 
				
			|||||||
    raise NotImplementedError("delete_user() needs to be implemented.")
 | 
					    raise NotImplementedError("delete_user() needs to be implemented.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@router.post("/login", summary="User login")
 | 
					 | 
				
			||||||
async def login(login_data: UserLoginSchema):
 | 
					 | 
				
			||||||
    raise NotImplementedError("login() needs to be implemented.")
 | 
					 | 
				
			||||||
    # user = authenticate_user(form_data.username, form_data.password)
 | 
					 | 
				
			||||||
    # if not user:
 | 
					 | 
				
			||||||
    #     raise HTTPException(
 | 
					 | 
				
			||||||
    #         status_code=status.HTTP_401_UNAUTHORIZED,
 | 
					 | 
				
			||||||
    #         detail="Incorrect username or password",
 | 
					 | 
				
			||||||
    #         headers={"WWW-Authenticate": "Bearer"},
 | 
					 | 
				
			||||||
    #     )
 | 
					 | 
				
			||||||
    # access_token_expires = timedelta(minutes=30)
 | 
					 | 
				
			||||||
    # access_token = create_access_token(
 | 
					 | 
				
			||||||
    #     data={"sub": user.username}, expires_delta=access_token_expires
 | 
					 | 
				
			||||||
    # )
 | 
					 | 
				
			||||||
    # return Token(access_token=access_token, token_type="bearer")
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
@router.delete("/logout", summary="User logout")
 | 
					@router.delete("/logout", summary="User logout")
 | 
				
			||||||
async def logout():
 | 
					async def logout():
 | 
				
			||||||
    raise NotImplementedError("logout() needs to be implemented.")
 | 
					    raise NotImplementedError("logout() needs to be implemented.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@router.post("/register", summary="Register new user")
 | 
					@router.post("/register", summary="Register new user")
 | 
				
			||||||
async def register(user_data: UserRegisterSchema):
 | 
					async def register(session: SessionDep, user_data: UserRegister):
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        create_user(user_data)
 | 
					        user_crud.create_user(session, user_data)
 | 
				
			||||||
        return {"message": "User registered successfully"}
 | 
					        return {"message": "User registered successfully"}
 | 
				
			||||||
    except BaseException:
 | 
					    except BaseException:
 | 
				
			||||||
        return {"message": "An error occured"}
 | 
					        return {"message": "An error occurred"}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@router.put("/update", summary="Update user details")
 | 
					@router.put("/update", summary="Update user details")
 | 
				
			||||||
 | 
				
			|||||||
@ -1,8 +1,10 @@
 | 
				
			|||||||
 | 
					import uuid
 | 
				
			||||||
from typing import Optional
 | 
					from typing import Optional
 | 
				
			||||||
from sqlmodel import Session, select
 | 
					from sqlmodel import Session, select
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from app.database.models.user_model import User
 | 
					from app.database.models.user_model import User
 | 
				
			||||||
from app.core.security import verify_password
 | 
					from app.schemas.user_schemas import UserRegister
 | 
				
			||||||
 | 
					from app.core.security import verify_password, get_password_hash
 | 
				
			||||||
from app.utils.models import generate_user_uuid5
 | 
					from app.utils.models import generate_user_uuid5
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def get_user_by_generated_uuid(session: Session, email: str, shop_id: Optional[int]) -> Optional[User]:
 | 
					def get_user_by_generated_uuid(session: Session, email: str, shop_id: Optional[int]) -> Optional[User]:
 | 
				
			||||||
@ -11,8 +13,19 @@ def get_user_by_generated_uuid(session: Session, email: str, shop_id: Optional[i
 | 
				
			|||||||
    db_user = session.exec(stmt).one_or_none()
 | 
					    db_user = session.exec(stmt).one_or_none()
 | 
				
			||||||
    return db_user
 | 
					    return db_user
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def create_user(session: Session):
 | 
					def create_user(session: Session, user_register: UserRegister, shop_id: Optional[int], user_role: str):
 | 
				
			||||||
    raise NotImplementedError()
 | 
					    user_uuid = generate_user_uuid5(user_register.email, shop_id)
 | 
				
			||||||
 | 
					    password = get_password_hash(user_register.password)
 | 
				
			||||||
 | 
					    new_user = User(
 | 
				
			||||||
 | 
					        uuid=user_uuid,
 | 
				
			||||||
 | 
					        shop_id=shop_id,
 | 
				
			||||||
 | 
					        email=user_register.email,
 | 
				
			||||||
 | 
					        username=user_register.username,
 | 
				
			||||||
 | 
					        phone_number=user_register.phone_number
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					    session.add(new_user)
 | 
				
			||||||
 | 
					    session.commit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
def authenticate(session: Session, email: str, password: str, shop_id: Optional[int]) -> Optional[User]:
 | 
					def authenticate(session: Session, email: str, password: str, shop_id: Optional[int]) -> Optional[User]:
 | 
				
			||||||
    db_user = get_user_by_generated_uuid(session, email, shop_id)
 | 
					    db_user = get_user_by_generated_uuid(session, email, shop_id)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,5 +1,4 @@
 | 
				
			|||||||
import logging
 | 
					import logging
 | 
				
			||||||
from contextlib import contextmanager
 | 
					 | 
				
			||||||
from typing import Generator
 | 
					from typing import Generator
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from sqlalchemy.exc import DatabaseError as SqlAlchemyError
 | 
					from sqlalchemy.exc import DatabaseError as SqlAlchemyError
 | 
				
			||||||
 | 
				
			|||||||
@ -1,3 +1,4 @@
 | 
				
			|||||||
 | 
					from uuid import UUID
 | 
				
			||||||
from enum import Enum as PyEnum
 | 
					from enum import Enum as PyEnum
 | 
				
			||||||
from typing import Optional, List
 | 
					from typing import Optional, List
 | 
				
			||||||
from datetime import datetime, time
 | 
					from datetime import datetime, time
 | 
				
			||||||
@ -38,6 +39,7 @@ class Shop(SQLModel, table=True):
 | 
				
			|||||||
    __tablename__ = 'shop'
 | 
					    __tablename__ = 'shop'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    id: Optional[int] = Field(default=None, primary_key=True)
 | 
					    id: Optional[int] = Field(default=None, primary_key=True)
 | 
				
			||||||
 | 
					    uuid: UUID = Field(nullable=False, unique=True)
 | 
				
			||||||
    owner_id: int = Field(foreign_key='user.id', nullable=False)
 | 
					    owner_id: int = Field(foreign_key='user.id', nullable=False)
 | 
				
			||||||
    name: str = Field(max_length=100, nullable=False, unique=True)
 | 
					    name: str = Field(max_length=100, nullable=False, unique=True)
 | 
				
			||||||
    description: str = Field(max_length=500, nullable=False)
 | 
					    description: str = Field(max_length=500, nullable=False)
 | 
				
			||||||
 | 
				
			|||||||
@ -2,22 +2,13 @@ from sqlmodel import Field as SqlModelField, SQLModel
 | 
				
			|||||||
from pydantic import EmailStr, Field
 | 
					from pydantic import EmailStr, Field
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UserRegisterSchema(SQLModel):
 | 
					class UserRegister(SQLModel):
 | 
				
			||||||
    username: str = Field(..., min_length=3, max_length=64)
 | 
					    username: str = Field(..., min_length=3, max_length=64)
 | 
				
			||||||
    email: EmailStr = Field(...)
 | 
					    email: EmailStr = Field(...)
 | 
				
			||||||
    phone_number: str = Field(..., min_length=2, max_length=16, pattern=r'^\+[1-9]\d{1,14}$')
 | 
					    phone_number: str = Field(..., min_length=2, max_length=16, pattern=r'^\+[1-9]\d{1,14}$')
 | 
				
			||||||
    password: str = Field(..., min_length=6, max_length=128)
 | 
					    password: str = Field(..., min_length=6, max_length=128)
 | 
				
			||||||
    shop_id: int = 0
 | 
					    shop_id: int = 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    class Config:
 | 
					 | 
				
			||||||
        from_attributes = True
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
class UserLoginSchema(SQLModel):
 | 
					 | 
				
			||||||
    shop_id: int = 0
 | 
					 | 
				
			||||||
    username: str = Field(..., min_length=3, max_length=64)
 | 
					 | 
				
			||||||
    password: str = Field(..., min_length=6, max_length=128)
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
class Token(SQLModel):
 | 
					class Token(SQLModel):
 | 
				
			||||||
    access_token: str
 | 
					    access_token: str
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user