diff --git a/devterm/server/routes.py b/devterm/server/routes.py new file mode 100644 index 0000000..7b385e6 --- /dev/null +++ b/devterm/server/routes.py @@ -0,0 +1,141 @@ +from fastapi import APIRouter, Request +from fastapi.responses import HTMLResponse +from fastapi.templating import Jinja2Templates +from pathlib import Path + +from devterm.tools.json_tool import format_json, validate_json +from devterm.tools.jwt_tool import decode_jwt +from devterm.tools.cron_tool import validate_cron, get_next_run +from devterm.tools.base64_tool import encode_base64, decode_base64 +from devterm.tools.url_tool import encode_url, decode_url + +router = APIRouter() + +templates = Jinja2Templates(directory=str(Path(__file__).parent.parent / "templates")) + + +async def get_body(request: Request) -> str: + body = await request.body() + return body.decode("utf-8") if body else "" + + +@router.get("/json", response_class=HTMLResponse) +async def json_page(request: Request): + return templates.TemplateResponse("json.html", {"request": request}) + + +@router.post("/json/format") +async def format_json_endpoint(request: Request): + data = await get_body(request) + try: + if not data: + return {"error": "No data provided"} + result = format_json(data) + return {"result": result, "valid": True} + except Exception as e: + return {"error": str(e), "valid": False} + + +@router.post("/json/validate") +async def validate_json_endpoint(request: Request): + data = await get_body(request) + try: + if not data: + return {"error": "No data provided"} + is_valid = validate_json(data) + return {"valid": is_valid} + except Exception as e: + return {"error": str(e), "valid": False} + + +@router.get("/jwt", response_class=HTMLResponse) +async def jwt_page(request: Request): + return templates.TemplateResponse("jwt.html", {"request": request}) + + +@router.post("/jwt/decode") +async def decode_jwt_endpoint(request: Request): + token = await get_body(request) + try: + if not token: + return {"error": "No token provided"} + result = decode_jwt(token) + return result + except Exception as e: + return {"error": str(e)} + + +@router.get("/cron", response_class=HTMLResponse) +async def cron_page(request: Request): + return templates.TemplateResponse("cron.html", {"request": request}) + + +@router.post("/cron/validate") +async def validate_cron_endpoint(request: Request): + cron_expr = await get_body(request) + try: + if not cron_expr: + return {"error": "No cron expression provided"} + is_valid = validate_cron(cron_expr) + next_run = get_next_run(cron_expr) if is_valid else None + return {"valid": is_valid, "next_run": next_run} + except Exception as e: + return {"error": str(e), "valid": False} + + +@router.get("/base64", response_class=HTMLResponse) +async def base64_page(request: Request): + return templates.TemplateResponse("base64.html", {"request": request}) + + +@router.post("/base64/encode") +async def encode_base64_endpoint(request: Request): + data = await get_body(request) + try: + if not data: + return {"error": "No data provided"} + result = encode_base64(data) + return {"result": result} + except Exception as e: + return {"error": str(e)} + + +@router.post("/base64/decode") +async def decode_base64_endpoint(request: Request): + data = await get_body(request) + try: + if not data: + return {"error": "No data provided"} + result = decode_base64(data) + return {"result": result} + except Exception as e: + return {"error": str(e)} + + +@router.get("/url", response_class=HTMLResponse) +async def url_page(request: Request): + return templates.TemplateResponse("url.html", {"request": request}) + + +@router.post("/url/encode") +async def encode_url_endpoint(request: Request): + data = await get_body(request) + try: + if not data: + return {"error": "No data provided"} + result = encode_url(data) + return {"result": result} + except Exception as e: + return {"error": str(e)} + + +@router.post("/url/decode") +async def decode_url_endpoint(request: Request): + data = await get_body(request) + try: + if not data: + return {"error": "No data provided"} + result = decode_url(data) + return {"result": result} + except Exception as e: + return {"error": str(e)}