# HPOS holochain API rewrite ## Motivation HPOS holochain API is an express app serving endpoints called by: - host console UI - holo-cli (via hpos-holochain-client) - regression tests - anything else??? It was never built with a production environment in mind and it obviously needs a re-write. Benefits of rewrite in rust: - strong typing of request/response payloads - rust's emphasis on error handling - interaction with Holochain via native holochain_conductor_api - good support of tests in rust (unit, integration) ## API ### `GET /happs/hosted/info` Returns info on each hosted happ in form of an array of objects with details Old: /hosted_happs Query params: - interval (optional, defaults to 1) - in days (? can I get infinity?) - quantity (optional, defaults to null) - null for all happs #### 200 ```json [{ id: "uhCkkK9aGip7W-QA2psB9ZqFmkTwJLzm_ifuvUTMw1zScpwzKZH97", name: "HoloFuel", bundleUrl: "https://holo-host.github.io/holo-hosting-app-rsm/releases/downloads/holofuel/0_1_6_alpha0/holofuel.0_1_6_alpha0-dev.happ", earnings: 0, enabled: true, hostedAgents: 0, hostedUrls: ["holofuel.dev.holotest.net"], id: "uhCkkK9aGip7W-QA2psB9ZqFmkTwJLzm_ifuvUTMw1zScpwzKZH97", isPaused: false, logoUrl: null, name: "HoloFuel", special_installed_app_id: null, usage: { bandwidth: 67157, cpu: 0, storage: 0 }, errors: [{ message": “servicelogger_not_installed”, code: 121 }] }] ``` ### `GET /happs/hosted/statistics` Returns statistics on hosting of hosted happs Old: /usage Query params: - interval (optional, defaults to 1) - in days (? can I get infinity?) #### 200 ```json { totalHostedAgents: 0, currentTotalStorage: 0, totalHostedHapps: 0, totalUsage: { cpu: 0, bandwidth: 0, } } ``` ### `GET /happs/core` Returns an app ID (as installed in holochain) of a core happ. Needed by UI for future zome calls to core happ. Old: /core_app_version #### 200 ```json { app_id: "core-app:0_3_8_alpha0::f1d1e96b-dc1c-44aa-a714-4a7e45e5aebf" } ``` #### 404 Not Found No core-happ found among installed happs #### 503 Service Unavailable Couldn't open connection to holochain #### 504 Gateway Timeout Websocket connection timeout ### `POST /happs/zome_call` Execute a zome call to app with `appId` and `roleId`. Old: /zome_call request payload: ```json { appId, roleId, zomeName, fnName, payload } ``` #### 200 Response of the zome call in json format ### `GET /host/preferences` Get host's default hosting preferences. Hosting preferences are used by service logger in billing for hosting. Old: /host_preferences #### 200 ```json { max_fuel_before_invoice: 1000, max_time_before_invoice: [86400,0], price_compute: 0.025, price_storage: 0.025, price_bandwidth: 0.025 } ``` ### `GET /host/earnings` Returns statistics on earnings from hosting. Includes an array of recent payment requests for hosting. Old: /host_earnings ```json { earnings: { last30days: 1006, last7days: 1006, lastday: 1006 }, holofuel: { balance: -6783 }, recentPayments: [{ id: "uhCEkzjtRtrb2Ip5kuZlmfhaG3Z5J_8mX9AkRAECyzBaZpd_5WsJD", amount:"1063.425", status:"Pending", type:"Request", direction:"Outgoing", createdDate:"1670240844322922", completedDate:null, expirationDate:null, counterparty:"uhCAkJX1suP92Jyp1_G7QbBTAkGEnLZsczbytOI9Zkfg86eMrZJ37", note:"Holo Hosting Invoice for \"Publisher Portal\" (...\"l5Y0j\")", proofOfServiceToken:"Dj8lClzGtuIU+fJPZHYa5+FyruKgYoSHJz67RN5gApVJXfABssEbgSDaqPRTDmuh7q06jxt6UppQNt9jR+lj3Q==", url:null, happ: { name:"Publisher Portal", id:"uhCkktpnpic_oJKfPKvvRsRIKXdCxHLGjcheCe14LEGH6Gchl5Y0j" }, invoiceDetails: { start: 1670239509213632, end: 1670240844292864, service_logs_range: { activity:[ "uhCkkb0G12f0q0p6Q1fGHNved23i-_g4NAPkzZeTxmwrktUGhQzBz", "uhCkkYPaP2CbZk-79Mfy4bOGGSZRa1uazBMRYYUSRZ2FcEC6PlkjN", "uhCkkrk1SOcS_fTmQerzhhKhyhY9Q9gpKP5vOwsG-69UPu9g2SQOj", "uhCkk1xPHfJuTQdJ6uXObUv2qXilZhO_1Uj64Gzeu8hGdkXuk1bgd", "uhCkk4KPv3I6XxYkceYFKOB9CW9QVLzzN4jgXgMW15xlY9Fropi27", "uhCkk0cQ_j0jIIOvWMJ8LG1DAmxttezjm5zGUt548MAlj1tZrAYbT", "uhCkk3HZpUWyejDRfK-NdPfLrE_jkp-340gCW_KFSpMO31q2Qe_5T", "uhCkkYBzqBsrKgRzQ0UcbzCIViXTTtSxYKZXcV5MC3y-dcEnx_uqg", "uhCkksMBcZyd09qAnsFVRQ1qNwYzMwMnMCMBon8FRCtSvJh8NMSQd", "uhCkkblDZDIACUqwjude0hcWJqHiFYre8fY-Jcky3yye8d3-IXlM7", "uhCkkRJnxcN5BgHPrSvwrU7TqAG68kS_0o9cQzyH7VOsa9KvQfbAQ", "uhCkku7ZRHsUrL1EPhFiC0MspdMjTgQJbn54W88HIMnleRSyBw3Sg", "uhCkkV3ktP36to5d3t3CXpCYNiIX4JwawNqGAuJHB3EZIwcBJfzkH", "uhCkkGFEqpbYbHUQsaV7yM1jpoj01-bEscjZLwRuYaMdN6KOtMqPc", "uhCkkUILSkoX32WLYKcMOVvwo_34sdsfsLkKnWYv_pqmhBOZTmsZA", "uhCkkIfskX1muWCujzmnJUSVDXwyns8H8Zu4XyTjYqWIN6ygkx1hq", "uhCkkqdTz92BVmNHvE6et9Txn_CJpscpohwpt0Rm8Pn7kvyY_F8qU", "uhCkkuPwEwWkRW_WPKAhT7iBEIpuRCvbvHmU00exzcMFcRdKIOx20", "uhCkk-IhSiaVoj78oLB2xtPmKjT0RQf1RMbXb_C-vY2KwAt3wgHmy", "uhCkkvt51SbNd-8elqRXfreKk02uRvXmzjhr_sx2qFBmoZ4Udp5_T", "uhCkkunsi01ojU831_Q--xdgmX2jWKQ7k-UvidO2w11X6EETHmTYQ", "uhCkkynfc1Q746swf66802wbgkWHRMnVFe-_keVe1ZHIz66jBbY4B", "uhCkkJK1lxxgIFF1-JRIgQ9lPofP_oH_03RHIXpEWmaZ1S74DwZL2", "uhCkkEhkl-jYjjbfWIypViqE-fiE4uytuadnbHueQQvw-nH_ZPP9a", "uhCkkRp1CbeILraAuKJlHHDpoo0T3ugKvc_VSUjT1lJ1g1VGzBmpq", "uhCkkRunfSZZsUAQwZi2zXRK-sfd33YzNjaAn81wdYIukRJGCISVu", "uhCkkbDLVRxGdi88Gxv9Mp6UibjO8zPxUxfquVk1rTucQlWS2kTUS", "uhCkkOR_E0rLVKKCMN-r6AL5JyHfn5r295YRNgbqQkppzLCNfrTvy", "uhCkkIy29ipzhA6QVin7Vmzmxwq7k1FTpiI1oXYC-ZzMmtSn4xrRR", "uhCkkYndMnDsGaf_eU9zty7TG_w5qbzmhq-sfsCgHRASA05IVKPbR", "uhCkk5LE8FAjKAEcR3PLLrQnfHPLqmL2vXLjK2YpNUW9acvnSXrbi", "uhCkkKhHaci2jU9wSaeCcqNzoOPjVd6rwi0h029y8Uc0HafZ_vZI-", "uhCkkmZhdcA7O7dolh4ARR86OPB_sKi_JbNr-I2Bwm69UBH9mobsh", "uhCkk-fUPGLUkkEbNMtyN4x4J7tZY0X26s8VpZG2vKhW35m9x6Pll", "uhCkkfxFUQwCWmbStHVr6AN6-ffbxGt5afcv06GB_AJb2CxNvXW3Y", "uhCkkhYwN8rTXc2HqgW8ibC-7vG14qm68LrDhwnQsLg74UmjAxRwR", "uhCkkxxbDsga0AARude7vjpT6WA0dHKBW1i3GRn-AI2didN19zhk5", "uhCkkhEwBlIIOhhK8P64JJ031Gzhz-WA50qpas3WoK94poc-4N_uU" ], disk_usage: [] }, bandwidth: { quantity: 42537, price: 0.025 }, compute: { quantity: 0, price: 0.025 }, storage: { quantity: 0, price: 0.025 } } }] } ``` ### `GET /host/invoices` Returns all the invoices issued by host. Query params: - filter: PAID Old: /host_invoices #### 200 ```json [{ id: "uhCEkzjtRtrb2Ip5kuZlmfhaG3Z5J_8mX9AkRAECyzBaZpd_5WsJD", amount:"1063.425", status:"Pending", type:"Request", direction:"Outgoing", createdDate:"1670240844322922", completedDate:null, expirationDate:null, counterparty:"uhCAkJX1suP92Jyp1_G7QbBTAkGEnLZsczbytOI9Zkfg86eMrZJ37", note:"Holo Hosting Invoice for \"Publisher Portal\" (...\"l5Y0j\")", proofOfServiceToken:"Dj8lClzGtuIU+fJPZHYa5+FyruKgYoSHJz67RN5gApVJXfABssEbgSDaqPRTDmuh7q06jxt6UppQNt9jR+lj3Q==", url:null, happ: { name:"Publisher Portal", id:"uhCkktpnpic_oJKfPKvvRsRIKXdCxHLGjcheCe14LEGH6Gchl5Y0j" }, invoiceDetails: { start: 1670239509213632, end: 1670240844292864, service_logs_range: { activity:[ "uhCkkb0G12f0q0p6Q1fGHNved23i-_g4NAPkzZeTxmwrktUGhQzBz", ... "uhCkkhEwBlIIOhhK8P64JJ031Gzhz-WA50qpas3WoK94poc-4N_uU" ], disk_usage: [] }, bandwidth: { quantity: 42537, price: 0.025 }, compute: { quantity: 0, price: 0.025 }, storage: { quantity: 0, price: 0.025 } } }] ``` ### `POST /happs/hosted/install` Installs hosted happ. Old: /install_hosted_happ request payload: ```json { name, hosted_urls, bundle_url, dnas } ``` #### 200 ```json ``` ### Old: /register_happ TODO: ??? ??? ## Technologies - Rocket framework - API docs via OpenApi - error, warn, info, debug logging with env-logger - well defined syntax of errors - standard use of HTTP verbs