Skip to content

Commit 030c01d

Browse files
committed
fix: use DbPool
1 parent 67d26ae commit 030c01d

11 files changed

Lines changed: 93 additions & 58 deletions

File tree

Cargo.lock

Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ diesel = { version = "2.2", features = [
1919
# "postgres",
2020
"chrono",
2121
"returning_clauses_for_sqlite_3_35",
22+
"r2d2",
2223
] }
2324
dotenvy = "0.15"
2425
chrono = { version = "0.4", features = ["serde"] }
26+
serde = { version = "1.0.219", features = ["derive"] }

file_classification_core/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ edition = "2024"
77
diesel = { workspace = true }
88
dotenvy = { workspace = true }
99
chrono = { workspace = true }
10-
serde = { version = "1.0.219", features = ["derive"] }
10+
serde = { workspace = true }
1111
#mysqlclient-sys = { workspace = true }
1212
#libsqlite3-sys = { workspace = true }
1313
#openssl-sys = { workspace = true }

file_classification_webapi/Cargo.toml

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,14 @@ edition = "2024"
55

66
[dependencies]
77
file_classification_core = { path = "../file_classification_core" }
8-
chrono = { workspace = true, version = "0.4.41", features = ["serde"] }
8+
chrono = { workspace = true }
9+
serde = { workspace = true }
10+
#diesel = { workspace = true, features = ["r2d2"] }
11+
diesel = { workspace = true }
12+
dotenvy = { workspace = true }
13+
# web related deps
914
actix-web = "4.11.0"
10-
serde = { version = "1.0.219", features = ["derive"] }
1115
lazy_static = "1.5.0"
12-
diesel = { version = "2.2.12", features = ["r2d2"] }
1316
serde_json = "1.0.142"
1417
once_cell = "1.21.3"
1518
env_logger = "0.11.8"

