Ananto30/zero

View on GitHub
examples/order_management/gateway/src/main.py

Summary

Maintainability
A
0 mins
Test Coverage
import logging
from typing import Optional

from aiohttp import ClientSession, web

from zero import AsyncZeroClient

log = logging.getLogger(__name__)

auth_service = AsyncZeroClient("auth", 6000)
user_service = AsyncZeroClient("user", 6001)
order_service = AsyncZeroClient("order", 6002)


async def login(request):
    data = await request.json()
    username = data.get("username")
    password = data.get("password")
    jwt = await user_service.call("login", (username, password))
    if "error" in jwt:
        return web.json_response(jwt, status=401)
    return web.json_response({"jwt": jwt})


async def profile(request):
    jwt = request.headers.get("Authorization")
    if not jwt:
        return web.json_response({"error": "Missing Authorization header"}, status=401)
    jwt = jwt.split(" ")[1]
    auth = await auth_service.call("verify_jwt", jwt)
    if "error" in auth:
        return web.json_response(auth, status=401)

    username = auth.get("username")
    user = await user_service.call("get_user", username)
    return web.json_response(user)


async def get_orders(request):
    jwt = request.headers.get("Authorization")
    if not jwt:
        return web.json_response({"error": "Missing Authorization header"}, status=401)
    jwt = jwt.split(" ")[1]
    auth = await auth_service.call("verify_jwt", jwt)
    if "error" in auth:
        return web.json_response(auth, status=401)

    username = auth.get("username")
    user = await user_service.call("get_user", username)
    orders = await order_service.call("get_orders", user.get("id"))
    return web.json_response(orders)


async def add_order(request):
    jwt = request.headers.get("Authorization")
    if not jwt:
        return web.json_response({"error": "Missing Authorization header"}, status=401)
    jwt = jwt.split(" ")[1]
    auth = await auth_service.call("verify_jwt", jwt)
    if "error" in auth:
        return web.json_response(auth, status=401)

    request_data = await request.json()
    items = request_data.get("items")

    username = auth.get("username")
    user = await user_service.call("get_user", username)
    data = {"user_id": user.get("id"), "items": items}
    created = await order_service.call("add_order", data)
    if created:
        return web.json_response({"status": "success"})
    return web.json_response({"error": "Failed to create order"}, status=500)


app = web.Application()
app.router.add_post("/api/v1/login", login)
app.router.add_get("/api/v1/profile", profile)
app.router.add_get("/api/v1/orders", get_orders)
app.router.add_post("/api/v1/orders", add_order)