@@ -9,7 +9,8 @@ mod test_helpers;
9
9
10
10
use crate :: database:: {
11
11
create_ticket, create_user, delete_ticket, edit_ticket, filter_tickets_in_database,
12
- get_all_tickets, get_user_by_email, remove_session_from_db, write_session_to_db, DataBase ,
12
+ get_all_tickets, get_single_ticket, get_user_by_email, remove_session_from_db,
13
+ write_session_to_db, DataBase ,
13
14
} ;
14
15
use crate :: middleware:: validator;
15
16
use crate :: models:: { NewSession , NewUser , Ticket , TokenClaims } ;
@@ -18,8 +19,9 @@ use crate::status_messages::{
18
19
CANNOT_LOGOUT , ERROR_COULD_NOT_CREATE_TICKET , ERROR_COULD_NOT_CREATE_USER ,
19
20
ERROR_COULD_NOT_DELETE , ERROR_COULD_NOT_GET , ERROR_COULD_NOT_UPDATE , ERROR_INCORRECT_PASSWORD ,
20
21
ERROR_INVALID_ID , ERROR_NOT_FOUND , ERROR_NOT_LOGGED_IN , ERROR_NO_USER_FOUND ,
21
- ERROR_USER_ALREADY_EXISTS , SUCCESS_LOGIN , SUCCESS_LOGOUT ,
22
+ ERROR_USER_ALREADY_EXISTS , SUCCESS_LOGOUT ,
22
23
} ;
24
+ use actix_cors:: Cors ;
23
25
use actix_web:: cookie:: time:: Duration ;
24
26
use actix_web:: cookie:: Cookie ;
25
27
use actix_web:: web:: { Json , Path } ;
@@ -39,15 +41,20 @@ async fn main() -> Result<()> {
39
41
HttpServer :: new ( move || {
40
42
let bearer_middleware = HttpAuthentication :: bearer ( validator) ;
41
43
42
- App :: new ( ) . service ( signup) . service ( login) . service (
43
- web:: scope ( "" )
44
- . wrap ( bearer_middleware)
45
- . service ( create)
46
- . service ( get_tickets)
47
- . service ( delete)
48
- . service ( edit)
49
- . service ( filter_tickets)
50
- . service ( logout) ,
44
+ let cors = Cors :: permissive ( ) . allow_any_method ( ) . allow_any_origin ( ) ;
45
+
46
+ App :: new ( ) . wrap ( cors) . service (
47
+ web:: scope ( "/api" ) . service ( signup) . service ( login) . service (
48
+ web:: scope ( "" )
49
+ . wrap ( bearer_middleware)
50
+ . service ( create)
51
+ . service ( get_tickets)
52
+ . service ( get_ticket)
53
+ . service ( delete)
54
+ . service ( edit)
55
+ . service ( filter_tickets)
56
+ . service ( logout) ,
57
+ ) ,
51
58
)
52
59
} )
53
60
. bind ( ( "localhost" , 8080 ) ) ?
@@ -84,6 +91,22 @@ async fn get_tickets() -> impl Responder {
84
91
}
85
92
}
86
93
94
+ #[ get( "/tickets/{id}" ) ]
95
+ async fn get_ticket ( ticket_id : Path < i32 > ) -> impl Responder {
96
+ let mut database = DataBase :: new ( ) ;
97
+ let ticket_id = ticket_id. into_inner ( ) ;
98
+
99
+ match get_single_ticket ( ticket_id, & mut database. connection ) {
100
+ Ok ( ticket) => HttpResponse :: Ok ( ) . json ( ticket. to_ticket ( ) ) ,
101
+ Err ( err) => match err {
102
+ Error :: NotFound => {
103
+ HttpResponse :: NotFound ( ) . json ( format ! ( "{} {}" , ERROR_NOT_FOUND , ticket_id) )
104
+ }
105
+ _ => HttpResponse :: InternalServerError ( ) . json ( ERROR_COULD_NOT_GET ) ,
106
+ } ,
107
+ }
108
+ }
109
+
87
110
#[ post( "/filter" ) ]
88
111
async fn filter_tickets ( payload : Json < FilterPayload > ) -> impl Responder {
89
112
let mut database = DataBase :: new ( ) ;
@@ -211,10 +234,10 @@ async fn login(payload: Json<LoginPayload>) -> impl Responder {
211
234
& mut database. connection ,
212
235
) ;
213
236
214
- let bearer_cookie = Cookie :: build ( "cira-bearer-token" , token_str)
215
- . http_only ( true )
237
+ let bearer_cookie = Cookie :: build ( "cira-bearer-token" , & token_str)
238
+ . http_only ( false )
216
239
. finish ( ) ;
217
- HttpResponse :: Ok ( ) . cookie ( bearer_cookie) . json ( SUCCESS_LOGIN )
240
+ HttpResponse :: Ok ( ) . cookie ( bearer_cookie) . body ( token_str )
218
241
} else {
219
242
HttpResponse :: Unauthorized ( ) . json ( ERROR_INCORRECT_PASSWORD )
220
243
}
@@ -897,4 +920,37 @@ mod tests {
897
920
assert_eq ! ( response. status( ) . as_u16( ) , StatusCode :: UNAUTHORIZED ) ;
898
921
}
899
922
}
923
+
924
+ mod get_ticket {
925
+ use super :: * ;
926
+ use crate :: get_ticket;
927
+ use crate :: models:: Ticket ;
928
+ use actix_web:: http:: StatusCode ;
929
+
930
+ #[ actix_web:: test]
931
+ #[ serial]
932
+ async fn test_get_ticket ( ) {
933
+ setup_database ( ) ;
934
+
935
+ let app = test:: init_service ( App :: new ( ) . service ( get_ticket) ) . await ;
936
+ let req = TestRequest :: get ( ) . uri ( "/tickets/1" ) . to_request ( ) ;
937
+
938
+ let response: Ticket = test:: call_and_read_body_json ( & app, req) . await ;
939
+
940
+ assert_eq ! ( response. id, 1 ) ;
941
+ }
942
+
943
+ #[ actix_web:: test]
944
+ #[ serial]
945
+ async fn not_found ( ) {
946
+ setup_database ( ) ;
947
+
948
+ let app = test:: init_service ( App :: new ( ) . service ( get_ticket) ) . await ;
949
+ let req = TestRequest :: get ( ) . uri ( "/tickets/333" ) . to_request ( ) ;
950
+
951
+ let response = test:: call_service ( & app, req) . await ;
952
+
953
+ assert_eq ! ( response. status( ) . as_u16( ) , StatusCode :: NOT_FOUND ) ;
954
+ }
955
+ }
900
956
}
0 commit comments