1
1
// Copyright 2024 the JSR authors. All rights reserved. MIT license.
2
2
use hyper:: { Body , Request } ;
3
3
use routerify:: prelude:: * ;
4
- use serde:: { Serialize , Deserialize } ; // 添加 Deserialize
4
+ use serde:: { Deserialize , Serialize } ;
5
5
use tracing:: instrument;
6
6
7
7
use crate :: {
8
- db:: { Change , Database } ,
9
- util:: { pagination, ApiResult } ,
8
+ db:: { Change , Database } ,
9
+ util:: { pagination, ApiResult } ,
10
10
} ;
11
11
12
- #[ derive( Serialize , Deserialize ) ] // 添加 Deserialize
12
+ #[ derive( Serialize , Deserialize ) ]
13
13
pub struct ApiChange {
14
- pub seq : i64 ,
15
- pub r#type : String ,
16
- pub id : String ,
17
- pub changes : serde_json:: Value ,
14
+ pub seq : i64 ,
15
+ pub r#type : String ,
16
+ pub id : String ,
17
+ pub changes : serde_json:: Value ,
18
18
}
19
19
20
20
impl From < Change > for ApiChange {
21
- fn from ( change : Change ) -> Self {
22
- Self {
23
- seq : change. seq ,
24
- r#type : change. change_type . to_string ( ) ,
25
- id : format ! ( "@jsr/{}__{}" , change. scope_name, change. package_name) ,
26
- changes : serde_json:: from_str ( & change. data ) . unwrap ( ) ,
27
- }
21
+ fn from ( change : Change ) -> Self {
22
+ Self {
23
+ seq : change. seq ,
24
+ r#type : change. change_type . to_string ( ) ,
25
+ id : format ! ( "@jsr/{}__{}" , change. scope_name, change. package_name) ,
26
+ changes : serde_json:: from_str ( & change. data ) . unwrap ( ) ,
28
27
}
28
+ }
29
29
}
30
30
31
31
#[ instrument( name = "GET /api/_changes" , skip( req) , err) ]
32
32
pub async fn list_changes ( req : Request < Body > ) -> ApiResult < Vec < ApiChange > > {
33
- let db = req. data :: < Database > ( ) . unwrap ( ) ;
34
- let ( start, limit) = pagination ( & req) ;
35
- let changes = db. list_changes ( start, limit) . await ?;
36
- Ok ( changes. into_iter ( ) . map ( ApiChange :: from) . collect ( ) )
33
+ let db = req. data :: < Database > ( ) . unwrap ( ) ;
34
+ let ( start, limit) = pagination ( & req) ;
35
+ let changes = db. list_changes ( start, limit) . await ?;
36
+ Ok ( changes. into_iter ( ) . map ( ApiChange :: from) . collect ( ) )
37
37
}
38
38
39
-
40
39
#[ cfg( test) ]
41
40
mod tests {
42
41
use super :: ApiChange ;
42
+ use crate :: db:: ChangeType ;
43
43
use crate :: ids:: PackageName ;
44
44
use crate :: ids:: ScopeName ;
45
45
use crate :: util:: test:: ApiResultExt ;
46
46
use crate :: util:: test:: TestSetup ;
47
- use crate :: db:: ChangeType ;
48
47
use serde_json:: json;
49
48
50
49
#[ tokio:: test]
@@ -67,14 +66,17 @@ mod tests {
67
66
async fn list_single_change ( ) {
68
67
let mut t = TestSetup :: new ( ) . await ;
69
68
70
- t. ephemeral_database . create_change (
71
- ChangeType :: PackageVersionAdded ,
72
- & ScopeName :: new ( "test-scope" . to_string ( ) ) . unwrap ( ) ,
73
- & PackageName :: new ( "test-package" . to_string ( ) ) . unwrap ( ) ,
74
- json ! ( {
75
- "version" : "1.0.0"
76
- } ) ,
77
- ) . await . unwrap ( ) ;
69
+ t. ephemeral_database
70
+ . create_change (
71
+ ChangeType :: PackageVersionAdded ,
72
+ & ScopeName :: new ( "test-scope" . to_string ( ) ) . unwrap ( ) ,
73
+ & PackageName :: new ( "test-package" . to_string ( ) ) . unwrap ( ) ,
74
+ json ! ( {
75
+ "version" : "1.0.0"
76
+ } ) ,
77
+ )
78
+ . await
79
+ . unwrap ( ) ;
78
80
79
81
let changes = t
80
82
. http ( )
@@ -97,23 +99,29 @@ mod tests {
97
99
let mut t = TestSetup :: new ( ) . await ;
98
100
99
101
// Create two changes
100
- t. ephemeral_database . create_change (
101
- ChangeType :: PackageVersionAdded ,
102
- & ScopeName :: new ( "test-scope" . to_string ( ) ) . unwrap ( ) ,
103
- & PackageName :: new ( "test-package-1" . to_string ( ) ) . unwrap ( ) ,
104
- json ! ( {
105
- "name" : "test-package-1" ,
106
- } ) ,
107
- ) . await . unwrap ( ) ;
108
-
109
- t. ephemeral_database . create_change (
110
- ChangeType :: PackageVersionAdded ,
111
- & ScopeName :: new ( "test-scope" . to_string ( ) ) . unwrap ( ) ,
112
- & PackageName :: new ( "test-package-2" . to_string ( ) ) . unwrap ( ) ,
113
- json ! ( {
114
- "version" : "1.0.0" ,
115
- } ) ,
116
- ) . await . unwrap ( ) ;
102
+ t. ephemeral_database
103
+ . create_change (
104
+ ChangeType :: PackageVersionAdded ,
105
+ & ScopeName :: new ( "test-scope" . to_string ( ) ) . unwrap ( ) ,
106
+ & PackageName :: new ( "test-package-1" . to_string ( ) ) . unwrap ( ) ,
107
+ json ! ( {
108
+ "name" : "test-package-1" ,
109
+ } ) ,
110
+ )
111
+ . await
112
+ . unwrap ( ) ;
113
+
114
+ t. ephemeral_database
115
+ . create_change (
116
+ ChangeType :: PackageVersionAdded ,
117
+ & ScopeName :: new ( "test-scope" . to_string ( ) ) . unwrap ( ) ,
118
+ & PackageName :: new ( "test-package-2" . to_string ( ) ) . unwrap ( ) ,
119
+ json ! ( {
120
+ "version" : "1.0.0" ,
121
+ } ) ,
122
+ )
123
+ . await
124
+ . unwrap ( ) ;
117
125
118
126
// Test limit parameter
119
127
let changes = t
@@ -131,7 +139,7 @@ mod tests {
131
139
// Test since parameter
132
140
let changes = t
133
141
. http ( )
134
- . get ( & format ! ( "/api/_changes?since={}" , changes[ 0 ] . seq) )
142
+ . get ( format ! ( "/api/_changes?since={}" , changes[ 0 ] . seq) )
135
143
. call ( )
136
144
. await
137
145
. unwrap ( )
0 commit comments