Skip to content

Commit 641aed2

Browse files
committed
feat(course): add course repository
1 parent f2bd9e3 commit 641aed2

File tree

9 files changed

+367
-4
lines changed

9 files changed

+367
-4
lines changed

Cargo.lock

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.nix

Lines changed: 100 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ members = [
88
"academy_cache/*",
99
"academy_config",
1010
"academy_core/*/*",
11+
"academy_data",
1112
"academy_demo",
1213
"academy_di",
1314
"academy_di_derive",
@@ -77,6 +78,7 @@ academy_core_session_contracts.path = "academy_core/session/contracts"
7778
academy_core_session_impl.path = "academy_core/session/impl"
7879
academy_core_user_contracts.path = "academy_core/user/contracts"
7980
academy_core_user_impl.path = "academy_core/user/impl"
81+
academy_data.path = "academy_data"
8082
academy_demo.path = "academy_demo"
8183
academy_di.path = "academy_di"
8284
academy_di_derive.path = "academy_di_derive"

academy/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ academy_core_premium_impl.workspace = true
3333
academy_core_session_impl.workspace = true
3434
academy_core_user_contracts.workspace = true
3535
academy_core_user_impl.workspace = true
36+
academy_data.workspace = true
3637
academy_demo.workspace = true
3738
academy_di.workspace = true
3839
academy_email_contracts.workspace = true

academy/src/commands/serve.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
use academy_cache_contracts::CacheService;
22
use academy_config::Config;
3+
use academy_data::course::CourseRepository;
34
use academy_di::Provide;
45
use academy_email_contracts::EmailService;
56
use academy_persistence_contracts::Database;
67
use academy_persistence_postgres::MigrationStatus;
8+
use anyhow::Context;
79
use tracing::{info, warn};
810

911
use crate::{
@@ -54,8 +56,11 @@ pub async fn serve(config: Config) -> anyhow::Result<()> {
5456
let email = email::connect(&config.email).await?;
5557
email.ping().await?;
5658

59+
let course_repository = CourseRepository::load(&config.course.course_dir)
60+
.context("Failed to load course repository")?;
61+
5762
let config_provider = ConfigProvider::new(&config)?;
58-
let mut provider = Provider::new(config_provider, database, cache, email);
63+
let mut provider = Provider::new(config_provider, database, cache, email, course_repository);
5964

6065
let server: RestServer = provider.provide();
6166
server.serve().await

academy/src/environment/mod.rs

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ use academy_core_paypal_impl::PaypalFeatureConfig;
1212
use academy_core_premium_impl::PremiumFeatureConfig;
1313
use academy_core_session_impl::SessionFeatureConfig;
1414
use academy_core_user_impl::UserFeatureConfig;
15+
use academy_data::course::CourseRepository;
1516
use academy_di::provider;
1617
use academy_extern_impl::{
1718
paypal::PaypalApiServiceConfig, recaptcha::RecaptchaApiServiceConfig,
@@ -34,6 +35,7 @@ provider! {
3435
database: Database,
3536
cache: Cache,
3637
email: Email,
38+
course_repository: CourseRepository,
3739
..config: ConfigProvider {
3840
// API
3941
RestServerConfig,
@@ -67,13 +69,20 @@ provider! {
6769
}
6870

6971
impl Provider {
70-
pub fn new(config: ConfigProvider, database: Database, cache: Cache, email: Email) -> Self {
72+
pub fn new(
73+
config: ConfigProvider,
74+
database: Database,
75+
cache: Cache,
76+
email: Email,
77+
course_repository: CourseRepository,
78+
) -> Self {
7179
Self {
7280
_cache: Default::default(),
7381
database,
7482
cache,
7583
email,
7684
config,
85+
course_repository,
7786
}
7887
}
7988

@@ -89,8 +98,16 @@ impl Provider {
8998
let email = crate::email::connect(&config.email)
9099
.await
91100
.context("Failed to connect to email server")?;
101+
let course_repository = CourseRepository::load(&config.course.course_dir)
102+
.context("Failed to load course repository")?;
92103

93-
Ok(Self::new(config_provider, database, cache, email))
104+
Ok(Self::new(
105+
config_provider,
106+
database,
107+
cache,
108+
email,
109+
course_repository,
110+
))
94111
}
95112
}
96113

@@ -318,8 +335,10 @@ mod tests {
318335
let database = PostgresDatabase::dummy().await;
319336
let cache = ValkeyCache::dummy().await;
320337
let email = EmailServiceImpl::dummy().await;
338+
let course_repository = CourseRepository::default();
321339

322-
let mut provider = Provider::new(config_provider, database, cache, email);
340+
let mut provider =
341+
Provider::new(config_provider, database, cache, email, course_repository);
323342
let _: RestServer = provider.provide();
324343
}
325344
}

academy_data/Cargo.toml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
[package]
2+
name = "academy_data"
3+
version.workspace = true
4+
edition.workspace = true
5+
publish.workspace = true
6+
homepage.workspace = true
7+
repository.workspace = true
8+
9+
[lints]
10+
workspace = true
11+
12+
[dependencies]
13+
academy_models.workspace = true
14+
anyhow.workspace = true
15+
chrono.workspace = true
16+
serde.workspace = true
17+
serde_yaml = { version = "0.9.34", default-features = false }
18+
tracing.workspace = true

0 commit comments

Comments
 (0)