Add editorconfig and analyzers, format backend code

This commit is contained in:
2026-09-24 04:54:17 +02:00
parent 87c3f97529
commit c8fe28b07b
367 changed files with 12179 additions and 12459 deletions
+65
View File
@@ -0,0 +1,65 @@
root = true
[*]
charset = utf-8
insert_final_newline = true
trim_trailing_whitespace = true
indent_style = space
[*.{csproj,props,targets,slnx,xml}]
indent_size = 2
[*.json]
indent_size = 4
[**/Migrations/**.cs]
generated_code = true
[*.cs]
indent_size = 4
csharp_style_namespace_declarations = file_scoped:warning
csharp_using_directive_placement = outside_namespace:warning
dotnet_sort_system_directives_first = true
dotnet_separate_import_directive_groups = false
dotnet_diagnostic.IDE0005.severity = warning
dotnet_style_require_accessibility_modifiers = always:warning
csharp_style_var_for_built_in_types = true:suggestion
csharp_style_var_when_type_is_apparent = true:suggestion
csharp_style_var_elsewhere = true:suggestion
csharp_prefer_braces = when_multiline:warning
csharp_style_prefer_primary_constructors = true:suggestion
csharp_style_expression_bodied_methods = when_on_single_line:suggestion
dotnet_style_prefer_collection_expression = when_types_loosely_match:suggestion
dotnet_naming_rule.private_fields.symbols = private_fields
dotnet_naming_rule.private_fields.style = camel_case
dotnet_naming_rule.private_fields.severity = warning
dotnet_naming_symbols.private_fields.applicable_kinds = field
dotnet_naming_symbols.private_fields.applicable_accessibilities = private
dotnet_naming_symbols.private_fields.required_modifiers =
dotnet_naming_style.camel_case.capitalization = camel_case
dotnet_naming_rule.private_constants.symbols = private_constants
dotnet_naming_rule.private_constants.style = pascal_case
dotnet_naming_rule.private_constants.severity = warning
dotnet_naming_symbols.private_constants.applicable_kinds = field
dotnet_naming_symbols.private_constants.required_modifiers = const
dotnet_naming_style.pascal_case.capitalization = pascal_case
# Analyzer rules that would need behaviour or API changes; downgraded in P0, revisit in P15.
dotnet_diagnostic.CA1848.severity = suggestion
dotnet_diagnostic.CA1873.severity = suggestion
dotnet_diagnostic.CA1305.severity = suggestion
dotnet_diagnostic.CA1707.severity = suggestion
dotnet_diagnostic.CA1859.severity = suggestion
dotnet_diagnostic.CA1716.severity = suggestion
dotnet_diagnostic.CA1000.severity = suggestion
dotnet_diagnostic.CA1725.severity = suggestion
dotnet_diagnostic.CA1816.severity = suggestion
dotnet_diagnostic.CA1822.severity = suggestion
dotnet_diagnostic.CA1852.severity = suggestion
dotnet_diagnostic.CA1068.severity = suggestion
dotnet_diagnostic.CA1711.severity = suggestion
dotnet_diagnostic.CA1861.severity = suggestion
@@ -5,8 +5,8 @@ using Microsoft.Extensions.Logging;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Domain.Entities; using Musify.Domain.Entities;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record AddTrackToAlbumCommand(long UserId, Guid AlbumId, Guid TrackId) public record AddTrackToAlbumCommand(long UserId, Guid AlbumId, Guid TrackId)
: ICommand<ErrorOr<Success>>; : ICommand<ErrorOr<Success>>;
@@ -79,4 +79,3 @@ namespace Musify.Application.Albums
return new Success(); return new Success();
} }
} }
}
@@ -2,17 +2,17 @@ using ErrorOr;
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Configuration;
using Musify.Application.Shared;
using Musify.Application.Events;
using Musify.Application.Albums.Responses; using Musify.Application.Albums.Responses;
using Musify.Application.Configuration;
using Musify.Application.Contracts;
using Musify.Application.Events;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Application.Shared;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record CreateAlbumCommand( public record CreateAlbumCommand(
long UserId, long UserId,
string Title, string Title,
@@ -125,4 +125,3 @@ namespace Musify.Application.Albums
} }
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record DeleteAlbumCommand(long UserId, Guid AlbumId) public record DeleteAlbumCommand(long UserId, Guid AlbumId)
: ICommand<ErrorOr<Success>>; : ICommand<ErrorOr<Success>>;
@@ -47,4 +47,3 @@ namespace Musify.Application.Albums
return new Success(); return new Success();
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Musify.Application.Albums.Responses; using Musify.Application.Albums.Responses;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record GetAlbumByIdQuery(Guid Id) public record GetAlbumByIdQuery(Guid Id)
: IQuery<ErrorOr<AlbumApplicationResponse>>; : IQuery<ErrorOr<AlbumApplicationResponse>>;
@@ -35,4 +35,3 @@ namespace Musify.Application.Albums
return AlbumApplicationResponse.FromEntity(album.Album, album.TrackCount, album.CoverTrackIds); return AlbumApplicationResponse.FromEntity(album.Album, album.TrackCount, album.CoverTrackIds);
} }
} }
}
@@ -5,8 +5,8 @@ using MimeMapping;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record GetAlbumCoverQuery(Guid AlbumId, string Size) public record GetAlbumCoverQuery(Guid AlbumId, string Size)
: IQuery<ErrorOr<AlbumCoverLocation>>; : IQuery<ErrorOr<AlbumCoverLocation>>;
@@ -46,4 +46,3 @@ namespace Musify.Application.Albums
private static string? BuildKey(Func<string, string> builder, string? name) private static string? BuildKey(Func<string, string> builder, string? name)
=> string.IsNullOrEmpty(name) ? null : builder(name); => string.IsNullOrEmpty(name) ? null : builder(name);
} }
}
@@ -7,8 +7,8 @@ using Musify.Application.Tracks.Responses;
using X.PagedList; using X.PagedList;
using X.PagedList.EF; using X.PagedList.EF;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record GetAlbumTracksQuery( public record GetAlbumTracksQuery(
Guid AlbumId, Guid AlbumId,
int PageNumber, int PageNumber,
@@ -46,4 +46,3 @@ namespace Musify.Application.Albums
return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks); return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks);
} }
} }
}
@@ -3,11 +3,10 @@ using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Albums.Responses; using Musify.Application.Albums.Responses;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using X.PagedList;
using X.PagedList.EF; using X.PagedList.EF;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record GetAlbumsQuery(string? Title, int PageNumber, int PageSize) public record GetAlbumsQuery(string? Title, int PageNumber, int PageSize)
: IQuery<ErrorOr<AlbumsSearchResponse>>; : IQuery<ErrorOr<AlbumsSearchResponse>>;
@@ -57,4 +56,3 @@ namespace Musify.Application.Albums
pagedEntities.HasNextPage); pagedEntities.HasNextPage);
} }
} }
}
@@ -7,8 +7,8 @@ using Musify.Application.Shared;
using X.PagedList; using X.PagedList;
using X.PagedList.EF; using X.PagedList.EF;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record GetAlbumsByUserIdQuery(long UserId, int PageNumber, int PageSize) public record GetAlbumsByUserIdQuery(long UserId, int PageNumber, int PageSize)
: IQuery<ErrorOr<PaginatedResponse<AlbumApplicationResponse>>>; : IQuery<ErrorOr<PaginatedResponse<AlbumApplicationResponse>>>;
@@ -50,4 +50,3 @@ namespace Musify.Application.Albums
return PaginatedResponse<AlbumApplicationResponse>.FromPagedList(pagedAlbums); return PaginatedResponse<AlbumApplicationResponse>.FromPagedList(pagedAlbums);
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Musify.Application.Albums.Responses; using Musify.Application.Albums.Responses;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record GetRecentlyListenedAlbumsQuery(long UserId, int Limit) public record GetRecentlyListenedAlbumsQuery(long UserId, int Limit)
: IQuery<ErrorOr<IReadOnlyList<AlbumApplicationResponse>>>; : IQuery<ErrorOr<IReadOnlyList<AlbumApplicationResponse>>>;
@@ -58,4 +58,3 @@ namespace Musify.Application.Albums
.ToList(); .ToList();
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record RemoveTrackFromAlbumCommand(long UserId, Guid AlbumId, Guid TrackId) public record RemoveTrackFromAlbumCommand(long UserId, Guid AlbumId, Guid TrackId)
: ICommand<ErrorOr<Success>>; : ICommand<ErrorOr<Success>>;
@@ -56,4 +56,3 @@ namespace Musify.Application.Albums
return new Success(); return new Success();
} }
} }
}
@@ -2,15 +2,15 @@ using ErrorOr;
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Configuration;
using Musify.Application.Albums.Responses; using Musify.Application.Albums.Responses;
using Musify.Application.Configuration;
using Musify.Application.Contracts;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record RequestAlbumPictureUploadCommand( public record RequestAlbumPictureUploadCommand(
long UserId, long UserId,
string FileType, string FileType,
@@ -102,4 +102,3 @@ namespace Musify.Application.Albums
} }
} }
} }
}
@@ -1,9 +1,9 @@
using System.Text.Json.Serialization; using System.Text.Json.Serialization;
using Musify.Domain.Entities;
using Musify.Application.Serialization; using Musify.Application.Serialization;
using Musify.Domain.Entities;
namespace Musify.Application.Albums.Responses;
namespace Musify.Application.Albums.Responses
{
public record AlbumApplicationResponse( public record AlbumApplicationResponse(
Guid Id, Guid Id,
string Title, string Title,
@@ -40,4 +40,3 @@ namespace Musify.Application.Albums.Responses
coverTrackIds ?? []); coverTrackIds ?? []);
} }
} }
}
@@ -1,5 +1,5 @@
namespace Musify.Application.Albums.Responses namespace Musify.Application.Albums.Responses;
{
public record AlbumPictureUploadResponse( public record AlbumPictureUploadResponse(
Guid IntentId, Guid IntentId,
string Bucket, string Bucket,
@@ -8,4 +8,3 @@ namespace Musify.Application.Albums.Responses
string ContentType, string ContentType,
int ExpiresInSeconds, int ExpiresInSeconds,
string UploadUrl); string UploadUrl);
}
@@ -1,7 +1,6 @@
namespace Musify.Application.Albums.Responses namespace Musify.Application.Albums.Responses;
{
public record AlbumSearchItemResponse(AlbumApplicationResponse Album) public record AlbumSearchItemResponse(AlbumApplicationResponse Album)
{ {
public static AlbumSearchItemResponse FromAlbum(AlbumApplicationResponse album) => new(album); public static AlbumSearchItemResponse FromAlbum(AlbumApplicationResponse album) => new(album);
} }
}
@@ -1,5 +1,5 @@
namespace Musify.Application.Albums.Responses namespace Musify.Application.Albums.Responses;
{
public record AlbumsSearchResponse( public record AlbumsSearchResponse(
IReadOnlyList<AlbumSearchItemResponse> Items, IReadOnlyList<AlbumSearchItemResponse> Items,
@@ -9,4 +9,3 @@ namespace Musify.Application.Albums.Responses
int TotalItemCount, int TotalItemCount,
bool HasPreviousPage, bool HasPreviousPage,
bool HasNextPage); bool HasNextPage);
}
@@ -2,17 +2,17 @@ using ErrorOr;
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Configuration;
using Musify.Application.Shared;
using Musify.Application.Events;
using Musify.Application.Albums.Responses; using Musify.Application.Albums.Responses;
using Musify.Application.Configuration;
using Musify.Application.Contracts;
using Musify.Application.Events;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Application.Shared;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.Albums namespace Musify.Application.Albums;
{
public record UpdateAlbumCommand( public record UpdateAlbumCommand(
long UserId, long UserId,
Guid AlbumId, Guid AlbumId,
@@ -147,4 +147,3 @@ namespace Musify.Application.Albums
} }
} }
} }
}
@@ -1,4 +1,4 @@
using Mediator; using Mediator;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
[assembly: MediatorOptions(ServiceLifetime = ServiceLifetime.Scoped)] [assembly: MediatorOptions(ServiceLifetime = ServiceLifetime.Scoped)]
@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public class AlbumConfiguration public class AlbumConfiguration
{ {
public const string SectionName = "Album"; public const string SectionName = "Album";
@@ -76,4 +76,3 @@ namespace Musify.Application.Configuration
[Range(1, 1024)] [Range(1, 1024)]
public int LargePictureHeight { get; set; } = 512; public int LargePictureHeight { get; set; } = 512;
} }
}
@@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public class ApplicationStorageConfiguration public class ApplicationStorageConfiguration
{ {
public const string SectionName = "ApplicationStorage"; public const string SectionName = "ApplicationStorage";
@@ -10,4 +10,3 @@ namespace Musify.Application.Configuration
[StringLength(128, MinimumLength = 1)] [StringLength(128, MinimumLength = 1)]
public required string Bucket { get; set; } public required string Bucket { get; set; }
} }
}
@@ -1,8 +1,8 @@
using Mediator; using Mediator;
using Musify.Application.Configuration.Responses; using Musify.Application.Configuration.Responses;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public record GetPlaybackPublicConfigQuery : IQuery<PlaybackPublicConfigResponse>; public record GetPlaybackPublicConfigQuery : IQuery<PlaybackPublicConfigResponse>;
@@ -14,4 +14,3 @@ namespace Musify.Application.Configuration
playbackConfiguration.AllowAnonymousListening, playbackConfiguration.AllowAnonymousListening,
playbackConfiguration.AnonymousFragmentSeconds)); playbackConfiguration.AnonymousFragmentSeconds));
} }
}
@@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public class MixConfiguration public class MixConfiguration
{ {
public const string SectionName = "Mix"; public const string SectionName = "Mix";
@@ -9,4 +9,3 @@ namespace Musify.Application.Configuration
[Range(4, 100)] [Range(4, 100)]
public int ItemsPerMix { get; set; } = 12; public int ItemsPerMix { get; set; } = 12;
} }
}
@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public class PlayListConfiguration public class PlayListConfiguration
{ {
public const string SectionName = "PlayList"; public const string SectionName = "PlayList";
@@ -76,4 +76,3 @@ namespace Musify.Application.Configuration
[Range(1, 1024)] [Range(1, 1024)]
public int LargePictureHeight { get; set; } = 512; public int LargePictureHeight { get; set; } = 512;
} }
}
@@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public sealed class PlaybackConfiguration public sealed class PlaybackConfiguration
{ {
@@ -15,4 +15,3 @@ namespace Musify.Application.Configuration
[Range(1, int.MaxValue)] [Range(1, int.MaxValue)]
public int EstimatedAudioBytesPerSecond { get; set; } = 16_000; public int EstimatedAudioBytesPerSecond { get; set; } = 16_000;
} }
}
@@ -1,5 +1,4 @@
namespace Musify.Application.Configuration.Responses namespace Musify.Application.Configuration.Responses;
{
public record PlaybackPublicConfigResponse(bool AllowAnonymousListening, int AnonymousFragmentSeconds); public record PlaybackPublicConfigResponse(bool AllowAnonymousListening, int AnonymousFragmentSeconds);
}
@@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public class StreamGatewayConfiguration public class StreamGatewayConfiguration
{ {
public const string SectionName = "StreamGateway"; public const string SectionName = "StreamGateway";
@@ -13,4 +13,3 @@ namespace Musify.Application.Configuration
[Required] [Required]
public string AudioFileName { get; set; } = "audio.m4a"; public string AudioFileName { get; set; } = "audio.m4a";
} }
}
@@ -1,8 +1,8 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public class TrackConfiguration public class TrackConfiguration
{ {
public const string SectionName = "Track"; public const string SectionName = "Track";
@@ -113,4 +113,3 @@ namespace Musify.Application.Configuration
[Range(1, 1024)] [Range(1, 1024)]
public int LargePictureHeight { get; set; } = 512; public int LargePictureHeight { get; set; } = 512;
} }
}
@@ -1,7 +1,7 @@
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace Musify.Application.Configuration namespace Musify.Application.Configuration;
{
public class UploadIntentConfiguration public class UploadIntentConfiguration
{ {
public const string SectionName = "UploadIntent"; public const string SectionName = "UploadIntent";
@@ -39,4 +39,3 @@ namespace Musify.Application.Configuration
[Range(60, 86400)] [Range(60, 86400)]
public int TemporalCleanUpJobIntervalSeconds { get; set; } = 3600; public int TemporalCleanUpJobIntervalSeconds { get; set; } = 3600;
} }
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public record AudioTranscodeResult(int StatusCode, TimeSpan Duration); public record AudioTranscodeResult(int StatusCode, TimeSpan Duration);
}
@@ -1,9 +1,8 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public interface IAudioTranscoderService public interface IAudioTranscoderService
{ {
Task<AudioTranscodeResult> TranscodeToAudioFileAsync(Stream audioStream, string destinationPath, CancellationToken cancellationToken); public Task<AudioTranscodeResult> TranscodeToAudioFileAsync(Stream audioStream, string destinationPath, CancellationToken cancellationToken);
Task<bool> IsValidAudioFileAsync(string filePath, CancellationToken cancellationToken); public Task<bool> IsValidAudioFileAsync(string filePath, CancellationToken cancellationToken);
}
} }
@@ -1,42 +1,41 @@
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Domain.Entities; using Musify.Domain.Entities;
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public interface IDatabase public interface IDatabase
{ {
DbSet<User> Users { get; } public DbSet<User> Users { get; }
DbSet<PlayList> PlayLists { get; } public DbSet<PlayList> PlayLists { get; }
DbSet<Album> Albums { get; } public DbSet<Album> Albums { get; }
DbSet<AlbumHasTrack> AlbumHasTracks { get; } public DbSet<AlbumHasTrack> AlbumHasTracks { get; }
DbSet<Track> Tracks { get; } public DbSet<Track> Tracks { get; }
DbSet<UserHasTrack> UserHasTracks { get; } public DbSet<UserHasTrack> UserHasTracks { get; }
DbSet<PlayListHasTrack> PlayListHasTracks { get; } public DbSet<PlayListHasTrack> PlayListHasTracks { get; }
DbSet<Mix> Mixes { get; } public DbSet<Mix> Mixes { get; }
DbSet<MixItem> MixItems { get; } public DbSet<MixItem> MixItems { get; }
DbSet<Upload> Uploads { get; } public DbSet<Upload> Uploads { get; }
DbSet<UploadIntent> UploadIntents { get; } public DbSet<UploadIntent> UploadIntents { get; }
DbSet<ListeningHistory> ListeningHistories { get; } public DbSet<ListeningHistory> ListeningHistories { get; }
DbSet<TrackLike> TrackLikes { get; } public DbSet<TrackLike> TrackLikes { get; }
DbSet<TrackTag> TrackTags { get; } public DbSet<TrackTag> TrackTags { get; }
DbSet<UserFollow> UserFollows { get; } public DbSet<UserFollow> UserFollows { get; }
Task<IDatabaseTransaction> BeginTransactionAsync(System.Data.IsolationLevel isolationLevel, CancellationToken cancellationToken); public Task<IDatabaseTransaction> BeginTransactionAsync(System.Data.IsolationLevel isolationLevel, CancellationToken cancellationToken);
Task<int> SaveChangesAsync(CancellationToken cancellationToken); public Task<int> SaveChangesAsync(CancellationToken cancellationToken);
}
} }
@@ -1,7 +1,6 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public interface IDatabaseTransaction : IAsyncDisposable public interface IDatabaseTransaction : IAsyncDisposable
{ {
Task CommitAsync(CancellationToken cancellationToken = default); public Task CommitAsync(CancellationToken cancellationToken = default);
}
} }
@@ -1,7 +1,6 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public interface IEventBus public interface IEventBus
{ {
Task PublishAsync<T>(T message, CancellationToken cancellationToken) where T : class; public Task PublishAsync<T>(T message, CancellationToken cancellationToken) where T : class;
}
} }
@@ -1,7 +1,6 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public interface IPictureService public interface IPictureService
{ {
Task<Stream> ResizePictureAsWebpAsync(Stream pictureStream, int width, int height, CancellationToken cancellationToken); public Task<Stream> ResizePictureAsWebpAsync(Stream pictureStream, int width, int height, CancellationToken cancellationToken);
}
} }
@@ -1,28 +1,27 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public interface IStorageService public interface IStorageService
{ {
Task<Stream> GetFileAsync(string bucket, string key, CancellationToken cancellationToken); public Task<Stream> GetFileAsync(string bucket, string key, CancellationToken cancellationToken);
Task<ObjectMetaData?> HeadObjectAsync(string bucket, string key, CancellationToken cancellationToken); public Task<ObjectMetaData?> HeadObjectAsync(string bucket, string key, CancellationToken cancellationToken);
Task<string> GetUrlAsync(string bucket, string key, TimeSpan ExpirationTime, CancellationToken cancellationToken); public Task<string> GetUrlAsync(string bucket, string key, TimeSpan ExpirationTime, CancellationToken cancellationToken);
Task<string> GetUploadUrlAsync(string bucket, string key, string contentType, TimeSpan expirationTime, CancellationToken cancellationToken, bool preventOverwrite = true); public Task<string> GetUploadUrlAsync(string bucket, string key, string contentType, TimeSpan expirationTime, CancellationToken cancellationToken, bool preventOverwrite = true);
Task UploadFileAsync(string filePath, string bucket, string key, CancellationToken cancellationToken); public Task UploadFileAsync(string filePath, string bucket, string key, CancellationToken cancellationToken);
Task UploadFileAsync(Stream sourceStream, string contentType, string bucket, string key, CancellationToken cancellationToken); public Task UploadFileAsync(Stream sourceStream, string contentType, string bucket, string key, CancellationToken cancellationToken);
Task<IReadOnlyList<string>> TransferFilesAsync(string sourceDirectory, string bucket, string route, CancellationToken cancellationToken); public Task<IReadOnlyList<string>> TransferFilesAsync(string sourceDirectory, string bucket, string route, CancellationToken cancellationToken);
Task RemoveFileAsync(string bucket, string key, CancellationToken cancellationToken); public Task RemoveFileAsync(string bucket, string key, CancellationToken cancellationToken);
Task CopyFileAsync(string sourceBucket, string sourceKey, string destinationBucket, string destinationKey, public Task CopyFileAsync(string sourceBucket, string sourceKey, string destinationBucket, string destinationKey,
CancellationToken cancellationToken); CancellationToken cancellationToken);
Task RemoveFolderAsync(string bucket, string folderKey, CancellationToken cancellationToken); public Task RemoveFolderAsync(string bucket, string folderKey, CancellationToken cancellationToken);
IAsyncEnumerable<StorageObject> ListObjectsAsync(string bucket, string prefix, CancellationToken cancellationToken); public IAsyncEnumerable<StorageObject> ListObjectsAsync(string bucket, string prefix, CancellationToken cancellationToken);
}
} }
@@ -1,10 +1,8 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public interface IStreamTicketService public interface IStreamTicketService
{ {
public StreamTicket IssueTicket(long? userId, string keyPrefix, long? maxBytes = null);
StreamTicket IssueTicket(long? userId, string keyPrefix, long? maxBytes = null);
} }
public record StreamTicket(string Token, int ExpiresInSeconds); public record StreamTicket(string Token, int ExpiresInSeconds);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public record ObjectMetaData(string ContentType, long ContentLength); public record ObjectMetaData(string ContentType, long ContentLength);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Contracts namespace Musify.Application.Contracts;
{
public record StorageObject(string Key, DateTime LastModifiedUtc); public record StorageObject(string Key, DateTime LastModifiedUtc);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record AlbumPictureProcessed(Guid AlbumId); public record AlbumPictureProcessed(Guid AlbumId);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record AlbumPictureProcessingFailed(Guid AlbumId); public record AlbumPictureProcessingFailed(Guid AlbumId);
}
@@ -1,7 +1,6 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record AlbumProcessingFailed( public record AlbumProcessingFailed(
Guid AlbumId, Guid AlbumId,
string? Bucket, string? Bucket,
string? PictureKey); string? PictureKey);
}
@@ -1,7 +1,7 @@
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record CreateAlbumResourcesEvent( public record CreateAlbumResourcesEvent(
Guid AlbumId, Guid AlbumId,
Guid PictureIntentId, Guid PictureIntentId,
@@ -11,4 +11,3 @@ namespace Musify.Application.Events
ImageSize Small, ImageSize Small,
ImageSize Medium, ImageSize Medium,
ImageSize Large); ImageSize Large);
}
@@ -1,7 +1,7 @@
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record CreatePlayListResourcesEvent( public record CreatePlayListResourcesEvent(
Guid PlayListId, Guid PlayListId,
Guid PictureIntentId, Guid PictureIntentId,
@@ -11,4 +11,3 @@ namespace Musify.Application.Events
ImageSize Small, ImageSize Small,
ImageSize Medium, ImageSize Medium,
ImageSize Large); ImageSize Large);
}
@@ -1,7 +1,7 @@
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record CreateTrackResourcesEvent( public record CreateTrackResourcesEvent(
Guid TrackId, Guid TrackId,
Guid PictureIntentId, Guid PictureIntentId,
@@ -15,4 +15,3 @@ namespace Musify.Application.Events
ImageSize Small, ImageSize Small,
ImageSize Medium, ImageSize Medium,
ImageSize Large); ImageSize Large);
}
@@ -1,6 +1,5 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record DeletePlayListEvent( public record DeletePlayListEvent(
Guid PlayListId, Guid PlayListId,
long UserId); long UserId);
}
@@ -1,6 +1,5 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record DeleteTrackEvent( public record DeleteTrackEvent(
Guid TrackId, Guid TrackId,
long UserId); long UserId);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record PlayListPictureProcessed(Guid PlayListId); public record PlayListPictureProcessed(Guid PlayListId);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record PlayListPictureProcessingFailed(Guid PlayListId); public record PlayListPictureProcessingFailed(Guid PlayListId);
}
@@ -1,7 +1,6 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record PlayListProcessingFailed( public record PlayListProcessingFailed(
Guid PlayListId, Guid PlayListId,
string? Bucket, string? Bucket,
string? PictureKey); string? PictureKey);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record TrackAudioProcessed(Guid TrackId); public record TrackAudioProcessed(Guid TrackId);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record TrackAudioProcessingFailed(Guid TrackId); public record TrackAudioProcessingFailed(Guid TrackId);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record TrackPictureProcessed(Guid TrackId); public record TrackPictureProcessed(Guid TrackId);
}
@@ -1,4 +1,3 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record TrackPictureProcessingFailed(Guid TrackId); public record TrackPictureProcessingFailed(Guid TrackId);
}
@@ -1,8 +1,7 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record TrackProcessingFailed( public record TrackProcessingFailed(
Guid TrackId, Guid TrackId,
string? Bucket, string? Bucket,
string? PictureKey, string? PictureKey,
string? AudioKey); string? AudioKey);
}
@@ -1,7 +1,7 @@
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record UpdateAlbumPictureEvent( public record UpdateAlbumPictureEvent(
Guid AlbumId, Guid AlbumId,
string Bucket, string Bucket,
@@ -9,4 +9,3 @@ namespace Musify.Application.Events
ImageSize Small, ImageSize Small,
ImageSize Medium, ImageSize Medium,
ImageSize Large); ImageSize Large);
}
@@ -1,7 +1,7 @@
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record UpdateAlbumPictureSourceEvent( public record UpdateAlbumPictureSourceEvent(
Guid AlbumId, Guid AlbumId,
Guid PictureIntentId, Guid PictureIntentId,
@@ -11,4 +11,3 @@ namespace Musify.Application.Events
ImageSize Small, ImageSize Small,
ImageSize Medium, ImageSize Medium,
ImageSize Large); ImageSize Large);
}
@@ -1,7 +1,7 @@
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record UpdatePlayListPictureEvent( public record UpdatePlayListPictureEvent(
Guid PlayListId, Guid PlayListId,
string Bucket, string Bucket,
@@ -9,4 +9,3 @@ using Musify.Application.Shared;
ImageSize Small, ImageSize Small,
ImageSize Medium, ImageSize Medium,
ImageSize Large); ImageSize Large);
}
@@ -1,7 +1,7 @@
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record UpdatePlayListPictureSourceEvent( public record UpdatePlayListPictureSourceEvent(
Guid PlayListId, Guid PlayListId,
Guid PictureIntentId, Guid PictureIntentId,
@@ -11,4 +11,3 @@ namespace Musify.Application.Events
ImageSize Small, ImageSize Small,
ImageSize Medium, ImageSize Medium,
ImageSize Large); ImageSize Large);
}
@@ -1,9 +1,8 @@
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record UpdateTrackAudioEvent( public record UpdateTrackAudioEvent(
Guid TrackId, Guid TrackId,
string SourceBucket, string SourceBucket,
string SourceKey, string SourceKey,
string DestinationBucket, string DestinationBucket,
string DestinationFolderKey); string DestinationFolderKey);
}
@@ -1,7 +1,7 @@
using Musify.Application.Shared; using Musify.Application.Shared;
namespace Musify.Application.Events namespace Musify.Application.Events;
{
public record UpdateTrackPictureEvent( public record UpdateTrackPictureEvent(
Guid TrackId, Guid TrackId,
string Bucket, string Bucket,
@@ -9,4 +9,3 @@ using Musify.Application.Shared;
ImageSize Small, ImageSize Small,
ImageSize Medium, ImageSize Medium,
ImageSize Large); ImageSize Large);
}
@@ -1,8 +1,8 @@
using Mediator; using Mediator;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
namespace Musify.Application.Genres namespace Musify.Application.Genres;
{
public record GetAvailableGenresQuery : IQuery<IReadOnlyList<AvailableGenreResponse>>; public record GetAvailableGenresQuery : IQuery<IReadOnlyList<AvailableGenreResponse>>;
public record AvailableGenreResponse(Genre Genre, IReadOnlyList<Genre> IncompatibleWith); public record AvailableGenreResponse(Genre Genre, IReadOnlyList<Genre> IncompatibleWith);
@@ -23,4 +23,3 @@ namespace Musify.Application.Genres
return ValueTask.FromResult(result); return ValueTask.FromResult(result);
} }
} }
}
@@ -3,8 +3,8 @@ using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
namespace Musify.Application.Genres namespace Musify.Application.Genres;
{
public record GetGenresQuery : IQuery<IReadOnlyList<GenreResponse>>; public record GetGenresQuery : IQuery<IReadOnlyList<GenreResponse>>;
public record GenreResponse(Genre Genre, int TrackCount); public record GenreResponse(Genre Genre, int TrackCount);
@@ -28,4 +28,3 @@ namespace Musify.Application.Genres
.ToList(); .ToList();
} }
} }
}
@@ -7,8 +7,8 @@ using Musify.Application.Tracks.Responses;
using X.PagedList; using X.PagedList;
using X.PagedList.EF; using X.PagedList.EF;
namespace Musify.Application.Likes namespace Musify.Application.Likes;
{
public record GetLikedTracksQuery( public record GetLikedTracksQuery(
long UserId, long UserId,
int PageNumber, int PageNumber,
@@ -40,4 +40,3 @@ namespace Musify.Application.Likes
return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks); return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks);
} }
} }
}
@@ -5,8 +5,8 @@ using Microsoft.Extensions.Logging;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Domain.Entities; using Musify.Domain.Entities;
namespace Musify.Application.Likes namespace Musify.Application.Likes;
{
public record ToggleTrackLikeCommand(long UserId, Guid TrackId) public record ToggleTrackLikeCommand(long UserId, Guid TrackId)
: ICommand<ErrorOr<bool>>; : ICommand<ErrorOr<bool>>;
@@ -53,4 +53,3 @@ namespace Musify.Application.Likes
return nowLiked; return nowLiked;
} }
} }
}
@@ -7,8 +7,8 @@ using Musify.Application.Contracts;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
namespace Musify.Application.Mixes namespace Musify.Application.Mixes;
{
public record GenerateMixesForUserCommand(long UserId) public record GenerateMixesForUserCommand(long UserId)
: ICommand<ErrorOr<Success>>; : ICommand<ErrorOr<Success>>;
@@ -150,4 +150,3 @@ namespace Musify.Application.Mixes
} }
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Application.Mixes.Responses; using Musify.Application.Mixes.Responses;
namespace Musify.Application.Mixes namespace Musify.Application.Mixes;
{
public record GetMixByIdQuery(long UserId, Guid MixId) public record GetMixByIdQuery(long UserId, Guid MixId)
: IQuery<ErrorOr<MixApplicationResponse>>; : IQuery<ErrorOr<MixApplicationResponse>>;
@@ -28,4 +28,3 @@ namespace Musify.Application.Mixes
return new MixApplicationResponse(mix.Id, mix.Title, mix.Subtitle, items.Count, items); return new MixApplicationResponse(mix.Id, mix.Title, mix.Subtitle, items.Count, items);
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Application.Mixes.Responses; using Musify.Application.Mixes.Responses;
namespace Musify.Application.Mixes namespace Musify.Application.Mixes;
{
public record GetMixesByUserIdQuery(long UserId) public record GetMixesByUserIdQuery(long UserId)
: IQuery<ErrorOr<IReadOnlyList<MixApplicationResponse>>>; : IQuery<ErrorOr<IReadOnlyList<MixApplicationResponse>>>;
@@ -34,4 +34,3 @@ namespace Musify.Application.Mixes
return responses; return responses;
} }
} }
}
@@ -3,8 +3,8 @@ using Musify.Application.Contracts;
using Musify.Application.Mixes.Responses; using Musify.Application.Mixes.Responses;
using Musify.Domain.Entities; using Musify.Domain.Entities;
namespace Musify.Application.Mixes namespace Musify.Application.Mixes;
{
internal static class MixItemMapper internal static class MixItemMapper
{ {
@@ -37,4 +37,3 @@ namespace Musify.Application.Mixes
.ToList(); .ToList();
} }
} }
}
@@ -1,5 +1,5 @@
namespace Musify.Application.Mixes.Responses namespace Musify.Application.Mixes.Responses;
{
public record MixApplicationResponse( public record MixApplicationResponse(
Guid Id, Guid Id,
string Title, string Title,
@@ -9,4 +9,3 @@ namespace Musify.Application.Mixes.Responses
{ {
public const int CoverItemCount = 4; public const int CoverItemCount = 4;
} }
}
@@ -1,9 +1,8 @@
namespace Musify.Application.Mixes.Responses namespace Musify.Application.Mixes.Responses;
{
public record MixItemApplicationResponse( public record MixItemApplicationResponse(
Guid TrackId, Guid TrackId,
string Title, string Title,
string? Artist, string? Artist,
double DurationSeconds, double DurationSeconds,
int ListensCount); int ListensCount);
}
@@ -5,8 +5,8 @@ using Microsoft.Extensions.Logging;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Domain.Entities; using Musify.Domain.Entities;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record AddTrackToPlayListCommand(long UserId, Guid PlayListId, Guid TrackId) public record AddTrackToPlayListCommand(long UserId, Guid PlayListId, Guid TrackId)
: ICommand<ErrorOr<Success>>; : ICommand<ErrorOr<Success>>;
@@ -72,4 +72,3 @@ namespace Musify.Application.PlayLists
return new Success(); return new Success();
} }
} }
}
@@ -3,16 +3,16 @@ using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Shared; using Musify.Application.Contracts;
using Musify.Application.Events; using Musify.Application.Events;
using Musify.Application.PlayLists.Responses; using Musify.Application.PlayLists.Responses;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Application.Shared;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record CreatePlayListCommand( public record CreatePlayListCommand(
long UserId, long UserId,
string Name, string Name,
@@ -143,4 +143,3 @@ namespace Musify.Application.PlayLists
} }
} }
} }
}
@@ -6,8 +6,8 @@ using Musify.Application.Contracts;
using Musify.Application.Events; using Musify.Application.Events;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record DeletePlayListCommand(long UserId, Guid PlayListId) public record DeletePlayListCommand(long UserId, Guid PlayListId)
: ICommand<ErrorOr<Success>>; : ICommand<ErrorOr<Success>>;
@@ -59,4 +59,3 @@ namespace Musify.Application.PlayLists
return new Success(); return new Success();
} }
} }
}
@@ -1,12 +1,12 @@
using ErrorOr; using ErrorOr;
using Microsoft.EntityFrameworkCore;
using Musify.Application.PlayLists.Responses;
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Application.PlayLists.Responses;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record GetPlayListByIdQuery(Guid Id, long? RequestingUserId = null) public record GetPlayListByIdQuery(Guid Id, long? RequestingUserId = null)
: IQuery<ErrorOr<PlayListApplicationResponse>>; : IQuery<ErrorOr<PlayListApplicationResponse>>;
@@ -34,9 +34,10 @@ namespace Musify.Application.PlayLists
if (entry.PlayList.Visibility == PlaylistVisibility.Private if (entry.PlayList.Visibility == PlaylistVisibility.Private
&& entry.PlayList.UserId != request.RequestingUserId) && entry.PlayList.UserId != request.RequestingUserId)
{
return Error.NotFound(); return Error.NotFound();
}
return PlayListApplicationResponse.FromEntity(entry.PlayList, entry.CoverTrackIds); return PlayListApplicationResponse.FromEntity(entry.PlayList, entry.CoverTrackIds);
} }
} }
}
@@ -5,8 +5,8 @@ using MimeMapping;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record GetPlayListCoverQuery(Guid PlayListId, string Size) public record GetPlayListCoverQuery(Guid PlayListId, string Size)
: IQuery<ErrorOr<PlayListCoverLocation>>; : IQuery<ErrorOr<PlayListCoverLocation>>;
@@ -46,4 +46,3 @@ namespace Musify.Application.PlayLists
private static string? BuildKey(Func<string, string> builder, string? name) private static string? BuildKey(Func<string, string> builder, string? name)
=> string.IsNullOrEmpty(name) ? null : builder(name); => string.IsNullOrEmpty(name) ? null : builder(name);
} }
}
@@ -7,8 +7,8 @@ using Musify.Application.Tracks.Responses;
using X.PagedList; using X.PagedList;
using X.PagedList.EF; using X.PagedList.EF;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record GetPlayListTracksQuery( public record GetPlayListTracksQuery(
Guid PlayListId, Guid PlayListId,
int PageNumber, int PageNumber,
@@ -46,4 +46,3 @@ namespace Musify.Application.PlayLists
return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks); return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks);
} }
} }
}
@@ -1,14 +1,14 @@
using ErrorOr; using ErrorOr;
using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Shared; using Musify.Application.Contracts;
using Musify.Application.PlayLists.Responses; using Musify.Application.PlayLists.Responses;
using Musify.Application.Shared;
using X.PagedList; using X.PagedList;
using X.PagedList.EF; using X.PagedList.EF;
using Mediator;
using Musify.Application.Contracts;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record GetPlayListsQuery(int PageNumber, int PageSize) public record GetPlayListsQuery(int PageNumber, int PageSize)
: IQuery<ErrorOr<PaginatedResponse<PlayListApplicationResponse>>>; : IQuery<ErrorOr<PaginatedResponse<PlayListApplicationResponse>>>;
@@ -40,4 +40,3 @@ namespace Musify.Application.PlayLists
return PaginatedResponse<PlayListApplicationResponse>.FromPagedList(pagedPlayLists); return PaginatedResponse<PlayListApplicationResponse>.FromPagedList(pagedPlayLists);
} }
} }
}
@@ -8,8 +8,8 @@ using Musify.Domain.ValueObjects;
using X.PagedList; using X.PagedList;
using X.PagedList.EF; using X.PagedList.EF;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record GetPlayListsByUserIdQuery( public record GetPlayListsByUserIdQuery(
long UserId, long UserId,
string? Name, string? Name,
@@ -61,4 +61,3 @@ namespace Musify.Application.PlayLists
return PaginatedResponse<PlayListApplicationResponse>.FromPagedList(pagedPlayLists); return PaginatedResponse<PlayListApplicationResponse>.FromPagedList(pagedPlayLists);
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record RemoveTrackFromPlayListCommand(long UserId, Guid PlayListId, Guid TrackId) public record RemoveTrackFromPlayListCommand(long UserId, Guid PlayListId, Guid TrackId)
: ICommand<ErrorOr<Success>>; : ICommand<ErrorOr<Success>>;
@@ -46,4 +46,3 @@ namespace Musify.Application.PlayLists
return new Success(); return new Success();
} }
} }
}
@@ -3,14 +3,14 @@ using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Contracts;
using Musify.Application.PlayLists.Responses; using Musify.Application.PlayLists.Responses;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record RequestPlayListPictureUploadCommand( public record RequestPlayListPictureUploadCommand(
long UserId, long UserId,
string FileType, string FileType,
@@ -102,4 +102,3 @@ namespace Musify.Application.PlayLists
} }
} }
} }
}
@@ -1,8 +1,8 @@
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
namespace Musify.Application.PlayLists.Responses namespace Musify.Application.PlayLists.Responses;
{
public record PlayListApplicationResponse( public record PlayListApplicationResponse(
Guid Id, Guid Id,
string Name, string Name,
@@ -34,4 +34,3 @@ namespace Musify.Application.PlayLists.Responses
coverTrackIds ?? []); coverTrackIds ?? []);
} }
} }
}
@@ -1,5 +1,5 @@
namespace Musify.Application.PlayLists.Responses namespace Musify.Application.PlayLists.Responses;
{
public record PlayListPictureUploadResponse( public record PlayListPictureUploadResponse(
Guid IntentId, Guid IntentId,
string Bucket, string Bucket,
@@ -8,4 +8,3 @@ namespace Musify.Application.PlayLists.Responses
string ContentType, string ContentType,
int ExpiresInSeconds, int ExpiresInSeconds,
string UploadUrl); string UploadUrl);
}
@@ -3,16 +3,16 @@ using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Shared; using Musify.Application.Contracts;
using Musify.Application.Events; using Musify.Application.Events;
using Musify.Application.PlayLists.Responses; using Musify.Application.PlayLists.Responses;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Application.Shared;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.PlayLists namespace Musify.Application.PlayLists;
{
public record UpdatePlayListCommand( public record UpdatePlayListCommand(
long UserId, long UserId,
Guid PlayListId, Guid PlayListId,
@@ -152,4 +152,3 @@ namespace Musify.Application.PlayLists
} }
} }
} }
}
@@ -1,9 +1,9 @@
using ErrorOr; using ErrorOr;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Contracts;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.Services; namespace Musify.Application.Services;
@@ -1,7 +1,6 @@
namespace Musify.Application.Shared namespace Musify.Application.Shared;
{
public record ImageSize( public record ImageSize(
string SavePath, string SavePath,
int Width, int Width,
int Height); int Height);
}
@@ -1,7 +1,7 @@
using X.PagedList; using X.PagedList;
namespace Musify.Application.Shared namespace Musify.Application.Shared;
{
public record PaginatedResponse<T>( public record PaginatedResponse<T>(
IReadOnlyCollection<T> Items, IReadOnlyCollection<T> Items,
int PageNumber, int PageNumber,
@@ -23,4 +23,3 @@ namespace Musify.Application.Shared
pagedList.HasPreviousPage); pagedList.HasPreviousPage);
} }
} }
}
@@ -1,5 +1,5 @@
namespace Musify.Application.Shared namespace Musify.Application.Shared;
{
public static class StorageKey public static class StorageKey
{ {
public static string Combine(params string[] segments) public static string Combine(params string[] segments)
@@ -9,4 +9,3 @@ namespace Musify.Application.Shared
.Select(static s => s.Trim().Trim('/', '\\'))); .Select(static s => s.Trim().Trim('/', '\\')));
} }
} }
}
@@ -3,16 +3,16 @@ using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Shared; using Musify.Application.Contracts;
using Musify.Application.Events; using Musify.Application.Events;
using Musify.Application.Tracks.Responses;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Application.Shared;
using Musify.Application.Tracks.Responses;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record CreateTrackCommand( public record CreateTrackCommand(
long UserId, long UserId,
string Title, string Title,
@@ -158,4 +158,3 @@ namespace Musify.Application.Tracks
return TrackApplicationResponse.FromEntity(trackEntity, listensCount: 0); return TrackApplicationResponse.FromEntity(trackEntity, listensCount: 0);
} }
} }
}
@@ -3,8 +3,8 @@ using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record DeleteStaleUncountedListensCommand : ICommand<int>; public record DeleteStaleUncountedListensCommand : ICommand<int>;
public class DeleteStaleUncountedListensCommandHandler( public class DeleteStaleUncountedListensCommandHandler(
@@ -30,4 +30,3 @@ namespace Musify.Application.Tracks
return stale.Count; return stale.Count;
} }
} }
}
@@ -2,13 +2,12 @@ using ErrorOr;
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Domain.Entities;
using Musify.Domain.ValueObjects;
using Musify.Application.Events;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Application.Events;
using Musify.Domain.ValueObjects;
namespace Musify.Application.Tracks;
namespace Musify.Application.Tracks
{
public record DeleteTrackCommand( public record DeleteTrackCommand(
long UserId, long UserId,
Guid TrackId) Guid TrackId)
@@ -68,4 +67,3 @@ namespace Musify.Application.Tracks
return new Success(); return new Success();
} }
} }
}
@@ -1,11 +1,11 @@
using ErrorOr; using ErrorOr;
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Application.Tracks.Responses; using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record GetLastTrackListenedByUserIdQuery(long UserId) : IQuery<ErrorOr<TrackApplicationResponse>>; public record GetLastTrackListenedByUserIdQuery(long UserId) : IQuery<ErrorOr<TrackApplicationResponse>>;
public class GetLastTrackListenedByUserIdQueryHandler(IDatabase database) public class GetLastTrackListenedByUserIdQueryHandler(IDatabase database)
@@ -27,4 +27,3 @@ namespace Musify.Application.Tracks
: track; : track;
} }
} }
}
@@ -1,10 +1,10 @@
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Application.Tracks.Responses; using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record GetListeningHistoryQuery(long UserId) : IQuery<IEnumerable<TrackApplicationResponse>>; public record GetListeningHistoryQuery(long UserId) : IQuery<IEnumerable<TrackApplicationResponse>>;
public class GetListeningHistoryQueryHandler( public class GetListeningHistoryQueryHandler(
@@ -37,4 +37,3 @@ namespace Musify.Application.Tracks
.Select(t => TrackApplicationResponse.FromEntity(t.Track, t.ListensCount)); .Select(t => TrackApplicationResponse.FromEntity(t.Track, t.ListensCount));
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Application.Tracks.Responses; using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record GetTrackByIdQuery(Guid TrackId) public record GetTrackByIdQuery(Guid TrackId)
: IQuery<ErrorOr<TrackApplicationResponse>>; : IQuery<ErrorOr<TrackApplicationResponse>>;
@@ -27,4 +27,3 @@ namespace Musify.Application.Tracks
return TrackApplicationResponse.FromEntity(entity.Track, entity.ListensCount); return TrackApplicationResponse.FromEntity(entity.Track, entity.ListensCount);
} }
} }
}
@@ -4,8 +4,8 @@ using Microsoft.EntityFrameworkCore;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record GetTrackCoverQuery(Guid TrackId, string Size) public record GetTrackCoverQuery(Guid TrackId, string Size)
: IQuery<ErrorOr<TrackCoverLocation>>; : IQuery<ErrorOr<TrackCoverLocation>>;
@@ -50,4 +50,3 @@ namespace Musify.Application.Tracks
private static string? BuildKey(Func<string, string> builder, string? name) private static string? BuildKey(Func<string, string> builder, string? name)
=> string.IsNullOrEmpty(name) ? null : builder(name); => string.IsNullOrEmpty(name) ? null : builder(name);
} }
}
@@ -7,8 +7,8 @@ using Musify.Application.Contracts;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Application.Tracks.Responses; using Musify.Application.Tracks.Responses;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record GetTrackStreamQuery(Guid TrackId, long? UserId) public record GetTrackStreamQuery(Guid TrackId, long? UserId)
: IQuery<ErrorOr<TrackStreamResponse>>; : IQuery<ErrorOr<TrackStreamResponse>>;
@@ -46,4 +46,3 @@ namespace Musify.Application.Tracks
return response; return response;
} }
} }
}
@@ -1,14 +1,13 @@
using ErrorOr; using ErrorOr;
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Tracks.Responses;
using X.PagedList;
using X.PagedList.EF;
using Musify.Application.Contracts; using Musify.Application.Contracts;
using Musify.Application.Tracks.Responses;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using X.PagedList.EF;
namespace Musify.Application.Tracks;
namespace Musify.Application.Tracks
{
public record GetTracksQuery(string? Name, int PageNumber, int PageSize, Genre? Genre = null) public record GetTracksQuery(string? Name, int PageNumber, int PageSize, Genre? Genre = null)
: IQuery<ErrorOr<TracksSearchResponse>>; : IQuery<ErrorOr<TracksSearchResponse>>;
@@ -54,4 +53,3 @@ namespace Musify.Application.Tracks
pagedEntities.HasNextPage); pagedEntities.HasNextPage);
} }
} }
}
@@ -1,14 +1,14 @@
using ErrorOr; using ErrorOr;
using Mediator; using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts;
using Musify.Application.Shared; using Musify.Application.Shared;
using Musify.Application.Tracks.Responses; using Musify.Application.Tracks.Responses;
using X.PagedList; using X.PagedList;
using X.PagedList.EF; using X.PagedList.EF;
using Musify.Application.Contracts;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record GetTracksByUserIdQuery( public record GetTracksByUserIdQuery(
long UserId, long UserId,
string? Name, string? Name,
@@ -50,4 +50,3 @@ namespace Musify.Application.Tracks
return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks); return PaginatedResponse<TrackApplicationResponse>.FromPagedList(pagedTracks);
} }
} }
}
@@ -1,5 +1,5 @@
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public static class ListeningRules public static class ListeningRules
{ {
public const double CountedThresholdSeconds = 30; public const double CountedThresholdSeconds = 30;
@@ -11,4 +11,3 @@ namespace Musify.Application.Tracks
public static double CountedThreshold(double durationSeconds) => public static double CountedThreshold(double durationSeconds) =>
Math.Min(CountedThresholdSeconds, durationSeconds * CountedThresholdFraction); Math.Min(CountedThresholdSeconds, durationSeconds * CountedThresholdFraction);
} }
}
@@ -3,8 +3,8 @@ using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Musify.Application.Contracts; using Musify.Application.Contracts;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record RecordListeningProgressCommand( public record RecordListeningProgressCommand(
long UserId, long UserId,
Guid ListenId, Guid ListenId,
@@ -41,4 +41,3 @@ namespace Musify.Application.Tracks
return Result.Success; return Result.Success;
} }
} }
}
@@ -3,14 +3,14 @@ using Mediator;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Musify.Application.Configuration; using Musify.Application.Configuration;
using Musify.Application.Contracts;
using Musify.Application.Services; using Musify.Application.Services;
using Musify.Application.Tracks.Responses; using Musify.Application.Tracks.Responses;
using Musify.Domain.Entities; using Musify.Domain.Entities;
using Musify.Domain.ValueObjects; using Musify.Domain.ValueObjects;
using Musify.Application.Contracts;
namespace Musify.Application.Tracks namespace Musify.Application.Tracks;
{
public record RequestTrackUploadUrlsCommand( public record RequestTrackUploadUrlsCommand(
long UserId, long UserId,
string PictureFileType, string PictureFileType,
@@ -140,4 +140,3 @@ namespace Musify.Application.Tracks
} }
} }
} }
}

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