Skip to content

Commit 17657fa

Browse files
WOOOOO SEA ORM IS GOATED
1 parent 7d0e7d8 commit 17657fa

151 files changed

Lines changed: 4804 additions & 3296 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Cargo.lock

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

Cargo.toml

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,6 @@ crates_io_api = "0.12.0"
3030
crossbeam-channel = "0.5.15"
3131
ctrlc = "3.5.0"
3232
derive_builder = "0.20.2"
33-
diesel = { version = "2.3.1", features = ["chrono", "postgres"] }
34-
diesel-async = { version = "0.6.1", features = ["tokio", "postgres", "deadpool"], git = "https://github.com/weiznich/diesel_async" }
35-
diesel_migrations = "2.3.0"
36-
diesel-derive-enum = { version = "2.1.0", features = ["postgres"] }
3733
dotenvy = "0.15.7"
3834
duration-str = "0.17.0"
3935
flate2 = "1.1.2"
@@ -68,10 +64,12 @@ rsbadges = "1.1.5"
6864
semver = { version = "1.0.27", features = ["serde"] }
6965
serde = { version = "1.0.223", features = ["derive"] }
7066
serde_json = "1.0.145"
67+
serde_norway = "0.9.42"
7168
serde-this-or-that = "0.5.0"
72-
serde_yaml = "0.9.34"
7369
serde-xml-rs = "0.8.1"
7470
sha-1 = "0.10.1"
71+
strum = "0.27.2"
72+
strum_macros = "0.27.2"
7573
sysinfo = "0.37.0"
7674
tar = "0.4.44"
7775
tempfile = "3.22.0"
@@ -98,6 +96,10 @@ axum-tracing-opentelemetry = { version = "0.30.0" }
9896
opentelemetry-otlp = { version = "0.30.0", features = ["tonic"] }
9997
tracing-opentelemetry = { version = "0.31.0" }
10098

99+
async-std = { version = "1.13.2", features = ["attributes", "tokio1"] }
100+
sea-orm = { version = "2.0.0-rc.6", features = ["runtime-tokio-rustls", "sqlx-postgres"] }
101+
sea-orm-migration = { version = "2.0.0-rc.6", features = ["runtime-tokio-rustls", "sqlx-postgres"] }
102+
101103
axumite = { version = "0", path = "./crates/axumite" }
102104
imghdr = { version = "0", path = "./crates/imghdr", features = ["serde"] }
103105
include_dir = { version = "0", path = "./crates/include_dir" }
@@ -115,6 +117,8 @@ modhost-router = { version = "0", path = "./crates/modhost-router" }
115117
modhost-search = { version = "0", path = "./crates/modhost-search" }
116118
modhost-server-core = { version = "0", path = "./crates/modhost-server-core" }
117119
modhost-ui = { version = "0", path = "./crates/modhost-ui" }
120+
modhost-migrations = { version = "0", path = "./crates/modhost-migrations" }
121+
modhost-entities = { version = "0", path = "./crates/modhost-entities" }
118122
parse-wiki-text-2 = { version = "0", path = "./crates/parse-wiki-text-2" }
119123
quickhost = { version = "0", path = "./crates/quickhost" }
120124

apps/astro-migrator/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ readme.workspace = true
1111
[dependencies]
1212
anyhow.workspace = true
1313
chrono.workspace = true
14-
diesel.workspace = true
15-
diesel-async.workspace = true
1614
indicatif.workspace = true
1715
itertools.workspace = true
1816
modhost.workspace = true
@@ -27,3 +25,4 @@ serde-this-or-that.workspace = true
2725
sha-1.workspace = true
2826
tokio.workspace = true
2927
tracing.workspace = true
28+
sea-orm.workspace = true

apps/astro-migrator/src/main.rs

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
use anyhow::Result;
22
use astro_migrator::models::{Mod, ModsDump};
3-
use diesel::{SelectableHelper, insert_into};
4-
use diesel_async::RunQueryDsl;
53
use indicatif::ProgressIterator;
64
use itertools::Itertools;
75
use modhost::init_logger;
86
use modhost_config::get_config;
9-
use modhost_db::{NewUser, User, create_connection, run_migrations, users};
7+
use modhost_db::{create_connection, fresh_migrations, users};
108
use modhost_search::MeilisearchService;
119
use ron::ser::PrettyConfig;
10+
use sea_orm::ActiveModelTrait;
11+
use sea_orm::ActiveValue::Set;
1212
use std::{fs, path::PathBuf};
1313
use tracing::level_filters::LevelFilter;
1414

