use crate::{ApiError, Result, Service};
use serde::{Deserialize, Serialize};
pub struct SubscribeOperation;
#[derive(Debug, Clone, Serialize)]
pub struct SubscribeRequest {
pub callback_url: String,
pub timeout_seconds: u32,
}
#[derive(Debug, Clone, Deserialize)]
pub struct SubscribeResponse {
pub sid: String,
pub timeout_seconds: u32,
}
impl SubscribeOperation {
pub fn execute(
soap_client: &soap_client::SoapClient,
ip: &str,
service: Service,
request: &SubscribeRequest,
) -> Result<SubscribeResponse> {
let service_info = service.info();
let subscription_response = soap_client
.subscribe(
ip,
1400, service_info.event_endpoint,
&request.callback_url,
request.timeout_seconds,
)
.map_err(|e| match e {
soap_client::SoapError::Network(msg) => ApiError::NetworkError(msg),
soap_client::SoapError::Parse(msg) => ApiError::ParseError(msg),
soap_client::SoapError::Fault(code) => ApiError::SoapFault(code),
})?;
Ok(SubscribeResponse {
sid: subscription_response.sid,
timeout_seconds: subscription_response.timeout_seconds,
})
}
}
pub struct UnsubscribeOperation;
#[derive(Debug, Clone, Serialize)]
pub struct UnsubscribeRequest {
pub sid: String,
}
#[derive(Debug, Clone)]
pub struct UnsubscribeResponse;
impl UnsubscribeOperation {
pub fn execute(
soap_client: &soap_client::SoapClient,
ip: &str,
service: Service,
request: &UnsubscribeRequest,
) -> Result<UnsubscribeResponse> {
let service_info = service.info();
soap_client
.unsubscribe(
ip,
1400, service_info.event_endpoint,
&request.sid,
)
.map_err(|e| match e {
soap_client::SoapError::Network(msg) => ApiError::NetworkError(msg),
soap_client::SoapError::Parse(msg) => ApiError::ParseError(msg),
soap_client::SoapError::Fault(code) => ApiError::SoapFault(code),
})?;
Ok(UnsubscribeResponse)
}
}
pub struct RenewOperation;
#[derive(Debug, Clone, Serialize)]
pub struct RenewRequest {
pub sid: String,
pub timeout_seconds: u32,
}
#[derive(Debug, Clone, Deserialize)]
pub struct RenewResponse {
pub timeout_seconds: u32,
}
impl RenewOperation {
pub fn execute(
soap_client: &soap_client::SoapClient,
ip: &str,
service: Service,
request: &RenewRequest,
) -> Result<RenewResponse> {
let service_info = service.info();
let actual_timeout_seconds = soap_client
.renew_subscription(
ip,
1400, service_info.event_endpoint,
&request.sid,
request.timeout_seconds,
)
.map_err(|e| match e {
soap_client::SoapError::Network(msg) => ApiError::NetworkError(msg),
soap_client::SoapError::Parse(msg) => ApiError::ParseError(msg),
soap_client::SoapError::Fault(code) => ApiError::SoapFault(code),
})?;
Ok(RenewResponse {
timeout_seconds: actual_timeout_seconds,
})
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_subscribe_request_creation() {
let request = SubscribeRequest {
callback_url: "http://192.168.1.50:8080/callback".to_string(),
timeout_seconds: 1800,
};
assert_eq!(request.callback_url, "http://192.168.1.50:8080/callback");
assert_eq!(request.timeout_seconds, 1800);
}
#[test]
fn test_subscribe_response_creation() {
let response = SubscribeResponse {
sid: "uuid:12345678-1234-1234-1234-123456789012".to_string(),
timeout_seconds: 1800,
};
assert_eq!(response.sid, "uuid:12345678-1234-1234-1234-123456789012");
assert_eq!(response.timeout_seconds, 1800);
}
#[test]
fn test_unsubscribe_request_creation() {
let request = UnsubscribeRequest {
sid: "uuid:12345678-1234-1234-1234-123456789012".to_string(),
};
assert_eq!(request.sid, "uuid:12345678-1234-1234-1234-123456789012");
}
#[test]
fn test_unsubscribe_response_creation() {
let _response = UnsubscribeResponse;
}
#[test]
fn test_renew_request_creation() {
let request = RenewRequest {
sid: "uuid:12345678-1234-1234-1234-123456789012".to_string(),
timeout_seconds: 1800,
};
assert_eq!(request.sid, "uuid:12345678-1234-1234-1234-123456789012");
assert_eq!(request.timeout_seconds, 1800);
}
#[test]
fn test_renew_response_creation() {
let response = RenewResponse {
timeout_seconds: 1800,
};
assert_eq!(response.timeout_seconds, 1800);
}
}