Skip to content

Commit c50b686

Browse files
committed
feat: add delete for file_group group_tag
1 parent 1329714 commit c50b686

12 files changed

Lines changed: 163 additions & 8 deletions

File tree

file_classification_cli/Cargo.toml

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -54,19 +54,26 @@ doc = false
5454
name = "delete_tag"
5555
doc = false
5656

57+
[[bin]]
58+
name = "list_group_tags_by_conditions"
59+
doc = false
60+
5761
[[bin]]
5862
name = "create_group_tag"
5963
doc = false
6064

6165
[[bin]]
62-
name = "list_file_groups_by_conditions"
66+
name = "delete_group_tag"
6367
doc = false
6468

6569
[[bin]]
66-
name = "list_group_tags_by_conditions"
70+
name = "list_file_groups_by_conditions"
6771
doc = false
6872

6973
[[bin]]
7074
name = "create_file_group"
7175
doc = false
7276

77+
[[bin]]
78+
name = "delete_file_group"
79+
doc = false
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
use file_classification_core::service::file_group::delete_file_group;
2+
use file_classification_core::utils::database::establish_connection;
3+
use std::io::{stdin, stdout, Write};
4+
5+
fn main() {
6+
let connection = &mut establish_connection();
7+
8+
let mut file_id_input = String::new();
9+
let mut group_id_input = String::new();
10+
11+
print!("Please input File ID: ");
12+
stdout().flush().unwrap();
13+
stdin().read_line(&mut file_id_input).unwrap();
14+
let file_id: i32 = file_id_input.trim().parse().expect("Invalid File ID");
15+
16+
print!("Please input Group ID: ");
17+
stdout().flush().unwrap();
18+
stdin().read_line(&mut group_id_input).unwrap();
19+
let group_id: i32 = group_id_input.trim().parse().expect("Invalid Group ID");
20+
21+
let result = delete_file_group(connection, file_id, group_id);
22+
match result {
23+
Ok(deleted_file_group_num) => {
24+
if (deleted_file_group_num == 0) {
25+
println!("No FileGroup deleted!");
26+
} else { println!("FileGroup deleted successfully!({:?} line changed)", deleted_file_group_num) }
27+
}
28+
Err(e) => eprintln!("Error deleting FileGroup: {}", e),
29+
}
30+
}
31+
32+
#[allow(dead_code)]
33+
#[cfg(not(windows))]
34+
const EOF: &str = "CTRL+D";
35+
36+
#[allow(dead_code)]
37+
#[cfg(windows)]
38+
const EOF: &str = "CTRL+Z";
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
use file_classification_core::service::group_tag::delete_group_tag;
2+
use file_classification_core::utils::database::establish_connection;
3+
use std::io::{stdin, stdout, Write};
4+
5+
fn main() {
6+
let connection = &mut establish_connection();
7+
8+
let mut group_id_input = String::new();
9+
let mut tag_id_input = String::new();
10+
11+
print!("Please input Group ID: ");
12+
stdout().flush().unwrap();
13+
stdin().read_line(&mut group_id_input).unwrap();
14+
let group_id: i32 = group_id_input.trim().parse().expect("Invalid Group ID");
15+
16+
print!("Please input Tag ID: ");
17+
stdout().flush().unwrap();
18+
stdin().read_line(&mut tag_id_input).unwrap();
19+
let tag_id: i32 = tag_id_input.trim().parse().expect("Invalid Tag ID");
20+
21+
let result = delete_group_tag(connection, group_id, tag_id);
22+
match result {
23+
Ok(deleted_group_tag_num) => {
24+
if (deleted_group_tag_num == 0) {
25+
println!("No GroupTag deleted!");
26+
} else {
27+
println!("GroupTag deleted successfully!({:?} line changed)", deleted_group_tag_num)
28+
}
29+
}
30+
Err(e) => eprintln!("Error deleting GroupTag: {}", e),
31+
}
32+
}
33+
34+
#[allow(dead_code)]
35+
#[cfg(not(windows))]
36+
const EOF: &str = "CTRL+D";
37+
38+
#[allow(dead_code)]
39+
#[cfg(windows)]
40+
const EOF: &str = "CTRL+Z";

file_classification_cli/src/bin/list_file_groups_by_conditions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use file_classification_core::model::models::FileGroupCondition;
2+
use file_classification_core::service::file_group::select_file_groups_by_conditions;
23
use file_classification_core::utils::database::establish_connection;
34
use std::io::{self, Write};
4-
use file_classification_core::service::file_group::select_file_groups_by_conditions;
55

