nova-api/api/core.py

94 lines
2.6 KiB
Python
Raw Normal View History

2023-08-01 02:38:55 +02:00
"""User management."""
import os
import json
import fastapi
2023-08-15 13:55:12 +02:00
from db.users import UserManager
2023-08-01 02:38:55 +02:00
2023-08-04 03:30:56 +02:00
from dhooks import Webhook, Embed
2023-08-01 02:38:55 +02:00
from dotenv import load_dotenv
load_dotenv()
router = fastapi.APIRouter(tags=['core'])
async def check_core_auth(request):
2023-08-13 11:16:23 +02:00
"""
### Checks the request's auth
Auth is taken from environment variable `CORE_API_KEY`
"""
2023-08-01 02:38:55 +02:00
received_auth = request.headers.get('Authorization')
if received_auth != os.getenv('CORE_API_KEY'):
return fastapi.Response(status_code=403, content='Invalid or no API key given.')
@router.get('/users')
async def get_users(discord_id: int, incoming_request: fastapi.Request):
2023-08-13 11:16:23 +02:00
auth = await check_core_auth(incoming_request)
if auth:
return auth
2023-08-01 02:38:55 +02:00
2023-08-13 11:16:23 +02:00
# Get user by discord ID
manager = UserManager()
user = await manager.user_by_discord_id(discord_id)
if not user:
2023-08-01 02:38:55 +02:00
return fastapi.Response(status_code=404, content='User not found.')
2023-08-01 02:38:55 +02:00
return user
2023-08-06 21:42:07 +02:00
async def new_user_webhook(user: dict) -> None:
2023-08-04 03:30:56 +02:00
dhook = Webhook(os.getenv('DISCORD_WEBHOOK__USER_CREATED'))
embed = Embed(
description='New User',
color=0x90ee90,
)
2023-08-04 03:30:56 +02:00
2023-08-06 21:42:07 +02:00
embed.add_field(name='ID', value=str(user['_id']), inline=False)
embed.add_field(name='Discord', value=user['auth']['discord'] or '-')
embed.add_field(name='Github', value=user['auth']['github'] or '-')
2023-08-04 03:30:56 +02:00
dhook.send(embed=embed)
2023-08-01 02:38:55 +02:00
@router.post('/users')
async def create_user(incoming_request: fastapi.Request):
auth_error = await check_core_auth(incoming_request)
if auth_error:
return auth_error
try:
payload = await incoming_request.json()
discord_id = payload.get('discord_id')
except (json.decoder.JSONDecodeError, AttributeError):
return fastapi.Response(status_code=400, content='Invalid or no payload received.')
# Create the user
manager = UserManager()
user = await manager.create(discord_id)
2023-08-06 21:42:07 +02:00
await new_user_webhook(user)
2023-08-04 03:30:56 +02:00
2023-08-01 02:38:55 +02:00
return user
2023-08-18 21:23:00 +02:00
@router.put('/users')
async def update_user(incoming_request: fastapi.Request):
auth_error = await check_core_auth(incoming_request)
if auth_error:
return auth_error
try:
payload = await incoming_request.json()
discord_id = payload.get('discord_id')
updates = payload.get('updates')
except (json.decoder.JSONDecodeError, AttributeError):
return fastapi.Response(status_code=400, content='Invalid or no payload received.')
# Update the user
manager = UserManager()
user = await manager.update_by_discord_id(discord_id, updates)
return user