Skip to content

Commit b283f53

Browse files
committed
Implement legacy api
1 parent 13aa427 commit b283f53

File tree

6 files changed

+154
-17
lines changed

6 files changed

+154
-17
lines changed

Cargo.lock

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

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ reqwest = { version = "0.12.22", default-features = false, features = ["charset"
3333
semver = "1.0.26"
3434
serde = { workspace = true }
3535
serde_json = { workspace = true }
36+
serde_variant = "0.1.3"
3637
sha2 = "0.11.0-rc.0"
3738
thiserror = "2.0.12"
3839
tokio = { version = "1.46.1", features = ["macros", "rt-multi-thread"] }

src/api/legacy/endpoint.rs

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
use actix_web::{HttpResponse, Responder, get, web};
2+
use tokio::try_join;
3+
4+
use crate::{
5+
api::{
6+
common::data::ApiData,
7+
legacy::types::{
8+
LegacyArtifact,
9+
LegacyArtifactsResponse,
10+
LegacyLoader,
11+
LegacyVersion
12+
}
13+
},
14+
maven::{self, MavenError}
15+
};
16+
17+
const ONECONFIG_GROUP: &str = "cc.polyfrost";
18+
19+
async fn get_latest(
20+
state: &web::Data<ApiData>,
21+
repository: &str,
22+
artifact: &str
23+
) -> Result<LegacyArtifact, MavenError> {
24+
let version =
25+
maven::fetch_latest_artifact(state, repository, ONECONFIG_GROUP, artifact)
26+
.await?;
27+
let group = ONECONFIG_GROUP.replace('.', "/");
28+
let checksum = maven::fetch_checksum(
29+
&state.client,
30+
&format!(
31+
"{internal_maven_url}{repository}/{group}/{artifact}/{version}/\
32+
{artifact}-{version}.jar",
33+
internal_maven_url = state.internal_maven_url,
34+
group = group.replace('.', "/")
35+
)
36+
)
37+
.await?;
38+
39+
Ok(LegacyArtifact {
40+
url: format!(
41+
"{public_maven_url}{repository}/{group}/{artifact}/{version}/\
42+
{artifact}-{version}.jar",
43+
public_maven_url = state.public_maven_url,
44+
group = group.replace('.', "/")
45+
),
46+
sha256: checksum
47+
})
48+
}
49+
50+
#[get("/oneconfig/{version}-{loader}")]
51+
async fn oneconfig(
52+
state: web::Data<ApiData>,
53+
path: web::Path<(LegacyVersion, LegacyLoader)>
54+
) -> impl Responder {
55+
let version = serde_variant::to_variant_name(&path.0)
56+
.expect("unable to serialize serde enum variant name");
57+
let loader = serde_variant::to_variant_name(&path.1)
58+
.expect("unable to serialize serde enum variant name");
59+
let loader_type = path.1.get_loader_type();
60+
61+
let oneconfig_artifact = format!("oneconfig-{version}-{loader}");
62+
let loader_artifact = format!("oneconfig-loader-{loader_type}");
63+
64+
let (release, snapshot, loader) = match try_join!(
65+
get_latest(&state, "releases", &oneconfig_artifact),
66+
get_latest(&state, "snapshots", &oneconfig_artifact),
67+
get_latest(&state, "releases", &loader_artifact)
68+
) {
69+
Ok(r) => r,
70+
Err(e) =>
71+
return HttpResponse::InternalServerError()
72+
.content_type("text/plain")
73+
.body(format!("Error fetching latest oneconfig version: {e:?}")),
74+
};
75+
76+
HttpResponse::Ok().json(LegacyArtifactsResponse {
77+
release,
78+
snapshot,
79+
loader
80+
})
81+
}

src/api/legacy/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1+
use actix_web::web::ServiceConfig;
12

3+
pub mod endpoint;
4+
pub mod types;
5+
6+
pub fn configure(config: &mut ServiceConfig) { config.service(endpoint::oneconfig); }

src/api/legacy/types.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
use serde::{Deserialize, Serialize};
2+
3+
#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone)]
4+
pub enum LegacyVersion {
5+
#[serde(rename = "1.8.9")]
6+
OneEightNine,
7+
#[serde(rename = "1.12.2")]
8+
OneTwelveTwo
9+
}
10+
11+
#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone)]
12+
#[serde(rename_all = "lowercase")]
13+
pub enum LegacyLoader {
14+
Forge
15+
}
16+
17+
impl LegacyLoader {
18+
pub fn get_loader_type(&self) -> &'static str {
19+
match self {
20+
LegacyLoader::Forge => "launchwrapper"
21+
}
22+
}
23+
}
24+
25+
#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone)]
26+
pub struct LegacyArtifact {
27+
pub url: String,
28+
pub sha256: String
29+
}
30+
31+
#[derive(Serialize, Deserialize, Debug, Hash, PartialEq, Eq, Clone)]
32+
pub struct LegacyArtifactsResponse {
33+
pub release: LegacyArtifact,
34+
pub snapshot: LegacyArtifact,
35+
pub loader: LegacyArtifact
36+
}

src/main.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -54,11 +54,15 @@ async fn main() {
5454
let mut server = HttpServer::new(move || {
5555
App::new()
5656
.app_data(data.clone())
57-
// .configure(api::legacy::configure)
57+
.configure(api::legacy::configure)
5858
.configure(api::v1::configure)
5959
.configure(api::common::metrics::configure)
60-
.wrap(actix_web::middleware::from_fn(api::common::caching::middleware))
61-
.wrap(actix_web::middleware::from_fn(api::common::metrics::middleware))
60+
.wrap(actix_web::middleware::from_fn(
61+
api::common::caching::middleware
62+
))
63+
.wrap(actix_web::middleware::from_fn(
64+
api::common::metrics::middleware
65+
))
6266
});
6367

6468
// Call .bind for each address, as using multiple in the same call can silently

0 commit comments

Comments
 (0)