chore: import Musify.WebApi into monorepo (preserving history)

git-subtree-dir: Musify.WebApi
git-subtree-mainline: 9d433868cc
git-subtree-split: ca8750c3b4
This commit is contained in:
2026-07-05 03:20:47 +02:00
36 changed files with 1698 additions and 0 deletions
@@ -0,0 +1,36 @@
using Ardalis.Result;
using IResult = Microsoft.AspNetCore.Http.IResult;
namespace WebApi.Extensions;
public static class ResultHttpExtensions
{
public static IResult ToHttpResult(this Result result) =>
result.Status switch
{
ResultStatus.Ok or ResultStatus.NoContent => Results.NoContent(),
ResultStatus.NotFound => Results.NotFound(result.Errors.FirstOrDefault()),
ResultStatus.Invalid => Results.ValidationProblem(ToValidationDictionary(result.ValidationErrors)),
ResultStatus.Unauthorized => Results.Unauthorized(),
ResultStatus.Forbidden => Results.StatusCode(StatusCodes.Status403Forbidden),
ResultStatus.Conflict => Results.Conflict(result.Errors.FirstOrDefault()),
_ => Results.Problem(string.Join(", ", result.Errors))
};
public static IResult ToHttpResult<T>(this Result<T> result) =>
result.Status switch
{
ResultStatus.Ok => Results.Ok(result.Value),
ResultStatus.NotFound => Results.NotFound(result.Errors.FirstOrDefault()),
ResultStatus.Invalid => Results.ValidationProblem(ToValidationDictionary(result.ValidationErrors)),
ResultStatus.Unauthorized => Results.Unauthorized(),
ResultStatus.Forbidden => Results.StatusCode(StatusCodes.Status403Forbidden),
ResultStatus.Conflict => Results.Conflict(result.Errors.FirstOrDefault()),
_ => Results.Problem(string.Join(", ", result.Errors))
};
private static Dictionary<string, string[]> ToValidationDictionary(IEnumerable<ValidationError> errors) =>
errors
.GroupBy(e => string.IsNullOrEmpty(e.Identifier) ? "general" : e.Identifier)
.ToDictionary(g => g.Key, g => g.Select(e => e.ErrorMessage).ToArray());
}
@@ -0,0 +1,34 @@
using FluentValidation;
using Musify.Infrastructure.MassTransit;
using Musify.Infrastructure.Persistence;
using Musify.Application.Configuration;
using Musify.Infrastructure.Services;
using WebApi.Authentication;
using WebApi.DataTransferObjects.PlayLists;
using WebApi.OpenApi;
using WebApi.Scalar;
namespace WebApi.Extensions;
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddApplicationServices(this IServiceCollection services, IConfiguration configuration)
{
services.AddDatabase(configuration);
services.AddApplicationStorageConfiguration(configuration);
services.AddPlayListConfiguration(configuration);
services.AddTrackConfiguration(configuration);
services.AddStreamGatewayConfiguration(configuration);
services.AddStorageService(configuration);
services.AddStreamTicketService(configuration);
services.AddUploadIntentConfiguration(configuration);
services.AddMassTransitClient(configuration);
services.AddMediator();
services.AddAuthenticationConfiguration(configuration);
services.AddOpenApiConfiguration();
services.AddScalarConfiguration();
services.AddValidatorsFromAssemblyContaining<CreatePlayListRequest>();
return services;
}
}