use crate::client::Parse;
use crate::error::ParseError;
use crate::object::{CreateObjectResponse, UpdateObjectResponse};
use crate::types::common::EmptyResponse;
use crate::ParseACL;
use reqwest::Method;
use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Default)]
#[serde(rename_all = "lowercase")]
pub enum DeviceType {
#[default]
Js, Ios,
Android,
Winphone, Macos,
Windows,
Linux,
Embedded, Other(String), }
#[derive(Serialize, Debug, Clone, Default)]
#[serde(rename_all = "camelCase")]
pub struct NewParseInstallation {
pub device_type: DeviceType,
#[serde(skip_serializing_if = "Option::is_none")]
pub device_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub installation_id: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub app_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_identifier: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub parse_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub badge: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channels: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locale_identifier: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub push_type: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub gcm_sender_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acl: Option<ParseACL>,
#[serde(flatten, skip_serializing_if = "Option::is_none")]
pub custom_fields: Option<HashMap<String, Value>>,
}
impl NewParseInstallation {
pub fn new(device_type: DeviceType) -> Self {
Self {
device_type,
..Default::default()
}
}
}
#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase")]
pub struct RetrievedParseInstallation {
#[serde(rename = "objectId")]
pub object_id: String,
#[serde(rename = "createdAt")]
pub created_at: String, #[serde(rename = "updatedAt")]
pub updated_at: String, pub device_type: DeviceType,
#[serde(skip_serializing_if = "Option::is_none")]
pub device_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub installation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_identifier: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub parse_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub badge: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channels: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub locale_identifier: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub push_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gcm_sender_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub acl: Option<ParseACL>,
#[serde(flatten)]
pub custom_fields: HashMap<String, Value>,
}
#[derive(Serialize, Debug, Clone, Default, PartialEq)]
#[serde(rename_all = "camelCase")]
pub struct UpdateParseInstallation {
#[serde(skip_serializing_if = "Option::is_none")]
pub device_type: Option<DeviceType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub device_token: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub installation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_version: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub app_identifier: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub time_zone: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub locale_identifier: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub badge: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub channels: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub push_type: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub gcm_sender_id: Option<String>, #[serde(skip_serializing_if = "Option::is_none")]
pub acl: Option<ParseACL>,
#[serde(flatten, skip_serializing_if = "HashMap::is_empty")]
pub custom_fields: HashMap<String, Value>,
}
impl UpdateParseInstallation {
pub fn new() -> Self {
Self::default()
}
}
impl Parse {
pub async fn create_installation(
&self,
installation_data: &NewParseInstallation,
) -> Result<CreateObjectResponse, ParseError> {
let use_master_key = self.master_key.is_some();
let session_token_to_use = None;
self._request(
Method::POST,
"installations",
Some(installation_data),
use_master_key,
session_token_to_use,
)
.await
}
pub async fn get_installation(
&self,
object_id: &str,
) -> Result<RetrievedParseInstallation, ParseError> {
if object_id.is_empty() {
return Err(ParseError::InvalidInput(
"Object ID cannot be empty.".to_string(),
));
}
let endpoint = format!("installations/{}", object_id);
let use_master_key = self.master_key.is_some();
let session_token_to_use = None;
self._request(
Method::GET,
&endpoint,
None::<Value>.as_ref(), use_master_key,
session_token_to_use,
)
.await
}
pub async fn update_installation(
&self,
object_id: &str,
update_data: &UpdateParseInstallation,
) -> Result<UpdateObjectResponse, ParseError> {
if object_id.is_empty() {
return Err(ParseError::InvalidInput(
"Object ID cannot be empty.".to_string(),
));
}
let endpoint = format!("installations/{}", object_id);
let use_master_key = self.master_key.is_some();
let session_token_to_use = None;
self._request(
Method::PUT,
&endpoint,
Some(update_data),
use_master_key,
session_token_to_use,
)
.await
}
pub async fn delete_installation(&self, object_id: &str) -> Result<EmptyResponse, ParseError> {
if object_id.is_empty() {
return Err(ParseError::InvalidInput(
"Object ID cannot be empty.".to_string(),
));
}
let endpoint = format!("installations/{}", object_id);
let use_master_key = self.master_key.is_some();
if !use_master_key {
log::warn!("Attempting to delete an installation without the master key. This might be restricted by server ACLs/CLPs.");
}
let session_token_to_use = None;
self._request(
Method::DELETE,
&endpoint,
None::<Value>.as_ref(), use_master_key,
session_token_to_use,
)
.await
}
}