@@ -36,9 +36,10 @@ namespace StabilityMatrix.Avalonia.ViewModels.CheckpointBrowser;
3636public sealed partial class CivitAiBrowserViewModel : TabViewModelBase , IInfinitelyScroll
3737{
3838 private static readonly Logger Logger = LogManager . GetCurrentClassLogger ( ) ;
39- private readonly ICivitApi civitApi ;
39+ private readonly CivitCompatApiManager civitApi ;
4040 private readonly ISettingsManager settingsManager ;
4141 private readonly ILiteDbContext liteDbContext ;
42+ private readonly IConnectedServiceManager connectedServiceManager ;
4243 private readonly INotificationService notificationService ;
4344 private readonly ICivitBaseModelTypeService baseModelTypeService ;
4445 private bool dontSearch = false ;
@@ -104,6 +105,11 @@ public sealed partial class CivitAiBrowserViewModel : TabViewModelBase, IInfinit
104105 private IObservableCollection < BaseModelOptionViewModel > allBaseModels =
105106 new ObservableCollectionExtended < BaseModelOptionViewModel > ( ) ;
106107
108+ [ ObservableProperty ]
109+ private bool civitUseDiscoveryApi ;
110+
111+ public bool UseLocalCache => true ;
112+
107113 public double StatsResizeFactor => Math . Clamp ( ResizeFactor , 0.75d , 1.25d ) ;
108114
109115 public IEnumerable < CivitPeriod > AllCivitPeriods =>
@@ -126,17 +132,19 @@ public sealed partial class CivitAiBrowserViewModel : TabViewModelBase, IInfinit
126132 SelectedBaseModels . Count > 0 && SelectedBaseModels . Count < AllBaseModels . Count ;
127133
128134 public CivitAiBrowserViewModel (
129- ICivitApi civitApi ,
135+ CivitCompatApiManager civitApi ,
130136 ISettingsManager settingsManager ,
131137 ServiceManager < ViewModelBase > dialogFactory ,
132138 ILiteDbContext liteDbContext ,
139+ IConnectedServiceManager connectedServiceManager ,
133140 INotificationService notificationService ,
134141 ICivitBaseModelTypeService baseModelTypeService
135142 )
136143 {
137144 this . civitApi = civitApi ;
138145 this . settingsManager = settingsManager ;
139146 this . liteDbContext = liteDbContext ;
147+ this . connectedServiceManager = connectedServiceManager ;
140148 this . notificationService = notificationService ;
141149 this . baseModelTypeService = baseModelTypeService ;
142150
@@ -270,6 +278,15 @@ or nameof(HideEarlyAccessModels)
270278 )
271279 ) ;
272280
281+ AddDisposable (
282+ settingsManager . RelayPropertyFor (
283+ this ,
284+ model => model . CivitUseDiscoveryApi ,
285+ settings => settings . CivitUseDiscoveryApi ,
286+ true
287+ )
288+ ) ;
289+
273290 EventManager . Instance . NavigateAndFindCivitAuthorRequested += OnNavigateAndFindCivitAuthorRequested ;
274291 }
275292
@@ -361,6 +378,29 @@ private bool FilterModelCardsPredicate(CheckpointBrowserCardViewModel card)
361378 return ! card . CivitModel . Nsfw || ShowNsfw ;
362379 }
363380
381+ [ RelayCommand ]
382+ private async Task OnUseDiscoveryToggle ( )
383+ {
384+ if ( CivitUseDiscoveryApi )
385+ {
386+ CivitUseDiscoveryApi = false ;
387+ }
388+ else
389+ {
390+ if ( ! await connectedServiceManager . PromptEnableCivitUseDiscoveryApi ( ) )
391+ return ;
392+
393+ CivitUseDiscoveryApi = true ;
394+ }
395+
396+ // Reset cache in case model differences
397+ Logger . Info ( "Toggled Discovery API, clearing cache" ) ;
398+
399+ var items = await liteDbContext . CivitModelQueryCache . DeleteAllAsync ( ) ;
400+
401+ Logger . Info ( "Deleted {Count} Civit model query cache entries" , items ) ;
402+ }
403+
364404 /// <summary>
365405 /// Background update task
366406 /// </summary>
@@ -432,20 +472,24 @@ private async Task CivitModelQuery(CivitModelsRequest request, bool isInfiniteSc
432472 . Where ( m => m . Mode == null )
433473 . ToList ( ) ;
434474
435- // Database update calls will invoke `OnModelsUpdated`
436- // Add to database
437- await liteDbContext . UpsertCivitModelAsync ( models ) ;
438- // Add as cache entry
439- var cacheNew = await liteDbContext . UpsertCivitModelQueryCacheEntryAsync (
440- new ( )
441- {
442- Id = ObjectHash . GetMd5Guid ( request ) ,
443- InsertedAt = DateTimeOffset . UtcNow ,
444- Request = request ,
445- Items = models ,
446- Metadata = modelsResponse ? . Metadata
447- }
448- ) ;
475+ var cacheNew = true ;
476+ if ( UseLocalCache )
477+ {
478+ // Database update calls will invoke `OnModelsUpdated`
479+ // Add to database
480+ await liteDbContext . UpsertCivitModelAsync ( models ) ;
481+ // Add as cache entry
482+ cacheNew = await liteDbContext . UpsertCivitModelQueryCacheEntryAsync (
483+ new ( )
484+ {
485+ Id = ObjectHash . GetMd5Guid ( request ) ,
486+ InsertedAt = DateTimeOffset . UtcNow ,
487+ Request = request ,
488+ Items = models ,
489+ Metadata = modelsResponse ? . Metadata
490+ }
491+ ) ;
492+ }
449493
450494 if ( cacheNew )
451495 {
@@ -554,7 +598,8 @@ private async Task SearchModels(bool isInfiniteScroll = false)
554598 {
555599 Nsfw = "true" , // Handled by local view filter
556600 Sort = SortMode ,
557- Period = SelectedPeriod
601+ Period = SelectedPeriod ,
602+ Limit = 30
558603 } ;
559604
560605 if ( NextPageCursor != null )
@@ -637,10 +682,17 @@ private async Task SearchModels(bool isInfiniteScroll = false)
637682 }
638683
639684 // See if query is cached
640- var cachedQuery = await liteDbContext . TryQueryWithClearOnExceptionAsync (
641- liteDbContext . CivitModelQueryCache ,
642- liteDbContext . CivitModelQueryCache . IncludeAll ( ) . FindByIdAsync ( ObjectHash . GetMd5Guid ( modelRequest ) )
643- ) ;
685+ CivitModelQueryCacheEntry ? cachedQuery = null ;
686+
687+ if ( UseLocalCache )
688+ {
689+ cachedQuery = await liteDbContext . TryQueryWithClearOnExceptionAsync (
690+ liteDbContext . CivitModelQueryCache ,
691+ liteDbContext
692+ . CivitModelQueryCache . IncludeAll ( )
693+ . FindByIdAsync ( ObjectHash . GetMd5Guid ( modelRequest ) )
694+ ) ;
695+ }
644696
645697 // If cached, update model cards
646698 if ( cachedQuery is not null )
0 commit comments