From 01413b9bf015630487e06f330447990213647b0a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Henrique=20Sebasti=C3=A3o?= Date: Thu, 21 Aug 2025 20:49:50 -0400 Subject: [PATCH] =?UTF-8?q?feat:=20Adicionando=20endpoint=20que=20verifica?= =?UTF-8?q?=20se=20nome=20de=20usu=C3=A1rio=20est=C3=A1=20dispon=C3=ADvel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pyproject.toml | 1 + server/main.py | 3 ++- server/routers/online_users.py | 43 ++++++++++++++++++++++++++++++++++ server/schemas/message.py | 5 ++++ 4 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 server/routers/online_users.py create mode 100644 server/schemas/message.py diff --git a/pyproject.toml b/pyproject.toml index 6bf5c80..0892077 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -47,6 +47,7 @@ quote-style = 'single' "settings.py" = ['D103', 'D101', 'D100'] "db.py" = ['D100'] "hasher.py" = ['D100'] +"online_users.py" = ['D100'] [tool.taskipy.tasks] run = 'uvicorn --reload --host 127.0.0.1 server.main:app' diff --git a/server/main.py b/server/main.py index c7c9325..7631cf9 100644 --- a/server/main.py +++ b/server/main.py @@ -5,7 +5,7 @@ from fastapi import FastAPI from server.db import redis_client -from server.routers import status, ws +from server.routers import online_users, status, ws description = """ Este servidor realiza o encaminhamento de mensagens entre usuários conectados @@ -49,3 +49,4 @@ async def clean_online_users(app: FastAPI): app.include_router(ws.router) app.include_router(status.router) +app.include_router(online_users.router) diff --git a/server/routers/online_users.py b/server/routers/online_users.py new file mode 100644 index 0000000..8f5754a --- /dev/null +++ b/server/routers/online_users.py @@ -0,0 +1,43 @@ +from fastapi import APIRouter, HTTPException, status + +from server.db import redis_client +from server.hasher import hash_id +from server.schemas.message import Message + +router = APIRouter(prefix='/online-users', tags=['Online Users']) + + +@router.get( + '/{user_id}', + response_model=Message, + summary='Verifica se o nome de usuário solicitado está disponível.', +) +async def check_username_availability(user_id: str): + """ + Verifica a disponibilidade de um nome de usuário no sistema. + + Este endpoint consulta o banco de dados Redis para determinar se o usuário + especificado já está registrado como "online". Caso o usuário esteja em uso, + a API retorna um erro de conflito (HTTP 409). Caso contrário, confirma que + o nome está disponível. + + Args: + user_id (str): O identificador único do usuário que se deseja verificar. + + Raises: + HTTPException: Retorna um erro 409 (Conflict) se o nome de usuário já + estiver em uso no momento. + + Returns: + Message: Um objeto contendo uma mensagem informando que o nome de usuário + está disponível. + + """ + is_online = await redis_client.sismember('online_users', hash_id(user_id)) + + if is_online: + raise HTTPException( + status.HTTP_409_CONFLICT, detail='Este nome de usuário não está disponível' + ) + + return {'message': 'O nome de usuário está disponível'} diff --git a/server/schemas/message.py b/server/schemas/message.py new file mode 100644 index 0000000..8b65c80 --- /dev/null +++ b/server/schemas/message.py @@ -0,0 +1,5 @@ +from pydantic import BaseModel + + +class Message(BaseModel): + message: str