Skip to content

Commit bbc4914

Browse files
authored
Merge pull request #10 from SakaDream/update-dependencies
👋 2019, 🎉 2020!
2 parents 7f4e5f3 + 7866cc2 commit bbc4914

File tree

8 files changed

+114
-84
lines changed

8 files changed

+114
-84
lines changed

.vscode/launch.json

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,24 @@
44
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
55
"version": "0.2.0",
66
"configurations": [
7+
{
8+
"type": "lldb",
9+
"request": "launch",
10+
"name": "Debug executable 'actix-web-rest-api-with-jwt'",
11+
"cargo": {
12+
"args": [
13+
"build",
14+
"--bin=actix-web-rest-api-with-jwt",
15+
"--package=actix-web-rest-api-with-jwt"
16+
],
17+
"filter": {
18+
"name": "actix-web-rest-api-with-jwt",
19+
"kind": "bin"
20+
}
21+
},
22+
"args": [],
23+
"cwd": "${workspaceFolder}"
24+
},
725
{
826
"type": "lldb",
927
"request": "launch",

Cargo.toml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -5,29 +5,29 @@ authors = ["SakaDream <bahaimt@gmail.com>"]
55
edition = "2018"
66

77
[dependencies]
8-
actix-web = "1.0.8"
9-
actix-rt = "0.2.5"
10-
actix-service = "0.4.2"
8+
actix-web = "2.0.0"
9+
actix-rt = "1.0.0"
10+
actix-service = "1.0.1"
1111
log = "0.4.8"
1212
env_logger = "0.7.1"
1313
diesel_migrations = "1.4.0"
14-
serde = "1.0.102"
15-
serde_derive = "1.0.102"
16-
serde_json = "1.0.41"
14+
serde = "1.0.104"
15+
serde_derive = "1.0.104"
16+
serde_json = "1.0.44"
1717
dotenv = "0.15.0"
18-
futures = "0.1.29"
18+
futures = "0.3.1"
1919
failure = "0.1.6"
20-
derive_more = "0.15.0"
20+
derive_more = "0.99.2"
2121
jsonwebtoken = "6.0.1"
2222
bcrypt = "0.6.1"
23-
time = "0.1.42"
23+
time = "0.2.1"
2424

2525
[dependencies.diesel]
2626
version = "1.4.3"
2727
features = ["postgres", "r2d2", "chrono"]
2828

2929
[dependencies.chrono]
30-
version = "0.4.9"
30+
version = "0.4.10"
3131
features = ["serde"]
3232

3333
[dependencies.uuid]

src/api/account_controller.rs

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,30 @@ use crate::{
77
},
88
services::account_service,
99
};
10-
use actix_web::{web, Error, HttpRequest, HttpResponse};
11-
use futures::future::{ok, Future};
10+
use actix_web::{web, HttpRequest, HttpResponse, Result};
1211

1312
// POST api/auth/signup
14-
pub fn signup(user_dto: web::Json<UserDTO>, pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
13+
pub async fn signup(user_dto: web::Json<UserDTO>, pool: web::Data<Pool>) -> Result<HttpResponse> {
1514
match account_service::signup(user_dto.0, &pool) {
16-
Ok(message) => ok(HttpResponse::Ok().json(ResponseBody::new(&message, constants::EMPTY))),
17-
Err(err) => ok(err.response()),
15+
Ok(message) => Ok(HttpResponse::Ok().json(ResponseBody::new(&message, constants::EMPTY))),
16+
Err(err) => Ok(err.response()),
1817
}
1918
}
2019

2120
// POST api/auth/login
22-
pub fn login(login_dto: web::Json<LoginDTO>, pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
21+
pub async fn login(login_dto: web::Json<LoginDTO>, pool: web::Data<Pool>) -> Result<HttpResponse> {
2322
match account_service::login(login_dto.0, &pool) {
24-
Ok(token_res) => ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_LOGIN_SUCCESS, token_res))),
25-
Err(err) => ok(err.response()),
23+
Ok(token_res) => Ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_LOGIN_SUCCESS, token_res))),
24+
Err(err) => Ok(err.response()),
2625
}
2726
}
2827

