#!/usr/bin/env node const axios = require('axios'); const mysql = require('mysql2/promise'); // Load environment require('dotenv').config({ path: '.env.ordrestyring' }); const API_BASE = 'https://v2.api.ordrestyring.dk'; const TOKEN = process.env.ORDRESTYRING_TOKEN; const DB_CONFIG = { host: process.env.DB_HOST, port: parseInt(process.env.DB_PORT) || 3306, database: process.env.DB_NAME, user: process.env.DB_USER, password: process.env.DB_PASSWORD }; const REMAINING_ENDPOINTS = [ { endpoint: '/debtors', table: 'debtors', limit: 1335 }, { endpoint: '/debtor-invoices', table: 'debtor_invoices', limit: 2441 } ]; async function makeAPIRequest(endpoint, limit) { try { const config = { method: 'GET', url: `${API_BASE}${endpoint}`, auth: { username: TOKEN, password: 'x' }, params: { pagesize: limit } }; const response = await axios(config); const dataKeys = Object.keys(response.data); const isArrayLike = dataKeys.length > 0 && dataKeys.every(key => !isNaN(key)); if (isArrayLike) { return Object.values(response.data); } return []; } catch (error) { console.error(`āŒ Error fetching ${endpoint}:`, error.message); return []; } } async function insertRecords(connection, tableName, records) { if (records.length === 0) return 0; const [columns] = await connection.execute(`SHOW COLUMNS FROM ${tableName}`); const columnNames = columns.map(col => col.Field).filter(name => name !== 'id'); let insertedCount = 0; let errorCount = 0; for (const record of records) { try { const values = columnNames.map(col => { let value = record[col]; if (value === null || value === undefined || value === '') { return null; } if (Array.isArray(value)) { return JSON.stringify(value); } if (typeof value === 'boolean' || typeof value === 'number') { return value; } return String(value); }); const placeholders = columnNames.map(() => '?').join(', '); const updatePart = columnNames.map(col => `${col} = VALUES(${col})`).join(', '); const query = `INSERT INTO ${tableName} (${columnNames.join(', ')}) VALUES (${placeholders}) ON DUPLICATE KEY UPDATE ${updatePart}`; await connection.execute(query, values); insertedCount++; } catch (error) { errorCount++; if (errorCount <= 2) { console.error(`āŒ Error inserting into ${tableName}:`, error.message); } } } if (errorCount > 2) { console.log(` ... and ${errorCount - 2} more errors`); } return insertedCount; } async function completeImport() { console.log('šŸ“¦ Completing Ordrestyring Import - Remaining Data'); console.log('================================================'); let connection; try { connection = await mysql.createConnection(DB_CONFIG); console.log('āœ… Database connection established'); for (const { endpoint, table, limit } of REMAINING_ENDPOINTS) { console.log(`\nšŸ“Š Importing: ${endpoint} -> ${table}`); const records = await makeAPIRequest(endpoint, limit); console.log(`šŸ“„ Fetched ${records.length} records`); if (records.length > 0) { const insertedCount = await insertRecords(connection, table, records); console.log(`āœ… Inserted ${insertedCount}/${records.length} records`); } } // Final count console.log('\nšŸŽ‰ Complete Import Finished!'); console.log('\nšŸ“Š Final Database Summary:'); const tables = ['cases', 'case_materials', 'hours', 'debtors', 'debtor_invoices', 'users', 'case_types', 'case_statuses', 'employee_types']; for (const table of tables) { const [rows] = await connection.execute(`SELECT COUNT(*) as count FROM ${table}`); console.log(` ${table}: ${rows[0].count} records`); } } catch (error) { console.error('āŒ Import failed:', error); } finally { if (connection) { await connection.end(); } } } completeImport().catch(console.error);