1
1
use anyhow:: Result ;
2
- use rivet_api_builder:: ApiCtx ;
2
+ use axum:: {
3
+ extract:: { Extension , Query } ,
4
+ http:: HeaderMap ,
5
+ response:: { IntoResponse , Json , Response } ,
6
+ } ;
7
+ use rivet_api_builder:: { ApiCtx , ApiError } ;
8
+ use rivet_api_client:: request_remote_datacenter;
9
+ use rivet_api_types:: actors:: create:: { CreateRequest , CreateResponse } ;
3
10
use rivet_types:: actors:: CrashPolicy ;
4
- use rivet_util:: Id ;
5
11
use serde:: { Deserialize , Serialize } ;
6
12
use utoipa:: { IntoParams , ToSchema } ;
7
13
8
- #[ derive( Debug , Deserialize , IntoParams ) ]
14
+ #[ derive( Debug , Serialize , Deserialize , IntoParams ) ]
9
15
#[ serde( deny_unknown_fields) ]
10
16
#[ into_params( parameter_in = Query ) ]
11
17
pub struct CreateQuery {
12
18
pub namespace : String ,
13
19
pub datacenter : Option < String > ,
14
20
}
15
21
16
- #[ derive( Deserialize , ToSchema ) ]
17
- #[ serde( deny_unknown_fields) ]
18
- #[ schema( as = ActorsCreateRequest ) ]
19
- pub struct CreateRequest {
20
- pub name : String ,
21
- pub key : Option < String > ,
22
- pub input : Option < String > ,
23
- pub runner_name_selector : String ,
24
- pub crash_policy : CrashPolicy ,
25
- }
26
-
27
- #[ derive( Serialize , ToSchema ) ]
28
- #[ schema( as = ActorsCreateResponse ) ]
29
- pub struct CreateResponse {
30
- pub actor : rivet_types:: actors:: Actor ,
31
- }
32
-
33
22
/// ## Datacenter Round Trips
34
23
///
35
24
/// **If actor is created in the current datacenter:**
@@ -57,18 +46,23 @@ pub struct CreateResponse {
57
46
) ,
58
47
) ]
59
48
pub async fn create (
49
+ Extension ( ctx) : Extension < ApiCtx > ,
50
+ headers : HeaderMap ,
51
+ Query ( query) : Query < CreateQuery > ,
52
+ Json ( body) : Json < CreateRequest > ,
53
+ ) -> Response {
54
+ match create_inner ( ctx, headers, query, body) . await {
55
+ Ok ( response) => Json ( response) . into_response ( ) ,
56
+ Err ( err) => ApiError :: from ( err) . into_response ( ) ,
57
+ }
58
+ }
59
+
60
+ async fn create_inner (
60
61
ctx : ApiCtx ,
61
- _path : ( ) ,
62
+ headers : HeaderMap ,
62
63
query : CreateQuery ,
63
64
body : CreateRequest ,
64
65
) -> Result < CreateResponse > {
65
- let namespace = ctx
66
- . op ( namespace:: ops:: resolve_for_name_global:: Input {
67
- name : query. namespace . clone ( ) ,
68
- } )
69
- . await ?
70
- . ok_or_else ( || namespace:: errors:: Namespace :: NotFound . build ( ) ) ?;
71
-
72
66
// Determine which datacenter to create the actor in
73
67
let target_dc_label = if let Some ( dc_name) = & query. datacenter {
74
68
ctx. config ( )
@@ -79,26 +73,22 @@ pub async fn create(
79
73
ctx. config ( ) . dc_label ( )
80
74
} ;
81
75
82
- let actor_id = Id :: new_v1 ( target_dc_label) ;
83
-
84
- let key: Option < String > = body. key ;
85
-
86
- let res = ctx
87
- . op ( pegboard:: ops:: actor:: create:: Input {
88
- actor_id,
89
- namespace_id : namespace. namespace_id ,
90
- name : body. name . clone ( ) ,
91
- key,
92
- runner_name_selector : body. runner_name_selector ,
93
- input : body. input . clone ( ) ,
94
- crash_policy : body. crash_policy ,
95
- // Forward requests to the correct api-peer datacenter
96
- forward_request : true ,
97
- datacenter_name : query. datacenter . clone ( ) ,
98
- } )
99
- . await ?;
100
-
101
- let actor = res. actor ;
76
+ let query = rivet_api_types:: actors:: create:: CreateQuery {
77
+ namespace : query. namespace ,
78
+ } ;
102
79
103
- Ok ( CreateResponse { actor } )
80
+ if target_dc_label == ctx. config ( ) . dc_label ( ) {
81
+ rivet_api_peer:: actors:: create:: create ( ctx, ( ) , query, body) . await
82
+ } else {
83
+ request_remote_datacenter :: < CreateResponse > (
84
+ ctx. config ( ) ,
85
+ target_dc_label,
86
+ "/actors" ,
87
+ axum:: http:: Method :: POST ,
88
+ headers,
89
+ Some ( & query) ,
90
+ Some ( & body) ,
91
+ )
92
+ . await
93
+ }
104
94
}
0 commit comments