1+ use std:: fmt;
2+
13use bson:: oid:: ObjectId ;
2- use serde:: { Deserialize , Serialize } ;
4+ use chrono:: DateTime ;
5+ use serde:: { de:: { self , Visitor } , Deserialize , Deserializer , Serialize } ;
36
47#[ derive( Debug , Serialize , Deserialize , Clone , PartialEq , Eq , Hash ) ]
58#[ serde( rename_all = "kebab-case" ) ]
@@ -36,6 +39,17 @@ pub enum ActivityMode {
3639 SocialPractice ,
3740}
3841
42+ #[ derive( Debug , Serialize , Deserialize , Clone , PartialEq , Eq , Hash ) ]
43+ #[ serde( rename_all = "kebab-case" ) ]
44+ pub enum SpecialActivityCategory {
45+ Prize ,
46+ Import ,
47+ Club ,
48+ Deduction ,
49+ Other ,
50+ }
51+
52+
3953#[ derive( Debug , Serialize , Deserialize , Clone , PartialEq ) ]
4054pub struct ActivityMember {
4155 pub _id : String , // ObjectId
@@ -56,7 +70,9 @@ pub struct ActivityMemberHistory {
5670 pub action : ActivityMemberStatus ,
5771}
5872
73+
5974#[ derive( Debug , Serialize , Deserialize , Clone , PartialEq ) ]
75+ #[ serde( rename_all = "camelCase" ) ]
6076pub struct Activity {
6177 #[ serde( rename = "_id" ) ]
6278 pub _id : ObjectId ,
@@ -65,10 +81,48 @@ pub struct Activity {
6581 pub name : String ,
6682 pub description : Option < String > ,
6783 pub duration : Option < f64 > ,
68- pub date : u128 ,
69- pub created_at : u128 ,
70- pub updated_at : u128 ,
84+ #[ serde( deserialize_with = "datetime_or_u64" ) ]
85+ pub date : u64 ,
86+ #[ serde( deserialize_with = "datetime_or_u64" ) ]
87+ pub created_at : u64 ,
88+ #[ serde( deserialize_with = "datetime_or_u64" ) ]
89+ pub updated_at : u64 ,
7190 pub creator : ObjectId , // ObjectId
7291 pub status : ActivityStatus ,
7392 pub members : Option < Vec < ActivityMember > > ,
93+ pub location : Option < String > ,
94+ pub category : Option < SpecialActivityCategory > ,
95+ }
96+
97+ fn datetime_or_u64 < ' de , D > ( deserializer : D ) -> Result < u64 , D :: Error >
98+ where
99+ D : Deserializer < ' de > ,
100+ {
101+ struct DateTimeOrU64 ;
102+
103+ impl < ' de > Visitor < ' de > for DateTimeOrU64 {
104+ type Value = u64 ;
105+
106+ fn expecting ( & self , formatter : & mut fmt:: Formatter ) -> fmt:: Result {
107+ formatter. write_str ( "a UNIX timestamp as a u64 or a datetime string" )
108+ }
109+
110+ fn visit_u64 < E > ( self , value : u64 ) -> Result < Self :: Value , E >
111+ where
112+ E : de:: Error ,
113+ {
114+ Ok ( value)
115+ }
116+
117+ fn visit_str < E > ( self , value : & str ) -> Result < Self :: Value , E >
118+ where
119+ E : de:: Error ,
120+ {
121+ DateTime :: parse_from_rfc3339 ( value)
122+ . map_err ( de:: Error :: custom)
123+ . and_then ( |dt| Ok ( dt. timestamp ( ) as u64 ) )
124+ }
125+ }
126+
127+ deserializer. deserialize_any ( DateTimeOrU64 )
74128}
0 commit comments