@@ -2,7 +2,7 @@ use crate::{
22 models:: {
33 activities:: Activity ,
44 groups:: GroupPermission ,
5- response:: { ErrorResponse , Response as ZVMSResponse , ResponseStatus , SuccessResponse } ,
5+ response:: { ErrorResponse , ResponseStatus , SuccessResponse } ,
66 } ,
77 utils:: jwt:: UserData ,
88} ;
@@ -13,7 +13,7 @@ use axum::{
1313} ;
1414use bson:: { doc, from_document, oid:: ObjectId } ;
1515use futures:: stream:: TryStreamExt ;
16- use mongodb:: { Collection , Database } ;
16+ use mongodb:: { options :: FindOneOptions , Collection , Database } ;
1717use serde:: { Deserialize , Serialize } ;
1818use std:: sync:: Arc ;
1919use tokio:: sync:: Mutex ;
@@ -53,15 +53,64 @@ pub async fn read_all(
5353 let query = query. unwrap_or ( "" . to_string ( ) ) ;
5454 let db = db. lock ( ) . await ;
5555 let collection: Collection < Activity > = db. collection ( "activities" ) ;
56+ let target = if user. perms . contains ( & GroupPermission :: Auditor ) || user. perms . contains ( & GroupPermission :: Admin ) {
57+ "pending"
58+ } else {
59+ ""
60+ } ;
5661 let pipeline = vec ! [
5762 doc! { "$match" : { "name" : { "$regex" : query, "$options" : "i" } } } ,
63+ doc! { "$sort" : { "_id" : -1 } } ,
64+ doc! { "$project" : {
65+ "name" : 1 ,
66+ "type" : 1 ,
67+ "status" : 1 ,
68+ "date" : 1 ,
69+ "createdAt" : 1 ,
70+ "updatedAt" : 1 ,
71+ "creator" : 1 ,
72+ "members" : {
73+ "$filter" : {
74+ "input" : "$members" ,
75+ "as" : "member" ,
76+ "cond" : { "$eq" : [ "$$member.status" , target] }
77+ }
78+ }
79+ }
80+ } ,
81+ doc! { "$project" : {
82+ "members.history" : 0 ,
83+ "members.impression" : 0 ,
84+ "members.images" : 0 ,
85+ } } ,
5886 doc! { "$skip" : ( page - 1 ) * perpage} ,
5987 doc! { "$limit" : perpage} ,
6088 ] ;
61- let mut cursor = collection. aggregate ( pipeline, None ) . await . unwrap ( ) ;
89+ let cursor = collection. aggregate ( pipeline, None ) . await ;
90+ if let Err ( e) = cursor {
91+ let response: ErrorResponse = ErrorResponse {
92+ status : ResponseStatus :: Error ,
93+ code : 500 ,
94+ message : "Failed to read activity: " . to_string ( ) + & e. to_string ( ) ,
95+ }
96+ . into ( ) ;
97+ let response = serde_json:: to_string ( & response) . unwrap ( ) ;
98+ return ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( response) ) ;
99+ }
100+ let mut cursor = cursor. unwrap ( ) ;
62101 let mut activities = Vec :: new ( ) ;
63102 loop {
64103 let doc_result = cursor. try_next ( ) . await ;
104+ if let Err ( e) = doc_result {
105+ let response: ErrorResponse = ErrorResponse {
106+ status : ResponseStatus :: Error ,
107+ code : 500 ,
108+ message : "Failed to read activity: " . to_string ( ) + & e. to_string ( ) ,
109+ }
110+ . into ( ) ;
111+ let response = serde_json:: to_string ( & response) . unwrap ( ) ;
112+ return ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( response) ) ;
113+ }
65114 if let Ok ( Some ( document) ) = doc_result {
66115 match from_document :: < Activity > ( document) {
67116 Ok ( activity) => activities. push ( activity) ,
@@ -72,7 +121,6 @@ pub async fn read_all(
72121 message : "Failed to read activity: " . to_string ( ) + & e. to_string ( ) ,
73122 }
74123 . into ( ) ;
75- println ! ( "{:?}" , response) ;
76124 let response = serde_json:: to_string ( & response) . unwrap ( ) ;
77125 return ( StatusCode :: INTERNAL_SERVER_ERROR , Json ( response) ) ;
78126 }
@@ -86,9 +134,7 @@ pub async fn read_all(
86134 status : ResponseStatus :: Error ,
87135 code : 404 ,
88136 message : "No activities found" . to_string ( ) ,
89- }
90- . into ( ) ;
91- let response = ZVMSResponse :: < ( ) , ( ) > :: Error ( response) ;
137+ } ;
92138 let response = serde_json:: to_string ( & response) . unwrap ( ) ;
93139 ( StatusCode :: NOT_FOUND , Json ( response) )
94140 } else {
@@ -97,9 +143,7 @@ pub async fn read_all(
97143 code : 200 ,
98144 data : activities,
99145 metadata : None ,
100- }
101- . into ( ) ;
102- let response = ZVMSResponse :: Success ( response) ;
146+ } ;
103147 let response = serde_json:: to_string ( & response) . unwrap ( ) ;
104148 ( StatusCode :: OK , Json ( response) )
105149 }
@@ -110,7 +154,6 @@ pub async fn read_one(
110154 _: UserData ,
111155 Path ( id) : Path < String > ,
112156) -> impl IntoResponse {
113- println ! ( "ID: {:?}" , id) ;
114157 let db = client. lock ( ) . await ;
115158 let collection = db. collection ( "activities" ) ;
116159 let id = ObjectId :: parse_str ( & id) ;
@@ -125,9 +168,18 @@ pub async fn read_one(
125168 }
126169 let id = id. unwrap ( ) ;
127170 let filter = doc ! { "_id" : id} ;
128- let result = collection. find_one ( filter, None ) . await ;
171+ let projection = doc ! {
172+ "members.history" : 0 ,
173+ "members.impression" : 0 ,
174+ "members.images" : 0 ,
175+ } ;
176+ let result = collection
177+ . find_one (
178+ filter,
179+ Some ( FindOneOptions :: builder ( ) . projection ( projection) . build ( ) ) ,
180+ )
181+ . await ;
129182 if let Err ( e) = result {
130- println ! ( "Failed to read activity: {:?}" , e) ;
131183 let response = ErrorResponse {
132184 status : ResponseStatus :: Error ,
133185 code : 500 ,
@@ -139,7 +191,6 @@ pub async fn read_one(
139191 let result: Option < Activity > = result. unwrap ( ) ;
140192 match result {
141193 Some ( document) => {
142- println ! ( "{:?}" , document) ;
143194 let response: SuccessResponse < Activity , ( ) > = SuccessResponse {
144195 status : ResponseStatus :: Success ,
145196 code : 200 ,
@@ -150,7 +201,6 @@ pub async fn read_one(
150201 ( StatusCode :: OK , Json ( response) )
151202 }
152203 None => {
153- println ! ( "Activity not found" ) ;
154204 let response = ErrorResponse {
155205 status : ResponseStatus :: Error ,
156206 code : 404 ,
0 commit comments