fix(auth): align demo staff phone identity and clock-in payload
This commit is contained in:
@@ -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) => {
|
||||
|
||||
@@ -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 });
|
||||
|
||||
Reference in New Issue
Block a user