2928
// POST api/auth/logout
30-
pub fn logout(req: HttpRequest, pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
29+
pub async fn logout(req: HttpRequest, pool: web::Data<Pool>) -> Result<HttpResponse> {
3130
if let Some(authen_header) = req.headers().get(constants::AUTHORIZATION) {
3231
account_service::logout(authen_header, &pool);
33-
ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_LOGOUT_SUCCESS, constants::EMPTY)))
32+
Ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_LOGOUT_SUCCESS, constants::EMPTY)))
3433
} else {
35-
ok(HttpResponse::BadRequest().json(ResponseBody::new(constants::MESSAGE_TOKEN_MISSING, constants::EMPTY)))
34+
Ok(HttpResponse::BadRequest().json(ResponseBody::new(constants::MESSAGE_TOKEN_MISSING, constants::EMPTY)))
3635
}
3736
}

src/api/address_book_controller.rs

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -7,53 +7,52 @@ use crate::{
77
},
88
services::address_book_service,
99
};
10-
use actix_web::{web, Error, HttpResponse};
11-
use futures::future::{ok, Future};
10+
use actix_web::{web, HttpResponse, Result};
1211

1312
// GET api/address-book
14-
pub fn find_all(pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
13+
pub async fn find_all(pool: web::Data<Pool>) -> Result<HttpResponse> {
1514
match address_book_service::find_all(&pool) {
16-
Ok(people) => ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, people))),
17-
Err(err) => ok(err.response()),
15+
Ok(people) => Ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, people))),
16+
Err(err) => Ok(err.response()),
1817
}
1918
}
2019

2120
// GET api/address-book/{id}
22-
pub fn find_by_id(id: web::Path<String>, pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
21+
pub async fn find_by_id(id: web::Path<String>, pool: web::Data<Pool>) -> Result<HttpResponse> {
2322
match address_book_service::find_by_id(id.into_inner().parse::<i32>().unwrap(), &pool) {
24-
Ok(person) => ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, person))),
25-
Err(err) => ok(err.response()),
23+
Ok(person) => Ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, person))),
24+
Err(err) => Ok(err.response()),
2625
}
2726
}
2827

2928
// GET api/address-book/query/{query}
30-
pub fn query(query: web::Path<String>, pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
29+
pub async fn query(query: web::Path<String>, pool: web::Data<Pool>) -> Result<HttpResponse> {
3130
match address_book_service::query(query.into_inner(), &pool) {
32-
Ok(people) => ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, people))),
33-
Err(err) => ok(err.response()),
31+
Ok(people) => Ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, people))),
32+
Err(err) => Ok(err.response()),
3433
}
3534
}
3635

3736
// POST api/address-book
38-
pub fn insert(new_person: web::Json<PersonDTO>, pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
37+
pub async fn insert(new_person: web::Json<PersonDTO>, pool: web::Data<Pool>) -> Result<HttpResponse> {
3938
match address_book_service::insert(new_person.0, &pool) {
40-
Ok(()) => ok(HttpResponse::Created().json(ResponseBody::new(constants::MESSAGE_OK, constants::EMPTY))),
41-
Err(err) => ok(err.response()),
39+
Ok(()) => Ok(HttpResponse::Created().json(ResponseBody::new(constants::MESSAGE_OK, constants::EMPTY))),
40+
Err(err) => Ok(err.response()),
4241
}
4342
}
4443

4544
// PUT api/address-book/{id}
46-
pub fn update(id: web::Path<String>, updated_person: web::Json<PersonDTO>, pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
45+
pub async fn update(id: web::Path<String>, updated_person: web::Json<PersonDTO>, pool: web::Data<Pool>) -> Result<HttpResponse> {
4746
match address_book_service::update(id.into_inner().parse::<i32>().unwrap(), updated_person.0, &pool) {
48-
Ok(()) => ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, constants::EMPTY))),
49-
Err(err) => ok(err.response()),
47+
Ok(()) => Ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, constants::EMPTY))),
48+
Err(err) => Ok(err.response()),
5049
}
5150
}
5251

