106 lines
3.9 KiB
JavaScript
106 lines
3.9 KiB
JavaScript
const express = require('express');
|
|
const router = express.Router();
|
|
const dns = require('dns').promises;
|
|
const db = require('../config/database');
|
|
|
|
// Email Validierung via DNS MX-Record Check
|
|
async function verifyEmailDomain(email) {
|
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
if (!emailRegex.test(email)) return { valid: false, reason: 'Ungültiges E-Mail-Format' };
|
|
|
|
const domain = email.split('@')[1];
|
|
try {
|
|
const records = await dns.resolveMx(domain);
|
|
if (records && records.length > 0) {
|
|
return { valid: true };
|
|
}
|
|
return { valid: false, reason: 'Domain hat keine E-Mail-Server (MX-Records fehlen)' };
|
|
} catch (err) {
|
|
return { valid: false, reason: 'E-Mail-Domain konnte nicht verifiziert werden' };
|
|
}
|
|
}
|
|
|
|
// POST /api/verify-email
|
|
router.post('/verify-email', async (req, res) => {
|
|
const { email } = req.body;
|
|
if (!email) return res.json({ valid: false, reason: 'Keine E-Mail angegeben' });
|
|
|
|
const result = await verifyEmailDomain(email);
|
|
res.json(result);
|
|
});
|
|
|
|
// POST /api/submit-membership
|
|
router.post('/submit-membership', async (req, res) => {
|
|
try {
|
|
const {
|
|
tariff_id, salutation, title, first_name, last_name, birth_date,
|
|
email, phone, street, address_addition, zip, city,
|
|
bank_name, account_holder, iban,
|
|
sepa_accepted, agb_accepted, datenschutz_accepted, data_correct,
|
|
guardian_consent
|
|
} = req.body;
|
|
|
|
// E-Mail validieren
|
|
const emailCheck = await verifyEmailDomain(email);
|
|
if (!emailCheck.valid) {
|
|
return res.json({ success: false, error: 'E-Mail-Adresse ist nicht erreichbar: ' + emailCheck.reason });
|
|
}
|
|
|
|
// Pflichtfelder prüfen
|
|
if (!tariff_id || !first_name || !last_name || !birth_date || !email || !street || !zip || !city) {
|
|
return res.json({ success: false, error: 'Bitte alle Pflichtfelder ausfüllen.' });
|
|
}
|
|
|
|
if (!agb_accepted || !datenschutz_accepted || !data_correct) {
|
|
return res.json({ success: false, error: 'Bitte alle Einverständniserklärungen bestätigen.' });
|
|
}
|
|
|
|
// Alter berechnen
|
|
const birthDateObj = new Date(birth_date);
|
|
const today = new Date();
|
|
let age = today.getFullYear() - birthDateObj.getFullYear();
|
|
const m = today.getMonth() - birthDateObj.getMonth();
|
|
if (m < 0 || (m === 0 && today.getDate() < birthDateObj.getDate())) age--;
|
|
|
|
const is_minor = age < 18 ? 1 : 0;
|
|
|
|
if (is_minor && !guardian_consent) {
|
|
return res.json({ success: false, error: 'Bei Minderjährigen ist die Einverständniserklärung der Erziehungsberechtigten erforderlich.' });
|
|
}
|
|
|
|
if (age < 14) {
|
|
return res.json({ success: false, error: 'Das Mindestalter für eine Mitgliedschaft beträgt 14 Jahre.' });
|
|
}
|
|
|
|
// Tarif prüfen
|
|
const [tariffs] = await db.query('SELECT * FROM tariffs WHERE id = ? AND active = 1', [tariff_id]);
|
|
if (tariffs.length === 0) {
|
|
return res.json({ success: false, error: 'Ungültiger oder inaktiver Tarif.' });
|
|
}
|
|
|
|
// In DB speichern
|
|
await db.query(`
|
|
INSERT INTO memberships
|
|
(tariff_id, salutation, title, first_name, last_name, birth_date, email, phone,
|
|
street, address_addition, zip, city, bank_name, account_holder, iban,
|
|
sepa_accepted, agb_accepted, datenschutz_accepted, data_correct, guardian_consent, is_minor)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
|
|
`, [
|
|
tariff_id, salutation, title || '', first_name, last_name, birth_date,
|
|
email, phone || '', street, address_addition || '', zip, city,
|
|
bank_name || '', account_holder || '', iban || '',
|
|
sepa_accepted ? 1 : 0, agb_accepted ? 1 : 0,
|
|
datenschutz_accepted ? 1 : 0, data_correct ? 1 : 0,
|
|
guardian_consent ? 1 : 0, is_minor
|
|
]);
|
|
|
|
res.json({ success: true });
|
|
|
|
} catch (err) {
|
|
console.error('Submit error:', err);
|
|
res.json({ success: false, error: 'Serverfehler. Bitte versuche es später erneut.' });
|
|
}
|
|
});
|
|
|
|
module.exports = router;
|