Skip to content

Commit ed3b6a4

Browse files
authored
refactor: move route plugins to Nova global config (#61)
Remove per-group plugin definitions from asobi_router route groups and move them to {nova, [{plugins, [...]}]} in sys.config. This allows wrapper applications (like asobi_engine) to control the plugin chain via their own Nova config when using asobi as a nova_app, enabling injection of additional plugins (e.g. tenant resolution) without duplicating all route definitions.
1 parent b413d61 commit ed3b6a4

3 files changed

Lines changed: 29 additions & 62 deletions

File tree

config/dev_sys.config.src

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,19 @@
2424
}},
2525
{dev_mode, true},
2626
{bootstrap_application, asobi},
27-
{json_lib, json}
27+
{json_lib, json},
28+
{plugins, [
29+
{pre_request, nova_request_plugin, #{
30+
decode_json_body => true,
31+
parse_qs => true
32+
}},
33+
{pre_request, nova_cors_plugin, #{
34+
allow_origins => ~"*"
35+
}},
36+
{pre_request, nova_correlation_plugin, #{}},
37+
{pre_request, asobi_rate_limit_plugin, #{limiter => asobi_api_limiter}},
38+
{post_request, asobi_security_headers_plugin, #{}}
39+
]}
2840
]},
2941
{kura, [
3042
{repo, asobi_repo},
@@ -37,16 +49,6 @@
3749
]},
3850
{asobi, [
3951
{nova_apps, [nova_resilience]},
40-
{plugins, [
41-
{pre_request, nova_request_plugin, #{
42-
decode_json_body => true,
43-
parse_qs => true
44-
}},
45-
{pre_request, nova_correlation_plugin, #{}},
46-
{pre_request, nova_cors_plugin, #{
47-
allow_origins => <<"*">>
48-
}}
49-
]},
5052
{game_modes, #{
5153
%% Map mode names to game behaviour modules
5254
%% ~"default" => my_game_module

config/prod_sys.config.src

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,19 @@
2121
}},
2222
{dev_mode, false},
2323
{bootstrap_application, asobi},
24-
{json_lib, json}
24+
{json_lib, json},
25+
{plugins, [
26+
{pre_request, nova_request_plugin, #{
27+
decode_json_body => true,
28+
parse_qs => true
29+
}},
30+
{pre_request, nova_cors_plugin, #{
31+
allow_origins => <<"${ASOBI_CORS_ORIGINS}">>
32+
}},
33+
{pre_request, nova_correlation_plugin, #{}},
34+
{pre_request, asobi_rate_limit_plugin, #{limiter => asobi_api_limiter}},
35+
{post_request, asobi_security_headers_plugin, #{}}
36+
]}
2537
]},
2638
{kura, [
2739
{repo, asobi_repo},
@@ -35,16 +47,6 @@
3547
{asobi, [
3648
{game_dir, "/app/game"},
3749
{nova_apps, [nova_resilience]},
38-
{plugins, [
39-
{pre_request, nova_request_plugin, #{
40-
decode_json_body => true,
41-
parse_qs => true
42-
}},
43-
{pre_request, nova_correlation_plugin, #{}},
44-
{pre_request, nova_cors_plugin, #{
45-
allow_origins => <<"${ASOBI_CORS_ORIGINS}">>
46-
}}
47-
]},
4850
{matchmaker, #{
4951
tick_interval => 1000,
5052
max_wait_seconds => 60

src/asobi_router.erl

Lines changed: 3 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,10 @@ routes(_Environment) ->
1212
ws_routes()
1313
].
1414

15-
cors_opts() ->
16-
Origins = application:get_env(asobi, cors_allow_origins, ~""),
17-
#{allow_origins => Origins}.
18-
19-
rate_limit_opts(Group) ->
20-
#{limiter => limiter_name(Group)}.
21-
22-
limiter_name(auth) -> asobi_auth_limiter;
23-
limiter_name(iap) -> asobi_iap_limiter;
24-
limiter_name(api) -> asobi_api_limiter.
25-
2615
auth_routes() ->
2716
#{
2817
prefix => ~"/api/v1/auth",
2918
security => false,
30-
plugins => [
31-
{pre_request, nova_request_plugin, #{
32-
decode_json_body => true
33-
}},
34-
{pre_request, nova_cors_plugin, cors_opts()},
35-
{pre_request, nova_correlation_plugin, #{}},
36-
{pre_request, asobi_rate_limit_plugin, rate_limit_opts(auth)},
37-
{post_request, asobi_security_headers_plugin, #{}}
38-
],
3919
routes => [
4020
{~"/register", fun asobi_auth_controller:register/1, #{methods => [post]}},
4121
{~"/login", fun asobi_auth_controller:login/1, #{methods => [post]}},
@@ -48,15 +28,6 @@ iap_routes() ->
4828
#{
4929
prefix => ~"/api/v1/iap",
5030
security => fun asobi_auth_plugin:verify/1,
51-
plugins => [
52-
{pre_request, nova_request_plugin, #{
53-
decode_json_body => true
54-
}},
55-
{pre_request, nova_cors_plugin, cors_opts()},
56-
{pre_request, nova_correlation_plugin, #{}},
57-
{pre_request, asobi_rate_limit_plugin, rate_limit_opts(iap)},
58-
{post_request, asobi_security_headers_plugin, #{}}
59-
],
6031
routes => [
6132
{~"/apple", fun asobi_iap_controller:verify_apple/1, #{methods => [post]}},
6233
{~"/google", fun asobi_iap_controller:verify_google/1, #{methods => [post]}}
@@ -67,16 +38,6 @@ api_routes() ->
6738
#{
6839
prefix => ~"/api/v1",
6940
security => fun asobi_auth_plugin:verify/1,
70-
plugins => [
71-
{pre_request, nova_request_plugin, #{
72-
decode_json_body => true,
73-
parse_qs => true
74-
}},
75-
{pre_request, nova_cors_plugin, cors_opts()},
76-
{pre_request, nova_correlation_plugin, #{}},
77-
{pre_request, asobi_rate_limit_plugin, rate_limit_opts(api)},
78-
{post_request, asobi_security_headers_plugin, #{}}
79-
],
8041
routes => [
8142
%% Auth - Provider linking
8243
{~"/auth/link", fun asobi_oauth_controller:link/1, #{methods => [post]}},
@@ -139,7 +100,9 @@ api_routes() ->
139100
{~"/groups/:id", fun asobi_social_controller:update_group/1, #{methods => [put]}},
140101
{~"/groups/:id/join", fun asobi_social_controller:join_group/1, #{methods => [post]}},
141102
{~"/groups/:id/leave", fun asobi_social_controller:leave_group/1, #{methods => [post]}},
142-
{~"/groups/:id/members", fun asobi_social_controller:list_members/1, #{methods => [get]}},
103+
{~"/groups/:id/members", fun asobi_social_controller:list_members/1, #{
104+
methods => [get]
105+
}},
143106
{
144107
~"/groups/:id/members/:player_id/role",
145108
fun asobi_social_controller:update_member_role/1,

0 commit comments

Comments
 (0)