use crate::account::*;
use crate::accounting::Address;
use crate::device::device::DeviceStruct;
use crate::rest::common::{
ApiError, ListRequest,
};
use crate::RecordReference;
use serde::{Deserialize, Serialize};
#[cfg(feature = "openapi")]
use utoipa::{IntoParams, ToSchema};
#[derive(Debug, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema, IntoParams))]
#[cfg_attr(feature = "openapi", schema(
title ="Query parameters containing account ID"
))]
pub struct AccountIdQuery {
#[cfg_attr(feature = "openapi", schema(example = "507f1f77bcf86cd799439011"))]
pub account_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[cfg_attr(feature = "openapi", schema(
title ="Request payload for creating a new account",
example = json!({
"name": "Acme Corporation",
"mbn": "12345",
"domain": "acme.com",
"organisation": {
"id": "507f1f77bcf86cd799439011",
"name": "Acme Org"
},
"clusterSettings": {
"region": "us-east-1",
"zone": "a"
}
})
))]
#[serde(rename_all = "camelCase")]
pub struct CreateAccountRequest {
#[cfg_attr(feature = "openapi", schema(example = "Acme Corporation", min_length = 1))]
pub name: String,
#[cfg_attr(feature = "openapi", schema(example = "12345", min_length = 1))]
pub mbn: String,
#[cfg_attr(feature = "openapi", schema(example = "acme.com", min_length = 1))]
pub domain: String,
pub organisation: RecordReference,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub teams: Option<TeamsAccount>,
#[serde(skip_serializing_if = "Option::is_none")]
pub environment: Option<Environment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spend_cap: Option<SpendCap>,
#[serde(skip_serializing_if = "Option::is_none")]
pub concurrency: Option<Concurrency>,
#[serde(skip_serializing_if = "Option::is_none")]
pub class_of_service: Option<ClassOfService>,
pub cluster_settings: Cluster,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[cfg_attr(feature = "openapi", schema(
title ="Request payload for updating an account. All fields are optional."
))]
#[serde(rename_all = "camelCase")]
pub struct UpdateAccountRequest {
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "openapi", schema(example = "Acme Corp Updated"))]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "openapi", schema(example = "54321"))]
pub mbn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "openapi", schema(example = "new-acme.com"))]
pub domain: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub organisation: Option<RecordReference>,
#[serde(skip_serializing_if = "Option::is_none")]
pub address: Option<Address>,
#[serde(skip_serializing_if = "Option::is_none")]
pub teams: Option<TeamsAccount>,
#[serde(skip_serializing_if = "Option::is_none")]
pub environment: Option<Environment>,
#[serde(skip_serializing_if = "Option::is_none")]
pub spend_cap: Option<SpendCap>,
#[serde(skip_serializing_if = "Option::is_none")]
pub concurrency: Option<Concurrency>,
#[serde(skip_serializing_if = "Option::is_none")]
pub class_of_service: Option<ClassOfService>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cluster_settings: Option<Cluster>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
#[cfg_attr(feature = "openapi", schema(
title ="Query parameters for listing accounts with filtering and pagination"
))]
#[serde(rename_all = "camelCase")]
pub struct AccountListRequest {
#[serde(flatten)]
pub common: ListRequest,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "openapi", schema(example = "507f1f77bcf86cd799439011"))]
pub organisation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "openapi", schema(example = "Acme"))]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "openapi", schema(example = "12345"))]
pub mbn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
#[cfg_attr(feature = "openapi", schema(example = "acme.com"))]
pub domain: Option<String>,
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "openapi", derive(ToSchema))]
pub enum AccountErrorCode {
NotFound,
DuplicateMbn,
DuplicateDomain,
InvalidOrganisation,
InvalidCluster,
MissingRequiredField,
}
impl AccountErrorCode {
pub fn as_str(&self) -> &'static str {
match self {
Self::NotFound => "ACCOUNT_NOT_FOUND",
Self::DuplicateMbn => "DUPLICATE_MBN",
Self::DuplicateDomain => "DUPLICATE_DOMAIN",
Self::InvalidOrganisation => "INVALID_ORGANISATION",
Self::InvalidCluster => "INVALID_CLUSTER",
Self::MissingRequiredField => "MISSING_REQUIRED_FIELD",
}
}
}
impl CreateAccountRequest {
pub fn validate(&self) -> Result<(), ApiError> {
if self.name.trim().is_empty() {
return Err(ApiError::new(
AccountErrorCode::MissingRequiredField.as_str(),
"Account name is required",
)
.with_field("name"));
}
if self.mbn.trim().is_empty() {
return Err(ApiError::new(
AccountErrorCode::MissingRequiredField.as_str(),
"MBN is required",
)
.with_field("mbn"));
}
if self.domain.trim().is_empty() {
return Err(ApiError::new(
AccountErrorCode::MissingRequiredField.as_str(),
"Domain is required",
)
.with_field("domain"));
}
Ok(())
}
}
impl UpdateAccountRequest {
pub fn is_empty(&self) -> bool {
self.name.is_none()
&& self.mbn.is_none()
&& self.domain.is_none()
&& self.organisation.is_none()
&& self.address.is_none()
&& self.teams.is_none()
&& self.environment.is_none()
&& self.spend_cap.is_none()
&& self.concurrency.is_none()
&& self.class_of_service.is_none()
&& self.cluster_settings.is_none()
}
}
impl Default for AccountListRequest {
fn default() -> Self {
Self {
common: ListRequest {
pagination: crate::rest::common::PaginationParams::default(),
sort: crate::rest::common::SortParams::default(),
search: None,
time_range: None,
filters: None,
},
organisation_id: None,
name: None,
mbn: None,
domain: None,
}
}
}
impl AccountListRequest {
pub fn new() -> Self {
Self::default()
}
pub fn with_pagination(mut self, page: u32, page_size: u32) -> Self {
self.common.pagination = crate::rest::common::PaginationParams::new(page, page_size);
self
}
pub fn with_organisation_id(mut self, organisation_id: String) -> Self {
self.organisation_id = Some(organisation_id);
self
}
}