from fastapi import FastAPI,Request,HTTPException,Response from pydantic import BaseModel from fastapi.responses import JSONResponse from components.mongodbconnection import provideClient from components.checkaccountexists import checkAccount from components.endpointscheck import checkEndpoints from components.dynamicendpointscheck import checkDynamicEndpoints from components.updatedynamicendpoint import UpdateDynamicEndpoint from components.getinvoices import GetInvoices from components.updateendpointprice import UpdateEndpointPrice from components.updatedynamicendpointprice import UpdateDynamicEndpointPrice from openkitx403 import OpenKit403Middleware import uuid from fastapi.middleware.cors import CORSMiddleware import json import base64 from components.checktoken import TokenCheck from components.middleware import x401Kit app=FastAPI() client=provideClient() origins=[ "http://localhost:3000", "http://localhost:3001" ] app.add_middleware( CORSMiddleware, allow_origins=origins, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], ) ''' app.add_middleware( OpenKit403Middleware, audience="https://itsvelocity-velocity.hf.space/", issuer="my-api-v1", #token_gate=TokenCheck, excluded_paths=[ "/setupaccount", "/checkaccount", "/register_endpoint", "/register_dynamic_endpoint", "/delete_endpoint", "/delete_dynamic_endpoint", "/checkendpoints", "/checkdynamicendpoints", "/update_dynamic_endpoint", "/update_endpoint_price", "/update_dynamic_endpoint_price", "/docs", "/openapi.json", "/invoices" ] ) ''' app.add_middleware( x401Kit, protected_paths=[ "/custom_account_login" ], required_mint="3d4XyPWkUJzruF5c2qc1QfpLgsaNaDLMtTya1bWBpump", mint_amount=100000, helius_api_key="", geo_code=False, geo_code_locs=["IN"] ) db=client["x402ify_db"] coll=db["x402ify_col"] marketplace=db["x402marketplace"] sdkdb=db["sdklogs_db"] sdkcol=sdkdb["sdklogs_col"] class SetupPayload(BaseModel): owner:str class RegisterPayload(BaseModel): endpoint:str owner:str description:str meta:str price:str #pay_per_request:bool class RegisterPayloadDynamic(BaseModel): endpoint:str owner:str description:str tag:str meta:str price:str #pay_per_request:bool class RegisterAgent(BaseModel): agent:str owner:str description:str meta:str price:str class Update(BaseModel): owner:str tag:str newendpoint:str class Owner(BaseModel): owner:str class Delete(BaseModel): owner:str endpoint_linker:str class Invoice(BaseModel): owner:str class UpdatePrice(BaseModel): owner:str endpoint_linker:str price:str def saveToMarket(payload): marketplace.update_one( {"owner": "system"}, {"$push": {"market": payload}} ) def UpdateMarketData(endpoint_method,endpoint_linker,status_code): call_success = 200 <= status_code < 300 marketplace.update_one( { "owner": "system" }, { "$set": { "market.$[elem].endpoint_method":endpoint_method, }, "$inc": { "market.$[elem].calls": 1, "market.$[elem].failures": 0 if call_success else 1 } }, array_filters=[{ "elem.endpoint_linker": endpoint_linker }] ); #POST requests proxy #GET proxy with query params #'''post proxy tester''' @app.post("/tester") async def Tester(request:Request): body=await request.json() return {"data":body.get("name")} @app.get("/accountlogin") def AccountLogin(request:Request): return {"message":"login"} @app.get("/custom_account_login") def CustomAccountLogin(request:Request): return {"address":""} #'''Account Setup''' @app.post("/setupaccount") def SetupAccount(data:Owner): payload={ "owner":data.owner, "endpoints":[], "dynamicendpoints":[], "agents":[] } coll.insert_one(payload) return {"status":True} #'''Account Check ''' @app.post("/checkaccount") def checkaccount(data:Owner): status=checkAccount(data.owner) print(data) if status==True: return {'status':True} else: return {"status":False} #''' Regular Endpoint Registration ''' @app.post("/register_endpoint") def RegisterEndpoint(data:RegisterPayload): try: document=coll.find_one({'owner':data.owner}) endpoints=document["endpoints"] if len(endpoints) > 0: for endpointobject in endpoints: if endpointobject["endpoint"]==data.endpoint: return {"status":False,"message":"endpoint already present"} short_id = str(uuid.uuid4())[:5] short_id_e=short_id+"x402" payload={ "owner":data.owner, "endpoint":data.endpoint, "meta":data.meta, "endpoint_linker":short_id_e, "price":data.price, "invoices":[] #"pay_per_request":data.pay_per_request } coll.update_one( {"owner": data.owner}, {"$push": {"endpoints": payload}} ) marketpayload={ "owner":data.owner, "endpoint_linker":short_id_e, "meta":data.meta, "description":data.description, "endpoint_method":"", "price":data.price, "endpoint_mcp_base":"https://mcpv100-production.up.railway.app/mcp:8080", "calls":0, "failures":0 } saveToMarket(marketpayload) return {"status":True,"x402ify_tag":short_id_e,"message":"done"} except Exception as e: return {"status":False,"x402ify_tag":str(e),"message":"error"} #''' Dynamic Endpoint Creation ''' @app.post("/register_dynamic_endpoint") async def RegisterDynamicEndpoint(data:RegisterPayloadDynamic): try: document=coll.find_one({'owner':data.owner}) endpoints=document["dynamicendpoints"] if len(endpoints) > 0: for endpointobject in endpoints: if endpointobject["endpoint"]==data.endpoint: return {"status":False,"message":"endpoint already present"} payload={ "owner":data.owner, "endpoint":data.endpoint, "description":data.description, "meta":data.meta, "endpoint_linker":f"{data.tag}", "price":data.price, "invoices":[] #"pay_per_request":data.pay_per_request } coll.update_one( {"owner": data.owner}, {"$push": {"dynamicendpoints": payload}} ) marketpayload={ "owner":data.owner, "endpoint_linker":short_id_e, "meta":data.meta, "description":data.description, "endpoint_method":"", "price":data.price, "endpoint_mcp_base":"https://mcpv100-production.up.railway.app/mcp:8080", "calls":0, "failures":0 } saveToMarket(marketpayload) return {"status":True,"x402ify_tag":f"{data.tag}","message":"done"} except Exception as e: return {"status":False,"x402ify_tag":str(e),"message":"error"} #'''Regular Endpoint Deletion''' @app.post("/delete_endpoint") def DeleteEndpoint(data:Delete): try: coll.update_one( {"owner": data.owner}, {"$pull": {"endpoints": {"endpoint_linker": data.endpoint_linker}}}) return {"status":True} except Exception as e: return {"status":False} #'''Dynamic Endpoint Deletion ''' @app.post("/delete_dynamic_endpoint") def DeleteDynamicEndpoint(data:Delete): try: coll.update_one( {"owner": data.owner}, {"$pull": {"dynamicendpoints": {"endpoint_linker": data.endpoint_linker}}}) return {"status":True} except Exception as e: return {"status":False} #'''Regular Endpoint Fetching''' @app.post("/checkendpoints") def checkEP(data:Owner): print(data.owner) endpoints=checkEndpoints(data.owner) return endpoints #''' Dynamic Endpoint Fetching ''' @app.post("/checkdynamicendpoints") def checkDEP(data:Owner): dendpoints=checkDynamicEndpoints(data.owner) return dendpoints #''' Dynamic Endpoint Updation ''' @app.post("/update_dynamic_endpoint") def UpdateDynamic(data:Update): print(data.tag) status=UpdateDynamicEndpoint(data.owner,data.tag,data.newendpoint) return status @app.post("/update_endpoint_price") def UpdateEndpointPriceRoute(data:UpdatePrice): status=UpdateEndpointPrice(data.owner,data.endpoint_linker,data.price) return status @app.post("/update_dynamic_endpoint_price") def UpdateDynamicEndpointPriceRoute(data:UpdatePrice): status=UpdateDynamicEndpointPrice(data.owner,data.endpoint_linker,data.price) return status #'''Fetch Invoices ''' @app.post("/invoices") def getaudit(data:Invoice): invoices=GetInvoices(data.owner) result = [] for item in invoices: owner = item.get("owner") endpoint = item.get("endpoint") endpoint_linker = item.get("endpoint_linker") signature = item.get("signature") #Navigate into nested fields payment = item["details"]["payment_request"] #Some entries use "accepts", some use flat structure if "accepts" in payment: pay_info = payment["accepts"][0] else: pay_info = payment payTo = pay_info.get("payTo") asset = pay_info.get("asset") amount = pay_info.get("maxAmountRequired") result.append({ "owner": owner, "endpoint_linker": endpoint_linker, "endpoint": endpoint, "signature": signature, "payTo": payTo, "asset": asset, "amount": amount }) return {"invoices":result} @app.get("/marketdata") def MarketData(request:Request): marketdocument=marketplace.find_one({"owner":"system"}) marketdata=marketdocument["market"] return {"market":marketdata} #'''GET Endpoints Proxy endpoint''' @app.get("/sdklogs/{id}") def SDKLog(id): document=col.find_one({"owner":"system"}) details=None if document: logs=document["logs"] for data in logs: if data.signer==id: details=data return JSONResponse(content={"details":details})