Add full application: receipt scanning, auth, billing, and account deletion
Brings the working codebase (Next.js app, auth system, Stripe billing, Docker/deploy config, tests, docs) into version control on top of the placeholder initial commit, and adds account self-deletion (Danger Zone in Settings, password + typed-email confirmation, cascading DB cleanup, Stripe cancellation) per GDPR right-to-erasure. Excludes local build caches, node_modules, and internal agent scratch files; .gitignore hardened to keep those out going forward. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
67
scripts/test_hints.mjs
Normal file
67
scripts/test_hints.mjs
Normal file
@@ -0,0 +1,67 @@
|
||||
import https from 'https';
|
||||
|
||||
const keywords = [
|
||||
// German Core
|
||||
'receipt scanner',
|
||||
'beleg scanner',
|
||||
'belege digitalisieren',
|
||||
'rechnung scanner',
|
||||
'kassenbon scanner',
|
||||
'quittung scanner',
|
||||
'spesen app',
|
||||
'buchhaltung scanner',
|
||||
'datev',
|
||||
'datev scanner',
|
||||
'belegmanager',
|
||||
'haushaltsbuch',
|
||||
'ausgaben tracker',
|
||||
'steuer belege',
|
||||
|
||||
// English Core
|
||||
'receipt to excel',
|
||||
'receipt scanner to excel',
|
||||
'expense tracker',
|
||||
'receipt keeper',
|
||||
'invoice scanner',
|
||||
'smart receipts',
|
||||
'receipts',
|
||||
'shoeboxed',
|
||||
'expensify',
|
||||
'camscanner',
|
||||
'genius scan'
|
||||
];
|
||||
|
||||
function fetchHints(term, storefront = '143443') { // 143443 = Germany, 143441 = US
|
||||
return new Promise((resolve) => {
|
||||
const url = `https://search.itunes.apple.com/WebObjects/MZSearchHints.woa/wa/hints?clientApplication=Software&term=${encodeURIComponent(term)}`;
|
||||
https.get(url, {
|
||||
headers: {
|
||||
'User-Agent': 'AppStore/3.0 (iOS; 16.0)',
|
||||
'X-Apple-Store-Front': `${storefront}-1,29`
|
||||
}
|
||||
}, (res) => {
|
||||
let data = '';
|
||||
res.on('data', chunk => data += chunk);
|
||||
res.on('end', () => {
|
||||
try {
|
||||
const json = JSON.parse(data);
|
||||
resolve(json);
|
||||
} catch (e) {
|
||||
resolve(null);
|
||||
}
|
||||
});
|
||||
}).on('error', () => resolve(null));
|
||||
});
|
||||
}
|
||||
|
||||
async function test() {
|
||||
console.log('Testing hints:');
|
||||
for (const kw of ['beleg', 'kassenbon', 'receipt', 'expense', 'datev', 'spesen', 'rechnung']) {
|
||||
const hintsDE = await fetchHints(kw, '143443');
|
||||
console.log(`DE Hints for "${kw}":`, hintsDE?.hints?.map(h => h.term));
|
||||
const hintsUS = await fetchHints(kw, '143441');
|
||||
console.log(`US Hints for "${kw}":`, hintsUS?.hints?.map(h => h.term));
|
||||
}
|
||||
}
|
||||
|
||||
test();
|
||||
Reference in New Issue
Block a user