feat: Goa GEL Blockchain e-Licensing Platform - Full Stack Implementation
Complete implementation of the Goa Government e-Licensing platform with: Backend: - NestJS API with JWT authentication - PostgreSQL database with Knex ORM - Redis caching and session management - MinIO document storage - Hyperledger Besu blockchain integration - Multi-department workflow system - Comprehensive API tests (266/282 passing) Frontend: - Angular 21 with standalone components - Angular Material + TailwindCSS UI - Visual workflow builder - Document upload with progress tracking - Blockchain explorer integration - Role-based dashboards (Admin, Department, Citizen) - E2E tests with Playwright (37 tests) Infrastructure: - Docker Compose orchestration - Blockscout blockchain explorer - Development and production configurations
This commit is contained in:
156
screenshot-diagrams.js
Normal file
156
screenshot-diagrams.js
Normal file
@@ -0,0 +1,156 @@
|
||||
const fs = require('fs');
|
||||
const path = require('path');
|
||||
|
||||
// Since we don't have puppeteer or mermaid-cli, create a guide for manual conversion
|
||||
|
||||
const diagrams = [
|
||||
'system-context',
|
||||
'container-architecture',
|
||||
'blockchain-architecture',
|
||||
'workflow-state-machine',
|
||||
'data-flow',
|
||||
'deployment-architecture'
|
||||
];
|
||||
|
||||
console.log('='.repeat(70));
|
||||
console.log('DIAGRAM PNG CONVERSION GUIDE');
|
||||
console.log('='.repeat(70));
|
||||
console.log();
|
||||
console.log('Since automated PNG conversion is not available in this environment,');
|
||||
console.log('here are your options to convert the diagrams:');
|
||||
console.log();
|
||||
console.log('OPTION 1: Mermaid Live (Easiest - No Installation Needed)');
|
||||
console.log('─'.repeat(70));
|
||||
console.log('1. Go to: https://mermaid.live');
|
||||
console.log('2. Upload or paste content from each .mermaid file');
|
||||
console.log('3. Click the menu icon (hamburger) → Download');
|
||||
console.log('4. Choose "Download as PNG"');
|
||||
console.log();
|
||||
console.log('Files to convert:');
|
||||
diagrams.forEach((d, i) => {
|
||||
console.log(` ${i+1}. ${d}.mermaid → ${d}.png`);
|
||||
});
|
||||
console.log();
|
||||
console.log('OPTION 2: Using NPM mermaid-cli');
|
||||
console.log('─'.repeat(70));
|
||||
console.log('Local installation (no sudo needed):');
|
||||
console.log(' npm install --save-dev @mermaid-js/mermaid-cli');
|
||||
console.log();
|
||||
console.log('Then run:');
|
||||
diagrams.forEach(d => {
|
||||
console.log(` npx mmdc -i ${d}.mermaid -o ${d}.png -t dark -b transparent`);
|
||||
});
|
||||
console.log();
|
||||
console.log('Or batch convert all:');
|
||||
console.log(' for file in *.mermaid; do');
|
||||
console.log(' npx mmdc -i "$file" -o "${file%.mermaid}.png" -t dark -b transparent');
|
||||
console.log(' done');
|
||||
console.log();
|
||||
console.log('OPTION 3: Using Docker');
|
||||
console.log('─'.repeat(70));
|
||||
diagrams.forEach(d => {
|
||||
console.log(`docker run --rm -v $(pwd):/data mermaid/mermaid-cli:latest \\`);
|
||||
console.log(` -i /data/${d}.mermaid -o /data/${d}.png -t dark -b transparent`);
|
||||
console.log();
|
||||
});
|
||||
console.log('OPTION 4: Browser Screenshot Method');
|
||||
console.log('─'.repeat(70));
|
||||
console.log('1. Open each .html file in your browser:');
|
||||
diagrams.forEach(d => {
|
||||
console.log(` file:///sessions/cool-elegant-faraday/mnt/Goa-GEL/${d}.html`);
|
||||
});
|
||||
console.log();
|
||||
console.log('2. Use browser DevTools:');
|
||||
console.log(' - Press F12');
|
||||
console.log(' - Right-click on diagram → Inspect');
|
||||
console.log(' - In DevTools, use Capture Node Screenshot');
|
||||
console.log();
|
||||
console.log('3. Or use system screenshot tool:');
|
||||
console.log(' - Take screenshot of rendered diagram');
|
||||
console.log(' - Crop and save as PNG');
|
||||
console.log();
|
||||
console.log('OPTION 5: Using Online Converter with CLI');
|
||||
console.log('─'.repeat(70));
|
||||
console.log('Using curl to convert via kroki.io:');
|
||||
diagrams.forEach(d => {
|
||||
console.log(`curl -X POST --data-binary @${d}.mermaid \\`);
|
||||
console.log(` -H "Content-Type: text/plain" \\`);
|
||||
console.log(` https://kroki.io/mermaid/png -o ${d}.png`);
|
||||
});
|
||||
console.log();
|
||||
console.log('='.repeat(70));
|
||||
console.log('CURRENT STATUS');
|
||||
console.log('='.repeat(70));
|
||||
console.log();
|
||||
console.log('✓ Created 6 mermaid diagram files (.mermaid)');
|
||||
console.log('✓ Created 6 HTML preview files (.html)');
|
||||
console.log('✓ Created comprehensive README.md');
|
||||
console.log();
|
||||
console.log('Next: Choose one of the 5 options above to create PNG files');
|
||||
console.log();
|
||||
|
||||
// Try Option 5: kroki.io if curl is available
|
||||
console.log('ATTEMPTING: Option 5 (kroki.io online converter)...');
|
||||
console.log('─'.repeat(70));
|
||||
|
||||
const exec = require('child_process').exec;
|
||||
|
||||
const convertWithKroki = (diagram) => {
|
||||
return new Promise((resolve) => {
|
||||
const mermaidFile = path.join(__dirname, `${diagram}.mermaid`);
|
||||
const pngFile = path.join(__dirname, `${diagram}.png`);
|
||||
|
||||
if (!fs.existsSync(mermaidFile)) {
|
||||
console.log(`✗ ${diagram}.mermaid not found`);
|
||||
resolve(false);
|
||||
return;
|
||||
}
|
||||
|
||||
exec(`curl -s -X POST --data-binary @"${mermaidFile}" -H "Content-Type: text/plain" https://kroki.io/mermaid/png -o "${pngFile}"`, (error) => {
|
||||
if (error) {
|
||||
console.log(`✗ ${diagram}: ${error.message.split('\n')[0]}`);
|
||||
resolve(false);
|
||||
} else {
|
||||
// Verify file was created and has content
|
||||
if (fs.existsSync(pngFile) && fs.statSync(pngFile).size > 0) {
|
||||
console.log(`✓ ${diagram}.png created (${(fs.statSync(pngFile).size / 1024).toFixed(1)} KB)`);
|
||||
resolve(true);
|
||||
} else {
|
||||
console.log(`✗ ${diagram}: Failed to create PNG`);
|
||||
resolve(false);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
// Try kroki conversion sequentially
|
||||
(async () => {
|
||||
console.log();
|
||||
let successCount = 0;
|
||||
for (const diagram of diagrams) {
|
||||
const success = await convertWithKroki(diagram);
|
||||
if (success) successCount++;
|
||||
}
|
||||
|
||||
console.log();
|
||||
console.log('─'.repeat(70));
|
||||
if (successCount === diagrams.length) {
|
||||
console.log(`✓ ALL DIAGRAMS CONVERTED SUCCESSFULLY (${successCount}/${diagrams.length})`);
|
||||
console.log();
|
||||
console.log('PNG files created:');
|
||||
diagrams.forEach(d => {
|
||||
const pngPath = path.join(__dirname, `${d}.png`);
|
||||
if (fs.existsSync(pngPath)) {
|
||||
const size = (fs.statSync(pngPath).size / 1024).toFixed(1);
|
||||
console.log(` ✓ ${d}.png (${size} KB)`);
|
||||
}
|
||||
});
|
||||
} else if (successCount > 0) {
|
||||
console.log(`⚠ PARTIAL SUCCESS: ${successCount}/${diagrams.length} diagrams converted`);
|
||||
} else {
|
||||
console.log('✗ Kroki conversion failed (network may be unreachable)');
|
||||
console.log('Use one of the manual options above');
|
||||
}
|
||||
console.log();
|
||||
})();
|
||||
Reference in New Issue
Block a user