11use  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 } ; 
310use  rivet_types:: actors:: CrashPolicy ; 
4- use  rivet_util:: Id ; 
511use  serde:: { Deserialize ,  Serialize } ; 
612use  utoipa:: { IntoParams ,  ToSchema } ; 
713
8- #[ derive( Debug ,  Deserialize ,  IntoParams ) ]  
14+ #[ derive( Debug ,  Serialize ,   Deserialize ,  IntoParams ) ]  
915#[ serde( deny_unknown_fields) ]  
1016#[ into_params( parameter_in = Query ) ]  
1117pub  struct  CreateQuery  { 
1218	pub  namespace :  String , 
1319	pub  datacenter :  Option < String > , 
1420} 
1521
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- 
3322/// ## Datacenter Round Trips 
3423/// 
3524/// **If actor is created in the current datacenter:** 
@@ -57,18 +46,23 @@ pub struct CreateResponse {
5746    ) ,  
5847) ] 
5948pub  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 ( 
6061	ctx :  ApiCtx , 
61- 	_path :   ( ) , 
62+ 	headers :   HeaderMap , 
6263	query :  CreateQuery , 
6364	body :  CreateRequest , 
6465)  -> 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- 
7266	// Determine which datacenter to create the actor in 
7367	let  target_dc_label = if  let  Some ( dc_name)  = & query. datacenter  { 
7468		ctx. config ( ) 
@@ -79,26 +73,22 @@ pub async fn create(
7973		ctx. config ( ) . dc_label ( ) 
8074	} ; 
8175
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+ 	} ; 
10279
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+ 	} 
10494} 
0 commit comments