fix(backend): resolve shift signup by looking up Member via ExternalUserId #3

Merged
MasterMito merged 7 commits from fix/shift-signup-external-user-lookup into main 2026-03-09 15:56:12 +01:00
5 changed files with 31 additions and 10 deletions
Showing only changes of commit 867dc717cc - Show all commits

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"; 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 name = httpContext.User.FindFirst("name")?.Value ?? email.Split('@')[0];
var roleClaim = httpContext.User.FindFirst(System.Security.Claims.ClaimTypes.Role)?.Value ?? "Member"; var roleClaim = httpContext.User.FindFirst(System.Security.Claims.ClaimTypes.Role)?.Value ?? "Member";

View File

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

View File

@@ -17,6 +17,6 @@ public record ShiftDetailDto(
public record ShiftSignupDto( public record ShiftSignupDto(
Guid Id, Guid Id,
Guid MemberId, Guid MemberId, string? ExternalUserId,
DateTimeOffset SignedUpAt 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 capacityPercentage = (shift.signups.length / shift.capacity) * 100;
const isFull = shift.signups.length >= shift.capacity; const isFull = shift.signups.length >= shift.capacity;
const isPast = new Date(shift.startTime) < new Date(); 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 () => { const handleSignUp = async () => {
await signUpMutation.mutateAsync(shift.id); await signUpMutation.mutateAsync(shift.id);

View File

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