@@ -4,7 +4,8 @@ use crate::api::SearchStudentsRequest;
44use crate :: api:: UserRequest ;
55use crate :: auth_middleware:: UserData ;
66use crate :: error:: ApiError ;
7- use crate :: models:: group:: { CreateGroup , GroupRepository } ;
7+ use crate :: models:: group:: { CreateGroup , GroupRepository , JoinRequestPolicy } ;
8+ use crate :: models:: group_join_request:: GroupJoinRequestRepository ;
89use crate :: response:: group:: { GroupResponse , GroupsResponse } ;
910use crate :: response:: shared:: User ;
1011use crate :: response:: Enrich ;
@@ -19,6 +20,7 @@ use tonic::transport::Channel;
1920#[ derive( Deserialize , Serialize ) ]
2021pub struct CreateGroupRequest {
2122 pub title : String ,
23+ pub join_policy : JoinRequestPolicy ,
2224}
2325
2426/// Endpoint to create a new group
@@ -39,6 +41,7 @@ pub async fn create_group(
3941 title : ( req. title ) . clone ( ) ,
4042 tutor : user. user_id ,
4143 members : vec ! [ ] ,
44+ join_policy : req. join_policy . clone ( ) ,
4245 } ;
4346 if !new_group. is_granted ( SecurityAction :: Create , & user) {
4447 return Err ( ApiError :: Forbidden {
@@ -112,6 +115,60 @@ pub async fn get_group(
112115 } )
113116}
114117
118+ #[ derive( Deserialize ) ]
119+ struct UpdateGroupRequest {
120+ pub title : String ,
121+ pub join_policy : JoinRequestPolicy ,
122+ }
123+
124+ #[ post( "/groups/{id}" ) ]
125+ pub async fn update_group (
126+ data : web:: Data < AppState > ,
127+ user : web:: ReqData < UserData > ,
128+ path : web:: Path < ( i32 , ) > ,
129+ req : web:: Json < UpdateGroupRequest > ,
130+ ) -> Result < HttpResponse , ApiError > {
131+ let conn = & mut data. db . db . get ( ) . unwrap ( ) ;
132+ let mut group =
133+ GroupRepository :: get_by_id ( path. into_inner ( ) . 0 , conn) . ok_or ( ApiError :: BadRequest {
134+ message : "No access to group" . to_string ( ) ,
135+ } ) ?;
136+
137+ if !group. is_granted ( SecurityAction :: Update , & user) {
138+ return Err ( ApiError :: Forbidden {
139+ message : "You are not allowed to update group" . to_string ( ) ,
140+ } ) ;
141+ }
142+
143+ let found_group = GroupRepository :: get_by_title ( & req. title , conn) ;
144+ if found_group. is_some ( ) && group. title . clone ( ) != found_group. unwrap ( ) . title {
145+ return Err ( ApiError :: BadRequest {
146+ message : "Group with this name already exists" . to_string ( ) ,
147+ } ) ;
148+ }
149+
150+ group. title = req. title . clone ( ) ;
151+ group. join_policy = req. join_policy . clone ( ) ;
152+
153+ if group. join_policy == JoinRequestPolicy :: Open {
154+ let requests = GroupJoinRequestRepository :: get_group_requests_no_pagination ( group. id , conn) ;
155+ group
156+ . members
157+ . extend ( requests. iter ( ) . map ( |r| Some ( r. requestor ) ) ) ;
158+ GroupJoinRequestRepository :: delete_all_requests_for_group ( group. id , conn) ;
159+ } else if group. join_policy == JoinRequestPolicy :: Closed {
160+ let requests = GroupJoinRequestRepository :: get_group_requests_no_pagination ( group. id , conn) ;
161+ for join_request in requests. iter ( ) {
162+ GroupJoinRequestRepository :: delete_request ( join_request. clone ( ) , conn) ;
163+ }
164+ }
165+
166+ GroupRepository :: update_group ( group. clone ( ) , conn) ;
167+
168+ let enriched = GroupResponse :: enrich ( & group, & mut data. user_api . clone ( ) , conn) . await ?;
169+ Ok ( HttpResponse :: Ok ( ) . json ( enriched) )
170+ }
171+
115172#[ derive( Deserialize ) ]
116173struct EnlistableQuery {
117174 pub search : String ,
0 commit comments