fix(auth): align demo staff phone identity and clock-in payload

This commit is contained in:
zouantchaw
2026-03-17 14:44:32 +01:00
parent 1a3a120499
commit 13471629f6
5 changed files with 103 additions and 1 deletions

View File

@@ -1,10 +1,24 @@
import { signInWithPassword, signUpWithPassword } from '../src/services/identity-toolkit.js';
import { applicationDefault, getApps, initializeApp } from 'firebase-admin/app';
import { getAuth } from 'firebase-admin/auth';
const ownerEmail = process.env.V2_DEMO_OWNER_EMAIL || 'legendary.owner+v2@krowd.com';
const staffEmail = process.env.V2_DEMO_STAFF_EMAIL || 'ana.barista+v2@krowd.com';
const staffPhone = process.env.V2_DEMO_STAFF_PHONE || '+15557654321';
const ownerPassword = process.env.V2_DEMO_OWNER_PASSWORD || 'Demo2026!';
const staffPassword = process.env.V2_DEMO_STAFF_PASSWORD || 'Demo2026!';
function ensureAdminApp() {
if (getApps().length === 0) {
initializeApp({ credential: applicationDefault() });
}
}
function getAdminAuth() {
ensureAdminApp();
return getAuth();
}
async function ensureUser({ email, password, displayName }) {
try {
const signedIn = await signInWithPassword({ email, password });
@@ -40,6 +54,44 @@ async function ensureUser({ email, password, displayName }) {
}
}
async function getUserByPhoneNumber(phoneNumber) {
try {
return await getAdminAuth().getUserByPhoneNumber(phoneNumber);
} catch (error) {
if (error?.code === 'auth/user-not-found') return null;
throw error;
}
}
async function reconcileStaffPhoneIdentity({ uid, email, displayName, phoneNumber }) {
const auth = getAdminAuth();
const current = await auth.getUser(uid);
const existingPhoneUser = await getUserByPhoneNumber(phoneNumber);
let deletedConflictingUid = null;
if (existingPhoneUser && existingPhoneUser.uid !== uid) {
deletedConflictingUid = existingPhoneUser.uid;
await auth.deleteUser(existingPhoneUser.uid);
}
const updatePayload = {};
if (current.displayName !== displayName) updatePayload.displayName = displayName;
if (current.email !== email) updatePayload.email = email;
if (current.phoneNumber !== phoneNumber) updatePayload.phoneNumber = phoneNumber;
if (Object.keys(updatePayload).length > 0) {
await auth.updateUser(uid, updatePayload);
}
const reconciled = await auth.getUser(uid);
return {
uid: reconciled.uid,
email: reconciled.email,
phoneNumber: reconciled.phoneNumber,
deletedConflictingUid,
};
}
async function main() {
const owner = await ensureUser({
email: ownerEmail,
@@ -53,8 +105,15 @@ async function main() {
displayName: 'Ana Barista V2',
});
const reconciledStaff = await reconcileStaffPhoneIdentity({
uid: staff.uid,
email: staff.email,
displayName: staff.displayName,
phoneNumber: staffPhone,
});
// eslint-disable-next-line no-console
console.log(JSON.stringify({ owner, staff }, null, 2));
console.log(JSON.stringify({ owner, staff: { ...staff, ...reconciledStaff } }, null, 2));
}
main().catch((error) => {

View File

@@ -631,6 +631,10 @@ async function main() {
assert.ok(Array.isArray(todaysShifts.items));
const assignedTodayShift = todaysShifts.items.find((shift) => shift.shiftId === fixture.shifts.assigned.id);
assert.ok(assignedTodayShift);
assert.equal(assignedTodayShift.clientName, fixture.business.name);
assert.equal(typeof assignedTodayShift.hourlyRate, 'number');
assert.equal(typeof assignedTodayShift.latitude, 'number');
assert.equal(typeof assignedTodayShift.longitude, 'number');
assert.equal(assignedTodayShift.clockInMode, fixture.shifts.assigned.clockInMode);
assert.equal(assignedTodayShift.allowClockInOverride, fixture.shifts.assigned.allowClockInOverride);
logStep('staff.clock-in.shifts-today.ok', { count: todaysShifts.items.length });