5352
// DELETE api/address-book/{id}
54-
pub fn delete(id: web::Path<String>, pool: web::Data<Pool>) -> impl Future<Item = HttpResponse, Error = Error> {
53+
pub async fn delete(id: web::Path<String>, pool: web::Data<Pool>) -> Result<HttpResponse> {
5554
match address_book_service::delete(id.into_inner().parse::<i32>().unwrap(), &pool) {
56-
Ok(()) => ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, constants::EMPTY))),
57-
Err(err) => ok(err.response()),
55+
Ok(()) => Ok(HttpResponse::Ok().json(ResponseBody::new(constants::MESSAGE_OK, constants::EMPTY))),
56+
Err(err) => Ok(err.response()),
5857
}
5958
}

src/config/app.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,33 +10,33 @@ pub fn config_services(cfg: &mut web::ServiceConfig) {
1010
web::scope("/auth")
1111
.service(
1212
web::resource("/signup")
13-
.route(web::post().to_async(account_controller::signup))
13+
.route(web::post().to(account_controller::signup))
1414
)
1515
.service(
1616
web::resource("/login")
17-
.route(web::post().to_async(account_controller::login))
17+
.route(web::post().to(account_controller::login))
1818
)
1919
.service(
2020
web::resource("/logout")
21-
.route(web::post().to_async(account_controller::logout))
21+
.route(web::post().to(account_controller::logout))
2222
)
2323
)
2424
.service(
2525
web::scope("/address-book")
2626
.service(
2727
web::resource("")
28-
.route(web::get().to_async(address_book_controller::find_all))
29-
.route(web::post().to_async(address_book_controller::insert))
28+
.route(web::get().to(address_book_controller::find_all))
29+
.route(web::post().to(address_book_controller::insert))
3030
)
3131
.service(
3232
web::resource("/{id}")
33-
.route(web::get().to_async(address_book_controller::find_by_id))
34-
.route(web::put().to_async(address_book_controller::update))
35-
.route(web::delete().to_async(address_book_controller::delete))
33+
.route(web::get().to(address_book_controller::find_by_id))
34+
.route(web::put().to(address_book_controller::update))
35+
.route(web::delete().to(address_book_controller::delete))
3636
)
3737
.service(
3838
web::resource("/query/{query}")
39-
.route(web::get().to_async(address_book_controller::query))
39+
.route(web::get().to(address_book_controller::query))
4040
)
4141
)
4242
);

src/main.rs

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -35,9 +35,12 @@ mod services;
3535
mod utils;
3636

3737
use actix_web::{HttpServer, App};
38+
use actix_service::Service;
39+
use futures::FutureExt;
3840
use std::{io, env};
3941

