update backend
This commit is contained in:
@ -74,12 +74,8 @@ async def unicorn_exception_handler(request: Request, exc: HTTPException):
|
||||
def api_routers():
|
||||
app.include_router(router)
|
||||
|
||||
|
||||
api_routers()
|
||||
|
||||
# app.include_router(authR.authRouter)
|
||||
# app.include_router(userR.userRouter)
|
||||
|
||||
def main():
|
||||
uvicorn.run("app:app", host="0.0.0.0", port=settings.API_PORT, reload=True, workers=1, forwarded_allow_ips="*")
|
||||
|
||||
|
8
fuware/core/message_code.py
Normal file
8
fuware/core/message_code.py
Normal file
@ -0,0 +1,8 @@
|
||||
class MessageCode:
|
||||
CREATED_USER: str = 'CREATED_USER'
|
||||
WRONG_INPUT: str = 'LOGIN_WRONG'
|
||||
ACCOUNT_LOCK: str = 'USER_LOCK'
|
||||
|
||||
|
||||
def message_code():
|
||||
return MessageCode()
|
@ -13,7 +13,7 @@ class SqlAlchemyBase(Model):
|
||||
__abstract__ = True
|
||||
|
||||
created_at: Mapped[datetime | None] = mapped_column(DateTime, default=datetime.utcnow(), index=True)
|
||||
update_at: Mapped[datetime | None] = mapped_column(DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
|
||||
updated_at: Mapped[datetime | None] = mapped_column(DateTime, default=datetime.utcnow(), onupdate=datetime.utcnow())
|
||||
|
||||
@classmethod
|
||||
def normalize(cls, val: str) -> str:
|
||||
|
@ -25,7 +25,7 @@ class SessionLogin(SqlAlchemyBase):
|
||||
__tablename__ = 'session_login'
|
||||
|
||||
id: Mapped[int] = mapped_column(primary_key=True, autoincrement=True)
|
||||
session: Mapped[str] = mapped_column(UUID, default=uuid4, index=True, nullable=False)
|
||||
session: Mapped[str] = mapped_column(String, unique=True, index=True, nullable=False)
|
||||
user_id: Mapped[str] = mapped_column(ForeignKey("users.id"), unique=True, index=True, nullable=False)
|
||||
|
||||
user = relationship("User", back_populates="session_login")
|
||||
|
@ -1,8 +1,11 @@
|
||||
from fuware.core.config import get_app_settings
|
||||
from fuware.core.security.hasher import get_hasher
|
||||
from fuware.db.models import SessionLogin, User
|
||||
from fuware.schemas import UserCreate
|
||||
from sqlalchemy.orm import Session
|
||||
from uuid import uuid4
|
||||
|
||||
settings = get_app_settings()
|
||||
|
||||
class RepositoryUsers:
|
||||
def __init__(self):
|
||||
@ -33,7 +36,8 @@ class RepositoryUsers:
|
||||
|
||||
def create_session(self, db: Session, user_id: str):
|
||||
try:
|
||||
db_ss = SessionLogin(user_id=user_id)
|
||||
bhash = uuid4().hex[:10]
|
||||
db_ss = SessionLogin(session=bhash,user_id=user_id)
|
||||
db.add(db_ss)
|
||||
db.commit()
|
||||
except Exception:
|
||||
@ -50,11 +54,12 @@ class RepositoryUsers:
|
||||
return db_ss
|
||||
|
||||
def logout(self, db: Session, user_ss: str):
|
||||
print(f"Logout: {user_ss}")
|
||||
db_ss = self.sessionLogin.query.filter_by(session=user_ss).first()
|
||||
print(f"db_ss: {db_ss}")
|
||||
try:
|
||||
db.delete(db_ss)
|
||||
db.commit()
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
raise e
|
||||
pass
|
||||
|
@ -1,13 +1,13 @@
|
||||
from typing import Any
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response
|
||||
from fastapi import APIRouter, Depends, HTTPException, Response, Request
|
||||
|
||||
from fastapi.encoders import jsonable_encoder
|
||||
from sqlalchemy.orm import Session
|
||||
from fuware.core.config import get_app_settings
|
||||
from fuware.core.message_code import message_code
|
||||
from fuware.core.security.hasher import get_hasher
|
||||
from fuware.db.db_setup import generate_session
|
||||
from fuware.schemas import ReturnValue, UserRequest
|
||||
from fuware.schemas.user.user import UserCreate
|
||||
from fuware.schemas import ReturnValue, UserRequest, PrivateUser, UserCreate
|
||||
from fuware.services import UserService
|
||||
|
||||
|
||||
@ -15,24 +15,29 @@ public_router = APIRouter(tags=["Users: Authentication"])
|
||||
user_service = UserService()
|
||||
hasher = get_hasher()
|
||||
settings = get_app_settings()
|
||||
message = message_code()
|
||||
|
||||
@public_router.put('/register')
|
||||
def register_user(user: UserCreate, db: Session = Depends(generate_session)) -> ReturnValue[Any]:
|
||||
db_user = user_service.get_by_username(username=user.username)
|
||||
if db_user:
|
||||
raise HTTPException(status_code=400, detail="Username already registered!")
|
||||
raise HTTPException(status_code=400, detail=message.CREATED_USER)
|
||||
user_return = user_service.create(db=db, user=user)
|
||||
return ReturnValue(status=200, data=jsonable_encoder(user_return))
|
||||
|
||||
@public_router.post('/login', response_model=ReturnValue[Any])
|
||||
@public_router.post('/login', response_model=ReturnValue[PrivateUser])
|
||||
def user_login(user: UserRequest, response: Response, db: Session = Depends(generate_session)) -> ReturnValue[Any]:
|
||||
db_user = user_service.get_by_username(username=user.username)
|
||||
if not db_user:
|
||||
raise HTTPException(status_code=401, detail="Your username or password input is wrong!")
|
||||
if not hasher.verify(password=user.password, hashed=db_user.password):
|
||||
raise HTTPException(status_code=401, detail="Your username or password input is wrong!")
|
||||
if db_user.is_lock is True:
|
||||
raise HTTPException(status_code=401, detail="Your Account was locked")
|
||||
db_user = user_service.check_exist(user=user)
|
||||
cookieEncode = user_service.check_login(db=db, user_id=db_user.id)
|
||||
response.set_cookie(key=settings.COOKIE_KEY, value=cookieEncode.session)
|
||||
return ReturnValue(status=200, data=jsonable_encoder(db_user))
|
||||
response.set_cookie(key=settings.COOKIE_KEY, value=cookieEncode, max_age=86400, httponly=True)
|
||||
return ReturnValue(status=200, data=db_user)
|
||||
|
||||
@public_router.get('/logout', response_model=ReturnValue[Any])
|
||||
def user_logout(request: Request, response: Response, db: Session = Depends(generate_session)) -> ReturnValue[Any]:
|
||||
session_id = request.cookies.get(settings.COOKIE_KEY)
|
||||
if not session_id:
|
||||
response.delete_cookie(key=settings.COOKIE_KEY)
|
||||
return ReturnValue(status=200, data='Logged out')
|
||||
user_service.delete_session(db=db, user_ss=session_id)
|
||||
response.delete_cookie(key=settings.COOKIE_KEY)
|
||||
return ReturnValue(status=200, data='Logged out')
|
||||
|
@ -1,7 +1,7 @@
|
||||
from typing import ClassVar, Protocol, TypeVar
|
||||
from typing import ClassVar, TypeVar
|
||||
from humps import camelize
|
||||
from enum import Enum
|
||||
from pydantic import UUID4, BaseModel, ConfigDict
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
|
||||
T = TypeVar("T", bound=BaseModel)
|
||||
|
||||
|
@ -1,5 +1,6 @@
|
||||
from datetime import datetime
|
||||
from pydantic import BaseModel, ConfigDict
|
||||
from uuid import UUID
|
||||
from pydantic import ConfigDict
|
||||
from fastapi import Form
|
||||
|
||||
from fuware.schemas.fuware_model import FuwareModel
|
||||
@ -15,7 +16,7 @@ class UserCreate(UserRequest):
|
||||
name: str
|
||||
|
||||
class PrivateUser(UserBase):
|
||||
id: str
|
||||
id: UUID
|
||||
name: str
|
||||
is_admin: bool
|
||||
is_lock: bool
|
||||
|
@ -1,12 +1,14 @@
|
||||
|
||||
from fastapi import HTTPException
|
||||
from sqlalchemy.orm import Session
|
||||
from fuware.core.message_code import message_code
|
||||
from fuware.core.security.hasher import get_hasher
|
||||
from fuware.repos import RepositoryUsers
|
||||
from fuware.schemas import UserRequest, UserCreate
|
||||
from fuware.services._base_service import BaseService
|
||||
|
||||
hasher = get_hasher()
|
||||
message = message_code()
|
||||
|
||||
class UserService(BaseService):
|
||||
def __init__(self):
|
||||
@ -21,16 +23,19 @@ class UserService(BaseService):
|
||||
def create(self, db: Session, user: UserCreate):
|
||||
return self.repos.create(db=db, user=user)
|
||||
|
||||
def check_exist(self, db: Session, user: UserRequest):
|
||||
def check_exist(self, user: UserRequest):
|
||||
db_user = self.get_by_username(username=user.username)
|
||||
if not db_user:
|
||||
raise HTTPException(status_code=401, detail="Your username or password input is wrong!")
|
||||
raise HTTPException(status_code=401, detail=message.WRONG_INPUT)
|
||||
if not hasher.verify(password=user.password, hashed=db_user.password):
|
||||
raise HTTPException(status_code=401, detail="Your username or password input is wrong!")
|
||||
raise HTTPException(status_code=401, detail=message.WRONG_INPUT)
|
||||
if db_user.is_lock is True:
|
||||
raise HTTPException(status_code=401, detail="Your Account is banned")
|
||||
raise HTTPException(status_code=401, detail=message.ACCOUNT_LOCK)
|
||||
return db_user
|
||||
|
||||
def check_login(self, db: Session, user_id: str):
|
||||
db_session = self.repos.login(db=db, user_id=user_id)
|
||||
return db_session
|
||||
return db_session.session
|
||||
|
||||
def delete_session(self, db: Session, user_ss: str):
|
||||
self.repos.logout(db=db, user_ss=user_ss)
|
||||
|
Reference in New Issue
Block a user