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