reorganized project

This commit is contained in:
Flaminel
2025-06-17 18:11:18 +03:00
parent d76216665b
commit e5d7d8ed12
264 changed files with 1137 additions and 1123 deletions

View File

@@ -2,41 +2,37 @@
<PropertyGroup>
<AssemblyName>cleanuparr</AssemblyName>
<TargetFramework>net9.0</TargetFramework>
<Version Condition="'$(Version)' == ''">0.0.1</Version>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>dotnet-Executable-6108b2ba-f035-47bc-addf-aaf5e20da4b8</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.5">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.5" />
<PackageReference Include="Quartz" Version="3.13.1" />
<PackageReference Include="Quartz.Extensions.DependencyInjection" Version="3.13.1" />
<PackageReference Include="Quartz.Extensions.Hosting" Version="3.13.1" />
<PackageReference Include="Serilog" Version="4.2.0" />
<Folder Include="wwwroot\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Cleanuparr.Application\Cleanuparr.Application.csproj" />
<ProjectReference Include="..\Cleanuparr.Infrastructure\Cleanuparr.Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.Hosting" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.6" />
<PackageReference Include="Quartz" Version="3.14.0" />
<PackageReference Include="Quartz.Extensions.DependencyInjection" Version="3.14.0" />
<PackageReference Include="Quartz.Extensions.Hosting" Version="3.14.0" />
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.Expressions" Version="5.0.0" />
<PackageReference Include="Serilog.Extensions.Hosting" Version="9.0.0" />
<PackageReference Include="Serilog.Settings.Configuration" Version="9.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
<!-- API-related packages -->
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.2" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
<ProjectReference Include="..\Infrastructure\Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="wwwroot\" />
</ItemGroup>
</Project>

View File

@@ -1,6 +1,6 @@
using Microsoft.AspNetCore.Mvc;
namespace Executable.Controllers;
namespace Cleanuparr.Api.Controllers;
[ApiController]
[Route("")]

View File

@@ -1,20 +1,21 @@
using Common.Configuration;
using Data.Models.Configuration.Arr;
using Data.Models.Configuration.DownloadCleaner;
using Data.Models.Configuration.General;
using Data.Models.Configuration.QueueCleaner;
using Data;
using Data.Enums;
using Infrastructure.Http.DynamicHttpClientSystem;
using Infrastructure.Logging;
using Infrastructure.Models;
using Cleanuparr.Application.Features.Arr.Dtos;
using Cleanuparr.Application.Features.DownloadClient.Dtos;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Infrastructure.Http.DynamicHttpClientSystem;
using Cleanuparr.Infrastructure.Logging;
using Cleanuparr.Infrastructure.Models;
using Cleanuparr.Persistence;
using Cleanuparr.Persistence.Models.Configuration;
using Cleanuparr.Persistence.Models.Configuration.Arr;
using Cleanuparr.Persistence.Models.Configuration.DownloadCleaner;
using Cleanuparr.Persistence.Models.Configuration.General;
using Cleanuparr.Persistence.Models.Configuration.QueueCleaner;
using Infrastructure.Services.Interfaces;
using Mapster;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Executable.DTOs;
namespace Executable.Controllers;
namespace Cleanuparr.Api.Controllers;
[ApiController]
[Route("api/[controller]")]

View File

@@ -1,12 +1,11 @@
using Data;
using Data.Models.Events;
using Data.Enums;
using Infrastructure.Events;
using System.Text.Json.Serialization;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Persistence;
using Cleanuparr.Persistence.Models.Events;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using System.Text.Json.Serialization;
namespace Executable.Controllers;
namespace Cleanuparr.Api.Controllers;
[ApiController]
[Route("api/[controller]")]

View File

@@ -1,7 +1,7 @@
using Infrastructure.Health;
using Cleanuparr.Infrastructure.Health;
using Microsoft.AspNetCore.Mvc;
namespace Executable.Controllers;
namespace Cleanuparr.Api.Controllers;
/// <summary>
/// Controller for checking the health of download clients

View File

@@ -1,10 +1,9 @@
using Executable.Models;
using Infrastructure.Models;
using Cleanuparr.Api.Models;
using Cleanuparr.Infrastructure.Models;
using Infrastructure.Services.Interfaces;
using Infrastructure.Utilities;
using Microsoft.AspNetCore.Mvc;
namespace Executable.Controllers;
namespace Cleanuparr.Api.Controllers;
[ApiController]
[Route("api/[controller]")]

View File

