X Tutup
Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 14 additions & 3 deletions race-ms/api/matchmaker.py
Original file line number Diff line number Diff line change
@@ -1,12 +1,23 @@
from fastapi import APIRouter
from fastapi import APIRouter, Depends, Request

import models
import services

router = APIRouter(
prefix='/lobby',
)

@router.post("/", tags=["lobby"])
async def create_lobby():
return [{"username": "Rick"}, {"username": "Morty"}]
async def create_lobby(
request: Request,
service: services.MultiplayerService = Depends(),
) -> models.CreateLobbyResponse:

lobby_id = services.generate_lobby_id(5)
token = request.headers['authorization']
user = service.validate_token(token)

return {'user': user, 'lobby_id': lobby_id}

@router.get("/{lobby}", tags=["lobby"])
async def get_lobby(lobby: str):
Expand Down
10 changes: 1 addition & 9 deletions race-ms/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,9 @@

class Settings(BaseSettings):
ALLOWED_HOSTS: str
PS_URL: str
PS_PORT: str
PS_LOGIN: str
PS_DB_NAME: str
PS_PASSWORD: str
REDIS_URL: str
REDIS_PORT: str

def get_db_uri(self):
print(f"postgres://{self.PS_LOGIN}:{self.PS_PASSWORD}@{self.PS_URL}:5432/{self.PS_DB_NAME}")
return f"postgres://{self.PS_LOGIN}:{self.PS_PASSWORD}@{self.PS_URL}:5432/{self.PS_DB_NAME}"
JWT_SECRET_KEY: str

class Config:
env_file = ".env"
Expand Down
3 changes: 2 additions & 1 deletion race-ms/models/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from .tasks import Task, TaskResponse
from .tasks import Task, TaskResponse
from .users import User, CreateLobbyResponse
1 change: 0 additions & 1 deletion race-ms/models/tasks.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from pydantic import BaseModel
from typing import Optional


class Task(BaseModel):
Expand Down
13 changes: 13 additions & 0 deletions race-ms/models/users.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
from pydantic import BaseModel
from typing import Literal

class User(BaseModel):
id: str
username: str
exp: int
token_type: Literal["access"]


class CreateLobbyResponse(BaseModel):
user: User
lobby_id: str
3 changes: 2 additions & 1 deletion race-ms/services/__init__.py
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
from .learn import check_regex
from .learn import check_regex
from .multiplayer import *
48 changes: 48 additions & 0 deletions race-ms/services/multiplayer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import random
import string
#from jose import jwt, JWTError
import jwt
from fastapi import status, HTTPException, Depends
from pydantic import ValidationError

import models
from config import settings


def generate_lobby_id(length: int) -> str:
result_str = ''.join(random.choice(string.ascii_letters) for i in range(length))
return result_str

def get_current_user(token: str):
return MultiplayerService.validate_token(token)

class MultiplayerService():

@classmethod
def validate_token(cls, token: str):
exception = HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail='could not authorize credentials',
headers={
'WWW-authenticate': 'Bearer'
},
)
try:
payload = jwt.decode(
token,
settings.JWT_SECRET_KEY,
algorithms=['HS256']
)
except jwt.exceptions.InvalidSignatureError:
raise exception from None

try:
user = models.User.parse_obj(payload)
except ValidationError:
raise exception from None

return user

def generate_lobby_id(length: int) -> str:
result_str = ''.join(random.choice(string.ascii_letters) for i in range(length))
return result_str
X Tutup