feat: update PersonMapper — pass viewerId to album mapper

This commit is contained in:
2026-07-15 18:50:48 +00:00
parent 2ed0e2f7ab
commit c7f031a8af
+1 -54
View File
@@ -1,54 +1 @@
using Butter.Dtos.Album;
using Butter.Dtos.Person;
using Butter.Types;
using Lactose.Models;
namespace Lactose.Mapper;
/// <summary>
/// Provides mapping methods for converting Person objects to DTOs.
/// </summary>
public static class PersonMapper {
/// <summary>
/// Maps a Person to a PersonDetailedDto with album previews and stats.
/// </summary>
/// <param name="person">The person to map.</param>
/// <param name="accessLevel">The requesting user's access level.</param>
/// <returns>A PersonDetailedDto.</returns>
public static PersonDetailedDto ToPersonDetailedDto(this Person person, EAccessLevel accessLevel) {
var albums = person.Albums ?? [];
var maintainers = person.Maintainers ?? [];
return new PersonDetailedDto {
Id = person.Id,
Name = person.Name,
ProfileAssetId = person.ProfileAssetId,
ProfileCropX = person.ProfileCropX,
ProfileCropY = person.ProfileCropY,
ProfileCropZoom = person.ProfileCropZoom,
TotalAlbums = albums.Count,
TotalAssets = albums.Sum(a => a.Assets?.Count(asset => asset.DeletedAt == null) ?? 0),
Visibility = accessLevel >= EAccessLevel.Maintainer ? person.Visibility : null,
Albums = albums.Select(a => a.ToAlbumPreviewDto(accessLevel)).ToList(),
MaintainerUserIds = maintainers.Select(u => u.Id).ToList(),
MaintainerUsernames = maintainers.Select(u => u.Username).ToList()
};
}
/// <summary>
/// Maps a Person to a PersonPreviewDto.
/// </summary>
/// <param name="person">The person to map.</param>
/// <param name="accessLevel">The requesting user's access level.</param>
/// <returns>A PersonPreviewDto.</returns>
public static PersonPreviewDto ToPersonPreviewDto(this Person person, EAccessLevel accessLevel) => new() {
Id = person.Id,
Name = person.Name,
ProfileAssetId = person.ProfileAssetId,
ProfileCropX = person.ProfileCropX,
ProfileCropY = person.ProfileCropY,
ProfileCropZoom = person.ProfileCropZoom,
TotalAlbums = person.Albums?.Count ?? 0,
Visibility = accessLevel >= EAccessLevel.Maintainer ? person.Visibility : null
};
}
dXNpbmcgQnV0dGVyLkR0b3MuQWxidW07CnVzaW5nIEJ1dHRlci5EdG9zLlBlcnNvbjsKdXNpbmcgQnV0dGVyLlR5cGVzOwp1c2luZyBMYWN0b3NlLk1vZGVsczsKCm5hbWVzcGFjZSBMYWN0b3NlLk1hcHBlcjsKCi8vLyA8c3VtbWFyeT4KLy8vIFByb3ZpZGVzIG1hcHBpbmcgbWV0aG9kcyBmb3IgY29udmVydGluZyBQZXJzb24gb2JqZWN0cyB0byBEVE9zLgovLy8gPC9zdW1tYXJ5PgpwdWJsaWMgc3RhdGljIGNsYXNzIFBlcnNvbk1hcHBlciB7CiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gTWFwcyBhIFBlcnNvbiB0byBhIFBlcnNvbkRldGFpbGVkRHRvIHdpdGggYWxidW0gcHJldmlld3MgYW5kIHN0YXRzLgogICAgLy8vIDwvc3VtbWFyeT4KICAgIC8vLyA8cGFyYW0gbmFtZT0icGVyc29uIj5UaGUgcGVyc29uIHRvIG1hcC48L3BhcmFtPgogICAgLy8vIDxwYXJhbSBuYW1lPSJhY2Nlc3NMZXZlbCI+VGhlIHJlcXVlc3RpbmcgdXNlcidzIGFjY2VzcyBsZXZlbC48L3BhcmFtPgogICAgLy8vIDxwYXJhbSBuYW1lPSJ2aWV3ZXJJZCI+VGhlIElEIG9mIHRoZSByZXF1ZXN0aW5nIHVzZXIuPC9wYXJhbT4KICAgIC8vLyA8cmV0dXJucz5BIFBlcnNvbkRldGFpbGVkRHRvLjwvcmV0dXJucz4KICAgIHB1YmxpYyBzdGF0aWMgUGVyc29uRGV0YWlsZWREdG8gVG9QZXJzb25EZXRhaWxlZER0byh0aGlzIFBlcnNvbiBwZXJzb24sIEVBY2Nlc3NMZXZlbCBhY2Nlc3NMZXZlbCwgR3VpZD8gdmlld2VySWQgPSBudWxsKSB7CiAgICAgICAgdmFyIGFsYnVtcyA9IHBlcnNvbi5BbGJ1bXMgPz8gW107CiAgICAgICAgdmFyIG1haW50YWluZXJzID0gcGVyc29uLk1haW50YWluZXJzID8/IFtdOwoKICAgICAgICByZXR1cm4gbmV3IFBlcnNvbkRldGFpbGVkRHRvIHsKICAgICAgICAgICAgSWQgICAgICAgICAgICAgPSBwZXJzb24uSWQsCiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0gcGVyc29uLk5hbWUsCiAgICAgICAgICAgIFByb2ZpbGVBc3NldElkID0gcGVyc29uLlByb2ZpbGVBc3NldElkLAogICAgICAgICAgICBQcm9maWxlQ3JvcFggICA9IHBlcnNvbi5Qcm9maWxlQ3JvcFgsCiAgICAgICAgICAgIFByb2ZpbGVDcm9wWSAgID0gcGVyc29uLlByb2ZpbGVDcm9wWSwKICAgICAgICAgICAgUHJvZmlsZUNyb3Bab29tID0gcGVyc29uLlByb2ZpbGVDcm9wWm9vbSwKICAgICAgICAgICAgVG90YWxBbGJ1bXMgICAgPSBhbGJ1bXMuQ291bnQsCiAgICAgICAgICAgIFRvdGFsQXNzZXRzICAgID0gYWxidW1zLlN1bShhID0+IGEuQXNzZXRzPy5Db3VudChhc3NldCA9PiBhc3NldC5EZWxldGVkQXQgPT0gbnVsbCkgPz8gMCksCiAgICAgICAgICAgIFZpc2liaWxpdHkgICAgID0gYWNjZXNzTGV2ZWwgPj0gRUFjY2Vzc0xldmVsLk1haW50YWluZXIgPyBwZXJzb24uVmlzaWJpbGl0eSA6IG51bGwsCiAgICAgICAgICAgIEFsYnVtcyAgICAgICAgID0gYWxidW1zLlNlbGVjdChhID0+IGEuVG9BbGJ1bVByZXZpZXdEdG8oYWNjZXNzTGV2ZWwsIHZpZXdlcklkKSkuVG9MaXN0KCksCiAgICAgICAgICAgIE1haW50YWluZXJVc2VySWRzICAgPSBtYWludGFpbmVycy5TZWxlY3QodSA9PiB1LklkKS5Ub0xpc3QoKSwKICAgICAgICAgICAgTWFpbnRhaW5lclVzZXJuYW1lcyA9IG1haW50YWluZXJzLlNlbGVjdCh1ID0+IHUuVXNlcm5hbWUpLlRvTGlzdCgpCiAgICAgICAgfTsKICAgIH0KCiAgICAvLy8gPHN1bW1hcnk+CiAgICAvLy8gTWFwcyBhIFBlcnNvbiB0byBhIFBlcnNvblByZXZpZXdEdG8uCiAgICAvLy8gPC9zdW1tYXJ5PgogICAgLy8vIDxwYXJhbSBuYW1lPSJwZXJzb24iPlRoZSBwZXJzb24gdG8gbWFwLjwvcGFyYW0+CiAgICAvLy8gPHBhcmFtIG5hbWU9ImFjY2Vzc0xldmVsIj5UaGUgcmVxdWVzdGluZyB1c2VyJ3MgYWNjZXNzIGxldmVsLjwvcGFyYW0+CiAgICAvLy8gPHJldHVybnM+QSBQZXJzb25QcmV2aWV3RHRvLjwvcmV0dXJucz4KICAgIHB1YmxpYyBzdGF0aWMgUGVyc29uUHJldmlld0R0byBUb1BlcnNvblByZXZpZXdEdG8odGhpcyBQZXJzb24gcGVyc29uLCBFQWNjZXNzTGV2ZWwgYWNjZXNzTGV2ZWwpID0+IG5ldygpIHsKICAgICAgICBJZCAgICAgICAgICAgICA9IHBlcnNvbi5JZCwKICAgICAgICBOYW1lICAgICAgICAgICA9IHBlcnNvbi5OYW1lLAogICAgICAgIFByb2ZpbGVBc3NldElkID0gcGVyc29uLlByb2ZpbGVBc3NldElkLAogICAgICAgIFByb2ZpbGVDcm9wWCAgID0gcGVyc29uLlByb2ZpbGVDcm9wWCwKICAgICAgICBQcm9maWxlQ3JvcFkgICA9IHBlcnNvbi5Qcm9maWxlQ3JvcFksCiAgICAgICAgUHJvZmlsZUNyb3Bab29tID0gcGVyc29uLlByb2ZpbGVDcm9wWm9vbSwKICAgICAgICBUb3RhbEFsYnVtcyAgICA9IHBlcnNvbi5BbGJ1bXM/LkNvdW50ID8/IDAsCiAgICAgICAgVmlzaWJpbGl0eSAgICAgPSBhY2Nlc3NMZXZlbCA+PSBFQWNjZXNzTGV2ZWwuTWFpbnRhaW5lciA/IHBlcnNvbi5WaXNpYmlsaXR5IDogbnVsbAogICAgfTsKfQo=