nova-api/api/db/logs.py

95 lines
2.6 KiB
Python
Raw Normal View History

import os
2023-08-03 03:50:04 +02:00
import time
from dotenv import load_dotenv
from motor.motor_asyncio import AsyncIOMotorClient
2023-08-04 03:30:56 +02:00
from helpers import network
load_dotenv()
2023-08-06 21:42:07 +02:00
UA_SIMPLIFY = {
'Windows NT': 'W',
'Mozilla/5.0': 'M',
'Win64; x64': '64',
'Safari/537.36': 'S',
'AppleWebKit/537.36 (KHTML, like Gecko)': 'K',
}
2023-08-12 18:20:18 +02:00
## MONGODB Setup
conn = AsyncIOMotorClient(os.getenv('MONGO_URI'))
async def _get_collection(collection_name: str):
2023-08-16 15:06:16 +02:00
return conn[os.getenv('MONGO_NAME', 'nova-test')][collection_name]
2023-08-06 21:42:07 +02:00
async def replacer(text: str, dict_: dict) -> str:
2023-08-13 17:12:35 +02:00
# This seems to exist for a very specific and dumb purpose :D
2023-08-06 21:42:07 +02:00
for k, v in dict_.items():
text = text.replace(k, v)
return text
2023-08-04 03:30:56 +02:00
async def log_api_request(user: dict, incoming_request, target_url: str):
2023-08-13 17:12:35 +02:00
"""Logs the API Request into the database.
No input prompt is logged, however data such as IP & useragent is noted.
This would be useful for security reasons. Other minor data is also collected.
Args:
user (dict): User dict object
incoming_request (_type_): Request
target_url (str): The URL the api request was targetted to.
Returns:
_type_: _description_
"""
2023-08-12 18:20:18 +02:00
db = await _get_collection('logs')
payload = {}
try:
payload = await incoming_request.json()
except Exception as exc:
if 'JSONDecodeError' in str(exc):
pass
2023-08-04 03:30:56 +02:00
model = payload.get('model')
2023-08-04 17:29:49 +02:00
ip_address = await network.get_ip(incoming_request)
2023-08-06 21:42:07 +02:00
useragent = await replacer(incoming_request.headers.get('User-Agent'), UA_SIMPLIFY)
new_log_item = {
2023-08-03 03:50:04 +02:00
'timestamp': time.time(),
2023-08-04 03:30:56 +02:00
'method': incoming_request.method,
'path': incoming_request.url.path,
2023-08-06 21:42:07 +02:00
'user_id': str(user['_id']),
'security': {
2023-08-04 17:29:49 +02:00
'ip': ip_address,
2023-08-06 21:42:07 +02:00
'useragent': useragent,
},
'details': {
'model': model,
'target_url': target_url
}
}
2023-08-06 21:42:07 +02:00
inserted = await db.insert_one(new_log_item)
log_item = await db.find_one({'_id': inserted.inserted_id})
return log_item
async def by_id(log_id: str):
2023-08-12 18:20:18 +02:00
db = await _get_collection('logs')
2023-08-06 21:42:07 +02:00
return await db.find_one({'_id': log_id})
async def by_user_id(user_id: str):
2023-08-12 18:20:18 +02:00
db = await _get_collection('logs')
2023-08-06 21:42:07 +02:00
return await db.find({'user_id': user_id})
async def delete_by_id(log_id: str):
2023-08-12 18:20:18 +02:00
db = await _get_collection('logs')
2023-08-06 21:42:07 +02:00
return await db.delete_one({'_id': log_id})
async def delete_by_user_id(user_id: str):
2023-08-12 18:20:18 +02:00
db = await _get_collection('logs')
2023-08-06 21:42:07 +02:00
return await db.delete_many({'user_id': user_id})
if __name__ == '__main__':
pass