Setup API

This commit is contained in:
2024-11-04 21:14:58 +00:00
parent f7279c8707
commit d1ab59a0aa
8 changed files with 581 additions and 7 deletions

46
src/api.rs Normal file
View File

@ -0,0 +1,46 @@
use crate::db;
use crate::nip98::Nip98Auth;
use crate::provisioner::Provisioner;
use anyhow::Error;
use rocket::serde::json::Json;
use rocket::{get, routes, Responder, Route, State};
use serde::{Deserialize, Serialize};
pub fn routes() -> Vec<Route> {
routes![v1_list_vms]
}
type ApiResult<T> = Result<Json<ApiData<T>>, ApiError>;
#[derive(Serialize)]
struct ApiData<T: Serialize> {
pub data: T,
}
impl<T: Serialize> ApiData<T> {
pub fn ok(data: T) -> ApiResult<T> {
Ok(Json::from(ApiData { data }))
}
}
#[derive(Responder)]
#[response(status = 500)]
struct ApiError {
pub error: String,
}
impl From<Error> for ApiError {
fn from(value: Error) -> Self {
Self {
error: value.to_string(),
}
}
}
#[get("/api/v1/vms")]
async fn v1_list_vms(auth: Nip98Auth, provisioner: &State<Provisioner>) -> ApiResult<Vec<db::Vm>> {
let pubkey = auth.event.pubkey.to_bytes();
let uid = provisioner.upsert_user(&pubkey).await?;
let vms = provisioner.list_vms(uid).await?;
ApiData::ok(vms)
}