← back to CelebritySignatures
chore: lint, refactor, v1.0.1 (session close)
6a34cf335a5d47d4a983a224314c464187eedd74 · 2026-08-06 14:10:37 -0700 · Steve
- fix: /wear POD-draft double-submit guard wrote pod_drafted (never read) instead
of pod_submitted, so a duplicate Stripe paid-callback could append a 2nd draft.
- refactor: wearSignatures uses Promise.all; named WEAR_GARMENT_DEFAULT_PRICE_USD +
WEAR_ORDER_ID_SEED; minor spacing normalization in submit-pod-draft.mjs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Files touched
M package.jsonM scripts/submit-pod-draft.mjsM server.js
Diff
commit 6a34cf335a5d47d4a983a224314c464187eedd74
Author: Steve <steve@designerwallcoverings.com>
Date: Thu Aug 6 14:10:37 2026 -0700
chore: lint, refactor, v1.0.1 (session close)
- fix: /wear POD-draft double-submit guard wrote pod_drafted (never read) instead
of pod_submitted, so a duplicate Stripe paid-callback could append a 2nd draft.
- refactor: wearSignatures uses Promise.all; named WEAR_GARMENT_DEFAULT_PRICE_USD +
WEAR_ORDER_ID_SEED; minor spacing normalization in submit-pod-draft.mjs.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---
package.json | 2 +-
scripts/submit-pod-draft.mjs | 10 +++++-----
server.js | 14 ++++++++------
3 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/package.json b/package.json
index 77f10af..281ef27 100644
--- a/package.json
+++ b/package.json
@@ -1 +1 @@
-{"name":"celebrity-signatures","version":"1.0.0","type":"module","private":true}
+{"name":"celebrity-signatures","version":"1.0.1","type":"module","private":true}
\ No newline at end of file
diff --git a/scripts/submit-pod-draft.mjs b/scripts/submit-pod-draft.mjs
index a406a08..0c63c88 100644
--- a/scripts/submit-pod-draft.mjs
+++ b/scripts/submit-pod-draft.mjs
@@ -17,16 +17,16 @@ const ROOT = fileURLToPath(new URL('..', import.meta.url));
const DATA = join(ROOT, 'data');
const APPLY = process.argv.includes('--apply');
-function envVal(name){
+function envVal(name) {
if (process.env[name]) return process.env[name];
- try { const m = readFileSync(join(ROOT,'.env'),'utf8').match(new RegExp('^'+name+'=(.+)$','m')); if(m) return m[1].trim(); } catch {}
+ try { const m = readFileSync(join(ROOT, '.env'), 'utf8').match(new RegExp('^' + name + '=(.+)$', 'm')); if (m) return m[1].trim(); } catch {}
return null;
}
-async function main(){
+async function main() {
let lines = [];
- try { lines = (await readFile(join(DATA,'pod-order-drafts.jsonl'),'utf8')).trim().split('\n').filter(Boolean); } catch {}
- const drafts = lines.map(l=>JSON.parse(l)).filter(d=>d.status==='DRAFT_UNSENT');
+ try { lines = (await readFile(join(DATA, 'pod-order-drafts.jsonl'), 'utf8')).trim().split('\n').filter(Boolean); } catch {}
+ const drafts = lines.map(l => JSON.parse(l)).filter(d => d.status === 'DRAFT_UNSENT');
console.log(`POD drafts pending: ${drafts.length}`);
for (const d of drafts){
// The shape a Printful/Printify order will take (documented target payload).
diff --git a/server.js b/server.js
index 3357db6..0d0f799 100644
--- a/server.js
+++ b/server.js
@@ -162,12 +162,14 @@ function wearEligible(sig, clr) {
return !!v && v.verdict === 'CLEAR'; // legally clear only
}
async function wearSignatures() {
- const [sigs, clr] = [await mergedSignatures(), await tmClearance()];
+ const [sigs, clr] = await Promise.all([mergedSignatures(), tmClearance()]);
return sigs.filter(s => s.signature_image_url && wearEligible(s, clr));
}
const esc = s => String(s == null ? '' : s).replace(/[&<>"]/g, c => ({ '&': '&', '<': '<', '>': '>', '"': '"' }[c]));
-const DEFAULT_PRICE_USD = 20; // download price (payments wired later — Steve-gated)
-const DEFAULT_COMMISSION_PCT = 50; // owner's cut per download
+const DEFAULT_PRICE_USD = 20; // download price (payments wired later — Steve-gated)
+const DEFAULT_COMMISSION_PCT = 50; // owner's cut per download
+const WEAR_GARMENT_DEFAULT_PRICE_USD = 34; // fallback garment price when template omits priceUsd
+const WEAR_ORDER_ID_SEED = 5000; // wear orders start above 5000 to avoid colliding with mural/download IDs
async function adminToken() {
// Bootstrap a local admin token on first use (data/admin-token.txt, gitignored
// + deploy-protected). Steve reads it from the file to approve uploads.
@@ -653,10 +655,10 @@ ${paid ? `<div class="ok">✓</div><h1>Order confirmed</h1>
if (!garment) return sendJSON(res, 400, { ok: false, error: 'unknown garment' });
const color = (garment.colors || []).find(c => c.id === String(b.color || '')) || garment.colors[0];
const size = (garment.sizes || []).includes(String(b.size)) ? String(b.size) : garment.sizes[0];
- const amountCents = Math.round((garment.priceUsd || 34) * 100);
+ const amountCents = Math.round((garment.priceUsd || WEAR_GARMENT_DEFAULT_PRICE_USD) * 100);
const u = await currentUser(req);
const list = await load('wear-orders.json', []);
- const id = (list.at(-1)?.id || 5000) + 1;
+ const id = (list.at(-1)?.id || WEAR_ORDER_ID_SEED) + 1;
const order = { id, at: new Date().toISOString(), account: u ? u.email : null, email,
qid: qidOf(sig), signature_name: sig.full_name, garment: garment.id, garment_label: garment.label,
color: color.id, size, placement: tpl.placement || 'left_chest', amountUsd: amountCents / 100,
@@ -709,7 +711,7 @@ ${paid ? `<div class="ok">✓</div><h1>Order confirmed</h1>
design_image_url: sig ? sig.signature_image_url : null,
note: 'NOT SENT — awaiting Steve approval + POD API key (scripts/submit-pod-draft.mjs --apply)' };
await appendFile(join(DATA, 'pod-order-drafts.jsonl'), JSON.stringify(draft) + '\n');
- order.pod_drafted = true;
+ order.pod_submitted = true;
}
await store('wear-orders.json', list);
}
← 4986121 Add WEAR-READY-FOR-KEY finish note (paste key -> full-regist
·
back to CelebritySignatures
·
celeb: add Sign in with Apple backend (web OAuth + WebView h ee2b355 →