40-
fn main() -> io::Result<()> {
42+
#[actix_rt::main]
43+
async fn main() -> io::Result<()> {
4144
dotenv::dotenv().expect("Failed to read .env file");
4245
env::set_var("RUST_LOG", "actix_web=debug");
4346

@@ -48,20 +51,19 @@ fn main() -> io::Result<()> {
4851
let app_url = format!("{}:{}", &app_host, &app_port);
4952
let db_url = env::var("DATABASE_URL").expect("DATABASE_URL not found.");
5053

51-
let sys = actix_rt::System::new("address-book");
5254
let pool = config::db::migrate_and_config_db(&db_url);
5355

5456
HttpServer::new(move || {
5557
App::new()
5658
.data(pool.clone())
5759
.wrap(actix_web::middleware::Logger::default())
5860
.wrap(crate::middleware::authen_middleware::Authentication)
61+
.wrap_fn(|req, srv| {
62+
srv.call(req).map(|res| res)
63+
})
5964
.configure(config::app::config_services)
6065
})
6166
.bind(&app_url)?
62-
.start();
63-
64-
info!("Server is started at {}", &app_url);
65-
66-
sys.run()
67+
.run()
68+
.await
6769
}
Lines changed: 37 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
1-
use crate::{
2-
config::db::Pool,
3-
constants,
4-
models::response::ResponseBody,
5-
utils::token_utils,
6-
};
1+
use crate::{config::db::Pool, constants, models::response::ResponseBody, utils::token_utils};
72
use actix_service::{Service, Transform};
83
use actix_web::{
9-
Error, HttpResponse,
104
dev::{ServiceRequest, ServiceResponse},
5+
Error, HttpResponse,
116
};
127
use futures::{
13-
Poll,
14-
future::{ok, Either, FutureResult},
8+
future::{ok, Ready},
9+
Future,
10+
};
11+
use std::{
12+
pin::Pin,
13+
task::{Context, Poll},
1514
};
1615

1716
pub struct Authentication;
@@ -20,13 +19,14 @@ impl<S, B> Transform<S> for Authentication
2019
where
2120
S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
2221
S::Future: 'static,
22+
B: 'static,
2323
{
2424
type Request = ServiceRequest;
2525
type Response = ServiceResponse<B>;
2626
type Error = Error;
2727
type InitError = ();
2828
type Transform = AuthenticationMiddleware<S>;
29-
type Future = FutureResult<Self::Transform, Self::InitError>;
29+
type Future = Ready<Result<Self::Transform, Self::InitError>>;
3030

3131
fn new_transform(&self, service: S) -> Self::Future {
3232
ok(AuthenticationMiddleware { service })
@@ -40,21 +40,24 @@ impl<S, B> Service for AuthenticationMiddleware<S>
4040
where
4141
S: Service<Request = ServiceRequest, Response = ServiceResponse<B>, Error = Error>,
4242
S::Future: 'static,
43+
B: 'static,
4344
{
4445
type Request = ServiceRequest;
4546
type Response = ServiceResponse<B>;
4647
type Error = Error;
47-
type Future = Either<S::Future, FutureResult<Self::Response, Self::Error>>;
48+
type Future = Pin<Box<dyn Future<Output = Result<Self::Response, Self::Error>>>>;
4849

49-
fn poll_ready(&mut self) -> Poll<(), Self::Error> {
50-
self.service.poll_ready()
50+
fn poll_ready(&mut self, cx: &mut Context<'_>) -> Poll<Result<(), Self::Error>> {
51+
self.service.poll_ready(cx)
5152
}
5253

5354
fn call(&mut self, mut req: ServiceRequest) -> Self::Future {
55+
let mut authenticate_pass: bool = false;
56+
5457
// Bypass some account routes
5558
for ignore_route in constants::IGNORE_ROUTES.iter() {
5659
if req.path().starts_with(ignore_route) {
57-
return Either::A(self.service.call(req));
60+
authenticate_pass = true;
5861
}
5962
}
6063

@@ -63,21 +66,16 @@ where
6366
if let Some(authen_header) = req.headers_mut().get(constants::AUTHORIZATION) {
6467
info!("Parsing authorization header...");
6568
if let Ok(authen_str) = authen_header.to_str() {
66-
if authen_str.starts_with("bearer") {
69+
if authen_str.starts_with("bearer") || authen_str.starts_with("Bearer") {
6770
info!("Parsing token...");
6871
let token = authen_str[6..authen_str.len()].trim();
6972
if let Ok(token_data) = token_utils::decode_token(token.to_string()) {
7073
info!("Decoding token...");
7174
if token_utils::verify_token(&token_data, &pool).is_ok() {
7275
info!("Valid token");
73-
return Either::A(self.service.call(req));
76+
authenticate_pass = true;
7477
} else {
7578
error!("Invalid token");
76-
return Either::B(ok(req.into_response(
77-
HttpResponse::Unauthorized()
78-
.json(ResponseBody::new(constants::MESSAGE_INVALID_TOKEN, constants::EMPTY))
79-
.into_body()
80-
)));
8179
}
8280
}
8381
}
@@ -86,10 +84,23 @@ where
8684
}
8785

8886
error!("{}", constants::MESSAGE_PROCESS_TOKEN_ERROR);
89-
Either::B(ok(req.into_response(
90-
HttpResponse::InternalServerError()
91-
.json(ResponseBody::new(constants::MESSAGE_PROCESS_TOKEN_ERROR, constants::EMPTY))
92-
.into_body()
93-
)))
87+
if authenticate_pass {
88+
let fut = self.service.call(req);
89+
Box::pin(async move {
90+
let res = fut.await?;
91+
Ok(res)
92+
})
93+
} else {
94+
Box::pin(async move {
95+
Ok(req.into_response(
96+
HttpResponse::Unauthorized()
97+
.json(ResponseBody::new(
98+
constants::MESSAGE_INVALID_TOKEN,
99+
constants::EMPTY,
100+
))
101+
.into_body(),
102+
))
103+
})
104+
}
94105
}
95106
}

0 commit comments

Comments
 (0)