gitdataai/lib/service/lib.rs
2026-05-30 01:38:40 +08:00

66 lines
1.4 KiB
Rust

use cache::AppCache;
use config::AppConfig;
use db::AppDatabase;
use deadpool_redis::cluster::Pool as RedisPool;
use email::AppEmail;
use error::AppError;
use serde::Deserialize;
use session::Session;
use storage::AppStorage;
use tonic::transport::Channel;
use uuid::Uuid;
pub mod agent;
pub mod ai;
pub mod auth;
pub mod error;
pub mod git;
pub mod issues;
pub mod pull_request;
pub mod user;
pub mod users;
pub mod workspace;
pub(crate) fn session_user(ctx: &Session) -> Result<Uuid, AppError> {
ctx.user().ok_or(AppError::Unauthorized)
}
pub(crate) fn non_empty(value: String) -> Option<String> {
if value.is_empty() { None } else { Some(value) }
}
pub(crate) fn constant_time_eq(a: &str, b: &str) -> bool {
if a.len() != b.len() {
return false;
}
a.bytes()
.zip(b.bytes())
.fold(0u8, |acc, (x, y)| acc | (x ^ y))
== 0
}
#[derive(Debug, Clone, Deserialize, utoipa::IntoParams, utoipa::ToSchema)]
pub struct Pagination {
pub offset: Option<u32>,
pub limit: Option<u32>,
}
impl Pagination {
pub fn offset(&self) -> u32 {
self.offset.unwrap_or(0)
}
pub fn limit(&self) -> u32 {
self.limit.unwrap_or(20).min(100)
}
}
#[derive(Clone)]
pub struct AppService {
pub db: AppDatabase,
pub cache: AppCache,
pub email: AppEmail,
pub storage: AppStorage,
pub config: AppConfig,
pub git: Channel,
pub redis_pool: RedisPool,
}