/* * Author: Ruben Fiszel * Copyright: Windmill Labs, Inc 2022 * This file and its contents are licensed under the AGPLv3 License. * Please see the included NOTICE for copyright information and * LICENSE-AGPL for a copy of the license. */ use axum::{ extract::{Extension, Query}, routing::get, Json, Router, }; use serde::{Deserialize, Serialize}; use sqlx::FromRow; use windmill_common::{ db::UserDB, error::JsonResult, utils::{paginate, Pagination}, worker::ALL_TAGS, }; use crate::db::ApiAuthed; pub fn global_service() -> Router { Router::new() .route("/list", get(list_worker_pings)) .route("/custom_tags", get(get_custom_tags)) } #[derive(FromRow, Serialize, Deserialize)] struct WorkerPing { worker: String, worker_instance: String, last_ping: Option, started_at: chrono::DateTime, ip: String, jobs_executed: i32, custom_tags: Option>, worker_group: String, } #[derive(Serialize, Deserialize)] struct EnableWorkerQuery { disable: bool, } async fn list_worker_pings( authed: ApiAuthed, Extension(user_db): Extension, Query(pagination): Query, ) -> JsonResult> { let mut tx = user_db.begin(&authed).await?; let (per_page, offset) = paginate(pagination); let rows = sqlx::query_as!( WorkerPing, "SELECT worker, worker_instance, EXTRACT(EPOCH FROM (now() - ping_at))::integer as last_ping, started_at, ip, jobs_executed, custom_tags, worker_group FROM worker_ping ORDER BY ping_at desc LIMIT $1 OFFSET $2", per_page as i64, offset as i64 ) .fetch_all(&mut *tx) .await?; tx.commit().await?; Ok(Json(rows)) } async fn get_custom_tags() -> Json> { Json(ALL_TAGS.read().await.clone().into()) }