Files
MilkyShots/Lactose/Mapper/UsersMapper.cs
T
REDCODE 6efccae030 fix: address PR #127 review issues — fallback, eager load, indentation, Maintainer tests
- Change ?? EAccessLevel.Admin fallback to ?? EAccessLevel.User in UserController.GetAll
- Add .Include(u => u.MaintainedPersons) to UserRepository.GetAll() so MaintainedPersonIds/MaintainedPersonNames populate in list endpoint
- Fix UsersMapper.cs method body indentation (was flush with class)
- Add Maintainer-role visibility tests (68.5-68.8): promote user, test viewing admin, demote back
2026-07-15 17:31:33 +02:00

42 lines
2.0 KiB
C#

using Butter.Dtos.User;
using Butter.Types;
using Lactose.Models;
namespace Lactose.Mapper;
/// <summary>
/// Provides mapping methods for User objects.
/// </summary>
public static class UsersMapper {
/// <summary>
/// Maps a User object to a UserInfoDto object, filtering sensitive fields based on the viewer's access.
/// Sensitive fields (Email, Ban/Delete status, AccessLevel, MaintainedPersons) are only populated
/// when the viewer is an admin or viewing their own profile.
/// </summary>
/// <param name="user">The User object to map.</param>
/// <param name="viewerAccessLevel">The access level of the requesting user.</param>
/// <param name="viewerId">The ID of the requesting user (null if anonymous).</param>
/// <returns>A UserInfoDto object containing the mapped data.</returns>
public static UserInfoDto ToGetUsersDto(this User user, EAccessLevel viewerAccessLevel, Guid? viewerId) {
bool isAdmin = viewerAccessLevel >= EAccessLevel.Admin;
bool isSelf = viewerId == user.Id;
bool showSensitive = isAdmin || isSelf;
return new UserInfoDto {
Id = user.Id,
Username = user.Username,
Email = showSensitive ? user.Email : null,
CreatedAt = user.CreatedAt,
UpdatedAt = showSensitive ? user.UpdatedAt : null,
LastLogin = showSensitive ? user.LastLogin : null,
BannedAt = showSensitive ? user.BannedAt : null,
DeletedAt = isAdmin ? user.DeletedAt : null,
IsBanned = showSensitive && user.BannedAt != null,
AccessLevel = showSensitive ? user.AccessLevel : EAccessLevel.User,
MaintainedPersonIds = showSensitive ? user.MaintainedPersons?.Select(p => p.Id).ToList() : null,
MaintainedPersonNames = showSensitive ? user.MaintainedPersons?.Select(p => p.Name).ToList() : null
};
}
}