- Remove hardcoded database credentials from all scripts - Remove hardcoded Legacy API tokens from backend scripts - Remove hardcoded MQTT credentials from mqtt-test.js - Update backend/.env.example with DB_HOST, DB_USER, DB_PASSWORD, DB_NAME - Update backend/.env.example with LEGACY_API_TOKEN and MQTT credentials - Add dotenv config to all scripts requiring credentials - Create comprehensive documentation: - scripts/README.md - Root scripts usage - backend/scripts/README.md - Backend scripts documentation - MQTT_TESTING.md - MQTT testing guide - SECURITY_CREDENTIALS_CLEANUP.md - Security changes summary All scripts now read credentials from backend/.env instead of hardcoded values. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
168 lines
6.3 KiB
JavaScript
168 lines
6.3 KiB
JavaScript
const axios = require('axios');
|
||
require('dotenv').config();
|
||
|
||
const LEGACY_API_BASE = 'https://eluxnetworks.net/function/well-api/api';
|
||
const TOKEN = process.env.LEGACY_API_TOKEN;
|
||
const USERNAME = process.env.LEGACY_API_USERNAME || 'robster';
|
||
|
||
// 1x1 pixel JPEG
|
||
const MINI_PHOTO = '/9j/4AAQSkZJRgABAQEASABIAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAABAAEDASIAAhEBAxEB/8QAFQABAQAAAAAAAAAAAAAAAAAAAAn/xAAUEAEAAAAAAAAAAAAAAAAAAAAA/8QAFQEBAQAAAAAAAAAAAAAAAAAAAAX/xAAUEQEAAAAAAAAAAAAAAAAAAAAA/9oADAMBAAIRAxEAPwCwAB//2Q==';
|
||
|
||
// Бенефициары которым нужно создать deployment
|
||
const beneficiaries = [
|
||
// Сначала те у кого NULL
|
||
{ id: 60, name: 'Test Deployment User', deploymentId: 47 },
|
||
{ id: 61, name: 'Test With Photo', deploymentId: 48 },
|
||
// Потом те у кого общий ID=45 (нужно пересоздать)
|
||
{ id: 12, name: 'Test Person', deploymentId: 27 },
|
||
{ id: 13, name: 'Mama', deploymentId: 42 },
|
||
{ id: 14, name: 'Mama2', deploymentId: 28 },
|
||
{ id: 15, name: 'Mwm2', deploymentId: 30 },
|
||
{ id: 16, name: 'Name16', deploymentId: 19 },
|
||
{ id: 17, name: 'Mama', deploymentId: 34 },
|
||
{ id: 18, name: 'Mam22', deploymentId: 36 },
|
||
{ id: 19, name: 'Mama', deploymentId: 23 },
|
||
{ id: 21, name: 'Mama', deploymentId: 33 },
|
||
{ id: 22, name: 'Mama2', deploymentId: 37 },
|
||
{ id: 23, name: 'Mama3', deploymentId: 38 },
|
||
{ id: 24, name: 'Mama4', deploymentId: 32 },
|
||
{ id: 25, name: 'Mama5', deploymentId: 40 },
|
||
{ id: 26, name: 'Mama6', deploymentId: 24 },
|
||
{ id: 27, name: 'Mama10', deploymentId: 44 },
|
||
{ id: 28, name: 'Mama 8', deploymentId: 46 },
|
||
{ id: 29, name: 'Mama20', deploymentId: 39 },
|
||
{ id: 30, name: 'Mama3030', deploymentId: 26 },
|
||
{ id: 31, name: 'Mama40', deploymentId: 41 },
|
||
{ id: 33, name: 'Papa10', deploymentId: 25 },
|
||
{ id: 34, name: 'Mama1000', deploymentId: 43 },
|
||
{ id: 35, name: 'Lisa', deploymentId: 20 },
|
||
{ id: 36, name: 'Lis2', deploymentId: 31 },
|
||
{ id: 37, name: 'Haha', deploymentId: 22 },
|
||
{ id: 38, name: 'Bkbb', deploymentId: 35 },
|
||
{ id: 39, name: 'Mama home', deploymentId: 21 },
|
||
{ id: 40, name: 'Lisa', deploymentId: 45 },
|
||
{ id: 42, name: 'Mama', deploymentId: 29 },
|
||
{ id: 46, name: 'Test Deployment User', deploymentId: 6 },
|
||
{ id: 47, name: 'Test Legacy User', deploymentId: 7 },
|
||
{ id: 48, name: 'John Smith', deploymentId: 8 },
|
||
{ id: 49, name: 'Mary Johnson', deploymentId: 9 },
|
||
{ id: 50, name: 'Robert Williams', deploymentId: 10 },
|
||
{ id: 51, name: 'Anna Davis', deploymentId: 11 },
|
||
{ id: 52, name: 'Final Test', deploymentId: 12 },
|
||
{ id: 53, name: 'Address Test', deploymentId: 13 },
|
||
{ id: 54, name: 'GPS Test', deploymentId: 14 },
|
||
{ id: 55, name: 'Phone Test', deploymentId: 15 },
|
||
{ id: 56, name: 'Final Victory', deploymentId: 16 },
|
||
{ id: 58, name: 'Test Legacy Integration', deploymentId: 17 },
|
||
{ id: 59, name: 'DeploymentTest User', deploymentId: 18 },
|
||
];
|
||
|
||
async function createLegacyDeployment(beneficiaryId, beneficiaryName) {
|
||
// Format name for Legacy API (needs exactly 2 words)
|
||
const nameParts = beneficiaryName.trim().split(/\s+/);
|
||
let firstName, lastName;
|
||
if (nameParts.length === 1) {
|
||
firstName = nameParts[0];
|
||
lastName = 'User';
|
||
} else {
|
||
firstName = nameParts[0];
|
||
lastName = nameParts[1];
|
||
}
|
||
const legacyName = firstName + ' ' + lastName;
|
||
|
||
const beneficiaryUsername = 'beneficiary_' + beneficiaryId;
|
||
const password = Math.random().toString(36).substring(2, 15);
|
||
|
||
const formData = new URLSearchParams({
|
||
function: 'set_deployment',
|
||
user_name: USERNAME,
|
||
token: TOKEN,
|
||
deployment: 'NEW',
|
||
beneficiary_name: legacyName,
|
||
beneficiary_email: 'beneficiary-' + beneficiaryId + '@wellnuo.app',
|
||
beneficiary_user_name: beneficiaryUsername,
|
||
beneficiary_password: password,
|
||
beneficiary_address: 'test', // ВАЖНО: всегда "test"
|
||
beneficiary_photo: MINI_PHOTO,
|
||
firstName: firstName,
|
||
lastName: lastName,
|
||
first_name: firstName,
|
||
last_name: lastName,
|
||
new_user_name: beneficiaryUsername,
|
||
phone_number: '+10000000000',
|
||
key: password,
|
||
signature: 'Test',
|
||
gps_age: '0',
|
||
wifis: '[]',
|
||
devices: '[]'
|
||
});
|
||
|
||
const response = await axios.post(LEGACY_API_BASE, formData, {
|
||
headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
|
||
});
|
||
|
||
return response.data;
|
||
}
|
||
|
||
async function main() {
|
||
console.log('Starting Legacy API deployment creation...\n');
|
||
|
||
const results = [];
|
||
|
||
for (const b of beneficiaries) {
|
||
try {
|
||
console.log('Processing beneficiary ' + b.id + ' (' + b.name + ')...');
|
||
const result = await createLegacyDeployment(b.id, b.name);
|
||
|
||
if (result.deployment_id && result.deployment_id > 0) {
|
||
console.log(' OK Created legacy_deployment_id: ' + result.deployment_id);
|
||
results.push({
|
||
beneficiaryId: b.id,
|
||
deploymentId: b.deploymentId,
|
||
legacyDeploymentId: result.deployment_id,
|
||
success: true
|
||
});
|
||
} else {
|
||
console.log(' WARN No deployment_id returned');
|
||
results.push({
|
||
beneficiaryId: b.id,
|
||
deploymentId: b.deploymentId,
|
||
legacyDeploymentId: null,
|
||
success: false,
|
||
error: 'No deployment_id'
|
||
});
|
||
}
|
||
|
||
// Small delay to not overwhelm the API
|
||
await new Promise(r => setTimeout(r, 500));
|
||
|
||
} catch (error) {
|
||
console.log(' ERROR: ' + error.message);
|
||
results.push({
|
||
beneficiaryId: b.id,
|
||
deploymentId: b.deploymentId,
|
||
legacyDeploymentId: null,
|
||
success: false,
|
||
error: error.message
|
||
});
|
||
}
|
||
}
|
||
|
||
console.log('\n\n=== RESULTS ===\n');
|
||
|
||
// Print SQL updates
|
||
console.log('-- SQL to update beneficiary_deployments:\n');
|
||
for (const r of results) {
|
||
if (r.success && r.legacyDeploymentId) {
|
||
console.log('UPDATE beneficiary_deployments SET legacy_deployment_id = ' + r.legacyDeploymentId + ' WHERE id = ' + r.deploymentId + ';');
|
||
}
|
||
}
|
||
|
||
console.log('\n\n-- Summary:');
|
||
const successful = results.filter(r => r.success).length;
|
||
const failed = results.filter(r => !r.success).length;
|
||
console.log('Total: ' + results.length + ', Success: ' + successful + ', Failed: ' + failed);
|
||
}
|
||
|
||
main().catch(console.error);
|