fix: Jumpstart schema fix - use url instead of domain

CRITICAL FIX:
- Added 'config' and 'type' fields to generation_jobs collection
- Fixed JumpstartWizard to use 'url' field instead of non-existent 'domain' field
- Tested via API: Job creation now works successfully

Schema Changes (via Directus API):
- generation_jobs.config (json) - stores WordPress URL, auth, mode
- generation_jobs.type (string) - stores job type (Refactor, Import, etc.)

Frontend Changes:
- JumpstartWizard now looks up sites by 'url' field
- Properly handles URL normalization (adds https:// if missing)

Test Results:
-  API test: Job created successfully (ID: 7b97c4ae-bcb6-4c41-8883-83a0e742ccbd)
-  Site lookup works
-  Config field populated correctly

Ready for frontend testing after deployment.
This commit is contained in:
cawcenter
2025-12-13 18:53:22 -05:00
parent 813e9cc28c
commit 5baf4e32a0
6 changed files with 317 additions and 6 deletions

View File

@@ -0,0 +1,27 @@
import { createDirectus, rest, authentication, readFieldsByCollection } from '@directus/sdk';
const DIRECTUS_URL = 'https://spark.jumpstartscaling.com';
const EMAIL = 'insanecorp@gmail.com';
const PASSWORD = 'Idk@ai2026yayhappy';
const client = createDirectus(DIRECTUS_URL).with(authentication()).with(rest());
async function checkSchema() {
try {
await client.login(EMAIL, PASSWORD);
console.log('✅ Authenticated\n');
// @ts-ignore
const fields = await client.request(readFieldsByCollection('generation_jobs'));
console.log('📋 generation_jobs fields:\n');
fields.forEach((field: any) => {
console.log(` ${field.field}: ${field.type} ${field.schema?.is_nullable ? '(nullable)' : '(required)'}`);
});
} catch (error: any) {
console.error('❌ Error:', error.message);
}
}
checkSchema();

View File

@@ -0,0 +1,27 @@
import { createDirectus, rest, authentication, readFieldsByCollection } from '@directus/sdk';
const DIRECTUS_URL = 'https://spark.jumpstartscaling.com';
const EMAIL = 'insanecorp@gmail.com';
const PASSWORD = 'Idk@ai2026yayhappy';
const client = createDirectus(DIRECTUS_URL).with(authentication()).with(rest());
async function checkSchema() {
try {
await client.login(EMAIL, PASSWORD);
console.log('✅ Authenticated\n');
// @ts-ignore
const fields = await client.request(readFieldsByCollection('sites'));
console.log('📋 sites fields:\n');
fields.forEach((field: any) => {
console.log(` ${field.field}: ${field.type} ${field.schema?.is_nullable ? '(nullable)' : '(required)'}`);
});
} catch (error: any) {
console.error('❌ Error:', error.message);
}
}
checkSchema();

View File

@@ -0,0 +1,65 @@
import { createDirectus, rest, authentication, createField } from '@directus/sdk';
const DIRECTUS_URL = 'https://spark.jumpstartscaling.com';
const EMAIL = 'insanecorp@gmail.com';
const PASSWORD = 'Idk@ai2026yayhappy';
const client = createDirectus(DIRECTUS_URL).with(authentication()).with(rest());
async function addConfigField() {
try {
await client.login(EMAIL, PASSWORD);
console.log('✅ Authenticated\n');
console.log('Adding config field to generation_jobs...');
await client.request(
createField('generation_jobs', {
field: 'config',
type: 'json',
meta: {
note: 'Job configuration (WordPress URL, auth, mode, etc.)',
interface: 'input-code',
options: {
language: 'json'
}
},
schema: {
is_nullable: true
}
})
);
console.log('✅ config field added successfully!');
console.log('\nNow you can also add type field:');
await client.request(
createField('generation_jobs', {
field: 'type',
type: 'string',
meta: {
note: 'Job type (Refactor, Import, etc.)',
interface: 'input',
width: 'half'
},
schema: {
is_nullable: true,
max_length: 50
}
})
);
console.log('✅ type field added successfully!');
console.log('\n🎉 generation_jobs schema updated!');
console.log('Jumpstart should now work correctly.');
} catch (error: any) {
if (error.errors?.[0]?.extensions?.code === 'FIELD_DUPLICATE') {
console.log('⚠️ Fields already exist - schema is correct!');
} else {
console.error('❌ Error:', error.message || error);
}
}
}
addConfigField();

View File

@@ -0,0 +1,72 @@
import { createDirectus, rest, authentication, readItems, createItem } from '@directus/sdk';
const DIRECTUS_URL = 'https://spark.jumpstartscaling.com';
const EMAIL = 'insanecorp@gmail.com';
const PASSWORD = 'Idk@ai2026yayhappy';
const client = createDirectus(DIRECTUS_URL).with(authentication()).with(rest());
async function testJumpstartAPI() {
try {
await client.login(EMAIL, PASSWORD);
console.log('✅ Authenticated\n');
// 1. Find or create site
console.log('1. Checking for site record...');
// @ts-ignore
const sites = await client.request(readItems('sites', {
filter: { url: { _eq: 'https://chrisamaya.work' } },
limit: 1
}));
let siteId;
if (sites.length > 0) {
siteId = sites[0].id;
console.log(` ✅ Found existing site (ID: ${siteId})`);
} else {
console.log(' Creating new site...');
// @ts-ignore
const newSite = await client.request(createItem('sites', {
name: 'chrisamaya.work',
url: 'https://chrisamaya.work'
}));
siteId = newSite.id;
console.log(` ✅ Created site (ID: ${siteId})`);
}
// 2. Create generation job with config
console.log('\n2. Creating generation job...');
// @ts-ignore
const job = await client.request(createItem('generation_jobs', {
site_id: siteId,
status: 'Pending',
type: 'Refactor',
target_quantity: 1456,
config: {
wordpress_url: 'https://chrisamaya.work',
wordpress_auth: 'gatekeeper:Idk@2025',
mode: 'refactor',
batch_size: 5,
total_posts: 1456
}
}));
console.log(` ✅ Job created successfully!`);
console.log(` Job ID: ${job.id}`);
console.log(` Status: ${job.status}`);
console.log(` Type: ${job.type}`);
console.log(` Target: ${job.target_quantity} posts`);
console.log('\n🎉 SUCCESS! Jumpstart job creation works!');
console.log('\nNext step: The frontend should now work correctly.');
console.log('Try the Jumpstart wizard again in the browser.');
} catch (error: any) {
console.error('\n❌ Error:', error.message || error);
if (error.errors) {
console.error('Details:', JSON.stringify(error.errors, null, 2));
}
}
}
testJumpstartAPI();