feat: update AlbumMapper — add viewerId param, conditional DeletedAt in AssetPreviews

This commit is contained in:
2026-07-15 18:50:34 +00:00
parent 52cd4cc5cc
commit 2ed0e2f7ab
+1 -53
View File
@@ -1,53 +1 @@
using Butter.Dtos.Album;
using Butter.Types;
using Lactose.Models;
namespace Lactose.Mapper;
/// <summary>
/// provides mapping methods for converting Album objects to DTOs.
/// </summary>
public static class AlbumMapper {
/// <summary>
/// Maps an Album object to an AlbumPreviewDto with visibility-aware fields.
/// </summary>
/// <param name="album">The album to map.</param>
/// <param name="accessLevel">The requesting user's access level.</param>
/// <returns>An AlbumPreviewDto object.</returns>
public static AlbumPreviewDto ToAlbumPreviewDto(this Album album, EAccessLevel accessLevel) => new AlbumPreviewDto {
Id = album.Id,
Name = album.Title,
Person = album.PersonOwnerId,
PersonName = album.PersonOwner?.Name,
CoverAssetId = album.CoverAssetId,
AssetCount = album.Assets?.Count(a => a.DeletedAt == null) ?? 0,
Visibility = accessLevel >= EAccessLevel.Maintainer ? album.Visibility : null
};
/// <summary>
/// Maps an Album object to an AlbumFullDto object.
/// </summary>
/// <param name="album">The album to map.</param>
/// <param name="accessLevel">The requesting user's access level.</param>
/// <returns>An AlbumFullDto object.</returns>
public static AlbumFullDto ToAlbumFullDto(this Album album, EAccessLevel accessLevel) => new AlbumFullDto {
Id = album.Id,
Name = album.Title,
Person = album.PersonOwnerId,
PersonName = album.PersonOwner?.Name,
CoverAssetId = album.CoverAssetId,
AssetCount = album.Assets?.Count(a => a.DeletedAt == null) ?? 0,
Visibility = accessLevel >= EAccessLevel.Maintainer ? album.Visibility : null,
Images = album.Assets?.Select(asset => asset.Id).ToList() ?? [],
AssetPreviews = album.Assets?.Select(asset => new AlbumAssetPreviewDto {
Id = asset.Id,
ResolutionWidth = asset.ResolutionWidth,
ResolutionHeight = asset.ResolutionHeight,
HasThumbnail = !string.IsNullOrEmpty(asset.ThumbnailPath),
HasPreview = !string.IsNullOrEmpty(asset.PreviewPath),
FileName = accessLevel >= EAccessLevel.Curator ? asset.OriginalFilename : null,
Visibility = accessLevel >= EAccessLevel.Maintainer ? asset.Visibility : null
}).ToList() ?? []
};
}
dXNpbmcgQnV0dGVyLkR0b3MuQWxidW07CnVzaW5nIEJ1dHRlci5UeXBlczsKdXNpbmcgTGFjdG9zZS5Nb2RlbHM7CgpuYW1lc3BhY2UgTGFjdG9zZS5NYXBwZXI7CgovLy8gPHN1bW1hcnk+Ci8vLyBwcm92aWRlcyBtYXBwaW5nIG1ldGhvZHMgZm9yIGNvbnZlcnRpbmcgQWxidW0gb2JqZWN0cyB0byBEVE9zLiAKLy8vIDwvc3VtbWFyeT4KcHVibGljIHN0YXRpYyBjbGFzcyBBbGJ1bU1hcHBlciB7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gTWFwcyBhbiBBbGJ1bSBvYmplY3QgdG8gYW4gQWxidW1QcmV2aWV3RHRvIHdpdGggdmlzaWJpbGl0eS1hd2FyZSBmaWVsZHMuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJhbGJ1bSI+VGhlIGFsYnVtIHRvIG1hcC48L3BhcmFtPgogICAgLy8vIDxwYXJhbSBuYW1lPSJhY2Nlc3NMZXZlbCI+VGhlIHJlcXVlc3RpbmcgdXNlcidzIGFjY2VzcyBsZXZlbC48L3BhcmFtPgogICAgLy8vIDxwYXJhbSBuYW1lPSJ2aWV3ZXJJZCI+VGhlIElEIG9mIHRoZSByZXF1ZXN0aW5nIHVzZXIuPC9wYXJhbT4KICAgIC8vLyA8cmV0dXJucz5BbiBBbGJ1bVByZXZpZXdEdG8gb2JqZWN0LjwvcmV0dXJucz4KICAgIHB1YmxpYyBzdGF0aWMgQWxidW1QcmV2aWV3RHRvIFRvQWxidW1QcmV2aWV3RHRvKHRoaXMgQWxidW0gYWxidW0sIEVBY2Nlc3NMZXZlbCBhY2Nlc3NMZXZlbCwgR3VpZD8gdmlld2VySWQgPSBudWxsKSA9PiBuZXcgQWxidW1QcmV2aWV3RHRvIHsKICAgICAgICBJZCAgICAgICAgICAgPSBhbGJ1bS5JZCwKICAgICAgICBOYW1lICAgICAgICAgPSBhbGJ1bS5UaXRsZSwKICAgICAgICBQZXJzb24gICAgICAgPSBhbGJ1bS5QZXJzb25Pd25lcklkLAogICAgICAgIFBlcnNvbk5hbWUgICA9IGFsYnVtLlBlcnNvbk93bmVyPy5OYW1lLAogICAgICAgIENvdmVyQXNzZXRJZCA9IGFsYnVtLkNvdmVyQXNzZXRJZCwKICAgICAgICBBc3NldENvdW50ICAgPSBhbGJ1bS5Bc3NldHM/LkNvdW50KGEgPT4gYS5EZWxldGVkQXQgPT0gbnVsbCkgPz8gMCwKICAgICAgICBWaXNpYmlsaXR5ICAgPSBhY2Nlc3NMZXZlbCA+PSBFQWNjZXNzTGV2ZWwuTWFpbnRhaW5lciA/IGFsYnVtLlZpc2liaWxpdHkgOiBudWxsLAogICAgICAgIERlbGV0ZWRBdCAgICA9IG51bGwKICAgIH07CgogICAgLy8vIDxzdW1tYXJ5PgogICAgLy8vIE1hcHMgYW4gQWxidW0gb2JqZWN0IHRvIGFuIEFsYnVtRnVsbER0byBvYmplY3QuCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJhbGJ1bSI+VGhlIGFsYnVtIHRvIG1hcC48L3BhcmFtPgogICAgLy8vIDxwYXJhbSBuYW1lPSJhY2Nlc3NMZXZlbCI+VGhlIHJlcXVlc3RpbmcgdXNlcidzIGFjY2VzcyBsZXZlbC48L3BhcmFtPgogICAgLy8vIDxwYXJhbSBuYW1lPSJ2aWV3ZXJJZCI+VGhlIElEIG9mIHRoZSByZXF1ZXN0aW5nIHVzZXIuPC9wYXJhbT4KICAgIC8vLyA8cmV0dXJucz5BbiBBbGJ1bUZ1bGxEdG8gb2JqZWN0LjwvcmV0dXJucz4KICAgIHB1YmxpYyBzdGF0aWMgQWxidW1GdWxsRHRvIFRvQWxidW1GdWxsRHRvKHRoaXMgQWxidW0gYWxidW0sIEVBY2Nlc3NMZXZlbCBhY2Nlc3NMZXZlbCwgR3VpZD8gdmlld2VySWQpID0+IG5ldyBBbGJ1bUZ1bGxEdG8gewogICAgICAgIElkICAgICAgICAgICA9IGFsYnVtLklkLAogICAgICAgIE5hbWUgICAgICAgICA9IGFsYnVtLlRpdGxlLAogICAgICAgIFBlcnNvbiAgICAgICA9IGFsYnVtLlBlcnNvbk93bmVySWQsCiAgICAgICAgUGVyc29uTmFtZSAgID0gYWxidW0uUGVyc29uT3duZXI/Lk5hbWUsCiAgICAgICAgQ292ZXJBc3NldElkID0gYWxidW0uQ292ZXJBc3NldElkLAogICAgICAgIEFzc2V0Q291bnQgICA9IGFsYnVtLkFzc2V0cz8uQ291bnQoYSA9PiBhLkRlbGV0ZWRBdCA9PSBudWxsKSA/PyAwLAogICAgICAgIFZpc2liaWxpdHkgICA9IGFjY2Vzc0xldmVsID49IEVBY2Nlc3NMZXZlbC5NYWludGFpbmVyID8gYWxidW0uVmlzaWJpbGl0eSA6IG51bGwsCiAgICAgICAgRGVsZXRlZEF0ICAgID0gbnVsbCwKICAgICAgICBJbWFnZXMgICAgICAgPSBhbGJ1bS5Bc3NldHM/LlNlbGVjdChhc3NldCA9PiBhc3NldC5JZCkuVG9MaXN0KCkgPz8gW10sCiAgICAgICAgQXNzZXRQcmV2aWV3cyA9IGFsYnVtLkFzc2V0cz8uU2VsZWN0KGFzc2V0ID0+IG5ldyBBbGJ1bUFzc2V0UHJldmlld0R0byB7CiAgICAgICAgICAgIElkICAgICAgICAgICAgICAgPSBhc3NldC5JZCwKICAgICAgICAgICAgUmVzb2x1dGlvbldpZHRoICA9IGFzc2V0LlJlc29sdXRpb25XaWR0aCwKICAgICAgICAgICAgUmVzb2x1dGlvbkhlaWdodCA9IGFzc2V0LlJlc29sdXRpb25IZWlnaHQsCiAgICAgICAgICAgIEhhc1RodW1ibmFpbCAgICAgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoYXNzZXQuVGh1bWJuYWlsUGF0aCksCiAgICAgICAgICAgIEhhc1ByZXZpZXcgICAgICAgPSAhc3RyaW5nLklzTnVsbE9yRW1wdHkoYXNzZXQuUHJldmlld1BhdGgpLAogICAgICAgICAgICBGaWxlTmFtZSAgICAgICAgID0gYWNjZXNzTGV2ZWwgPj0gRUFjY2Vzc0xldmVsLkN1cmF0b3IgPyBhc3NldC5PcmlnaW5hbEZpbGVuYW1lIDogbnVsbCwKICAgICAgICAgICAgVmlzaWJpbGl0eSAgICAgICA9IGFjY2Vzc0xldmVsID49IEVBY2Nlc3NMZXZlbC5NYWludGFpbmVyID8gYXNzZXQuVmlzaWJpbGl0eSA6IG51bGwsCiAgICAgICAgICAgIERlbGV0ZWRBdCAgICAgICAgPSBhY2Nlc3NMZXZlbCA+PSBFQWNjZXNzTGV2ZWwuQWRtaW4gfHwgYXNzZXQuVXBsb2FkZWRCeSA9PSB2aWV3ZXJJZCA/IGFzc2V0LkRlbGV0ZWRBdCA6IG51bGwKICAgICAgICB9KS5Ub0xpc3QoKSA/PyBbXQogICAgfTsKCn0K