📄 src/Infrastructure/Database/ServiceCollectionExtensions.cs
using System;
using Jellyfin.Database.Implementations;
using Jellyfin.Database.Implementations.Locking;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection.Extensions;
using Slopper.Domain;
using Slopper.Infrastructure.Database.Jellyfin;
using Slopper.Infrastructure.Database.Slopper;

namespace Slopper.Infrastructure.Database;

public static class ServiceCollectionExtensions
{
    extension(IServiceCollection services)
    {
        public IServiceCollection AddJellyfinDatabase()
        {
            services.AddSingleton<IJellyfinDatabaseProvider, JellyfinDatabaseProvider>();
            services.AddSingleton<IEntityFrameworkCoreLockingBehavior, EntityFrameworkCoreLockingBehavior>();
            services.AddDbContext<JellyfinDbContext>(
                (sp, options) =>
                    options.UseSqlite(sp.GetRequiredService<IConfiguration>().GetConnectionString("jellyfin"))
            );
            services.TryAddSingleton(Random.Shared);
            services.AddTransient<IMediaRepository, MediaRepository>();
            return services;
        }

        public IServiceCollection AddSlopperDatabase()
        {
            services.AddHostedService<SlopperStartupMigration>();
            services.AddDbContext<SlopperDbContext>(
                (sp, options) =>
                    options.UseSqlite(sp.GetRequiredService<IConfiguration>().GetConnectionString("slopper"))
            );
            services.AddTransient<IClipRepository, ClipRepository>();
            return services;
        }
    }
}