No longer loads the person's full album/asset graph into memory; uses ID-first paging, ILike search against the trgm GIN index, and DB-level counts. Slims Find() to a PK lookup for write paths.
60 lines
2.5 KiB
C#
60 lines
2.5 KiB
C#
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>
|
|
/// <param name="viewerId">The ID of the requesting user.</param>
|
|
/// <returns>A PersonDetailedDto.</returns>
|
|
public static PersonDetailedDto ToPersonDetailedDto(this Person person, EAccessLevel accessLevel, Guid? viewerId = null) {
|
|
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 = person.AlbumTotalCount,
|
|
TotalAssets = person.TotalAssetCount,
|
|
Visibility = accessLevel >= EAccessLevel.Maintainer ? person.Visibility : null,
|
|
Albums = albums.Select(a => {
|
|
var dto = a.ToAlbumPreviewDto(accessLevel, viewerId);
|
|
dto.AssetCount = person.AlbumAssetCounts?.GetValueOrDefault(a.Id, 0) ?? 0;
|
|
return dto;
|
|
}).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
|
|
};
|
|
}
|