feat: expand workspace to include libertas_infra and libertas_worker

feat(libertas_api): add dependency on libertas_infra and async-nats

refactor(libertas_api): consolidate config loading and add broker_url

refactor(libertas_api): integrate NATS client into app state and services

feat(libertas_core): introduce config module for database and server settings

fix(libertas_core): enhance error handling with detailed messages

feat(libertas_infra): create infrastructure layer with database repositories

feat(libertas_infra): implement Postgres repositories for media and albums

feat(libertas_worker): add worker service to process media jobs via NATS
This commit is contained in:
2025-11-02 10:22:38 +01:00
parent 7ea91da20a
commit a5a88c7f33
23 changed files with 1122 additions and 107 deletions

View File

@@ -11,3 +11,11 @@ chrono = "0.4.42"
futures = "0.3.31"
thiserror = "2.0.17"
uuid = "1.18.1"
sqlx = { version = "0.8.6", features = [
"runtime-tokio",
"postgres",
"uuid",
"chrono",
"sqlite",
] }
serde = { version = "1.0.228", features = ["derive"] }

View File

@@ -0,0 +1,37 @@
use serde::Deserialize;
use crate::error::CoreResult;
#[derive(Deserialize, Clone)]
pub enum DatabaseType {
Postgres,
Sqlite,
}
#[derive(Deserialize, Clone)]
pub struct DatabaseConfig {
pub db_type: DatabaseType,
pub url: String,
}
#[derive(Deserialize, Clone)]
pub struct Config {
pub database: DatabaseConfig,
pub server_address: String,
pub jwt_secret: String,
pub media_library_path: String,
pub broker_url: String,
}
pub fn load_config() -> CoreResult<Config> {
Ok(Config {
database: DatabaseConfig {
db_type: DatabaseType::Postgres,
url: "postgres://postgres:postgres@localhost:5432/libertas_db".to_string(),
},
server_address: "127.0.0.1:8080".to_string(),
jwt_secret: "super_secret_jwt_key".to_string(),
media_library_path: "media_library".to_string(),
broker_url: "amqp://guest:guest@localhost:5672/".to_string(),
})
}

View File

@@ -23,8 +23,8 @@ pub enum CoreError {
#[error("Authentication failed: {0}")]
Auth(String),
#[error("An unknown error occurred")]
Unknown,
#[error("An unknown error occurred: {0}")]
Unknown(String),
}
pub type CoreResult<T> = Result<T, CoreError>;

View File

@@ -1,5 +1,7 @@
pub mod config;
pub mod error;
pub mod models;
pub mod plugins;
pub mod repositories;
pub mod schema;
pub mod services;

View File

@@ -0,0 +1,26 @@
use std::sync::Arc;
use async_trait::async_trait;
use crate::{
error::CoreResult,
models::Media,
repositories::{AlbumRepository, MediaRepository, UserRepository},
};
pub struct PluginData {
pub message: String,
}
pub struct PluginContext {
pub media_repo: Arc<dyn MediaRepository>,
pub album_repo: Arc<dyn AlbumRepository>,
pub user_repo: Arc<dyn UserRepository>,
}
#[async_trait]
pub trait MediaProcessorPlugin: Send + Sync {
fn name(&self) -> &'static str;
async fn process(&self, media: &Media, context: &PluginContext) -> CoreResult<PluginData>;
}