using FamilyNido.Api.Features.Auth;
using FamilyNido.Api.Shared.Errors;
using FamilyNido.Api.Shared.Mediator;
using FamilyNido.Api.Shared.Outcomes;
using FamilyNido.Persistence;
using Microsoft.EntityFrameworkCore;
namespace FamilyNido.Api.Features.FamilyMembers;
/// Slice: re-activate a previously archived member (RF-USR-004).
public static class ActivateFamilyMember
{
/// Command carrying the target id.
public sealed record Command(Guid MemberId) : IRequest>;
/// Handler — flips IsActive to true.
public sealed class Handler : IRequestHandler>
{
private readonly ApplicationDbContext _db;
private readonly ICurrentUserContext _userContext;
/// Primary constructor.
public Handler(ApplicationDbContext db, ICurrentUserContext userContext)
{
_db = db;
_userContext = userContext;
}
///
public async Task> HandleAsync(Command request, CancellationToken cancellationToken)
{
var current = await _userContext.GetAsync(cancellationToken);
if (current is null)
{
return ApplicationError.Forbidden("auth.not_linked", "Caller is not linked to a family member.");
}
var member = await _db.FamilyMembers
.Include(m => m.User)
.FirstOrDefaultAsync(
m => m.Id == request.MemberId && m.FamilyId == current.Family.Id,
cancellationToken);
if (member is null)
{
return ApplicationError.NotFound(
"family_member.not_found",
$"Member {request.MemberId} not found in family.");
}
member.IsActive = true;
await _db.SaveChangesAsync(cancellationToken);
return FamilyMemberDto.From(member);
}
}
}