fix(shifts): expose ExternalUserId in ShiftSignupDto to fix frontend signup state
Some checks failed
CI Pipeline / Backend Build & Test (pull_request) Failing after 49s
CI Pipeline / Frontend Lint, Test & Build (pull_request) Successful in 29s
CI Pipeline / Infrastructure Validation (pull_request) Successful in 3s

This commit is contained in:
WorkClub Automation
2026-03-09 14:46:35 +01:00
parent 6119506bd3
commit 867dc717cc
5 changed files with 31 additions and 10 deletions

View File

@@ -41,6 +41,20 @@ public class MemberSyncService
}
var email = httpContext.User.FindFirst("email")?.Value ?? httpContext.User.FindFirst("preferred_username")?.Value ?? "unknown@example.com";
// If not found by ExternalUserId, try to find by Email (for seeded users)
var memberByEmail = await _context.Members
.FirstOrDefaultAsync(m => m.Email == email && m.TenantId == tenantId);
if (memberByEmail != null)
{
// Update the seeded user with the real ExternalUserId
memberByEmail.ExternalUserId = externalUserId;
memberByEmail.UpdatedAt = DateTimeOffset.UtcNow;
await _context.SaveChangesAsync();
return;
}
var name = httpContext.User.FindFirst("name")?.Value ?? email.Split('@')[0];
var roleClaim = httpContext.User.FindFirst(System.Security.Claims.ClaimTypes.Role)?.Value ?? "Member";

View File

@@ -61,14 +61,17 @@ public class ShiftService
if (shift == null)
return null;
var signups = await _context.ShiftSignups
.Where(ss => ss.ShiftId == id)
.OrderBy(ss => ss.SignedUpAt)
.ToListAsync();
var signups = await (from ss in _context.ShiftSignups
where ss.ShiftId == id
join m in _context.Members on ss.MemberId equals m.Id
orderby ss.SignedUpAt
select new { ss.Id, ss.MemberId, m.ExternalUserId, ss.SignedUpAt })
.ToListAsync();
var signupDtos = signups.Select(ss => new ShiftSignupDto(
ss.Id,
ss.MemberId,
ss.ExternalUserId,
ss.SignedUpAt
)).ToList();
@@ -165,14 +168,17 @@ public class ShiftService
return (null, "Shift was modified by another user. Please refresh and try again.", true);
}
var signups = await _context.ShiftSignups
.Where(ss => ss.ShiftId == id)
.OrderBy(ss => ss.SignedUpAt)
.ToListAsync();
var signups = await (from ss in _context.ShiftSignups
where ss.ShiftId == id
join m in _context.Members on ss.MemberId equals m.Id
orderby ss.SignedUpAt
select new { ss.Id, ss.MemberId, m.ExternalUserId, ss.SignedUpAt })
.ToListAsync();
var signupDtos = signups.Select(ss => new ShiftSignupDto(
ss.Id,
ss.MemberId,
ss.ExternalUserId,
ss.SignedUpAt
)).ToList();

View File

@@ -17,6 +17,6 @@ public record ShiftDetailDto(
public record ShiftSignupDto(
Guid Id,
Guid MemberId,
Guid MemberId, string? ExternalUserId,
DateTimeOffset SignedUpAt
);

View File

@@ -23,7 +23,7 @@ export default function ShiftDetailPage({ params }: { params: Promise<{ id: stri
const capacityPercentage = (shift.signups.length / shift.capacity) * 100;
const isFull = shift.signups.length >= shift.capacity;
const isPast = new Date(shift.startTime) < new Date();
const isSignedUp = shift.signups.some((s) => s.memberId === session?.user?.id);
const isSignedUp = shift.signups.some((s) => s.memberId === session?.user?.id || s.externalUserId === session?.user?.id);
const handleSignUp = async () => {
await signUpMutation.mutateAsync(shift.id);

View File

@@ -36,6 +36,7 @@ export interface ShiftDetailDto {
export interface ShiftSignupDto {
id: string;
memberId: string;
externalUserId?: string;
signedUpAt: string;
}