[object Object]

← 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

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 => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[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 →