- Create Economist SubmissionTracking package correctly: * mainArticle = full blog post content * coverLetter = 216-word SIR— letter * Links to blog post via blogPostId - Archive 'Letter to The Economist' from blog posts (it's the cover letter) - Fix date display on article cards (use published_at) - Target publication already displaying via blue badge Database changes: - Make blogPostId optional in SubmissionTracking model - Economist package ID: 68fa85ae49d4900e7f2ecd83 - Le Monde package ID: 68fa2abd2e6acd5691932150 Next: Enhanced modal with tabs, validation, export 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
82 lines
3.1 KiB
JavaScript
82 lines
3.1 KiB
JavaScript
#!/usr/bin/env node
|
||
|
||
/**
|
||
* Test Stripe API Connection
|
||
* Verifies that Stripe test keys are configured correctly and can connect to the API
|
||
*/
|
||
|
||
require('dotenv').config();
|
||
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);
|
||
|
||
async function testStripeConnection() {
|
||
try {
|
||
console.log('\n🔍 Testing Stripe API connection...\n');
|
||
console.log(`📋 Environment: ${process.env.NODE_ENV || 'development'}`);
|
||
console.log(`🔑 Using key: ${process.env.STRIPE_SECRET_KEY?.substring(0, 20)}...`);
|
||
console.log(`🔓 Public key: ${process.env.STRIPE_PUBLISHABLE_KEY?.substring(0, 20)}...\n`);
|
||
|
||
// Test 1: List existing products
|
||
console.log('📦 Checking existing products...');
|
||
const products = await stripe.products.list({ limit: 10 });
|
||
console.log(`✅ Found ${products.data.length} existing products in test mode`);
|
||
|
||
if (products.data.length > 0) {
|
||
products.data.forEach(p => {
|
||
console.log(` • ${p.name} (${p.id})`);
|
||
});
|
||
} else {
|
||
console.log(' ℹ️ No products created yet');
|
||
}
|
||
|
||
// Test 2: List existing prices
|
||
console.log('\n💰 Checking existing prices...');
|
||
const prices = await stripe.prices.list({ limit: 10 });
|
||
console.log(`✅ Found ${prices.data.length} existing prices in test mode`);
|
||
|
||
if (prices.data.length > 0) {
|
||
prices.data.forEach(p => {
|
||
const amount = p.unit_amount ? `${p.currency.toUpperCase()} ${(p.unit_amount / 100).toFixed(2)}` : 'Variable';
|
||
const interval = p.recurring ? `/ ${p.recurring.interval}` : '(one-time)';
|
||
console.log(` • ${p.id}: ${amount} ${interval}`);
|
||
});
|
||
} else {
|
||
console.log(' ℹ️ No prices created yet');
|
||
}
|
||
|
||
// Test 3: Check webhook endpoints
|
||
console.log('\n🔔 Checking webhook endpoints...');
|
||
const webhooks = await stripe.webhookEndpoints.list({ limit: 10 });
|
||
console.log(`✅ Found ${webhooks.data.length} webhook endpoint(s)`);
|
||
|
||
if (webhooks.data.length > 0) {
|
||
webhooks.data.forEach(w => {
|
||
console.log(` • ${w.url}`);
|
||
console.log(` Status: ${w.status}`);
|
||
console.log(` Events: ${w.enabled_events.length} enabled`);
|
||
});
|
||
} else {
|
||
console.log(' ⚠️ No webhook endpoints configured yet');
|
||
}
|
||
|
||
console.log('\n✅ Stripe API connection successful!\n');
|
||
console.log('📋 Next steps:');
|
||
console.log(' 1. Create product "Tractatus Framework Support" in Stripe Dashboard');
|
||
console.log(' 2. Create 3 monthly price tiers ($5, $15, $50 NZD)');
|
||
console.log(' 3. Configure webhook endpoint');
|
||
console.log(' 4. Update .env with product/price IDs\n');
|
||
|
||
} catch (error) {
|
||
console.error('\n❌ Stripe API error:', error.message);
|
||
|
||
if (error.type === 'StripeAuthenticationError') {
|
||
console.error('\n⚠️ Authentication failed. Check that STRIPE_SECRET_KEY in .env is correct.');
|
||
} else if (error.type === 'StripeConnectionError') {
|
||
console.error('\n⚠️ Network error. Check your internet connection.');
|
||
}
|
||
|
||
console.error('\nFull error:', error);
|
||
process.exit(1);
|
||
}
|
||
}
|
||
|
||
testStripeConnection();
|