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:
+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));
|
||||
|
||||
Reference in New Issue
Block a user