directus
This commit is contained in:
99
scripts/fix-schema.ts
Normal file
99
scripts/fix-schema.ts
Normal file
@@ -0,0 +1,99 @@
|
||||
import client, { ensureAuthenticated } from '../lib/directus';
|
||||
import {
|
||||
createCollection,
|
||||
createField,
|
||||
createItem,
|
||||
readCollections,
|
||||
deleteCollection
|
||||
} from '@directus/sdk';
|
||||
|
||||
async function fixSchema() {
|
||||
console.log('🚑 EXTERNAL RESCUE: Fixing Schema & Data...');
|
||||
await ensureAuthenticated();
|
||||
|
||||
// 1. Reset Products Collection to be 100% Standard
|
||||
console.log('🗑️ Clearing broken collections...');
|
||||
try { await client.request(deleteCollection('products')); } catch (e) { }
|
||||
try { await client.request(deleteCollection('products_translations')); } catch (e) { }
|
||||
|
||||
// 2. Create Products (Simple, Standard ID)
|
||||
console.log('🏗️ Rebuilding Products Schema...');
|
||||
await client.request(createCollection({
|
||||
collection: 'products',
|
||||
schema: {}, // Let Directus decide defaults
|
||||
meta: {
|
||||
display_template: '{{sku}}',
|
||||
archive_field: 'status',
|
||||
archive_value: 'archived',
|
||||
unarchive_value: 'published'
|
||||
},
|
||||
fields: [
|
||||
{
|
||||
field: 'id',
|
||||
type: 'integer',
|
||||
schema: { is_primary_key: true, has_auto_increment: true },
|
||||
meta: { hidden: true }
|
||||
},
|
||||
{
|
||||
field: 'status',
|
||||
type: 'string',
|
||||
schema: { default_value: 'published' },
|
||||
meta: { width: 'full', options: { choices: [{ text: 'Published', value: 'published' }] } }
|
||||
},
|
||||
{
|
||||
field: 'sku',
|
||||
type: 'string',
|
||||
meta: { interface: 'input', width: 'half' }
|
||||
}
|
||||
]
|
||||
} as any));
|
||||
|
||||
// 3. Create Translation Relation Safely
|
||||
console.log('🌍 Rebuilding Translations...');
|
||||
await client.request(createCollection({
|
||||
collection: 'products_translations',
|
||||
schema: {},
|
||||
fields: [
|
||||
{
|
||||
field: 'id',
|
||||
type: 'integer',
|
||||
schema: { is_primary_key: true, has_auto_increment: true },
|
||||
meta: { hidden: true }
|
||||
},
|
||||
{ field: 'products_id', type: 'integer' },
|
||||
{ field: 'languages_code', type: 'string' },
|
||||
{ field: 'name', type: 'string', meta: { interface: 'input', width: 'full' } },
|
||||
{ field: 'description', type: 'text', meta: { interface: 'input-multiline' } },
|
||||
{ field: 'technical_items', type: 'json', meta: { interface: 'input-code-json' } }
|
||||
]
|
||||
} as any));
|
||||
|
||||
// 4. Manually Insert ONE Product to Verify
|
||||
console.log('📦 Injecting Test Product...');
|
||||
try {
|
||||
// We do this in two steps to be absolutely sure permissions don't block us
|
||||
// Step A: Create User-Facing Product
|
||||
const product = await client.request(createItem('products', {
|
||||
sku: 'H1Z2Z2-K-TEST',
|
||||
status: 'published'
|
||||
}));
|
||||
|
||||
// Step B: Add Translation
|
||||
await client.request(createItem('products_translations', {
|
||||
products_id: product.id,
|
||||
languages_code: 'de-DE',
|
||||
name: 'H1Z2Z2-K Test Cable',
|
||||
description: 'This is a verified imported product.',
|
||||
technical_items: [{ label: 'Test', value: '100%' }]
|
||||
}));
|
||||
|
||||
console.log(`✅ SUCCESS! Product Created with ID: ${product.id}`);
|
||||
console.log(`verify at: ${process.env.DIRECTUS_URL}/admin/content/products/${product.id}`);
|
||||
|
||||
} catch (e: any) {
|
||||
console.error('❌ Failed to create product:', e);
|
||||
if (e.errors) console.error(JSON.stringify(e.errors, null, 2));
|
||||
}
|
||||
}
|
||||
|
||||
fixSchema().catch(console.error);
|
||||
Reference in New Issue
Block a user