file_classification_webapi/src/bin/file_classification_webapi.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,20 @@
11
use actix_web::{web, App, HttpServer, middleware::Logger};
2-
use file_classification_core::utils::database::establish_connection;
32
mod handlers;
43
mod utils;
4+
5+
use utils::database::establish_connection_pool;
6+
57
#[actix_web::main]
68
async fn main() -> std::io::Result<()> {
79
env_logger::init();
810

911
println!("正在启动文件分类 Web API...");
1012

11-
HttpServer::new(|| {
13+
let pool = establish_connection_pool();
14+
15+
HttpServer::new(move || {
1216
App::new()
13-
.app_data(web::Data::new(establish_connection()))
17+
.app_data(web::Data::new(pool.clone()))
1418
.wrap(Logger::default())
1519
.service(handlers::files::api_list_files)
1620
.service(handlers::files::api_list_files_by_conditions)

file_classification_webapi/src/bin/handlers/file_groups.rs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ use actix_web::{get, post, delete, web, HttpResponse, Result};
22
use serde_json::json;
33
use file_classification_core::{model::models::FileGroupCondition, service::file_group::{select_file_groups_by_conditions, create_file_group, delete_file_group}, utils};
44
use file_classification_core::model::models::FileGroupDTO;
5-
// TODO: 自己创建数据库
6-
use file_classification_core::utils::database::establish_connection;
5+
use crate::utils::database::{DbPool, DbPooledConnection};
76
use crate::utils::models::{ApiResponse, ApiError};
87

98

109
#[get("/api/file-groups")]
1110
async fn api_list_file_groups_by_conditions(
1211
conditions: web::Json<Vec<FileGroupCondition>>,
12+
pool: web::Data<DbPool>,
1313
) -> Result<HttpResponse> {
14-
let mut conn = establish_connection();
14+
let mut conn = pool.get().expect("Failed to get connection from pool");
1515
match select_file_groups_by_conditions(&mut conn, conditions.into_inner(), Some(100)) {
1616
Ok(file_groups) => {
1717
let count = file_groups.len();
@@ -32,8 +32,9 @@ async fn api_list_file_groups_by_conditions(
3232
#[post("/api/file-groups")]
3333
async fn api_create_file_group(
3434
file_group_dto: web::Json<FileGroupDTO>,
35+
pool: web::Data<DbPool>,
3536
) -> Result<HttpResponse> {
36-
let mut conn = establish_connection();
37+
let mut conn = pool.get().expect("Failed to get connection from pool");
3738
match create_file_group(&mut conn, file_group_dto.into_inner()) {
3839
Ok(_) => Ok(HttpResponse::Created().json(json!({
3940
"success": true,
@@ -49,8 +50,9 @@ async fn api_create_file_group(
4950
#[delete("/api/file-groups")]
5051
async fn api_delete_file_group(
5152
file_group_dto: web::Json<FileGroupDTO>,
53+
pool: web::Data<DbPool>,
5254
) -> Result<HttpResponse> {
53-
let mut conn = utils::database::establish_connection();
55+
let mut conn = pool.get().expect("Failed to get connection from pool");
5456
match delete_file_group(&mut conn, file_group_dto.into_inner()) {
5557
Ok(_) => Ok(HttpResponse::Ok().json(json!({
5658
"success": true,

file_classification_webapi/src/bin/handlers/files.rs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
use actix_web::{get, post, put, delete, web, HttpResponse, Result};
22
use serde_json::json;
33
use file_classification_core::{model::models::{FileCondition, UpdateFileDTO, FileFilter}, service::files::{select_files, select_files_by_conditions, update_files_by_conditions, delete_file}, utils};
4-
use crate::utils::models::{ApiResponse, ApiError};
4+
use file_classification_core::service::files::create_file;
5+
use crate::utils::database::{DbPool, DbPooledConnection};
6+
use crate::utils::models::{ApiResponse, ApiError, CreateFileDTO};
7+
58
#[get("/api/files")]
69
async fn api_list_files(
710
query: web::Query<FileFilter>,
11+
pool: web::Data<DbPool>,
812
) -> Result<HttpResponse> {
9-
let mut conn = utils::database::establish_connection();
13+
let mut conn = pool.get().expect("Failed to get connection from pool");
1014
match select_files(&mut conn, query.into_inner(), 100) {
1115
Ok(files) => {
1216
let count = files.len();
@@ -27,8 +31,9 @@ async fn api_list_files(
2731
#[post("/api/files/search")]
2832
async fn api_list_files_by_conditions(
2933
conditions: web::Json<Vec<FileCondition>>,
34+
pool: web::Data<DbPool>,
3035
) -> Result<HttpResponse> {
31-
let mut conn = utils::database::establish_connection();
36+
let mut conn = pool.get().expect("Failed to get connection from pool");
3237
match select_files_by_conditions(&mut conn, conditions.into_inner(), Some(100)) {
3338
Ok(files) => {
3439
let count = files.len();
@@ -49,15 +54,16 @@ async fn api_list_files_by_conditions(
4954
// #[post("/api/files")]
5055
// async fn api_create_file(
5156
// file_dto: web::Json<CreateFileDTO>,
57+
// pool: web::Data<DbPool>,
5258
// ) -> Result<HttpResponse> {
5359
// let create_dto = file_classification_core::model::models::CreateFileDTO {
5460
// type_: &file_dto.type_,
5561
// path: &file_dto.path,
5662
// group_id: file_dto.group_id,
5763
// };
5864
//
59-
// let mut conn = utils::database::establish_connection();
60-
// match create_file(&mut conn, &create_dto) {
65+
// let mut conn = pool.get().expect("Failed to get connection from pool");
66+
// match create_file(&mut conn, create_dto) {
6167
// Ok(file) => Ok(HttpResponse::Created().json(ApiResponse::from(file))),
6268
// Err(e) => Ok(HttpResponse::InternalServerError().json(ApiError {
6369
// success: false,
@@ -69,10 +75,11 @@ async fn api_list_files_by_conditions(
6975
#[put("/api/files")]
7076
async fn api_update_files_by_conditions(
7177
payload: web::Json<(Vec<FileCondition>, UpdateFileDTO)>,
78+
pool: web::Data<DbPool>,
7279
) -> Result<HttpResponse> {
7380
let (conditions, update_dto) = payload.into_inner();
7481

75-
let mut conn = utils::database::establish_connection();
82+
let mut conn = pool.get().expect("Failed to get connection from pool");
7683
match update_files_by_conditions(&mut conn, conditions, update_dto) {
7784
Ok(count) => Ok(HttpResponse::Ok().json(json!({
7885
"success": true,
@@ -89,10 +96,11 @@ async fn api_update_files_by_conditions(
8996
#[delete("/api/files/{id}")]
9097
async fn api_delete_file(
9198
path: web::Path<i32>,
99+
pool: web::Data<DbPool>,
92100
) -> Result<HttpResponse> {
93101
let file_id = path.into_inner();
94102

95-
let mut conn = utils::database::establish_connection();
103+
let mut conn = pool.get().expect("Failed to get connection from pool");
96104
match delete_file(&mut conn, file_id) {
97105
Ok(_) => Ok(HttpResponse::Ok().json(json!({
98106
"success": true,

file_classification_webapi/src/bin/handlers/group_tags.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ use actix_web::{get, post, delete, web, HttpResponse, Result};
22
use serde_json::json;
33
use file_classification_core::{model::models::GroupTagCondition, service::group_tag::{select_group_tags_by_conditions, create_group_tag, delete_group_tag_by_id}, utils};
44
use file_classification_core::model::models::GroupTagDTO;
5+
use crate::utils::database::{DbPool, DbPooledConnection};
56
use crate::utils::models::{CreateGroupTagDTO, ApiResponse, ApiError};
67

78
#[get("/api/group-tags")]
89
async fn api_list_group_tags_by_conditions(
910
conditions: web::Json<Vec<GroupTagCondition>>,
11+
pool: web::Data<DbPool>,
1012
) -> Result<HttpResponse> {
11-
let mut conn = utils::database::establish_connection();
13+
let mut conn = pool.get().expect("Failed to get connection from pool");
1214
match select_group_tags_by_conditions(&mut conn, conditions.into_inner(), Some(100)) {
1315
Ok(group_tags) => {
1416
let count = group_tags.len();
@@ -29,8 +31,9 @@ async fn api_list_group_tags_by_conditions(
2931
#[post("/api/group-tags")]
3032
async fn api_create_group_tag(
3133
group_tag_dto: web::Json<GroupTagDTO>,
34+
pool: web::Data<DbPool>,
3235
) -> Result<HttpResponse> {
33-
let mut conn = utils::database::establish_connection();
36+
let mut conn = pool.get().expect("Failed to get connection from pool");
3437
match create_group_tag(&mut conn, group_tag_dto.into_inner()) {
3538
Ok(_) => Ok(HttpResponse::Created().json(json!({
3639
"success": true,
@@ -46,8 +49,9 @@ async fn api_create_group_tag(
4649
#[delete("/api/group-tags")]
4750
async fn api_delete_group_tag(
4851
group_tag_dto: web::Json<GroupTagDTO>,
52+
pool: web::Data<DbPool>,
4953
) -> Result<HttpResponse> {
50-
let mut conn = utils::database::establish_connection();
54+
let mut conn = pool.get().expect("Failed to get connection from pool");
5155
match delete_group_tag_by_id(&mut conn, group_tag_dto.into_inner()) {
5256
Ok(_) => Ok(HttpResponse::Ok().json(json!({
5357
"success": true,

file_classification_webapi/src/bin/handlers/groups.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
use actix_web::{get, post, put, delete, web, HttpResponse, Result};
22
use serde_json::json;
33
use file_classification_core::{model::models::{GroupCondition, UpdateGroupDTO, GroupFilter}, service::groups::{select_groups, select_groups_by_conditions, create_group, update_groups_by_conditions, delete_group}, utils};
4+
use crate::utils::database::{DbPool, DbPooledConnection};
45
use crate::utils::models::{CreateGroupDTO, ApiResponse, ApiError};
56

67
#[get("/api/groups")]
78
async fn api_list_groups(
89
query: web::Query<GroupFilter>,
10+
pool: web::Data<DbPool>,
911
) -> Result<HttpResponse> {
10-
let mut conn = utils::database::establish_connection();
12+
let mut conn = pool.get().expect("Failed to get connection from pool");
1113
match select_groups(&mut conn, query.into_inner(), 100) {
1214
Ok(groups) => {
1315
let count = groups.len();
@@ -28,8 +30,9 @@ async fn api_list_groups(
2830
#[post("/api/groups/search")]
2931
async fn api_list_groups_by_conditions(
3032
conditions: web::Json<Vec<GroupCondition>>,
33+
pool: web::Data<DbPool>,
3134
) -> Result<HttpResponse> {
32-
let mut conn = utils::database::establish_connection();
35+
let mut conn = pool.get().expect("Failed to get connection from pool");
3336
match select_groups_by_conditions(&mut conn, conditions.into_inner(), Some(100)) {
3437
Ok(groups) => {
3538
let count = groups.len();
@@ -50,8 +53,9 @@ async fn api_list_groups_by_conditions(
5053
#[post("/api/groups")]
5154
async fn api_create_group(
5255
group_dto: web::Json<CreateGroupDTO>,
56+
pool: web::Data<DbPool>,
5357
) -> Result<HttpResponse> {
54-
let mut conn = utils::database::establish_connection();
58+
let mut conn = pool.get().expect("Failed to get connection from pool");
5559
match create_group(&mut conn, &group_dto.name) {
5660
Ok(group) => Ok(HttpResponse::Created().json(ApiResponse::from(group))),
5761
Err(e) => Ok(HttpResponse::InternalServerError().json(ApiError {
@@ -64,10 +68,11 @@ async fn api_create_group(
6468
#[put("/api/groups")]
6569
async fn api_update_groups_by_conditions(
6670
payload: web::Json<(Vec<GroupCondition>, UpdateGroupDTO)>,
71+
pool: web::Data<DbPool>,
6772
) -> Result<HttpResponse> {
6873
let (conditions, update_dto) = payload.into_inner();
6974

70-
let mut conn = utils::database::establish_connection();
75+
let mut conn = pool.get().expect("Failed to get connection from pool");
7176
match update_groups_by_conditions(&mut conn, conditions, update_dto) {
7277
Ok(count) => Ok(HttpResponse::Ok().json(json!({
7378
"success": true,
@@ -84,10 +89,11 @@ async fn api_update_groups_by_conditions(
8489
#[delete("/api/groups/{id}")]
8590
async fn api_delete_group(
8691
path: web::Path<i32>,
92+
pool: web::Data<DbPool>,
8793
) -> Result<HttpResponse> {
8894
let group_id = path.into_inner();
8995

90-
let mut conn = utils::database::establish_connection();
96+
let mut conn = pool.get().expect("Failed to get connection from pool");
9197
match delete_group(&mut conn, group_id) {
9298
Ok(_) => Ok(HttpResponse::Ok().json(json!({
9399
"success": true,

file_classification_webapi/src/bin/handlers/tags.rs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
use actix_web::{get, post, put, delete, web, HttpResponse, Result};
22
use serde_json::json;
33
use file_classification_core::{model::models::{TagCondition, UpdateTagDTO, TagFilter}, service::tags::{select_tags, select_tags_by_conditions, create_tag, update_tags_by_conditions, delete_tag}, utils};
4+
use crate::utils::database::{DbPool, DbPooledConnection};
45
use crate::utils::models::{CreateTagDTO, ApiResponse, ApiError};
56

67
#[get("/api/tags")]
78
async fn api_list_tags(
89
query: web::Query<TagFilter>,
10+
pool: web::Data<DbPool>,
911
) -> Result<HttpResponse> {
10-
let mut conn = utils::database::establish_connection();
12+
let mut conn = pool.get().expect("Failed to get connection from pool");
1113
match select_tags(&mut conn, query.into_inner(), 100) {
1214
Ok(tags) => {
1315
let count = tags.len();
@@ -28,8 +30,9 @@ async fn api_list_tags(
2830
#[post("/api/tags/search")]
2931
async fn api_list_tags_by_conditions(
3032
conditions: web::Json<Vec<TagCondition>>,
33+
pool: web::Data<DbPool>,
3134
) -> Result<HttpResponse> {
32-
let mut conn = utils::database::establish_connection();
35+
let mut conn = pool.get().expect("Failed to get connection from pool");
3336
match select_tags_by_conditions(&mut conn, conditions.into_inner(), Some(100)) {
3437
Ok(tags) => {
3538
let count = tags.len();
@@ -50,8 +53,9 @@ async fn api_list_tags_by_conditions(
5053
#[post("/api/tags")]
5154
async fn api_create_tag(
5255
tag_dto: web::Json<CreateTagDTO>,
56+
pool: web::Data<DbPool>,
5357
) -> Result<HttpResponse> {
54-
let mut conn = utils::database::establish_connection();
58+
let mut conn = pool.get().expect("Failed to get connection from pool");
5559
match create_tag(&mut conn, &tag_dto.name) {
5660
Ok(tag) => Ok(HttpResponse::Created().json(ApiResponse::from(tag))),
5761
Err(e) => Ok(HttpResponse::InternalServerError().json(ApiError {
@@ -64,9 +68,10 @@ async fn api_create_tag(
6468
#[put("/api/tags")]
6569
async fn api_update_tags_by_conditions(
6670
payload: web::Json<(Vec<TagCondition>, UpdateTagDTO)>,
71+
pool: web::Data<DbPool>,
6772
) -> Result<HttpResponse> {
6873
let (conditions, update_dto) = payload.into_inner();
69-
let mut conn = utils::database::establish_connection();
74+
let mut conn = pool.get().expect("Failed to get connection from pool");
7075

7176
match update_tags_by_conditions(&mut conn, conditions, update_dto) {
7277
Ok(count) => Ok(HttpResponse::Ok().json(json!({
@@ -84,10 +89,11 @@ async fn api_update_tags_by_conditions(
8489
#[delete("/api/tags/{id}")]
8590
async fn api_delete_tag(
8691
path: web::Path<i32>,
92+
pool: web::Data<DbPool>,
8793
) -> Result<HttpResponse> {
8894
let tag_id = path.into_inner();
8995

90-
let mut conn = utils::database::establish_connection();
96+
let mut conn = pool.get().expect("Failed to get connection from pool");
9197
match delete_tag(&mut conn, tag_id) {
9298
Ok(_) => Ok(HttpResponse::Ok().json(json!({
9399
"success": true,

0 commit comments

Comments
 (0)