1use crate::http::HttpClient;
4use crate::serde_util::{u32_as_string, u32_lenient, u32_vec_as_strings};
5use crate::{WebArenaIndigoApi, WebArenaIndigoApiError};
6use serde::{Deserialize, Serialize};
7use serde_json::json;
8
9pub struct FirewallApi<'a> {
10 indigo: &'a WebArenaIndigoApi,
11}
12
13impl<'a> FirewallApi<'a> {
14 pub(crate) fn new(api: &'a WebArenaIndigoApi) -> Self {
15 FirewallApi { indigo: api }
16 }
17
18 pub async fn create_firewall(
20 &self,
21 request: CreateFirewallRequest,
22 ) -> Result<FirewallTemplateResponse, WebArenaIndigoApiError> {
23 HttpClient::post(
24 self.indigo.throttle(),
25 self.indigo.access_token(),
26 &self.indigo.endpoint("/webarenaIndigo/v1/nw/createfirewall"),
27 &request,
28 )
29 .await
30 }
31
32 pub async fn firewall_list(&self) -> Result<Vec<Firewall>, WebArenaIndigoApiError> {
34 HttpClient::get(
35 self.indigo.throttle(),
36 self.indigo.access_token(),
37 &self
38 .indigo
39 .endpoint("/webarenaIndigo/v1/nw/getfirewalllist"),
40 )
41 .await
42 }
43
44 pub async fn retrieve_firewall(
46 &self,
47 firewall_id: u32,
48 ) -> Result<Vec<FirewallTemplateRule>, WebArenaIndigoApiError> {
49 HttpClient::get(
50 self.indigo.throttle(),
51 self.indigo.access_token(),
52 &self.indigo.endpoint(&format!(
53 "/webarenaIndigo/v1/nw/gettemplate/{}",
54 firewall_id
55 )),
56 )
57 .await
58 }
59
60 pub async fn update_firewall(
62 &self,
63 request: UpdateFirewallRequest,
64 ) -> Result<FirewallTemplateResponse, WebArenaIndigoApiError> {
65 HttpClient::put(
66 self.indigo.throttle(),
67 self.indigo.access_token(),
68 &self.indigo.endpoint("/webarenaIndigo/v1/nw/updatefirewall"),
69 &request,
70 )
71 .await
72 }
73
74 pub async fn assign_firewall(
76 &self,
77 firewall_id: u32,
78 instance_id: u32,
79 ) -> Result<FirewallOperationResponse, WebArenaIndigoApiError> {
80 HttpClient::post(
81 self.indigo.throttle(),
82 self.indigo.access_token(),
83 &self.indigo.endpoint("/webarenaIndigo/v1/nw/assign"),
84 &json!({
85 "templateid": firewall_id.to_string(),
86 "instanceid": instance_id.to_string(),
87 }),
88 )
89 .await
90 }
91
92 pub async fn destroy_firewall(
94 &self,
95 firewall_id: u32,
96 ) -> Result<FirewallOperationResponse, WebArenaIndigoApiError> {
97 HttpClient::delete(
98 self.indigo.throttle(),
99 self.indigo.access_token(),
100 &self.indigo.endpoint(&format!(
101 "/webarenaIndigo/v1/nw/deletefirewall/{}",
102 firewall_id
103 )),
104 )
105 .await
106 }
107}
108
109#[derive(Debug, Clone, Serialize)]
110pub struct CreateFirewallRequest {
111 pub name: String,
112 pub inbound: Vec<FirewallRule>,
113 pub outbound: Vec<FirewallRule>,
114 #[serde(serialize_with = "u32_vec_as_strings")]
115 pub instances: Vec<u32>,
116}
117
118#[derive(Debug, Clone, Serialize)]
119pub struct UpdateFirewallRequest {
120 #[serde(rename = "templateid", serialize_with = "u32_as_string")]
121 pub firewall_id: u32,
122 pub name: String,
123 pub inbound: Vec<FirewallRule>,
124 pub outbound: Vec<FirewallRule>,
125 #[serde(serialize_with = "u32_vec_as_strings")]
126 pub instances: Vec<u32>,
127}
128
129#[derive(Debug, Clone, Serialize, Deserialize)]
130pub struct FirewallRule {
131 #[serde(rename = "type")]
132 pub rule_type: String,
133 pub protocol: String,
134 pub port: String,
135 pub source: String,
136}
137
138#[derive(Debug, Clone, Serialize, Deserialize)]
139pub struct FirewallTemplateResponse {
140 pub success: bool,
141 pub message: String,
142 #[serde(rename = "sucessCode")]
143 pub success_code: String,
144 #[serde(rename = "firewallId", deserialize_with = "u32_lenient")]
147 pub firewall_id: u32,
148}
149
150#[derive(Debug, Clone, Serialize, Deserialize)]
151pub struct Firewall {
152 pub id: u32,
153 pub service_id: String,
154 pub user_id: u32,
155 pub name: String,
156 pub status: u32,
157 pub created_at: String,
158 pub updated_at: String,
159}
160
161#[derive(Debug, Clone, Serialize, Deserialize)]
162pub struct FirewallTemplateRule {
163 pub id: u32,
164 pub name: String,
165 pub direction: String,
166 #[serde(rename = "type")]
167 pub rule_type: String,
168 pub protocol: String,
169 pub port: String,
170 pub source: String,
171}
172
173#[derive(Debug, Clone, Serialize, Deserialize)]
174pub struct FirewallOperationResponse {
175 pub success: bool,
176 pub message: String,
177 #[serde(rename = "sucessCode")]
178 pub success_code: String,
179}