@@ -1,12 +1,12 @@
using Infrastructure.Verticals.Arr;
using Infrastructure.Verticals.DownloadClient;
using Microsoft.AspNetCore.Mvc;
using System.Diagnostics;
using Data;
using Data.Enums;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Infrastructure.Features.Arr;
using Cleanuparr.Infrastructure.Features.DownloadClient;
using Cleanuparr.Persistence;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
namespace Executable.Controllers;
namespace Cleanuparr.Api.Controllers;
[ApiController]
[Route("api/[controller]")]

View File

@@ -1,12 +1,12 @@
using System.Text.Json.Serialization;
using Infrastructure.Health;
using Infrastructure.Logging;
using Executable.Middleware;
using Infrastructure.Hubs;
using Cleanuparr.Api.Middleware;
using Cleanuparr.Infrastructure.Health;
using Cleanuparr.Infrastructure.Hubs;
using Cleanuparr.Infrastructure.Logging;
using Microsoft.AspNetCore.Http.Json;
using Microsoft.OpenApi.Models;
namespace Executable.DependencyInjection;
namespace Cleanuparr.Api.DependencyInjection;
public static class ApiDI
{

View File

@@ -1,13 +1,12 @@
using Common.Helpers;
using Data.Enums;
using Infrastructure.Verticals.DownloadCleaner;
using Infrastructure.Verticals.QueueCleaner;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Infrastructure.Models;
using Cleanuparr.Shared.Helpers;
using Serilog;
using Serilog.Events;
using Serilog.Templates;
using Serilog.Templates.Themes;
namespace Executable.DependencyInjection;
namespace Cleanuparr.Api.DependencyInjection;
public static class LoggingDI
{
@@ -28,7 +27,7 @@ public static class LoggingDI
const string fileOutputTemplate = $"{{@t:yyyy-MM-dd HH:mm:ss.fff zzz}} [{{@l:u3}}]{jobNameTemplate}{categoryTemplate} {{@m:lj}}\n{{@x}}";
// Determine job name padding
List<string> jobNames = [nameof(QueueCleaner), nameof(DownloadCleaner)];
List<string> jobNames = [nameof(JobType.QueueCleaner), nameof(JobType.DownloadCleaner)];
int jobPadding = jobNames.Max(x => x.Length) + 2;
// Determine instance name padding

View File

@@ -1,21 +1,14 @@
using System.Net;
using System.Text.Json.Serialization;
using Data.Models.Configuration.General;
using Cleanuparr.Infrastructure.Features.DownloadRemover.Consumers;
using Cleanuparr.Infrastructure.Features.Notifications.Consumers;
using Cleanuparr.Infrastructure.Health;
using Cleanuparr.Infrastructure.Http;
using Cleanuparr.Infrastructure.Http.DynamicHttpClientSystem;
using Data.Models.Arr;
using Infrastructure.Health;
using Infrastructure.Http;
using Infrastructure.Http.DynamicHttpClientSystem;
using Infrastructure.Verticals.DownloadClient.Deluge;
using Infrastructure.Verticals.DownloadClient.QBittorrent;
using Infrastructure.Verticals.DownloadClient.Transmission;
using Infrastructure.Verticals.DownloadRemover.Consumers;
using Infrastructure.Verticals.Notifications.Consumers;
using Infrastructure.Verticals.Notifications.Models;
using MassTransit;
using Polly;
using Polly.Extensions.Http;
namespace Executable.DependencyInjection;
namespace Cleanuparr.Api.DependencyInjection;
public static class MainDI
{

View File

@@ -1,8 +1,9 @@
using Cleanuparr.Infrastructure.Features.Notifications;
using Cleanuparr.Infrastructure.Features.Notifications.Apprise;
using Cleanuparr.Infrastructure.Features.Notifications.Notifiarr;
using Infrastructure.Verticals.Notifications;
using Infrastructure.Verticals.Notifications.Apprise;
using Infrastructure.Verticals.Notifications.Notifiarr;
namespace Executable.DependencyInjection;
namespace Cleanuparr.Api.DependencyInjection;
public static class NotificationsDI
{

View File

@@ -1,7 +1,7 @@
using Executable.Jobs;
using Cleanuparr.Api.Jobs;
using Quartz;
namespace Executable.DependencyInjection;
namespace Cleanuparr.Api.DependencyInjection;
public static class QuartzDI
{

View File

@@ -1,24 +1,22 @@
using Common.Helpers;
using Data;
using Infrastructure.Events;
using Cleanuparr.Application.Features.DownloadCleaner;
using Cleanuparr.Application.Features.QueueCleaner;
using Cleanuparr.Infrastructure.Events;
using Cleanuparr.Infrastructure.Features.Arr;
using Cleanuparr.Infrastructure.Features.ContentBlocker;
using Cleanuparr.Infrastructure.Features.DownloadClient;
using Cleanuparr.Infrastructure.Features.DownloadRemover;
using Cleanuparr.Infrastructure.Features.DownloadRemover.Interfaces;
using Cleanuparr.Infrastructure.Features.Files;
using Cleanuparr.Infrastructure.Features.ItemStriker;
using Cleanuparr.Infrastructure.Features.Security;
using Cleanuparr.Infrastructure.Interceptors;
using Cleanuparr.Infrastructure.Services;
using Cleanuparr.Persistence;
using Infrastructure.Interceptors;
using Infrastructure.Services;
using Infrastructure.Services.Interfaces;
using Infrastructure.Verticals.Arr;
using Infrastructure.Verticals.ContentBlocker;
using Infrastructure.Verticals.DownloadCleaner;
using Infrastructure.Verticals.DownloadClient;
using Infrastructure.Verticals.DownloadClient.Deluge;
using Infrastructure.Verticals.DownloadClient.QBittorrent;
using Infrastructure.Verticals.DownloadClient.Transmission;
using Infrastructure.Verticals.DownloadRemover;
using Infrastructure.Verticals.DownloadRemover.Interfaces;
using Infrastructure.Verticals.Files;
using Infrastructure.Verticals.ItemStriker;
using Infrastructure.Verticals.QueueCleaner;
using Infrastructure.Verticals.Security;
namespace Executable.DependencyInjection;
namespace Cleanuparr.Api.DependencyInjection;
public static class ServicesDI
{
@@ -39,8 +37,8 @@ public static class ServicesDI
.AddTransient<RadarrClient>()
.AddTransient<LidarrClient>()
.AddTransient<ArrClientFactory>()
.AddTransient<QueueCleaner>()
.AddTransient<DownloadCleaner>()
.AddTransient<QueueCleanerHandler>()
.AddTransient<DownloadCleanerHandler>()
.AddTransient<IQueueItemRemover, QueueItemRemover>()
.AddTransient<IFilenameEvaluator, FilenameEvaluator>()
.AddTransient<IHardLinkFileService, HardLinkFileService>()

View File

@@ -1,8 +1,8 @@
using System.Reflection;
using Data;
using Cleanuparr.Persistence;
using Microsoft.EntityFrameworkCore;
namespace Executable;
namespace Cleanuparr.Api;
public static class HostExtensions
{

View File

@@ -1,17 +1,17 @@
using Common.Configuration;
using Data.Models.Configuration.DownloadCleaner;
using Data.Models.Configuration.QueueCleaner;
using Common.Exceptions;
using Common.Helpers;
using Data;
using Infrastructure.Verticals.DownloadCleaner;
using Infrastructure.Verticals.Jobs;
using Infrastructure.Verticals.QueueCleaner;
using Cleanuparr.Application.Features.DownloadCleaner;
using Cleanuparr.Application.Features.QueueCleaner;
using Cleanuparr.Domain.Exceptions;
using Cleanuparr.Infrastructure.Features.Jobs;
using Cleanuparr.Persistence;
using Cleanuparr.Persistence.Models.Configuration;
using Cleanuparr.Persistence.Models.Configuration.DownloadCleaner;
using Cleanuparr.Persistence.Models.Configuration.QueueCleaner;
using Cleanuparr.Shared.Helpers;
using Microsoft.EntityFrameworkCore;
using Quartz;
using Quartz.Spi;
namespace Executable.Jobs;
namespace Cleanuparr.Api.Jobs;
/// <summary>
/// Manages background jobs in the application.
@@ -100,7 +100,7 @@ public class BackgroundJobManager : IHostedService
return;
}
await AddJobWithTrigger<QueueCleaner>(
await AddJobWithTrigger<QueueCleanerHandler>(
config,
config.CronExpression,
cancellationToken);
@@ -116,7 +116,7 @@ public class BackgroundJobManager : IHostedService
return;
}
await AddJobWithTrigger<DownloadCleaner>(
await AddJobWithTrigger<DownloadCleanerHandler>(
config,
config.CronExpression,
cancellationToken);

View File

@@ -1,8 +1,8 @@
using Infrastructure.Verticals.Jobs;
using Cleanuparr.Infrastructure.Features.Jobs;
using Quartz;
using Serilog.Context;
namespace Executable.Jobs;
namespace Cleanuparr.Api.Jobs;
[DisallowConcurrentExecution]
public sealed class GenericJob<T> : IJob

View File

@@ -1,9 +1,9 @@
using System.Net;
using System.Text.Json;
using Common.Exceptions;
using Executable.Models;
using Cleanuparr.Api.Models;
using Cleanuparr.Domain.Exceptions;
namespace Executable.Middleware;
namespace Cleanuparr.Api.Middleware;
public class ExceptionMiddleware
{

View File

@@ -1,4 +1,4 @@
namespace Executable.Models;
namespace Cleanuparr.Api.Models;
/// <summary>
/// Standardized error response model for API endpoints

View File

@@ -1,6 +1,6 @@
namespace Executable.Models;
using Cleanuparr.Infrastructure.Models;
using Infrastructure.Models;
namespace Cleanuparr.Api.Models;
/// <summary>
/// Represents a request to schedule a job

View File

@@ -1,8 +1,10 @@
using Executable;
using Executable.DependencyInjection;
using Infrastructure.Logging;
using Serilog;
// using Infrastructure.Logging;
// using Serilog;
using System.Text.Json.Serialization;
using Cleanuparr.Api;
using Cleanuparr.Api.DependencyInjection;
using Cleanuparr.Infrastructure.Logging;
using Serilog;
var builder = WebApplication.CreateBuilder(args);

View File

@@ -0,0 +1,20 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Cleanuparr.Domain\Cleanuparr.Domain.csproj" />
<ProjectReference Include="..\Cleanuparr.Infrastructure\Cleanuparr.Infrastructure.csproj" />
<ProjectReference Include="..\Cleanuparr.Persistence\Cleanuparr.Persistence.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="MassTransit" Version="8.4.1" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.6" />
</ItemGroup>
</Project>

View File

@@ -1,6 +1,6 @@
using Data.Enums;
using Cleanuparr.Domain.Enums;
namespace Executable.DTOs;
namespace Cleanuparr.Application.Features.Arr.Dtos;
public class ArrConfigDto
{

View File

@@ -1,6 +1,6 @@
using System.ComponentModel.DataAnnotations;
namespace Executable.DTOs;
namespace Cleanuparr.Application.Features.Arr.Dtos;
/// <summary>
/// DTO for creating new Arr instances without requiring an ID

View File

@@ -1,4 +1,4 @@
namespace Executable.DTOs;
namespace Cleanuparr.Application.Features.Arr.Dtos;
/// <summary>
/// DTO for updating Lidarr configuration basic settings (instances managed separately)

View File

@@ -1,4 +1,4 @@
namespace Executable.DTOs;
namespace Cleanuparr.Application.Features.Arr.Dtos;
/// <summary>
/// DTO for updating Radarr configuration basic settings (instances managed separately)

View File

@@ -1,7 +1,6 @@
using System.ComponentModel.DataAnnotations;
using Data.Models.Configuration.Arr;
namespace Executable.DTOs;
namespace Cleanuparr.Application.Features.Arr.Dtos;
/// <summary>
/// DTO for updating Sonarr configuration basic settings (instances managed separately)

View File

@@ -1,30 +1,29 @@
using Data.Models.Configuration.Arr;
using Data.Models.Configuration.DownloadCleaner;
using Data.Models.Configuration.General;
using Data;
using Data.Enums;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Infrastructure.Events;
using Cleanuparr.Infrastructure.Features.Arr;
using Cleanuparr.Infrastructure.Features.Arr.Interfaces;
using Cleanuparr.Infrastructure.Features.Context;
using Cleanuparr.Infrastructure.Features.DownloadClient;
using Cleanuparr.Infrastructure.Features.Jobs;
using Cleanuparr.Infrastructure.Helpers;
using Cleanuparr.Persistence;
using Cleanuparr.Persistence.Models.Configuration.Arr;
using Cleanuparr.Persistence.Models.Configuration.DownloadCleaner;
using Cleanuparr.Persistence.Models.Configuration.General;
using Data.Models.Arr.Queue;
using Data.Models.Configuration.Arr;
using Infrastructure.Events;
using Infrastructure.Helpers;
using Infrastructure.Verticals.Arr;
using Infrastructure.Verticals.Arr.Interfaces;
using Infrastructure.Verticals.Context;
using Infrastructure.Verticals.DownloadClient;
using Infrastructure.Verticals.Jobs;
using MassTransit;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging;
using LogContext = Serilog.Context.LogContext;
namespace Infrastructure.Verticals.DownloadCleaner;
namespace Cleanuparr.Application.Features.DownloadCleaner;
public sealed class DownloadCleaner : GenericHandler
public sealed class DownloadCleanerHandler : GenericHandler
{
private readonly HashSet<string> _excludedHashes = [];
public DownloadCleaner(
ILogger<DownloadCleaner> logger,
public DownloadCleanerHandler(
ILogger<DownloadCleanerHandler> logger,
DataContext dataContext,
IMemoryCache cache,
IBus messageBus,
@@ -56,7 +55,7 @@ public sealed class DownloadCleaner : GenericHandler
if (!isUnlinkedEnabled && !isCleaningEnabled)
{
_logger.LogWarning("{name} is not configured properly", nameof(DownloadCleaner));
_logger.LogWarning("{name} is not configured properly", nameof(DownloadCleanerHandler));
return;
}

View File

@@ -1,7 +1,7 @@
using Common.Enums;
using Common.Exceptions;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Domain.Exceptions;
namespace Executable.DTOs;
namespace Cleanuparr.Application.Features.DownloadClient.Dtos;
/// <summary>
/// DTO for creating a new download client (without ID)

View File

@@ -1,32 +1,31 @@
using Common.Configuration;
using Data.Models.Configuration.Arr;
using Data.Models.Configuration.General;
using Data.Models.Configuration.QueueCleaner;
using Common.Enums;
using Data;
using Data.Enums;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Infrastructure.Events;
using Cleanuparr.Infrastructure.Features.Arr;
using Cleanuparr.Infrastructure.Features.Arr.Interfaces;
using Cleanuparr.Infrastructure.Features.ContentBlocker;
using Cleanuparr.Infrastructure.Features.Context;
using Cleanuparr.Infrastructure.Features.DownloadClient;
using Cleanuparr.Infrastructure.Features.Jobs;
using Cleanuparr.Infrastructure.Helpers;
using Cleanuparr.Persistence;
using Cleanuparr.Persistence.Models.Configuration;
using Cleanuparr.Persistence.Models.Configuration.Arr;
using Cleanuparr.Persistence.Models.Configuration.General;
using Cleanuparr.Persistence.Models.Configuration.QueueCleaner;
using Data.Models.Arr.Queue;
using Infrastructure.Events;
using Infrastructure.Helpers;
using Infrastructure.Verticals.Arr;
using Infrastructure.Verticals.Arr.Interfaces;
using Infrastructure.Verticals.Context;
using Infrastructure.Verticals.DownloadClient;
using Infrastructure.Verticals.Jobs;
using MassTransit;
using Microsoft.Extensions.Caching.Memory;
using Microsoft.Extensions.Logging;
using LogContext = Serilog.Context.LogContext;
using Infrastructure.Verticals.ContentBlocker;
namespace Infrastructure.Verticals.QueueCleaner;
namespace Cleanuparr.Application.Features.QueueCleaner;
public sealed class QueueCleaner : GenericHandler
public sealed class QueueCleanerHandler : GenericHandler
{
private readonly BlocklistProvider _blocklistProvider;
public QueueCleaner(
ILogger<QueueCleaner> logger,
public QueueCleanerHandler(
ILogger<QueueCleanerHandler> logger,
DataContext dataContext,
IMemoryCache cache,
IBus messageBus,

View File

@@ -7,10 +7,7 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Mapster" Version="7.4.0" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.2" />
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="Serilog" Version="4.2.0" />
</ItemGroup>
</Project>

View File

@@ -1,4 +1,4 @@
using Data.Models.Configuration.Arr;
using Cleanuparr.Domain.Enums;
namespace Data.Models.Arr;

View File

@@ -1,6 +1,6 @@
using System.Globalization;
namespace Common.CustomDataTypes;
namespace Cleanuparr.Domain.Entities;
public readonly struct ByteSize : IComparable<ByteSize>, IEquatable<ByteSize>
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Cache;
namespace Cleanuparr.Domain.Entities.Cache;
public sealed record StalledCacheItem
{

View File

@@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace Data.Models.Deluge.Request;
namespace Cleanuparr.Domain.Entities.Deluge.Request;
public class DelugeRequest
{

View File

@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
namespace Data.Models.Deluge.Response;
namespace Cleanuparr.Domain.Entities.Deluge.Response;
public sealed record DelugeContents
{

View File

@@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace Data.Models.Deluge.Response;
namespace Cleanuparr.Domain.Entities.Deluge.Response;
public sealed record DelugeError
{

View File

@@ -1,6 +1,6 @@
using System.Text.Json.Serialization;
namespace Data.Models.Deluge.Response;
namespace Cleanuparr.Domain.Entities.Deluge.Response;
public class DelugeFileOrDirectory
{

View File

@@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace Data.Models.Deluge.Response;
namespace Cleanuparr.Domain.Entities.Deluge.Response;
public sealed record DelugeResponse<T>
{

View File

@@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace Data.Models.Deluge.Response;
namespace Cleanuparr.Domain.Entities.Deluge.Response;
public record DelugeTorrent
{

View File

@@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace Data.Models.Deluge.Response;
namespace Cleanuparr.Domain.Entities.Deluge.Response;
public sealed record DelugeTorrentExtended : DelugeTorrent
{

View File

@@ -1,6 +1,6 @@
using Newtonsoft.Json;
namespace Data.Models.Deluge.Response;
namespace Cleanuparr.Domain.Entities.Deluge.Response;
public sealed record DownloadStatus
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Lidarr;
namespace Cleanuparr.Domain.Entities.Lidarr;
public sealed record Album
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Lidarr;
namespace Cleanuparr.Domain.Entities.Lidarr;
public sealed record Artist
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Lidarr;
namespace Cleanuparr.Domain.Entities.Lidarr;
public sealed record LidarrCommand
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Radarr;
namespace Cleanuparr.Domain.Entities.Radarr;
public sealed record Movie
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Radarr;
namespace Cleanuparr.Domain.Entities.Radarr;
public sealed record RadarrCommand
{

View File

@@ -1,6 +1,6 @@
using System.Text;
namespace Common.CustomDataTypes;
namespace Cleanuparr.Domain.Entities;
public readonly struct SmartTimeSpan : IComparable<SmartTimeSpan>, IEquatable<SmartTimeSpan>
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Sonarr;
namespace Cleanuparr.Domain.Entities.Sonarr;
public sealed record Episode
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Sonarr;
namespace Cleanuparr.Domain.Entities.Sonarr;
public sealed record Series
{

View File

@@ -1,6 +1,6 @@
using Data.Models.Configuration.Arr;
using Cleanuparr.Domain.Enums;
namespace Data.Models.Sonarr;
namespace Cleanuparr.Domain.Entities.Sonarr;
public sealed record SonarrCommand
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Configuration.QueueCleaner;
namespace Cleanuparr.Domain.Enums;
public enum BlocklistType
{

View File

@@ -1,4 +1,4 @@
namespace Common.Enums;
namespace Cleanuparr.Domain.Enums;
public enum CertificateValidationType
{

View File

@@ -1,4 +1,4 @@
namespace Data.Enums;
namespace Cleanuparr.Domain.Enums;
public enum CleanReason
{

View File

@@ -1,4 +1,4 @@
namespace Data.Enums;
namespace Cleanuparr.Domain.Enums;
public enum DeleteReason
{

View File

@@ -1,4 +1,4 @@
namespace Common.Enums;
namespace Cleanuparr.Domain.Enums;
public enum DownloadClientType
{

View File

@@ -1,4 +1,4 @@
namespace Common.Enums;
namespace Cleanuparr.Domain.Enums;
public enum DownloadClientTypeName
{

View File

@@ -1,4 +1,4 @@
namespace Data.Enums;
namespace Cleanuparr.Domain.Enums;
public enum EventSeverity
{

View File

@@ -1,4 +1,4 @@
namespace Data.Enums;
namespace Cleanuparr.Domain.Enums;
public enum EventType
{

View File

@@ -1,4 +1,4 @@
namespace Data.Enums;
namespace Cleanuparr.Domain.Enums;
public enum InstanceType
{

View File

@@ -1,4 +1,4 @@
namespace Data.Models.Configuration.Arr;
namespace Cleanuparr.Domain.Enums;
public enum SonarrSearchType
{

View File

@@ -1,4 +1,4 @@
namespace Data.Enums;
namespace Cleanuparr.Domain.Enums;
public enum StrikeType
{

View File

@@ -1,4 +1,4 @@
namespace Common.Exceptions;
namespace Cleanuparr.Domain.Exceptions;
public class FatalException : Exception
{

View File

@@ -1,4 +1,4 @@
namespace Common.Exceptions;
namespace Cleanuparr.Domain.Exceptions;
public sealed class ValidationException : Exception
{

View File

@@ -4,34 +4,29 @@
<TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Cleanuparr.Infrastructure\Cleanuparr.Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="coverlet.collector" Version="6.0.4">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.13.0" />
<PackageReference Include="NSubstitute" Version="5.3.0" />
<PackageReference Include="Serilog" Version="4.3.0" />
<PackageReference Include="Serilog.Expressions" Version="5.0.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.File" Version="7.0.0" />
<PackageReference Include="Shouldly" Version="4.3.0" />
<PackageReference Include="xunit" Version="2.9.3" />
<PackageReference Include="xunit.runner.visualstudio" Version="3.0.2">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<Using Include="Xunit"/>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Infrastructure\Infrastructure.csproj" />
</ItemGroup>
<ItemGroup>
<Folder Include="Verticals\DownloadClient\Factory\" />
</ItemGroup>
</Project>

View File

@@ -1,8 +1,8 @@
using Infrastructure.Verticals.ContentBlocker;
using Cleanuparr.Infrastructure.Features.ContentBlocker;
using Microsoft.Extensions.Logging;
using NSubstitute;
namespace Infrastructure.Tests.Verticals.ContentBlocker;
namespace Cleanuparr.Infrastructure.Tests.Verticals.ContentBlocker;
public class FilenameEvaluatorFixture
{

View File

@@ -1,9 +1,10 @@
using System.Collections.Concurrent;
using System.Text.RegularExpressions;
using Data.Models.Configuration.QueueCleaner;
using Cleanuparr.Domain.Enums;
using Shouldly;
using Xunit;
namespace Infrastructure.Tests.Verticals.ContentBlocker;
namespace Cleanuparr.Infrastructure.Tests.Verticals.ContentBlocker;
public class FilenameEvaluatorTests : IClassFixture<FilenameEvaluatorFixture>
{

View File

@@ -1,4 +1,4 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
@@ -7,24 +7,24 @@
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Common\Common.csproj" />
<ProjectReference Include="..\Data\Data.csproj" />
<Folder Include="Features\" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="FLM.QBittorrent" Version="1.0.1" />
<PackageReference Include="FLM.Transmission" Version="1.0.3" />
<PackageReference Include="Mapster" Version="7.4.0" />
<PackageReference Include="MassTransit" Version="8.3.6" />
<PackageReference Include="MassTransit.Abstractions" Version="8.4.1" />
<PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.2.0" />
<PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.5" />
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Http.Polly" Version="9.0.6" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.6" />
<PackageReference Include="Mono.Unix" Version="7.1.0-final.1.21458.1" />
<PackageReference Include="Polly" Version="7.2.4" />
<PackageReference Include="Polly.Extensions.Http" Version="3.0.0" />
<PackageReference Include="Quartz" Version="3.13.1" />
<PackageReference Include="Scrutor" Version="6.0.1" />
<PackageReference Include="Quartz" Version="3.14.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Cleanuparr.Persistence\Cleanuparr.Persistence.csproj" />
</ItemGroup>
</Project>

View File

@@ -1,10 +1,10 @@
using Data;
using Cleanuparr.Persistence;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
namespace Infrastructure.Events;
namespace Cleanuparr.Infrastructure.Events;
/// <summary>
/// Background service that periodically cleans up old events

View File

@@ -1,15 +1,16 @@
using System.Text.Json;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Infrastructure.Features.Context;
using Cleanuparr.Infrastructure.Features.Notifications;
using Cleanuparr.Infrastructure.Hubs;
using Cleanuparr.Persistence;
using Cleanuparr.Persistence.Models.Events;
using Infrastructure.Interceptors;
using Infrastructure.Verticals.Notifications;
using Microsoft.AspNetCore.SignalR;
using Microsoft.Extensions.Logging;
using System.Text.Json;
using Data;
using Data.Enums;
using Data.Models.Events;
using Infrastructure.Verticals.Notifications;
using Infrastructure.Verticals.Context;
using Infrastructure.Interceptors;
using Infrastructure.Hubs;
namespace Infrastructure.Events;
namespace Cleanuparr.Infrastructure.Events;
/// <summary>
/// Service for publishing events to database and SignalR hub

View File

@@ -1,8 +1,8 @@
using Data.Models.Deluge.Response;
using Infrastructure.Helpers;
using Cleanuparr.Domain.Entities.Deluge.Response;
using Cleanuparr.Infrastructure.Services;
using Infrastructure.Services;
namespace Infrastructure.Extensions;
namespace Cleanuparr.Infrastructure.Extensions;
public static class DelugeExtensions
{

View File

@@ -1,7 +1,7 @@
using System.Net;
using System.Net.Sockets;
namespace Infrastructure.Extensions;
namespace Cleanuparr.Infrastructure.Extensions;
public static class IpAddressExtensions
{

View File

@@ -1,8 +1,8 @@
using Infrastructure.Helpers;
using Cleanuparr.Infrastructure.Services;
using Infrastructure.Services;
using QBittorrent.Client;
namespace Infrastructure.Extensions;
namespace Cleanuparr.Infrastructure.Extensions;
public static class QBitExtensions
{

View File

@@ -1,8 +1,8 @@
using Infrastructure.Helpers;
using Cleanuparr.Infrastructure.Services;
using Infrastructure.Services;
using Transmission.API.RPC.Entity;
namespace Infrastructure.Extensions;
namespace Cleanuparr.Infrastructure.Extensions;
public static class TransmissionExtensions
{

View File

@@ -1,17 +1,17 @@
using Data.Models.Configuration.Arr;
using Data.Models.Configuration.QueueCleaner;
using Common.Helpers;
using Data.Enums;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Infrastructure.Features.Arr.Interfaces;
using Cleanuparr.Infrastructure.Features.Context;
using Cleanuparr.Infrastructure.Features.ItemStriker;
using Cleanuparr.Persistence.Models.Configuration.Arr;
using Cleanuparr.Persistence.Models.Configuration.QueueCleaner;
using Cleanuparr.Shared.Helpers;
using Data.Models.Arr;
using Data.Models.Arr.Queue;
using Infrastructure.Interceptors;
using Infrastructure.Verticals.Arr.Interfaces;
using Infrastructure.Verticals.Context;
using Infrastructure.Verticals.ItemStriker;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace Infrastructure.Verticals.Arr;
namespace Cleanuparr.Infrastructure.Features.Arr;
public abstract class ArrClient : IArrClient
{

View File

@@ -1,7 +1,7 @@
using Data.Enums;
using Infrastructure.Verticals.Arr.Interfaces;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Infrastructure.Features.Arr.Interfaces;
namespace Infrastructure.Verticals.Arr;
namespace Cleanuparr.Infrastructure.Features.Arr;
public sealed class ArrClientFactory
{

View File

@@ -1,10 +1,9 @@
using Common.Configuration;
using Data.Models.Configuration.Arr;
using Cleanuparr.Infrastructure.Features.Arr.Interfaces;
using Cleanuparr.Persistence.Models.Configuration.Arr;
using Data.Models.Arr.Queue;
using Infrastructure.Verticals.Arr.Interfaces;
using Microsoft.Extensions.Logging;
namespace Infrastructure.Verticals.Arr;
namespace Cleanuparr.Infrastructure.Features.Arr;
public sealed class ArrQueueIterator
{

View File

@@ -1,9 +1,9 @@
using Data.Models.Configuration.Arr;
using Data.Enums;
using Cleanuparr.Domain.Enums;
using Cleanuparr.Persistence.Models.Configuration.Arr;
using Data.Models.Arr;
using Data.Models.Arr.Queue;
namespace Infrastructure.Verticals.Arr.Interfaces;
namespace Cleanuparr.Infrastructure.Features.Arr.Interfaces;
public interface IArrClient
{

View File

@@ -0,0 +1,5 @@
namespace Cleanuparr.Infrastructure.Features.Arr.Interfaces;
public interface ILidarrClient : IArrClient
{
}

View File

@@ -0,0 +1,5 @@
namespace Cleanuparr.Infrastructure.Features.Arr.Interfaces;
public interface IRadarrClient : IArrClient
{
}

View File

@@ -0,0 +1,5 @@
namespace Cleanuparr.Infrastructure.Features.Arr.Interfaces;
public interface ISonarrClient : IArrClient
{
}

View File

@@ -1,15 +1,15 @@
using System.Text;
using Data.Models.Configuration.Arr;
using Cleanuparr.Domain.Entities.Lidarr;
using Cleanuparr.Infrastructure.Features.Arr.Interfaces;
using Cleanuparr.Infrastructure.Features.ItemStriker;
using Cleanuparr.Persistence.Models.Configuration.Arr;
using Data.Models.Arr;
using Data.Models.Arr.Queue;
using Data.Models.Lidarr;
using Infrastructure.Interceptors;
using Infrastructure.Verticals.Arr.Interfaces;
using Infrastructure.Verticals.ItemStriker;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace Infrastructure.Verticals.Arr;
namespace Cleanuparr.Infrastructure.Features.Arr;
public class LidarrClient : ArrClient, ILidarrClient
{

View File

@@ -1,15 +1,15 @@
using System.Text;
using Data.Models.Configuration.Arr;
using Cleanuparr.Domain.Entities.Radarr;
using Cleanuparr.Infrastructure.Features.Arr.Interfaces;
using Cleanuparr.Infrastructure.Features.ItemStriker;
using Cleanuparr.Persistence.Models.Configuration.Arr;
using Data.Models.Arr;
using Data.Models.Arr.Queue;
using Data.Models.Radarr;
using Infrastructure.Interceptors;
using Infrastructure.Verticals.Arr.Interfaces;
using Infrastructure.Verticals.ItemStriker;
using Microsoft.Extensions.Logging;
using Newtonsoft.Json;
namespace Infrastructure.Verticals.Arr;
namespace Cleanuparr.Infrastructure.Features.Arr;
public class RadarrClient : ArrClient, IRadarrClient
{

Some files were not shown because too many files have changed in this diff Show More