idconvert/frontend/mock/db.js

132 lines
4.1 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// mock/db.js — simulates the full backend API
// Swap each function for a real fetch() call when wiring the real backend
const mockUsers = {
user_maya: {
id: 'user_maya',
email: 'maya@studio.com',
name: 'Maya',
credits_balance: 4,
free_used: true,
},
user_richard: {
id: 'user_richard',
email: 'richard@firmname.com',
name: 'Richard',
credits_balance: 0,
free_used: true,
},
user_new: {
id: 'user_new',
email: 'new@user.com',
name: 'New User',
credits_balance: 0,
free_used: false,
},
}
let activeUserId = null
const mockScanResponse = {
session_id: 'scan_abc123',
pages: 12,
stories: 8,
images: 14,
tables: 3,
fonts: [
{ name: 'Arial', status: 'safe', substitute: null, substitute_quality: null, used_for: 'Headings' },
{ name: 'Freight Text Pro', status: 'professional', substitute: 'Georgia', substitute_quality: 'serif body substitute', used_for: 'Body text (pages 18)' },
{ name: 'Myriad Pro', status: 'professional', substitute: 'Calibri', substitute_quality: 'sans-serif substitute', used_for: 'Captions (pages 312)' },
{ name: 'DM Mono', status: 'unknown', substitute: null, substitute_quality: null, used_for: 'Code blocks (page 7)' },
],
warnings: [
{ type: 'wrap_simplified', severity: 'info', page: 4, message: 'Contour text wrap simplified to square wrap' },
{ type: 'wrap_simplified', severity: 'info', page: 7, message: 'Contour text wrap simplified to square wrap' },
{ type: 'master_page', severity: 'info', page: null, message: 'Master page elements excluded — page numbers handled separately' },
],
}
const delay = (ms) => new Promise((r) => setTimeout(r, ms))
export const mockApi = {
// POST /api/scan
async scan(file) {
await delay(1800)
if (file && !file.name.endsWith('.idml') && !file.name.endsWith('.zip')) {
throw new Error('This is not a valid IDML file. Please upload an IDML export from InDesign.')
}
return { ...mockScanResponse }
},
// POST /api/convert
async convert(sessionId) {
await delay(3200)
const user = activeUserId ? mockUsers[activeUserId] : null
if (!user) throw new Error('Not authenticated')
if (user.free_used && user.credits_balance < 1) {
throw new Error('INSUFFICIENT_CREDITS')
}
if (user.free_used) {
mockUsers[activeUserId].credits_balance -= 1
} else {
mockUsers[activeUserId].free_used = true
}
return { download_url: '#mock-download', filename: 'AnnualReport_2025.docx' }
},
// GET /api/users/me
async getMe() {
await delay(200)
if (!activeUserId) return null
return { ...mockUsers[activeUserId] }
},
// POST /api/auth/login
async login(email, password) {
await delay(600)
const user = Object.values(mockUsers).find((u) => u.email === email)
if (!user) throw new Error('Invalid credentials')
activeUserId = user.id
return { ...user, token: 'mock_token_' + user.id }
},
// POST /api/auth/logout
async logout() {
await delay(200)
activeUserId = null
},
// POST /api/auth/register
async register(email, password, name) {
await delay(800)
const newId = 'user_' + Date.now()
mockUsers[newId] = { id: newId, email, name, credits_balance: 0, free_used: false }
activeUserId = newId
return { ...mockUsers[newId], token: 'mock_token_' + newId }
},
// POST /payments/create-intent
async createPaymentIntent(pack) {
await delay(500)
const packs = {
starter: { credits: 5, amount: 1900 },
studio: { credits: 20, amount: 5900 },
agency: { credits: 60, amount: 14900 },
}
return { client_secret: 'mock_pi_secret', ...packs[pack] }
},
// Simulate successful payment (skips Stripe in mock)
async completePurchase(pack) {
await delay(1000)
const credits = { starter: 5, studio: 20, agency: 60 }
if (activeUserId) {
mockUsers[activeUserId].credits_balance += credits[pack]
}
return {
success: true,
new_balance: activeUserId ? mockUsers[activeUserId].credits_balance : 0,
}
},
}