Commit c1143cce authored by Chunchi Che's avatar Chunchi Che

impl cards service

parent d446d876
Pipeline #18098 failed with stages
in 7 minutes and 32 seconds
mod model; mod model;
mod schema; mod schema;
use crate::infra::DbConn;
use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl};
use std::collections::HashMap; use std::collections::HashMap;
use crate::infra::DbConn; pub use model::{CardDatas, CardTexts};
/// `cards.cdb`业务层模块 /// `cards.cdb`业务层模块
pub struct CardsDB { pub struct CardsDB {
...@@ -24,15 +25,11 @@ impl CardsDB { ...@@ -24,15 +25,11 @@ impl CardsDB {
} }
/// 通过`id`获取`Card`元数据 /// 通过`id`获取`Card`元数据
pub fn select_card_datas( pub fn select_card_datas(&mut self, ids: &[i64]) -> anyhow::Result<HashMap<i64, CardDatas>> {
&mut self,
ids: &[i64],
) -> anyhow::Result<HashMap<i64, model::CardDatas>> {
use schema::datas; use schema::datas;
let conn = &mut *self.conn; let conn = &mut *self.conn;
let records: Vec<model::CardDatas> = let records: Vec<CardDatas> = datas::table.filter(datas::id.eq_any(ids)).load(conn)?;
datas::table.filter(datas::id.eq_any(ids)).load(conn)?;
let records = records let records = records
.into_iter() .into_iter()
...@@ -42,15 +39,11 @@ impl CardsDB { ...@@ -42,15 +39,11 @@ impl CardsDB {
} }
/// 通过`id`获取`Card`文本数据 /// 通过`id`获取`Card`文本数据
pub fn select_card_texts( pub fn select_card_texts(&mut self, ids: &[i64]) -> anyhow::Result<HashMap<i64, CardTexts>> {
&mut self,
ids: &[i64],
) -> anyhow::Result<HashMap<i64, model::CardTexts>> {
use schema::texts; use schema::texts;
let conn = &mut *self.conn; let conn = &mut *self.conn;
let records: Vec<model::CardTexts> = let records: Vec<CardTexts> = texts::table.filter(texts::id.eq_any(ids)).load(conn)?;
texts::table.filter(texts::id.eq_any(ids)).load(conn)?;
let records = records let records = records
.into_iter() .into_iter()
......
use diesel_derives::Queryable; use diesel_derives::Queryable;
#[derive(Queryable, Clone, Debug, Default, PartialEq, Eq)] #[derive(serde::Serialize, Queryable, Clone, Debug, Default, PartialEq, Eq)]
#[diesel(table_name = datas)] #[diesel(table_name = datas)]
pub struct CardDatas { pub struct CardDatas {
pub id: i64, pub id: i64,
...@@ -17,7 +17,7 @@ pub struct CardDatas { ...@@ -17,7 +17,7 @@ pub struct CardDatas {
} }
// TODO: 这里字段应该命名得更清晰一点 // TODO: 这里字段应该命名得更清晰一点
#[derive(Queryable, Clone, Debug, Default, PartialEq, Eq)] #[derive(serde::Serialize, Queryable, Clone, Debug, Default, PartialEq, Eq)]
#[diesel(table_name = texts)] #[diesel(table_name = texts)]
pub struct CardTexts { pub struct CardTexts {
pub id: i64, pub id: i64,
......
mod db; mod db;
// TODO: 这里更合理的做法应该是前端通过`POST`请求
// 数据,二进制格式使用PB协议编码,PB文件定义在`neos-protobuf`项目里面,
// `neos-rs`项目添加`neos-protobuf`项目作为子模块。
//
// 暂时先实现简单的`GET`接口
pub fn service(param: String) -> String { pub fn service(param: String) -> String {
todo!() let id = param.parse::<i64>().unwrap_or_default();
match (|| {
// TODO: 应该在服务冷启动的时候获取`CardsDB`实例,
// 而不是在每次`HTTP`请求的时候重新获取
let mut cards_db = db::CardsDB::new()?;
let datas = cards_db
.select_card_datas(&[id])?
.remove(&id)
.unwrap_or_default();
let texts = cards_db
.select_card_texts(&[id])?
.remove(&id)
.unwrap_or_default();
Ok::<(db::CardDatas, db::CardTexts), anyhow::Error>((datas, texts))
})() {
Ok((data, text)) => {
let meta = CardMeta { data, text };
serde_json::to_string(&meta).unwrap_or_default()
}
Err(e) => {
log::error!("Handle cards service error={:?}", e);
serde_json::to_string(&CardMeta::default()).unwrap_or_default()
}
}
}
#[derive(serde::Serialize, Default, Debug)]
pub struct CardMeta {
pub data: db::CardDatas,
pub text: db::CardTexts,
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment