1
+ use crate :: auth:: user:: AuthenticatedUser ;
2
+ use crate :: db;
3
+ use crate :: models:: relationship:: { DevPmRelationship , InvitePmRequest , NewDevPmRelationship , RespondToInviteRequest } ;
4
+ use crate :: models:: snack:: Snack ;
5
+ use crate :: models:: user:: User ;
6
+ use crate :: schema:: dev_pm_relationships:: { self , developer_id, project_manager_id, status} ;
7
+ use crate :: schema:: snacks:: { self , user_id} ;
8
+ use crate :: schema:: users;
9
+ use diesel:: prelude:: * ;
10
+ use rocket:: http:: Status ;
11
+ use rocket:: serde:: json:: Json ;
12
+
13
+ #[ post( "/invite-pm" , data = "<invite_data>" ) ]
14
+ pub fn invite_project_manager (
15
+ invite_data : Json < InvitePmRequest > ,
16
+ user : AuthenticatedUser ,
17
+ ) -> Result < Json < DevPmRelationship > , Status > {
18
+ let mut conn = db:: establish_connection ( ) ;
19
+
20
+ if user. 0 . role != "developer" {
21
+ return Err ( Status :: Forbidden ) ;
22
+ }
23
+
24
+ let pm = users:: table
25
+ . find ( invite_data. project_manager_id )
26
+ . first :: < User > ( & mut conn)
27
+ . map_err ( |_| Status :: NotFound ) ?;
28
+
29
+ if pm. role != "project_manager" {
30
+ return Err ( Status :: BadRequest ) ;
31
+ }
32
+
33
+ let existing = DevPmRelationship :: for_developer ( user. 0 . id )
34
+ . filter ( project_manager_id. eq ( invite_data. project_manager_id ) )
35
+ . filter ( status. ne ( "rejected" ) )
36
+ . first :: < DevPmRelationship > ( & mut conn) ;
37
+
38
+ if existing. is_ok ( ) {
39
+ return Err ( Status :: BadRequest ) ;
40
+ }
41
+
42
+ let new_relationship = NewDevPmRelationship {
43
+ developer_id : user. 0 . id ,
44
+ project_manager_id : invite_data. project_manager_id ,
45
+ status : "pending" . to_string ( ) ,
46
+ } ;
47
+
48
+ diesel:: insert_into ( dev_pm_relationships:: table)
49
+ . values ( & new_relationship)
50
+ . get_result ( & mut conn)
51
+ . map ( Json )
52
+ . map_err ( |_| Status :: InternalServerError )
53
+ }
54
+
55
+ #[ get( "/my-developers" ) ]
56
+ pub fn list_developers ( user : AuthenticatedUser ) -> Result < Json < Vec < User > > , Status > {
57
+ let mut conn = db:: establish_connection ( ) ;
58
+
59
+ if user. 0 . role != "project_manager" {
60
+ return Err ( Status :: Forbidden ) ;
61
+ }
62
+
63
+ users:: table
64
+ . inner_join (
65
+ dev_pm_relationships:: table
66
+ . on ( developer_id. eq ( users:: id)
67
+ . and ( project_manager_id. eq ( user. 0 . id ) )
68
+ . and ( status. eq ( "accepted" ) ) )
69
+ )
70
+ . select ( users:: all_columns)
71
+ . load :: < User > ( & mut conn)
72
+ . map ( Json )
73
+ . map_err ( |_| Status :: InternalServerError )
74
+ }
75
+
76
+ #[ get( "/snacks" ) ]
77
+ pub fn list_snacks ( user : AuthenticatedUser ) -> Result < Json < Vec < Snack > > , Status > {
78
+ let mut conn = db:: establish_connection ( ) ;
79
+
80
+ match user. 0 . role . as_str ( ) {
81
+ "admin" => {
82
+ snacks:: table
83
+ . limit ( 100 )
84
+ . select ( Snack :: as_select ( ) )
85
+ . load ( & mut conn)
86
+ }
87
+ "project_manager" => {
88
+ snacks:: table
89
+ . inner_join (
90
+ dev_pm_relationships:: table
91
+ . on ( user_id. eq ( developer_id)
92
+ . and ( project_manager_id. eq ( user. 0 . id ) )
93
+ . and ( status. eq ( "accepted" ) ) )
94
+ )
95
+ . select ( Snack :: as_select ( ) )
96
+ . distinct ( )
97
+ . limit ( 100 )
98
+ . load ( & mut conn)
99
+ }
100
+ _ => {
101
+ snacks:: table
102
+ . filter ( user_id. eq ( user. 0 . id ) )
103
+ . limit ( 100 )
104
+ . select ( Snack :: as_select ( ) )
105
+ . load ( & mut conn)
106
+ }
107
+ }
108
+ . map ( Json )
109
+ . map_err ( |err| {
110
+ println ! ( "Database error: {:?}" , err) ;
111
+ Status :: InternalServerError
112
+ } )
113
+ }
114
+
115
+ #[ patch( "/respond-to-invite/<relationship_id>" , data = "<response_data>" ) ]
116
+ pub fn respond_to_invite (
117
+ relationship_id : i32 ,
118
+ response_data : Json < RespondToInviteRequest > ,
119
+ user : AuthenticatedUser ,
120
+ ) -> Result < Json < DevPmRelationship > , Status > {
121
+ let mut conn = db:: establish_connection ( ) ;
122
+
123
+ if user. 0 . role != "project_manager" {
124
+ return Err ( Status :: Forbidden ) ;
125
+ }
126
+
127
+ let relationship = DevPmRelationship :: for_project_manager ( user. 0 . id )
128
+ . filter ( dev_pm_relationships:: id. eq ( relationship_id) )
129
+ . first :: < DevPmRelationship > ( & mut conn)
130
+ . map_err ( |_| Status :: NotFound ) ?;
131
+
132
+ if relationship. status != "pending" {
133
+ return Err ( Status :: BadRequest ) ;
134
+ }
135
+
136
+ diesel:: update ( dev_pm_relationships:: table. find ( relationship_id) )
137
+ . set ( status. eq ( & response_data. status ) )
138
+ . get_result ( & mut conn)
139
+ . map ( Json )
140
+ . map_err ( |_| Status :: InternalServerError )
141
+ }
0 commit comments