39fcd5d8创建于 2025年4月16日历史提交
use std::collections::HashMap;

use crate::{
    proto::ek::object::v1::{ExpertSlice, Metadata},
    schema,
};
use diesel::prelude::*;
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Clone, Debug, Queryable, Selectable, Identifiable, PartialEq)]
#[diesel(table_name = schema::node)]
pub struct Node {
    pub id: i32,
    pub hostname: String,
    pub device: String,
    pub config: serde_json::Value,
}

#[derive(Serialize, Deserialize, Clone, Debug, Insertable)]
#[diesel(table_name = schema::node)]
pub struct NewNode {
    pub hostname: String,
    pub device: String,
    pub config: serde_json::Value,
}

#[derive(
    Serialize,
    Deserialize,
    Clone,
    Debug,
    Queryable,
    Selectable,
    Associations,
    Identifiable,
    PartialEq,
)]
#[diesel(belongs_to(Node))]
#[diesel(table_name = schema::expert)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct Expert {
    pub id: i32,
    pub instance_id: i32,
    pub node_id: i32,
    pub expert_id: String,
    pub replica: i32,
    pub state: serde_json::Value,
}

#[derive(Serialize, Deserialize, Clone, Debug, Insertable)]
#[diesel(belongs_to(Node))]
#[diesel(table_name = schema::expert)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct NewExpert {
    pub instance_id: i32,
    pub node_id: i32,
    pub expert_id: String,
    pub replica: i32,
    pub state: serde_json::Value,
}

#[derive(Serialize, Deserialize, Clone, Debug, Queryable, Selectable, QueryableByName)]
#[diesel(table_name = schema::instance)]
#[diesel(check_for_backend(diesel::pg::Pg))]
pub struct Instance {
    pub id: i32,
    pub model_id: i32,
    pub name: String,
}

#[derive(Insertable)]
#[diesel(table_name = schema::instance)]
pub struct NewInstance {
    pub model_id: i32,
    pub name: String,
}

#[derive(Serialize, Deserialize, Clone, Debug, Queryable, Selectable)]
#[diesel(table_name = schema::model)]
pub struct Model {
    pub id: i32,
    pub name: String,
    pub config: serde_json::Value,
}

#[derive(Serialize, Deserialize, Clone, Debug, Insertable)]
#[diesel(table_name = schema::model)]
pub struct NewModel {
    pub name: String,
    pub config: serde_json::Value,
}

#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct NodeWithExperts {
    pub node: Node,
    pub experts: Vec<Expert>,
}

impl From<Vec<Expert>> for ExpertSlice {
    fn from(value: Vec<Expert>) -> Self {
        let expert_meta = value
            .iter()
            .map(|x| Metadata {
                id: x.expert_id.clone(),
                name: x.expert_id.clone(),
                tags: HashMap::new(),
            })
            .collect();
        let slice_meta = Metadata {
            id: "".to_owned(),
            name: "".to_owned(),
            tags: HashMap::new(),
        };
        ExpertSlice {
            meta: Some(slice_meta),
            expert_meta,
        }
    }
}