fix(backend): resolve shift signup by looking up Member via ExternalUserId #3
@@ -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";
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user