mirror of
https://github.com/rustfs/rustfs.git
synced 2026-08-24 21:26:28 +00:00
feat: improve legacy metadata and admin compatibility (#2202)
This commit is contained in:
@@ -13,10 +13,11 @@
|
||||
// limitations under the License.
|
||||
|
||||
use serde::Deserialize;
|
||||
use serde::Deserializer;
|
||||
use serde::Serialize;
|
||||
use time::OffsetDateTime;
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Default)]
|
||||
#[derive(Debug, Serialize, Default, PartialEq, Eq)]
|
||||
#[serde(rename_all = "lowercase")]
|
||||
pub enum GroupStatus {
|
||||
#[default]
|
||||
@@ -24,6 +25,20 @@ pub enum GroupStatus {
|
||||
Disabled,
|
||||
}
|
||||
|
||||
impl<'de> Deserialize<'de> for GroupStatus {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let value = String::deserialize(deserializer)?;
|
||||
match value.as_str() {
|
||||
"" | "enabled" => Ok(Self::Enabled),
|
||||
"disabled" => Ok(Self::Disabled),
|
||||
_ => Err(serde::de::Error::unknown_variant(&value, &["enabled", "disabled"])),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Serialize, Deserialize, Default)]
|
||||
pub struct GroupAddRemove {
|
||||
pub group: String,
|
||||
@@ -40,6 +55,40 @@ pub struct GroupDesc {
|
||||
pub status: String,
|
||||
pub members: Vec<String>,
|
||||
pub policy: String,
|
||||
#[serde(rename = "updatedAt", skip_serializing_if = "Option::is_none")]
|
||||
#[serde(
|
||||
rename = "updatedAt",
|
||||
skip_serializing_if = "Option::is_none",
|
||||
with = "time::serde::rfc3339::option"
|
||||
)]
|
||||
pub updated_at: Option<OffsetDateTime>,
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn group_desc_updated_at_serializes_as_rfc3339() {
|
||||
let now = OffsetDateTime::now_utc().replace_nanosecond(0).unwrap();
|
||||
let group = GroupDesc {
|
||||
name: "group-a".to_string(),
|
||||
status: "enabled".to_string(),
|
||||
members: vec!["user-a".to_string()],
|
||||
policy: "readwrite".to_string(),
|
||||
updated_at: Some(now),
|
||||
};
|
||||
|
||||
let json = serde_json::to_string(&group).unwrap();
|
||||
let decoded: GroupDesc = serde_json::from_str(&json).unwrap();
|
||||
|
||||
assert!(json.contains("\"updatedAt\":\""));
|
||||
assert!(json.contains('T'));
|
||||
assert_eq!(decoded.updated_at, Some(now));
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn group_status_accepts_empty_string_as_enabled() {
|
||||
let status: GroupStatus = serde_json::from_str(r#""""#).unwrap();
|
||||
assert_eq!(status, GroupStatus::Enabled);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user