use std::cmp::Ordering;
use derive_empty_traits::EmptyTraits;
use resolver_api::derive::Request;
use serde::{Deserialize, Serialize};
use typeshare::typeshare;
use crate::entities::{
build::{Build, BuildActionState, BuildListItem, BuildQuery},
Version, I64,
};
use super::MonitorReadRequest;
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(GetBuildResponse)]
pub struct GetBuild {
#[serde(alias = "id", alias = "name")]
pub build: String,
}
#[typeshare]
pub type GetBuildResponse = Build;
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Default, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(ListBuildsResponse)]
pub struct ListBuilds {
#[serde(default)]
pub query: BuildQuery,
}
#[typeshare]
pub type ListBuildsResponse = Vec<BuildListItem>;
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Default, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(ListFullBuildsResponse)]
pub struct ListFullBuilds {
#[serde(default)]
pub query: BuildQuery,
}
#[typeshare]
pub type ListFullBuildsResponse = Vec<Build>;
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(GetBuildActionStateResponse)]
pub struct GetBuildActionState {
#[serde(alias = "id", alias = "name")]
pub build: String,
}
#[typeshare]
pub type GetBuildActionStateResponse = BuildActionState;
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(GetBuildsSummaryResponse)]
pub struct GetBuildsSummary {}
#[typeshare]
#[derive(Serialize, Deserialize, Default, Debug, Clone)]
pub struct GetBuildsSummaryResponse {
pub total: u32,
pub ok: u32,
pub failed: u32,
pub building: u32,
pub unknown: u32,
}
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(GetBuildMonthlyStatsResponse)]
pub struct GetBuildMonthlyStats {
#[serde(default)]
pub page: u32,
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct GetBuildMonthlyStatsResponse {
pub total_time: f64, pub total_count: f64, pub days: Vec<BuildStatsDay>,
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct BuildStatsDay {
pub time: f64,
pub count: f64,
pub ts: f64,
}
impl GetBuildMonthlyStatsResponse {
pub fn new(
mut days: Vec<BuildStatsDay>,
) -> GetBuildMonthlyStatsResponse {
days.sort_by(|a, b| {
if a.ts < b.ts {
Ordering::Less
} else {
Ordering::Greater
}
});
let mut total_time = 0.0;
let mut total_count = 0.0;
for day in &days {
total_time += day.time;
total_count += day.count;
}
GetBuildMonthlyStatsResponse {
total_time,
total_count,
days,
}
}
}
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Default, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(ListBuildVersionsResponse)]
pub struct ListBuildVersions {
#[serde(alias = "id", alias = "name")]
pub build: String,
pub major: Option<i32>,
pub minor: Option<i32>,
pub patch: Option<i32>,
pub limit: Option<I64>,
}
#[typeshare]
pub type ListBuildVersionsResponse = Vec<BuildVersionResponseItem>;
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone, Default)]
pub struct BuildVersionResponseItem {
pub version: Version,
pub ts: I64,
}
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(ListCommonBuildExtraArgsResponse)]
pub struct ListCommonBuildExtraArgs {
#[serde(default)]
pub query: BuildQuery,
}
#[typeshare]
pub type ListCommonBuildExtraArgsResponse = Vec<String>;
#[typeshare]
#[derive(
Serialize, Deserialize, Debug, Clone, Request, EmptyTraits,
)]
#[empty_traits(MonitorReadRequest)]
#[response(GetBuildWebhookEnabledResponse)]
pub struct GetBuildWebhookEnabled {
#[serde(alias = "id", alias = "name")]
pub build: String,
}
#[typeshare]
#[derive(Serialize, Deserialize, Debug, Clone)]
pub struct GetBuildWebhookEnabledResponse {
pub managed: bool,
pub enabled: bool,
}