Phase 1 scaffold: auth for all apps
- Backend: Fastify with two listeners (public + internal), routes, services, DB migration + seed - client_app: Flutter with BLoC, all auth screens (welcome, display name, register, OTP, force-register) - mitra_app: Flutter with BLoC, OTP-only login - control_center: React + Vite, email/password login, mitra/user management, anonymity settings - Docs: phase1 plan, API contract, client app mockup - CLAUDE.md and shared memory for all subprojects Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
43
backend/src/services/customer.service.js
Normal file
43
backend/src/services/customer.service.js
Normal file
@@ -0,0 +1,43 @@
|
||||
import { getDb } from '../db/client.js'
|
||||
|
||||
const sql = getDb()
|
||||
|
||||
export const createAnonymousCustomer = async ({ display_name }) => {
|
||||
const [customer] = await sql`
|
||||
INSERT INTO customers (display_name, is_anonymous)
|
||||
VALUES (${display_name}, true)
|
||||
RETURNING id, display_name, is_anonymous, created_at
|
||||
`
|
||||
return customer
|
||||
}
|
||||
|
||||
export const linkCustomerAccount = async ({ customer_id, firebase_uid }) => {
|
||||
const [existing] = await sql`
|
||||
SELECT id, firebase_uid FROM customers WHERE id = ${customer_id}
|
||||
`
|
||||
if (!existing) throw Object.assign(new Error('Customer not found'), { code: 'NOT_FOUND', statusCode: 404 })
|
||||
if (existing.firebase_uid) throw Object.assign(new Error('Account already linked'), { code: 'ALREADY_REGISTERED', statusCode: 409 })
|
||||
|
||||
// Also fetch phone from firebase_uid if exists in another customer record for uniqueness
|
||||
const [firebaseLinked] = await sql`
|
||||
SELECT id FROM customers WHERE firebase_uid = ${firebase_uid}
|
||||
`
|
||||
if (firebaseLinked) throw Object.assign(new Error('Account already linked'), { code: 'ALREADY_REGISTERED', statusCode: 409 })
|
||||
|
||||
const [updated] = await sql`
|
||||
UPDATE customers
|
||||
SET firebase_uid = ${firebase_uid}, is_anonymous = false
|
||||
WHERE id = ${customer_id}
|
||||
RETURNING id, display_name, is_anonymous, phone, created_at
|
||||
`
|
||||
return updated
|
||||
}
|
||||
|
||||
export const getCustomerByFirebaseUid = async (firebase_uid) => {
|
||||
const [customer] = await sql`
|
||||
SELECT id, display_name, is_anonymous, phone, created_at
|
||||
FROM customers
|
||||
WHERE firebase_uid = ${firebase_uid}
|
||||
`
|
||||
return customer
|
||||
}
|
||||
Reference in New Issue
Block a user