@@ -17,9 +17,9 @@ pub async fn main() -> Result<()> {
1717
let _guard = init_logger("modhost-migrator-astro", LevelFilter::INFO)?;
1818

1919
let config = get_config()?;
20-
let pool = create_connection(Some(config.postgres.uri())).await?;
20+
let db = create_connection(Some(config.postgres.uri())).await?;
2121

22-
run_migrations(&pool).await?;
22+
fresh_migrations(&db).await?;
2323

2424
let pkgs = config.storage.projects()?;
2525
let imgs = config.storage.gallery()?;
@@ -30,35 +30,31 @@ pub async fn main() -> Result<()> {
3030
let data = serde_json::from_str::<ModsDump>(&raw)?;
3131
let dump: Vec<Mod> = data.into();
3232

33-
let user = NewUser {
34-
github_id: -1,
35-
username: "ModHost Migrator".into(),
36-
admin: false,
37-
moderator: false,
38-
};
33+
let user = users::ActiveModel {
34+
github_id: Set(-1),
35+
username: Set("ModHost Migrator".into()),
36+
admin: Set(false),
37+
moderator: Set(false),
38+
..Default::default()
39+
}
40+
.insert(&db)
41+
.await?;
3942

40-
let id = insert_into(users::table)
41-
.values(user)
42-
.returning(User::as_returning())
43-
.get_result(&mut pool.get().await?)
44-
.await?
45-
.id;
43+
let id = user.id;
4644

4745
let mut tags = Vec::new();
4846

4947
for item in dump.into_iter().progress() {
50-
let (pkg, _) = item
51-
.upload_all(id, &mut pool.get().await?, &pkgs, &imgs)
52-
.await?;
48+
let (pkg, _) = item.upload_all(id, &db, &pkgs, &imgs).await?;
5349

5450
tags.extend(pkg.tags);
5551
}
5652

57-
let tags = tags.into_iter().flatten().sorted().dedup().collect_vec();
53+
let tags = tags.into_iter().sorted().dedup().collect_vec();
5854

5955
let search = MeilisearchService::new(&config)?;
6056

61-
search.index_projects(&mut pool.get().await?).await?;
57+
search.index_projects(&db).await?;
6258

6359
fs::write(
6460
tags_file,

apps/astro-migrator/src/models.rs

Lines changed: 58 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,11 @@
11
use anyhow::Result;
22
use chrono::{DateTime, NaiveDateTime, Utc};
3-
use diesel::{SelectableHelper, insert_into};
4-
use diesel_async::RunQueryDsl;
53
use modhost_db::{
6-
DbConn, NewGalleryImage, NewProject, NewProjectFile, NewProjectVersion, Project, ProjectAuthor,
7-
ProjectVersion, ProjectVisibility, gallery_images, project_authors, project_versions, projects,
8-
version_files,
4+
DbConn, Project, ProjectVersion, ProjectVisibility, gallery_images, project_authors,
5+
project_versions, projects, version_files,
96
};
107
use object_store::{ObjectStore, PutPayload, aws::AmazonS3};
8+
use sea_orm::{ActiveModelTrait, ActiveValue::Set};
119
use serde::{Deserialize, Serialize};
1210
use serde_this_or_that::{as_bool, as_i64};
1311
use sha1::{Digest, Sha1};
@@ -197,92 +195,78 @@ impl Version {
197195
pub async fn as_ver(
198196
self,
199197
pkg: &Project,
200-
db: &mut DbConn,
198+
db: &DbConn,
201199
bucket: &AmazonS3,
202200
) -> Result<ProjectVersion> {
203201
let (id, size) = self.upload(bucket).await?;
204202
let file_name = self.release_file_name.clone();
205203
let ver = self.into_ver(pkg);
206-
207-
let ver = insert_into(project_versions::table)
208-
.values(ver)
209-
.returning(ProjectVersion::as_returning())
210-
.get_result(db)
211-
.await?;
212-
213-
let file = NewProjectFile {
214-
file_name,
215-
s3_id: id.clone(),
216-
sha1: id,
217-
version_id: ver.id,
218-
size,
219-
};
220-
221-
insert_into(version_files::table)
222-
.values(file)
223-
.execute(db)
224-
.await?;
204+
let ver = ver.insert(db).await?;
205+
206+
version_files::ActiveModel {
207+
file_name: Set(file_name),
208+
s3_id: Set(id.clone()),
209+
sha1: Set(id),
210+
version_id: Set(ver.id),
211+
size: Set(size),
212+
..Default::default()
213+
}
214+
.insert(db)
215+
.await?;
225216

226217
Ok(ver)
227218
}
228219

229-
pub fn into_ver(self, pkg: &Project) -> NewProjectVersion {
230-
NewProjectVersion {
231-
project: pkg.id,
232-
name: self.version.clone(),
233-
version_number: self.version,
234-
changelog: Some("Migrated from astroneermods.space.".into()),
235-
loaders: vec![Some("AstroModIntegrator".into())],
236-
game_versions: vec![Some(self.astro_build)],
237-
downloads: 0,
220+
pub fn into_ver(self, pkg: &Project) -> project_versions::ActiveModel {
221+
project_versions::ActiveModel {
222+
project: Set(pkg.id),
223+
name: Set(self.version.clone()),
224+
version_number: Set(self.version),
225+
changelog: Set(Some("Migrated from astroneermods.space.".into())),
226+
loaders: Set(vec!["AstroModIntegrator".into()]),
227+
game_versions: Set(vec![self.astro_build]),
228+
downloads: Set(0),
229+
..Default::default()
238230
}
239231
}
240232
}
241233

242234
impl Mod {
243-
pub fn into_pkg(self) -> NewProject {
244-
NewProject {
245-
slug: self.mod_id,
246-
name: self.name,
247-
readme: format!("{}{}", DESC_PREFIX, self.description),
248-
description: self.short_description,
249-
source: None,
250-
issues: None,
251-
wiki: None,
252-
tags: self.tags.into_iter().map(Some).collect(),
253-
visibility: if self.published {
235+
pub fn into_pkg(self) -> projects::ActiveModel {
236+
projects::ActiveModel {
237+
slug: Set(self.mod_id),
238+
name: Set(self.name),
239+
readme: Set(format!("{}{}", DESC_PREFIX, self.description)),
240+
description: Set(self.short_description),
241+
source: Set(None),
242+
issues: Set(None),
243+
wiki: Set(None),
244+
tags: Set(self.tags),
245+
visibility: Set(if self.published {
254246
ProjectVisibility::Public
255247
} else {
256248
ProjectVisibility::Private
257-
},
258-
license: Some(self.license),
249+
}),
250+
license: Set(Some(self.license)),
251+
..Default::default()
259252
}
260253
}
261254

262255
pub async fn upload_all(
263256
self,
264257
user_id: i32,
265-
db: &mut DbConn,
258+
db: &DbConn,
266259
bucket: &AmazonS3,
267260
imgs: &AmazonS3,
268261
) -> Result<(Project, Vec<ProjectVersion>)> {
269-
let pkg = self.clone().into_pkg();
270-
271-
let pkg = insert_into(projects::table)
272-
.values(pkg)
273-
.returning(Project::as_returning())
274-
.get_result(db)
275-
.await?;
276-
277-
let author = ProjectAuthor {
278-
user_id,
279-
project: pkg.id,
280-
};
262+
let pkg = self.clone().into_pkg().insert(db).await?;
281263

282-
insert_into(project_authors::table)
283-
.values(author)
284-
.execute(db)
285-
.await?;
264+
project_authors::ActiveModel {
265+
user_id: Set(user_id),
266+
project: Set(pkg.id),
267+
}
268+
.insert(db)
269+
.await?;
286270

287271
let imgs_dir = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
288272
.join("mods")
@@ -304,18 +288,16 @@ impl Mod {
304288
)
305289
.await?;
306290

307-
let img_data = NewGalleryImage {
308-
name: self.mod_id.clone(),
309-
description: None,
310-
ordering: 0, // We want this to be first, but easily allow the user to override it.
311-
project: pkg.id,
312-
s3_id: img_id,
313-
};
314-
315-
insert_into(gallery_images::table)
316-
.values(img_data)
317-
.execute(db)
318-
.await?;
291+
gallery_images::ActiveModel {
292+
name: Set(self.mod_id.clone()),
293+
description: Set(None),
294+
ordering: Set(0), // We want this to be first, but easily allow the user to override it.
295+
project: Set(pkg.id),
296+
s3_id: Set(img_id),
297+
..Default::default()
298+
}
299+
.insert(db)
300+
.await?;
319301
} else {
320302
println!("No image: {}", self.mod_id);
321303
}

apps/kjspkg-migrator/Cargo.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ readme.workspace = true
1010

1111
[dependencies]
1212
anyhow.workspace = true
13-
diesel.workspace = true
14-
diesel-async.workspace = true
1513
dotenvy.workspace = true
1614
flate2.workspace = true
1715
http-body-util.workspace = true
@@ -28,3 +26,4 @@ sha-1.workspace = true
2826
tar.workspace = true
2927
tokio.workspace = true
3028
tracing.workspace = true
29+
sea-orm.workspace = true

0 commit comments

Comments
 (0)