@@ -19,7 +19,7 @@ use crate::{
1919 } ,
2020 reports:: { Dimension , Metric } ,
2121 } ,
22- utils:: validate:: can_access_project ,
22+ utils:: validate:: { can_enumerate_project , can_view_project } ,
2323 web:: {
2424 RouterState ,
2525 session:: { Auth , MaybeAuth } ,
@@ -91,6 +91,8 @@ struct UpdateProjectRequest {
9191struct UpdateProjectInfo {
9292 display_name : String ,
9393 public : bool ,
94+ #[ serde( default ) ]
95+ unlisted : bool ,
9496 secret : Option < String > ,
9597}
9698
@@ -104,6 +106,8 @@ struct UpdatePasswordRequest {
104106struct CreateProjectRequest {
105107 display_name : String ,
106108 public : bool ,
109+ #[ serde( default ) ]
110+ unlisted : bool ,
107111 secret : Option < String > ,
108112 entities : Vec < String > ,
109113}
@@ -115,6 +119,7 @@ pub struct ProjectResponse {
115119 pub display_name : String ,
116120 pub entities : Vec < ProjectEntity > ,
117121 pub public : bool ,
122+ pub unlisted : bool ,
118123 pub hidden_metrics : Vec < Metric > ,
119124 pub hidden_dimensions : Vec < Dimension > ,
120125}
@@ -144,6 +149,7 @@ impl ProjectResponse {
144149 . map ( |entity| ProjectEntity { id : entity. id , display_name : entity. display_name } )
145150 . collect ( ) ,
146151 public : project. public ,
152+ unlisted : project. unlisted ,
147153 hidden_metrics : Metric :: all ( )
148154 . iter ( )
149155 . copied ( )
@@ -172,6 +178,7 @@ struct EntityProject {
172178 id : String ,
173179 display_name : String ,
174180 public : bool ,
181+ unlisted : bool ,
175182}
176183
177184#[ derive( Serialize , Deserialize , JsonSchema , Debug , Clone ) ]
@@ -343,6 +350,7 @@ async fn project_create_handler(
343350 id : project_id,
344351 display_name : project. display_name ,
345352 public : project. public ,
353+ unlisted : project. unlisted ,
346354 secret : project. secret ,
347355 } ,
348356 project. entities . as_slice ( ) ,
@@ -368,6 +376,7 @@ async fn project_update_handler(
368376 id : project_id. clone ( ) ,
369377 display_name : project. display_name ,
370378 public : project. public ,
379+ unlisted : project. unlisted ,
371380 secret : project. secret ,
372381 } )
373382 . http_err ( "Failed to update project" , StatusCode :: INTERNAL_SERVER_ERROR ) ?;
@@ -387,7 +396,7 @@ async fn projects_handler(
387396 MaybeAuth ( user) : MaybeAuth ,
388397) -> ApiResult < UseApi < impl IntoApiResponse , Json < ProjectsResponse > > > {
389398 let projects = app. projects . all ( ) . http_err ( "Failed to get projects" , StatusCode :: INTERNAL_SERVER_ERROR ) ?;
390- let projects: Vec < Project > = projects. into_iter ( ) . filter ( |p| can_access_project ( p, user. as_ref ( ) ) ) . collect ( ) ;
399+ let projects: Vec < Project > = projects. into_iter ( ) . filter ( |p| can_enumerate_project ( p, user. as_ref ( ) ) ) . collect ( ) ;
391400
392401 let mut resp = Vec :: new ( ) ;
393402 for project in projects {
@@ -405,7 +414,7 @@ async fn project_handler(
405414 Path ( project_id) : Path < String > ,
406415) -> ApiResult < UseApi < impl IntoApiResponse , Json < ProjectResponse > > > {
407416 let project = app. projects . get ( & project_id) . http_status ( StatusCode :: NOT_FOUND ) ?;
408- if !can_access_project ( & project, user. as_ref ( ) ) {
417+ if !can_view_project ( & project, user. as_ref ( ) ) {
409418 return Err ( StatusCode :: NOT_FOUND . into ( ) ) ;
410419 }
411420
@@ -595,6 +604,7 @@ async fn entities_handler(
595604 id : project. id ,
596605 display_name : project. display_name ,
597606 public : project. public ,
607+ unlisted : project. unlisted ,
598608 } )
599609 . collect ( ) ,
600610 } ) ;
0 commit comments