finally, queue logic
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
from .secret import SECRET_KEY
|
||||
|
||||
ALGORITHM = "HS256"
|
||||
ACCESS_TOKEN_EXPIRE_MINUTES = 30
|
||||
ACCESS_TOKEN_EXPIRE_WEEKS = 2
|
||||
|
||||
@ -34,11 +34,35 @@ class AnonymousUser(Base):
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
name = Column(String, index=True)
|
||||
|
||||
parts_in_queues = relationship("QueueUser", backref="user", lazy="dynamic")
|
||||
|
||||
|
||||
class Queue(Base):
|
||||
__tablename__ = "queues"
|
||||
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
||||
name = Column(String, index=True)
|
||||
description = Column(String, index=True)
|
||||
owner_id = Column(UUID(as_uuid=True), ForeignKey("users.id"))
|
||||
start_time = Column(DateTime, nullable=True)
|
||||
|
||||
users = relationship("QueueUser", backref="queue", lazy="dynamic")
|
||||
|
||||
|
||||
class QueueUser(Base):
|
||||
__tablename__ = "queueuser"
|
||||
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
user_id = Column(UUID(as_uuid=True), ForeignKey("anonymoususers.id"))
|
||||
queue_id = Column(UUID(as_uuid=True), ForeignKey("queues.id"))
|
||||
position = Column(Integer)
|
||||
passed = Column(Boolean, default=False)
|
||||
|
||||
|
||||
class QueueLog(Base):
|
||||
__tablename__ = "queuelog"
|
||||
|
||||
id = Column(UUID(as_uuid=True), primary_key=True, default=uuid.uuid4)
|
||||
action = Column(String)
|
||||
created = Column(DateTime, default=datetime.datetime.utcnow)
|
||||
|
||||
@ -34,7 +34,7 @@ async def login_for_access_token(
|
||||
detail="Incorrect username or password",
|
||||
headers={"WWW-Authenticate": "Bearer"},
|
||||
)
|
||||
access_token_expires = timedelta(minutes=jwt_config.ACCESS_TOKEN_EXPIRE_MINUTES)
|
||||
access_token_expires = timedelta(weeks=jwt_config.ACCESS_TOKEN_EXPIRE_WEEKS)
|
||||
access_token = services.create_access_token(
|
||||
data={"sub": user.username}, expires_delta=access_token_expires
|
||||
)
|
||||
|
||||
@ -46,7 +46,7 @@ def create_access_token(data: dict, expires_delta: Union[timedelta, None] = None
|
||||
if expires_delta:
|
||||
expire = datetime.now(timezone.utc) + expires_delta
|
||||
else:
|
||||
expire = datetime.now(timezone.utc) + timedelta(minutes=15)
|
||||
expire = datetime.now(timezone.utc) + timedelta(weeks=2)
|
||||
to_encode.update({"exp": expire})
|
||||
encoded_jwt = jwt.encode(
|
||||
to_encode, jwt_config.SECRET_KEY, algorithm=jwt_config.ALGORITHM
|
||||
@ -90,6 +90,24 @@ async def get_current_user(
|
||||
return user
|
||||
|
||||
|
||||
async def get_current_user_or_none(
|
||||
token: Annotated[str, Depends(oauth2_scheme)],
|
||||
db: Annotated[Session, Depends(get_db)],
|
||||
) -> Union[schemas.UserInDB, None]:
|
||||
try:
|
||||
payload = jwt.decode(
|
||||
token, jwt_config.SECRET_KEY, algorithms=[jwt_config.ALGORITHM]
|
||||
)
|
||||
username: str = payload.get("sub")
|
||||
if username is None:
|
||||
raise credentials_exception
|
||||
token_data = schemas.TokenData(username=username)
|
||||
except JWTError:
|
||||
return None
|
||||
user = get_user_by_username(db, username=token_data.username)
|
||||
return user
|
||||
|
||||
|
||||
async def get_current_active_user(
|
||||
current_user: Annotated[schemas.User, Depends(get_current_user)],
|
||||
):
|
||||
|
||||
@ -32,6 +32,13 @@ async def user_queues_list(
|
||||
return queues
|
||||
|
||||
|
||||
@router.get("/{queue_id}")
|
||||
async def user_queues_list(
|
||||
queue: Annotated[schemas.QueueDetail, Depends(services.get_detailed_queue)],
|
||||
) -> schemas.QueueDetail:
|
||||
return queue
|
||||
|
||||
|
||||
@router.post("/")
|
||||
async def create_queue(
|
||||
new_queue: schemas.Queue,
|
||||
|
||||
@ -25,3 +25,8 @@ class QueueInDb(Queue):
|
||||
|
||||
class Config:
|
||||
from_attributes = True
|
||||
|
||||
|
||||
class QueueDetail(Queue):
|
||||
id: UUID
|
||||
participants: ParticipantInfo
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
from fastapi import Depends
|
||||
from fastapi import Depends, HTTPException, status
|
||||
from typing import Annotated
|
||||
from sqlalchemy.orm import Session
|
||||
from uuid import UUID
|
||||
|
||||
from ...dependencies import get_db
|
||||
from ...db import models
|
||||
@ -28,3 +29,25 @@ def create_queue(
|
||||
db.add(q)
|
||||
db.commit()
|
||||
return schemas.QueueInDb.model_validate(q)
|
||||
|
||||
|
||||
def get_detailed_queue(
|
||||
queue_id: UUID,
|
||||
db: Annotated[Session, Depends(get_db)],
|
||||
) -> schemas.QueueDetail:
|
||||
q = db.query(models.Queue).filter(models.Queue.id == queue_id).first()
|
||||
print("\n\n", queue_id, "\n\n", flush=True)
|
||||
if q:
|
||||
return schemas.QueueDetail(
|
||||
id=q.id,
|
||||
name=q.name,
|
||||
description=q.description,
|
||||
participants=schemas.ParticipantInfo(
|
||||
total=q.users.count(),
|
||||
remaining=q.users.filter(models.QueueUser.passed == False).count(),
|
||||
),
|
||||
)
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_404_NOT_FOUND,
|
||||
detail="Not Found",
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user