66
fn main() {
77
let connection = &mut establish_connection();

file_classification_cli/src/bin/list_files.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use file_classification_core::model::models::FileFilter;
12
use file_classification_core::service::files::select_files;
23
use file_classification_core::utils::database::establish_connection;
3-
use file_classification_core::model::models::FileFilter;
44
// 引入select_files和SearchFile
55

66
fn main() {

file_classification_cli/src/bin/list_group_tags_by_conditions.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use file_classification_core::model::models::GroupTagCondition;
2+
use file_classification_core::service::group_tag::select_group_tags_by_conditions;
23
use file_classification_core::utils::database::establish_connection;
34
use std::io::{self, Write};
4-
use file_classification_core::service::group_tag::select_group_tags_by_conditions;
55

66
fn main() {
77
let connection = &mut establish_connection();

file_classification_cli/src/bin/list_groups.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use file_classification_core::model::models::GroupFilter;
12
use file_classification_core::service::groups::select_groups;
23
use file_classification_core::utils::database::establish_connection;
3-
use file_classification_core::model::models::GroupFilter;
44
// 引入select_groups和SearchGroup
55

66
fn main() {

file_classification_cli/src/bin/list_tags.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use file_classification_core::model::models::TagFilter;
12
use file_classification_core::service::tags::select_tags;
23
use file_classification_core::utils::database::establish_connection;
3-
use file_classification_core::model::models::TagFilter;
44
// 引入select_tags和SearchTag
55

66
fn main() {

file_classification_core/src/internal/file_group.rs

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::internal::{
33
files::increase_file_reference_count,
44
groups::{find_group_by_id, increase_group_reference_count},
55
};
6-
use crate::model::schema::file_groups;
6+
use crate::model::schema::{file_groups};
77
use diesel::prelude::*;
88
use std::fmt::{Debug, Formatter, Result as fmtResult};
99

@@ -27,6 +27,31 @@ pub fn create_file_group(
2727
let _ = result?;
2828
Ok(new_file_group)
2929
}
30+
31+
pub fn delete_file_group(
32+
conn: &mut SqliteConnection,
33+
file_id: i32,
34+
group_id: i32,
35+
) -> Result<usize, AppError> {
36+
let result = conn.transaction::<_, AppError, _>(|conn| {
37+
// 减少组和标签的引用计数
38+
decrease_group_reference_count(conn, group_id)?;
39+
decrease_file_reference_count(conn, file_id)?;
40+
41+
// 删除关联记录
42+
let deleted_count = diesel::delete(
43+
file_groups::table
44+
.filter(file_groups::group_id.eq(group_id))
45+
.filter(file_groups::file_id.eq(file_id))
46+
)
47+
.execute(conn)?;
48+
49+
Ok(deleted_count)
50+
});
51+
52+
result.map_err(|e| e)
53+
}
54+
3055
impl Debug for FileGroupDTO {
3156
fn fmt(&self, f: &mut Formatter<'_>) -> fmtResult {
3257
write!(f, "FileGroup {{ file_id: {}, group_id: {} }}", self.file_id, self.group_id)
@@ -39,6 +64,8 @@ use super::models::FileGroupCondition;
3964
use diesel::dsl::not;
4065
use diesel::sql_types::Bool;
4166
use diesel::sqlite::Sqlite;
67+
use crate::internal::files::decrease_file_reference_count;
68+
use crate::internal::groups::decrease_group_reference_count;
4269

4370
// 将 FileGroupCondition 转换为 diesel 查询条件的辅助函数
4471
fn build_file_group_condition(condition: FileGroupCondition) -> Box<dyn BoxableExpression<file_groups::table, Sqlite, SqlType = diesel::sql_types::Bool>> {

file_classification_core/src/internal/group_tag.rs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,31 @@ pub fn create_group_tag(
1717
let _ = result?;
1818
Ok(new_group_tag)
1919
}
20+
21+
pub fn delete_group_tag(
22+
conn: &mut SqliteConnection,
23+
group_id: i32,
24+
tag_id: i32,
25+
) -> Result<usize, AppError> {
26+
let result = conn.transaction::<_, AppError, _>(|conn| {
27+
// 减少组和标签的引用计数
28+
decrease_group_reference_count(conn, group_id)?;
29+
decrease_tag_reference_count(conn, tag_id)?;
30+
31+
// 删除关联记录
32+
let deleted_count = diesel::delete(
33+
group_tags::table
34+
.filter(group_tags::group_id.eq(group_id))
35+
.filter(group_tags::tag_id.eq(tag_id))
36+
)
37+
.execute(conn)?;
38+
39+
Ok(deleted_count)
40+
});
41+
42+
result.map_err(|e| e)
43+
}
44+
2045
impl Debug for GroupTagDTO {
2146
fn fmt(&self, f: &mut Formatter<'_>) -> fmtResult {
2247
write!(f, "GroupTag {{ group_id: {}, tag_id: {} }}", self.group_id, self.tag_id)
@@ -29,6 +54,8 @@ use super::models::GroupTagCondition;
2954
use diesel::dsl::not;
3055
use diesel::sql_types::Bool;
3156
use diesel::sqlite::Sqlite;
57+
use crate::internal::groups::decrease_group_reference_count;
58+
use crate::internal::tags::decrease_tag_reference_count;
3259

3360
// 将 GroupTagCondition 转换为 diesel 查询条件的辅助函数
3461
fn build_group_tag_condition(condition: GroupTagCondition) -> Box<dyn BoxableExpression<group_tags::table, Sqlite, SqlType = diesel::sql_types::Bool>> {

0 commit comments

Comments
 (0)