11use crate :: internal:: file_group:: select_file_groups_by_conditions;
22use crate :: internal:: groups:: select_groups_by_conditions;
3- use crate :: model:: models:: { CreateFileDTO , File , FileCondition , FileFilter , FileGroupCondition , FileGroupDTO , GroupCondition , GroupTagCondition , UpdateFileDTO , UpdateGroupDTO } ;
3+ use crate :: model:: models:: { CreateFileDTO , File , FileCondition , FileFilter , FileGroupCondition , FileGroupDTO , GroupCondition , GroupTagCondition , TagCondition , UpdateFileDTO , UpdateGroupDTO } ;
44use crate :: service:: groups:: update_groups_by_conditions;
55use crate :: service:: AppError ;
6- use crate :: utils:: errors:: AppError :: CannotBindToPrimaryGroup ;
6+ use crate :: utils:: errors:: AppError :: { FuturePrimaryGroupShouldBeEmpty } ;
77use crate :: { internal, service} ;
88use diesel:: Connection ;
99use crate :: utils:: database:: AnyConnection ;
@@ -57,7 +57,7 @@ pub fn create_file(conn: &mut AnyConnection, create_file_dto: CreateFileDTO) ->
5757 ) ?;
5858
5959 if file_groups. len ( ) != 0 {
60- return Err ( CannotBindToPrimaryGroup ) ;
60+ return Err ( FuturePrimaryGroupShouldBeEmpty ) ;
6161 }
6262 let mut count = 0 ;
6363 count += internal:: files:: create_file ( conn, & create_file_dto) ?;
@@ -100,20 +100,46 @@ pub fn delete_file(conn: &mut AnyConnection, file_id: i32) -> Result<(), AppErro
100100 let file_required_to_delete = internal:: files:: find_file_by_id ( conn, file_id) ?
101101 . ok_or_else ( || diesel:: result:: Error :: NotFound ) ?;
102102
103- // 删除与文件关联的组标签
103+ // 查找与该文件关联的所有文件组关系(包括主组和其他组)
104+ let file_groups = select_file_groups_by_conditions (
105+ conn,
106+ vec ! [ FileGroupCondition :: FileId ( file_required_to_delete. id) ] ,
107+ None ,
108+ ) ?;
109+
110+ // 对于每个文件组关系,减少对应组的引用计数
111+ for file_group in & file_groups {
112+ internal:: groups:: decrease_group_reference_count ( conn, file_group. group_id ) ?;
113+ }
114+
115+ // 仅对主组关联的标签减少引用计数
116+ let tag_list = internal:: group_tag:: select_group_tags_by_conditions (
117+ conn,
118+ vec ! [ GroupTagCondition :: GroupId ( file_required_to_delete. group_id) ] ,
119+ None ,
120+ ) ?;
121+
122+ if !tag_list. is_empty ( ) {
123+ internal:: tags:: decrease_tags_reference_count_by_conditions (
124+ conn,
125+ vec ! [ TagCondition :: IdIn ( tag_list. iter( ) . map( |tag| tag. tag_id) . collect:: <Vec <_>>( ) ) ] ,
126+ ) ?;
127+ }
128+
129+ // 删除与文件主组关联的所有组标签关系
104130 internal:: group_tag:: delete_group_tags_by_conditions (
105131 conn,
106132 vec ! [ GroupTagCondition :: GroupId ( file_required_to_delete. group_id) ] ,
107133 ) ?;
108134
109- // 删除与文件关联的文件组关系
135+ // 删除与文件关联的所有文件组关系
110136 internal:: file_group:: delete_file_groups_by_conditions (
111137 conn,
112138 vec ! [ FileGroupCondition :: FileId ( file_required_to_delete. id) ] ,
113139 ) ?;
114140
115- // 删除组和文件本身
116- service :: groups:: delete_group ( conn, file_required_to_delete. group_id ) ?;
141+ // 删除主组和文件本身
142+ internal :: groups:: delete_group ( conn, file_required_to_delete. group_id ) ?;
117143 internal:: files:: delete_file_by_id ( conn, file_id) ?;
118144
119145 Ok ( ( ) )
@@ -168,7 +194,7 @@ pub fn delete_files_by_conditions(
168194
169195 // 对于每个要删除的文件,处理相关的引用关系
170196 for file in & files_to_delete {
171- // 查找与该文件关联的所有文件组关系
197+ // 查找与该文件关联的所有文件组关系(包括主组和其他组)
172198 let file_groups = select_file_groups_by_conditions (
173199 conn,
174200 vec ! [ FileGroupCondition :: FileId ( file. id) ] ,
@@ -180,13 +206,34 @@ pub fn delete_files_by_conditions(
180206 internal:: groups:: decrease_group_reference_count ( conn, file_group. group_id ) ?;
181207 }
182208
209+ // 仅对主组关联的标签减少引用计数
210+ let tag_list = internal:: group_tag:: select_group_tags_by_conditions (
211+ conn,
212+ vec ! [ GroupTagCondition :: GroupId ( file. group_id) ] ,
213+ None ,
214+ ) ?;
215+
216+ if !tag_list. is_empty ( ) {
217+ internal:: tags:: decrease_tags_reference_count_by_conditions (
218+ conn,
219+ vec ! [ TagCondition :: IdIn ( tag_list. iter( ) . map( |tag| tag. tag_id) . collect:: <Vec <_>>( ) ) ] ,
220+ ) ?;
221+ }
222+
223+ // 删除与文件主组关联的所有组标签关系
224+ internal:: group_tag:: delete_group_tags_by_conditions (
225+ conn,
226+ vec ! [ GroupTagCondition :: GroupId ( file. group_id) ] ,
227+ ) ?;
228+
183229 // 删除与该文件关联的所有文件组关系
184230 internal:: file_group:: delete_file_groups_by_conditions (
185231 conn,
186232 vec ! [ FileGroupCondition :: FileId ( file. id) ] ,
187233 ) ?;
188234
189- // 删除文件本身
235+ // 删除主组和文件本身
236+ internal:: groups:: delete_group ( conn, file. group_id ) ?;
190237 let deleted_count = internal:: files:: delete_file_by_id ( conn, file. id ) ?;
191238 total_deleted += deleted_count;
192239 }
0 commit comments