feat: integrate mintel annotator with email submission and environment restrictions
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 38s
Build & Deploy / 🧪 QA (push) Failing after 36s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 3s
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 38s
Build & Deploy / 🧪 QA (push) Failing after 36s
Build & Deploy / 🏗️ Build (push) Has been skipped
Build & Deploy / 🚀 Deploy (push) Has been skipped
Build & Deploy / 🧪 Post-Deploy Verification (push) Has been skipped
Build & Deploy / 🔔 Notify (push) Successful in 3s
This commit is contained in:
35
app/actions/getAnnotatorAssets.ts
Normal file
35
app/actions/getAnnotatorAssets.ts
Normal file
@@ -0,0 +1,35 @@
|
||||
'use server';
|
||||
import fs from 'fs';
|
||||
import path from 'path';
|
||||
|
||||
export async function getAnnotatorAssets() {
|
||||
// Try /app/public first (docker), then process.cwd()/public
|
||||
let publicDir = '/app/public';
|
||||
if (!fs.existsSync(publicDir)) {
|
||||
publicDir = path.join(process.cwd(), 'public');
|
||||
}
|
||||
|
||||
const walk = (dir: string): string[] => {
|
||||
let results: string[] = [];
|
||||
if (!fs.existsSync(dir)) return results;
|
||||
const list = fs.readdirSync(dir);
|
||||
list.forEach((file) => {
|
||||
const filePath = path.join(dir, file);
|
||||
const stat = fs.statSync(filePath);
|
||||
if (stat && stat.isDirectory()) {
|
||||
results = results.concat(walk(filePath));
|
||||
} else {
|
||||
if (filePath.match(/\.(png|jpg|jpeg|webp|mp4|svg)$/i)) {
|
||||
results.push(filePath.replace(publicDir, ''));
|
||||
}
|
||||
}
|
||||
});
|
||||
return results;
|
||||
};
|
||||
const results = walk(publicDir);
|
||||
console.log('[Annotator] publicDir:', publicDir);
|
||||
console.log('[Annotator] Assets found:', results.length);
|
||||
console.log('[Annotator] First 5 paths:', results.slice(0, 5));
|
||||
|
||||
return results;
|
||||
}
|
||||
54
app/actions/submitAnnotations.ts
Normal file
54
app/actions/submitAnnotations.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import { sendEmail } from '@/lib/mail/mailer';
|
||||
import { getServerAppServices } from '@/lib/services/create-services.server';
|
||||
|
||||
export async function submitAnnotations(annotations: any[]) {
|
||||
const services = getServerAppServices();
|
||||
const logger = services.logger.child({ action: 'submitAnnotations' });
|
||||
|
||||
if (!annotations || annotations.length === 0) {
|
||||
return { success: false, error: 'Keine Korrekturen vorhanden.' };
|
||||
}
|
||||
|
||||
try {
|
||||
const jsonContent = JSON.stringify(annotations, null, 2);
|
||||
const htmlContent = `
|
||||
<h2>Neue Website-Korrekturen (${annotations.length})</h2>
|
||||
<p>Es wurden neue Korrekturen über den Annotator eingereicht.</p>
|
||||
<ul>
|
||||
${annotations.map(ann => `
|
||||
<li>
|
||||
<b>${new URL(ann.url).pathname}</b> [${ann.type}]<br />
|
||||
Element: <code>${ann.selector}</code><br />
|
||||
<i>${ann.type === 'image' ? 'Neues Bild: ' : 'Text: '}${ann.newContent}</i>
|
||||
</li>
|
||||
`).join('')}
|
||||
</ul>
|
||||
<p><i>Die genauen Daten (inkl. Scroll-Positionen, Viewport und Zeitstempel) befinden sich im JSON-Anhang.</i></p>
|
||||
`;
|
||||
|
||||
const notificationResult = await sendEmail({
|
||||
replyTo: 'info@e-tib.com', // Falls Rückfragen nötig
|
||||
subject: `[Korrekturen] ${annotations.length} neue Anmerkungen für E-TIB`,
|
||||
html: htmlContent,
|
||||
attachments: [
|
||||
{
|
||||
filename: 'corrections.json',
|
||||
content: jsonContent,
|
||||
contentType: 'application/json',
|
||||
}
|
||||
]
|
||||
});
|
||||
|
||||
if (!notificationResult.success) {
|
||||
logger.error('Annotation email FAILED', { error: notificationResult.error });
|
||||
return { success: false, error: notificationResult.error };
|
||||
}
|
||||
|
||||
logger.info('Annotation email sent successfully', { count: annotations.length });
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
const errorMsg = error instanceof Error ? error.message : String(error);
|
||||
logger.error('Failed to send annotations', { error: errorMsg });
|
||||
return { success: false, error: errorMsg };
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user