Skip to content

Commit 4502b08

Browse files
committed
feat: create change
1 parent 5caa86f commit 4502b08

File tree

5 files changed

+53
-14
lines changed

5 files changed

+53
-14
lines changed

api/migrations/20250402143550_create_changes.sql

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,5 @@ CREATE TABLE changes (
1111
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
1212
);
1313

14-
-- 创建索引
1514
CREATE INDEX changes_package_id_idx ON changes (package_id);
1615
CREATE INDEX changes_created_at_idx ON changes (created_at);

api/src/api/changes.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,10 @@
1-
use crate::api::ApiError;
21
use hyper::{Body, Request};
3-
use routerify::Router;
42
use routerify::prelude::*;
53
use serde::Serialize;
64

75
use crate::{
86
db::{Change, Database},
9-
util::{self, pagination, ApiResult},
7+
util::{pagination, ApiResult},
108
};
119

1210

@@ -29,14 +27,7 @@ impl From<Change> for ApiChange {
2927
}
3028
}
3129

32-
pub fn changes_router() -> Router<Body, ApiError> {
33-
Router::builder()
34-
.get("/_changes", util::json(list_changes))
35-
.build()
36-
.unwrap()
37-
}
38-
39-
async fn list_changes(req: Request<Body>) -> ApiResult<Vec<ApiChange>> {
30+
pub async fn list_changes(req: Request<Body>) -> ApiResult<Vec<ApiChange>> {
4031
let db = req.data::<Database>().unwrap();
4132
let (start, limit) = pagination(&req);
4233
let changes = db.list_changes(start, limit).await?;

api/src/api/mod.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use hyper::Response;
1616
use package::global_list_handler;
1717
use package::global_metrics_handler;
1818
use package::global_stats_handler;
19+
use changes::list_changes;
1920
use routerify::Middleware;
2021
use routerify::Router;
2122

@@ -29,7 +30,6 @@ use self::admin::admin_router;
2930
use self::authorization::authorization_router;
3031
use self::scope::scope_router;
3132
use self::users::users_router;
32-
use self::changes::changes_router;
3333

3434
use crate::util;
3535
use crate::util::CacheDuration;
@@ -43,10 +43,10 @@ pub fn api_router() -> Router<Body, ApiError> {
4343
util::json(global_metrics_handler),
4444
),
4545
)
46+
.get("/_changes", util::json(list_changes))
4647
.middleware(Middleware::pre(util::auth_middleware))
4748
.scope("/admin", admin_router())
4849
.scope("/scopes", scope_router())
49-
.scope("/changes", changes_router())
5050
.scope("/user", self_user_router())
5151
.scope("/users", users_router())
5252
.scope("/authorizations", authorization_router())

api/src/db/database.rs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,35 @@ impl Database {
8383
.await
8484
}
8585

86+
87+
#[instrument(name = "Database::create_change", skip(self), err)]
88+
pub async fn create_change(
89+
&self,
90+
change_type: ChangeType,
91+
package_id: String,
92+
data: serde_json::Value,
93+
) -> Result<Change> {
94+
sqlx::query_as!(
95+
Change,
96+
r#"
97+
INSERT INTO changes (change_type, package_id, data)
98+
VALUES ($1, $2, $3)
99+
RETURNING
100+
seq,
101+
change_type as "change_type: ChangeType",
102+
package_id,
103+
data,
104+
created_at
105+
"#,
106+
change_type as _,
107+
package_id,
108+
data.to_string()
109+
)
110+
.fetch_one(&self.pool)
111+
.await
112+
}
113+
114+
86115
#[instrument(name = "Database::get_user_public", skip(self), err)]
87116
pub async fn get_user_public(&self, id: Uuid) -> Result<Option<UserPublic>> {
88117
sqlx::query_as!(

api/src/publish.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ use std::collections::HashSet;
55
use crate::api::ApiError;
66
use crate::buckets::Buckets;
77
use crate::buckets::UploadTaskBody;
8+
use crate::db::ChangeType;
89
use crate::db::Database;
910
use crate::db::DependencyKind;
1011
use crate::db::ExportsMap;
@@ -234,6 +235,25 @@ async fn process_publishing_task(
234235
);
235236
}
236237

238+
tokio::spawn({
239+
let db = db.clone();
240+
let scope = publishing_task.package_scope.clone();
241+
let name = publishing_task.package_name.clone();
242+
let version = publishing_task.package_version.clone();
243+
244+
async move {
245+
if let Err(e) = db.create_change(
246+
ChangeType::PackageVersionAdded,
247+
format!("@{}/{}", scope, name),
248+
serde_json::json!({
249+
"version": version.to_string(),
250+
}),
251+
).await {
252+
error!("Failed to create change record: {}", e);
253+
}
254+
}
255+
});
256+
237257
Ok(())
238258
}
239259

0 commit comments

Comments
 (0)