@@ -161,9 +161,11 @@ public LibraryService(IServiceProvider serviceProvider)
161161
162162 public async Task RemoveLibraryItems ( IEnumerable < LibraryItem . ReadOnly > libraryItems , GarbageCollectorRunMode gcRunMode = GarbageCollectorRunMode . RunAsynchronously )
163163 {
164- using var tx = _connection . BeginTransaction ( ) ;
165164 var items = libraryItems . ToArray ( ) ;
166- RemoveLinkedItemsFromAllLoadouts ( items , tx ) ;
165+ var groupIds = items . SelectMany ( LoadoutsWithLibraryItem ) . Select ( tuple => tuple . linkedItem . AsLoadoutItemGroup ( ) . LoadoutItemGroupId ) . ToArray ( ) ;
166+ await _loadoutManager . RemoveItems ( groupIds ) ;
167+
168+ using var tx = _connection . BeginTransaction ( ) ;
167169
168170 foreach ( var item in items )
169171 tx . Delete ( item . Id , recursive : true ) ;
@@ -172,58 +174,12 @@ public async Task RemoveLibraryItems(IEnumerable<LibraryItem.ReadOnly> libraryIt
172174 await _gcRunner . RunWithMode ( gcRunMode ) ;
173175 }
174176
175- public async Task RemoveLinkedItemFromLoadout ( LibraryLinkedLoadoutItemId itemId )
176- {
177- using var tx = _connection . BeginTransaction ( ) ;
178- RemoveLinkedItemFromLoadout ( itemId , tx ) ;
179- await tx . Commit ( ) ;
180- }
181-
182- public async Task RemoveLinkedItemsFromLoadout ( IEnumerable < LibraryLinkedLoadoutItemId > itemIds )
183- {
184- using var tx = _connection . BeginTransaction ( ) ;
185- RemoveLinkedItemsFromLoadout ( itemIds , tx ) ;
186- await tx . Commit ( ) ;
187- }
188-
189- public void RemoveLinkedItemFromLoadout ( LibraryLinkedLoadoutItemId itemId , ITransaction tx )
190- {
191- _loadoutManager . RemoveItems ( tx , [ itemId . Value ] ) ;
192- }
193-
194- public void RemoveLinkedItemsFromLoadout ( IEnumerable < LibraryLinkedLoadoutItemId > itemIds , ITransaction tx )
195- {
196- _loadoutManager . RemoveItems ( tx , itemIds . Select ( LoadoutItemGroupId ( x ) => x . Value ) . ToArray ( ) ) ;
197- }
198-
199- public void RemoveLinkedItemsFromAllLoadouts ( IEnumerable < LibraryItem . ReadOnly > libraryItems , ITransaction tx )
200- {
201- var groupIds = libraryItems . SelectMany ( LoadoutsWithLibraryItem ) . Select ( tuple => tuple . linkedItem . AsLoadoutItemGroup ( ) . LoadoutItemGroupId ) . ToArray ( ) ;
202- _loadoutManager . RemoveItems ( tx , groupIds ) ;
203- }
204-
205- public async Task RemoveLinkedItemsFromAllLoadouts ( IEnumerable < LibraryItem . ReadOnly > libraryItems )
206- {
207- using var tx = _connection . BeginTransaction ( ) ;
208- RemoveLinkedItemsFromAllLoadouts ( libraryItems , tx ) ;
209- await tx . Commit ( ) ;
210- }
211-
212- public async ValueTask < LibraryItemReplacementResult > ReplaceLinkedItemsInAllLoadouts (
213- LibraryItem . ReadOnly oldItem , LibraryItem . ReadOnly newItem , ReplaceLibraryItemOptions options )
214- {
215- using var tx = _connection . BeginTransaction ( ) ;
216- var result = await ReplaceLinkedItemsInAllLoadouts ( oldItem , newItem , options , tx ) ;
217- await tx . Commit ( ) ;
218- return result ;
219- }
220-
221- public async ValueTask < LibraryItemReplacementResult > ReplaceLinkedItemsInAllLoadouts ( LibraryItem . ReadOnly oldItem , LibraryItem . ReadOnly newItem , ReplaceLibraryItemOptions options , ITransaction tx )
177+ public async ValueTask < LibraryItemReplacementResult > ReplaceLinkedItemsInAllLoadouts ( LibraryItem . ReadOnly oldItem , LibraryItem . ReadOnly newItem , ReplaceLibraryItemOptions options )
222178 {
223179 try
224180 {
225181 // 1. Find affected loadouts using existing method
226- var items = LoadoutsWithLibraryItem ( oldItem )
182+ var itemsPerLoadout = LoadoutsWithLibraryItem ( oldItem )
227183 . Where ( tuple =>
228184 {
229185 if ( options . IgnoreReadOnlyCollections )
@@ -235,15 +191,15 @@ public async ValueTask<LibraryItemReplacementResult> ReplaceLinkedItemsInAllLoad
235191
236192 return true ;
237193 } )
238- . ToArray ( ) ;
194+ . GroupBy ( tuple => tuple . loadout . LoadoutId )
195+ . ToDictionary ( grouping => grouping . Key , grouping => grouping . ToArray ( ) ) ;
239196
240- // 2. Unlink old mod using bulk removal
241- foreach ( var ( _, libraryLinkedItem ) in items )
242- RemoveLinkedItemFromLoadout ( libraryLinkedItem . Id , tx ) ;
243-
244- // 3. Reinstall new mod in original loadouts
245- foreach ( var ( loadout , _) in items )
246- await _loadoutManager . InstallItem ( libraryItem : newItem , targetLoadout : loadout . Id , transaction : tx ) ;
197+ foreach ( var kv in itemsPerLoadout )
198+ {
199+ var ( loadoutId , items ) = kv ;
200+ var groupIds = items . Select ( x => x . linkedItem . AsLoadoutItemGroup ( ) . LoadoutItemGroupId ) . ToArray ( ) ;
201+ await _loadoutManager . ReplaceItems ( loadoutId , groupIds , newItem ) ;
202+ }
247203 }
248204 catch
249205 {
@@ -253,14 +209,14 @@ public async ValueTask<LibraryItemReplacementResult> ReplaceLinkedItemsInAllLoad
253209 return LibraryItemReplacementResult . Success ;
254210 }
255211
256- public async ValueTask < LibraryItemReplacementResult > ReplaceLinkedItemsInAllLoadouts ( IEnumerable < ( LibraryItem . ReadOnly oldItem , LibraryItem . ReadOnly newItem ) > replacements , ReplaceLibraryItemsOptions options , ITransaction tx )
212+ public async ValueTask < LibraryItemReplacementResult > ReplaceLinkedItemsInAllLoadouts ( IEnumerable < ( LibraryItem . ReadOnly oldItem , LibraryItem . ReadOnly newItem ) > replacements , ReplaceLibraryItemsOptions options )
257213 {
258214 var replacementsArr = replacements . ToArray ( ) ;
259215 try
260216 {
261217 foreach ( var ( oldItem , newItem ) in replacementsArr )
262218 {
263- var result = await ReplaceLinkedItemsInAllLoadouts ( oldItem , newItem , options . ToReplaceLibraryItemOptions ( ) , tx ) ;
219+ var result = await ReplaceLinkedItemsInAllLoadouts ( oldItem , newItem , options . ToReplaceLibraryItemOptions ( ) ) ;
264220 if ( result != LibraryItemReplacementResult . Success )
265221 return result ; // failed due to some reason.
266222 }
@@ -272,14 +228,4 @@ public async ValueTask<LibraryItemReplacementResult> ReplaceLinkedItemsInAllLoad
272228
273229 return LibraryItemReplacementResult . Success ;
274230 }
275-
276- public async ValueTask < LibraryItemReplacementResult > ReplaceLinkedItemsInAllLoadouts ( IEnumerable < ( LibraryItem . ReadOnly oldItem , LibraryItem . ReadOnly newItem ) > replacements , ReplaceLibraryItemsOptions options )
277- {
278- using var tx = _connection . BeginTransaction ( ) ;
279- var result = await ReplaceLinkedItemsInAllLoadouts ( replacements , options , tx ) ;
280- if ( result == LibraryItemReplacementResult . Success )
281- await tx . Commit ( ) ;
282-
283- return result ;
284- }
285231}
0 commit comments