diff --git a/.gitignore b/.gitignore index ae2e615..6331107 100644 --- a/.gitignore +++ b/.gitignore @@ -34,6 +34,5 @@ ENV/ # Sphinx documentation docs/_build/ - - -.vscode/ \ No newline at end of file +.vscode/ +.idea/ diff --git a/api/api.py b/api/api.py deleted file mode 100644 index e69de29..0000000 diff --git a/api/handler.py b/api/handler.py new file mode 100644 index 0000000..3dda286 --- /dev/null +++ b/api/handler.py @@ -0,0 +1,83 @@ +#!/usr/bin/env python3 + +import ujson +from aiohttp.web import Response +from mongo import client as m_client +import logging + + +async def add_user(request): + logging.info('READING THE DATA...') + # user_id_insert_request + user_data = await request.json() + user_id = user_data.get("_id") + # check if _id already exists + check_id = await m_client.do_find_one(user_id) + if not check_id: + logging.info('ADDING RECORDS...') + inserted_data = await m_client.do_insert(user_data) + logging.info('INSERTED DATA...') + # find the inserted_data + find_data = await m_client.do_find_one(inserted_data) + logging.debug('RECORDS: %s', find_data) + return Response(text=ujson.dumps(find_data), status=200) + logging.error('_ID ALREADY EXISTS...') + return Response(text='_id already exists !') + + +async def get_user(request): + logging.info('READING THE _id...') + # user_id_find_request + user_id = request.match_info.get('user_id') + + # to get all documents in the collection + if user_id == '0': + data = await m_client.do_find_all() + logging.info(data) + return Response(text=ujson.dumps(data, indent=1), status=200) + # to get mentioned _id + else: + # check if _id exists + user_data = await m_client.do_find_one(user_id) + if not user_data: + logging.error('INVALID _id %s!', user_id) + return Response(text='Invalid _id !') + logging.debug('RECORDS: %s', user_data) + return Response(text=ujson.dumps(user_data), status=200) + + +async def delete_user(request): + logging.info('READING THE _id...') + # user_id_delete_request + user_id = request.match_info.get('user_id') + # check if _id exists + user_data = await m_client.do_find_one(user_id) + if not user_data: + logging.error('INVALID _id %s!', user_id) + return Response(text='Invalid _id !') + await m_client.do_del(user_data) + logging.info('DATA DELETED...') + return Response(text='Deleted !', status=200) + + +async def update_user(request): + logging.info('READING THE _id...') + # user_id_update_request + user_id = request.match_info.get('user_id') + user_data = await request.json() + data = dict(user_data) + # check if _id exists + doc = await m_client.do_find_one(user_id) + if not doc: + logging.error('INVALID _id %s!', user_id) + return Response(text='Invalid _id !') + await m_client.do_update(user_id, data) + logging.info('DATA UPDATED...') + return Response(text='Updated !', status=200) + + +""" +async def count_user(request): + d = await m_client.do_count() + return Response(text=json.dumps(d), status=200) +""" diff --git a/app.json b/app.json new file mode 100644 index 0000000..59ac5b5 --- /dev/null +++ b/app.json @@ -0,0 +1,27 @@ +{ + "version": 1, + "disable_existing_loggers": false, + "formatters": { + "simple": { + "format": "%(asctime)s - %(name)s - %(levelname)s - %(message)s", + "date_fmt": "%m-%d-%Y %H:%M:%S" + } + }, + "handlers": { + "SysLog": { + "class": "logging.handlers.SysLogHandler", + "formatter": "simple", + "address": "/var/run/syslog", + "level": "DEBUG", + "facility": "LOG_SYSLOG" + } + }, + "loggers": { + "handlers": ["SysLog"], + "level": "DEBUG", + "propagate": false + } +} + + + diff --git a/logger.py b/logger.py new file mode 100644 index 0000000..08afcb3 --- /dev/null +++ b/logger.py @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +import json +import logging.config +from logging.handlers import SysLogHandler + + +class MyLogger: + + @staticmethod + def setup(logger_name: str=None): + + # loading_data_from_json_file + with open("app.json", "r", encoding="utf-8") as fd: + data = json.load(fd) + + # LOG_SYSLOG + syslog_loaded = data["handlers"]["SysLog"] + syslog_address = syslog_loaded["address"] + syslog_level = syslog_loaded["level"] + formatter = logging.Formatter(fmt=data["formatters"]["simple"]["format"], + datefmt=data["formatters"]["simple"]["date_fmt"]) + propagate = data["loggers"]["propagate"] + + # accessing_the_loaded_json_file_SYSLOG + logger = logging.getLogger(logger_name) + handler = SysLogHandler(address=syslog_address) + handler.setFormatter(formatter) + logger.setLevel(syslog_level) + logger.propagate = propagate + logger.addHandler(handler) + +# called in server.py diff --git a/mongo/client.py b/mongo/client.py index e69de29..fc7bc02 100644 --- a/mongo/client.py +++ b/mongo/client.py @@ -0,0 +1,39 @@ +#!/usr/bin/env python3 + +import motor +from motor.motor_asyncio import AsyncIOMotorClient +m_client = motor.motor_asyncio.AsyncIOMotorClient() + +db = m_client.m1 +collection = db.m1c + + +async def do_insert(user_data): + document = await collection.insert(user_data) + return document + + +async def do_find_one(user_id): + document = await collection.find_one(user_id) + return document + + +async def do_del(user_id): + await collection.delete_one(user_id) + + +async def do_update(user_id, user_data): + await collection.update({"_id": user_id}, {'$set': user_data}) + + +async def do_find_all(): + doc = collection.find() + return doc + + +""" +async def do_count(): + cnt = await collection.find().count() + print('%s Count of documents ' % cnt) + return cnt +""" diff --git a/requirements.txt b/requirements.txt index 9fa5a6d..f26e6ae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,5 @@ +ujson + +motor==1.2.1 + aiohttp==3.1.3 diff --git a/server.py b/server.py index d854fa2..d710b4f 100644 --- a/server.py +++ b/server.py @@ -1,5 +1,25 @@ #!/usr/bin/env python3 +from aiohttp import web +from api import handler +from logger import MyLogger + + def run(): - """ Starts the Server - """ + """ Starts the Server """ + + app = web.Application() + MyLogger().setup() + + app.router.add_get('/api/user/{user_id}', handler.get_user) + app.router.add_post('/api/user', handler.add_user) + app.router.add_put('/api/user/{user_id}', handler.update_user) + app.router.add_delete('/api/user/{user_id}', handler.delete_user) + + web.run_app(app) + + +run() + + + diff --git a/tests/.gitkeep b/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/test_handler.py b/tests/test_handler.py new file mode 100644 index 0000000..20beddc --- /dev/null +++ b/tests/test_handler.py @@ -0,0 +1,12 @@ +# GET all users +# curl -X GET http://:/api/user + +# GET user with matching +# curl -X GET http://:/api/user/ + +# CREATE user +# curl -X POST http://:/api/user -d {} + +# curl -X DELETE http://:/api/user/ +# +# curl -X PUT http://:/api/user/ -d {}