Add track publication, album types, optional track pictures and batch upload URLs
Tracks
- Track.IsPublished (migration marks existing tracks as published). New
tracks are created unpublished.
- PUT /tracks/{id}/published and PUT /tracks/published change the flag;
publishing requires completed audio processing (the batch endpoint
reports skipped tracks).
- An unpublished track is only visible to its owner. A WherePublished /
VisibleTo filter is applied to search, genres, listening history, last
listened, likes, mixes, album and playlist contents and counts, recently
listened albums, public user tracks, track details and stream tickets.
- isPublished is part of the track responses, GET /tracks/users/{userId}
accepts a published filter and status-counts reports published and
unpublished totals.
- CreateTrackRequest.pictureIntentId is optional: without it the track
uses the album cover or the preset picture and no picture processing
runs. CreateTrackResourcesEvent carries nullable picture fields, so
queues must be drained before deploying.
- POST /tracks/upload-urls accepts an audios list and one optional picture
shared by all of them, and returns an intent per file. The upload intent
limits are raised so a batch fits.
Albums
- AlbumType (Album, EP, Single) on create, update and responses.
- CreateAlbumRequest.trackIds creates the album and links the tracks in a
single save.
This commit is contained in:
+10
-7
@@ -16,13 +16,16 @@ namespace Musify.Infrastructure.MassTransit.Activities.Tracks
|
||||
{
|
||||
var arguments = executeContext.Arguments;
|
||||
|
||||
await publishEndpoint.Publish(
|
||||
new UpdateTrackPictureEvent(
|
||||
arguments.TrackId,
|
||||
arguments.Bucket,
|
||||
arguments.FinalPictureKey,
|
||||
arguments.Sizes),
|
||||
executeContext.CancellationToken);
|
||||
if (arguments.FinalPictureKey != null)
|
||||
{
|
||||
await publishEndpoint.Publish(
|
||||
new UpdateTrackPictureEvent(
|
||||
arguments.TrackId,
|
||||
arguments.Bucket,
|
||||
arguments.FinalPictureKey,
|
||||
arguments.Sizes),
|
||||
executeContext.CancellationToken);
|
||||
}
|
||||
|
||||
await publishEndpoint.Publish(
|
||||
new UpdateTrackAudioEvent(
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ namespace Musify.Infrastructure.MassTransit.Arguments
|
||||
public record PublishTrackProcessingEventsArguments(
|
||||
Guid TrackId,
|
||||
string Bucket,
|
||||
string FinalPictureKey,
|
||||
string? FinalPictureKey,
|
||||
string FinalAudioKey,
|
||||
string AudioDestinationFolderKey,
|
||||
ImageSizes Sizes);
|
||||
|
||||
+18
-6
@@ -11,11 +11,21 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
|
||||
{
|
||||
public RoutingSlipBuilder Build(CreateTrackResourcesEvent message, Guid? correlationId)
|
||||
{
|
||||
var builder = RoutingSlips.Create(correlationId)
|
||||
.AddStep(
|
||||
var builder = RoutingSlips.Create(correlationId);
|
||||
|
||||
var hasPicture = message.PictureIntentId != null
|
||||
&& message.PictureSourceKey != null
|
||||
&& message.PictureDestinationKey != null;
|
||||
|
||||
if (hasPicture)
|
||||
{
|
||||
builder.AddStep(
|
||||
ActivityNames.CopyPictureToFinal,
|
||||
CopyFileInBucketActivity.ExecuteEndpointName,
|
||||
new CopyFileInBucketArguments(message.Bucket, message.PictureSourceKey, message.Bucket, message.PictureDestinationKey))
|
||||
new CopyFileInBucketArguments(message.Bucket, message.PictureSourceKey!, message.Bucket, message.PictureDestinationKey!));
|
||||
}
|
||||
|
||||
builder
|
||||
.AddStep(
|
||||
ActivityNames.CopyAudioToFinal,
|
||||
CopyFileInBucketActivity.ExecuteEndpointName,
|
||||
@@ -23,21 +33,23 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
|
||||
.AddStep(
|
||||
ActivityNames.ConsumeUploadIntents,
|
||||
ConsumeUploadIntentsActivity.ExecuteEndpointName,
|
||||
new ConsumeUploadIntentsArguments([message.PictureIntentId, message.AudioIntentId]))
|
||||
new ConsumeUploadIntentsArguments(
|
||||
hasPicture ? [message.PictureIntentId!.Value, message.AudioIntentId] : [message.AudioIntentId]))
|
||||
.AddStep(
|
||||
ActivityNames.PublishTrackProcessingEvents,
|
||||
PublishTrackProcessingEventsActivity.ExecuteEndpointName,
|
||||
new PublishTrackProcessingEventsArguments(
|
||||
message.TrackId,
|
||||
message.Bucket,
|
||||
message.PictureDestinationKey,
|
||||
hasPicture ? message.PictureDestinationKey : null,
|
||||
message.AudioDestinationKey,
|
||||
message.AudioProcessedFolderKey,
|
||||
message.Sizes))
|
||||
.TrackFaults(message.TrackId, RoutingSlipVariableNames.ProcessKinds.TrackCreation);
|
||||
|
||||
builder.AddVariable(RoutingSlipVariableNames.Workflow.Bucket, message.Bucket);
|
||||
builder.AddVariable(RoutingSlipVariableNames.Workflow.PictureKey, message.PictureDestinationKey);
|
||||
if (hasPicture)
|
||||
builder.AddVariable(RoutingSlipVariableNames.Workflow.PictureKey, message.PictureDestinationKey!);
|
||||
builder.AddVariable(RoutingSlipVariableNames.Workflow.AudioKey, message.AudioDestinationKey);
|
||||
|
||||
return builder;
|
||||
|
||||
+1
-1
@@ -47,7 +47,7 @@ namespace Musify.Infrastructure.MassTransit.RoutingSlip.Builders
|
||||
routes.BuildOriginalPicturePath(userId, track.Pictures.OriginalName));
|
||||
}
|
||||
|
||||
if (track.Pictures.IsProcessed)
|
||||
if (track.Pictures.IsProcessed && !string.IsNullOrEmpty(track.Pictures.OriginalName))
|
||||
{
|
||||
builder.AddRemoveFile(ActivityNames.RemoveTrackSmallPicture, bucket, routes.BuildPicturePath(PictureSize.Small, track.Pictures.SmallName));
|
||||
builder.AddRemoveFile(ActivityNames.RemoveTrackMediumPicture, bucket, routes.BuildPicturePath(PictureSize.Medium, track.Pictures.MediumName));
|
||||
|
||||
@@ -48,6 +48,7 @@ namespace Musify.Infrastructure.MassTransit.Sagas
|
||||
context.Saga.UpdatedAt = DateTime.UtcNow;
|
||||
context.Saga.Bucket = context.Message.Bucket;
|
||||
context.Saga.PictureKey = context.Message.PictureDestinationKey;
|
||||
context.Saga.PictureProcessed = context.Message.PictureDestinationKey == null;
|
||||
context.Saga.AudioKey = context.Message.AudioDestinationKey;
|
||||
})
|
||||
.TransitionTo(Processing));
|
||||
|
||||
Reference in New Issue
Block a user