232 lines
8.7 KiB
JavaScript
232 lines
8.7 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.getEmailsByCustomerId = getEmailsByCustomerId;
|
|
exports.getEmailsWithMailboxByCustomerId = getEmailsWithMailboxByCustomerId;
|
|
exports.getEmailById = getEmailById;
|
|
exports.getEmailWithMailboxById = getEmailWithMailboxById;
|
|
exports.createEmail = createEmail;
|
|
exports.updateEmail = updateEmail;
|
|
exports.deleteEmail = deleteEmail;
|
|
exports.enableMailbox = enableMailbox;
|
|
exports.syncMailboxStatus = syncMailboxStatus;
|
|
exports.getDecryptedPassword = getDecryptedPassword;
|
|
exports.resetMailboxPassword = resetMailboxPassword;
|
|
const client_1 = require("@prisma/client");
|
|
const encryption_js_1 = require("../utils/encryption.js");
|
|
const emailProviderService_js_1 = require("./emailProvider/emailProviderService.js");
|
|
const passwordGenerator_js_1 = require("../utils/passwordGenerator.js");
|
|
const prisma = new client_1.PrismaClient();
|
|
async function getEmailsByCustomerId(customerId, includeInactive = false) {
|
|
const where = { customerId };
|
|
if (!includeInactive) {
|
|
where.isActive = true;
|
|
}
|
|
return prisma.stressfreiEmail.findMany({
|
|
where,
|
|
orderBy: { createdAt: 'desc' },
|
|
});
|
|
}
|
|
// Mit Mailbox-Status für E-Mail-Client
|
|
async function getEmailsWithMailboxByCustomerId(customerId) {
|
|
return prisma.stressfreiEmail.findMany({
|
|
where: {
|
|
customerId,
|
|
isActive: true,
|
|
hasMailbox: true,
|
|
},
|
|
select: {
|
|
id: true,
|
|
email: true,
|
|
notes: true,
|
|
hasMailbox: true,
|
|
_count: {
|
|
select: {
|
|
cachedEmails: true,
|
|
},
|
|
},
|
|
},
|
|
orderBy: { email: 'asc' },
|
|
});
|
|
}
|
|
async function getEmailById(id) {
|
|
return prisma.stressfreiEmail.findUnique({
|
|
where: { id },
|
|
});
|
|
}
|
|
// E-Mail mit Mailbox-Status laden
|
|
async function getEmailWithMailboxById(id) {
|
|
return prisma.stressfreiEmail.findUnique({
|
|
where: { id },
|
|
select: {
|
|
id: true,
|
|
customerId: true,
|
|
email: true,
|
|
platform: true,
|
|
notes: true,
|
|
isActive: true,
|
|
hasMailbox: true,
|
|
emailPasswordEncrypted: true,
|
|
createdAt: true,
|
|
updatedAt: true,
|
|
},
|
|
});
|
|
}
|
|
async function createEmail(data) {
|
|
const { provisionAtProvider, createMailbox, ...emailData } = data;
|
|
// Falls beim Provider anlegen gewünscht
|
|
if (provisionAtProvider) {
|
|
// Kunde laden für Weiterleitung
|
|
const customer = await prisma.customer.findUnique({
|
|
where: { id: data.customerId },
|
|
select: { email: true },
|
|
});
|
|
if (!customer?.email) {
|
|
throw new Error('Kunde hat keine E-Mail-Adresse für Weiterleitung');
|
|
}
|
|
// LocalPart extrahieren
|
|
const localPart = data.email.split('@')[0];
|
|
if (createMailbox) {
|
|
// Mit echter Mailbox anlegen
|
|
const password = (0, passwordGenerator_js_1.generateSecurePassword)();
|
|
const result = await (0, emailProviderService_js_1.provisionEmailWithMailbox)(localPart, customer.email, password);
|
|
if (!result.success) {
|
|
throw new Error(result.error || 'Fehler beim Anlegen der Mailbox');
|
|
}
|
|
// Passwort verschlüsseln und speichern
|
|
const passwordEncrypted = (0, encryption_js_1.encrypt)(password);
|
|
return prisma.stressfreiEmail.create({
|
|
data: {
|
|
...emailData,
|
|
isActive: true,
|
|
hasMailbox: true,
|
|
emailPasswordEncrypted: passwordEncrypted,
|
|
},
|
|
});
|
|
}
|
|
else {
|
|
// Nur Weiterleitung anlegen
|
|
const result = await (0, emailProviderService_js_1.provisionEmail)(localPart, customer.email);
|
|
if (!result.success && !result.message?.includes('existiert bereits')) {
|
|
throw new Error(result.error || 'Fehler beim Anlegen der E-Mail');
|
|
}
|
|
}
|
|
}
|
|
return prisma.stressfreiEmail.create({
|
|
data: {
|
|
...emailData,
|
|
isActive: true,
|
|
hasMailbox: createMailbox || false,
|
|
},
|
|
});
|
|
}
|
|
async function updateEmail(id, data) {
|
|
return prisma.stressfreiEmail.update({
|
|
where: { id },
|
|
data,
|
|
});
|
|
}
|
|
async function deleteEmail(id) {
|
|
return prisma.stressfreiEmail.delete({ where: { id } });
|
|
}
|
|
// Mailbox nachträglich aktivieren (für existierende E-Mail-Weiterleitung)
|
|
async function enableMailbox(id) {
|
|
const stressfreiEmail = await prisma.stressfreiEmail.findUnique({
|
|
where: { id },
|
|
});
|
|
if (!stressfreiEmail) {
|
|
return { success: false, error: 'StressfreiEmail nicht gefunden' };
|
|
}
|
|
if (stressfreiEmail.hasMailbox) {
|
|
return { success: false, error: 'Mailbox ist bereits aktiviert' };
|
|
}
|
|
const localPart = stressfreiEmail.email.split('@')[0];
|
|
const password = (0, passwordGenerator_js_1.generateSecurePassword)();
|
|
// Mailbox für existierende E-Mail aktivieren (nicht neu erstellen!)
|
|
const result = await (0, emailProviderService_js_1.enableMailboxForExistingEmail)(localPart, password);
|
|
if (!result.success) {
|
|
return { success: false, error: result.error || 'Fehler beim Aktivieren der Mailbox' };
|
|
}
|
|
// Passwort verschlüsseln und speichern
|
|
const passwordEncrypted = (0, encryption_js_1.encrypt)(password);
|
|
await prisma.stressfreiEmail.update({
|
|
where: { id },
|
|
data: {
|
|
hasMailbox: true,
|
|
emailPasswordEncrypted: passwordEncrypted,
|
|
},
|
|
});
|
|
return { success: true };
|
|
}
|
|
// Mailbox-Status mit Provider synchronisieren
|
|
async function syncMailboxStatus(id) {
|
|
const stressfreiEmail = await prisma.stressfreiEmail.findUnique({
|
|
where: { id },
|
|
select: { email: true, hasMailbox: true },
|
|
});
|
|
if (!stressfreiEmail) {
|
|
return { success: false, error: 'StressfreiEmail nicht gefunden' };
|
|
}
|
|
const localPart = stressfreiEmail.email.split('@')[0];
|
|
// Provider-Status prüfen
|
|
const providerStatus = await (0, emailProviderService_js_1.checkEmailExists)(localPart);
|
|
if (!providerStatus.exists) {
|
|
return { success: true, hasMailbox: false, wasUpdated: false };
|
|
}
|
|
const providerHasMailbox = providerStatus.hasMailbox === true;
|
|
// DB aktualisieren wenn Status abweicht
|
|
if (stressfreiEmail.hasMailbox !== providerHasMailbox) {
|
|
await prisma.stressfreiEmail.update({
|
|
where: { id },
|
|
data: { hasMailbox: providerHasMailbox },
|
|
});
|
|
console.log(`Mailbox-Status für ${stressfreiEmail.email} aktualisiert: ${stressfreiEmail.hasMailbox} -> ${providerHasMailbox}`);
|
|
return { success: true, hasMailbox: providerHasMailbox, wasUpdated: true };
|
|
}
|
|
return { success: true, hasMailbox: providerHasMailbox, wasUpdated: false };
|
|
}
|
|
// Passwort für IMAP/SMTP-Zugang entschlüsseln (nur für autorisierte Nutzung)
|
|
async function getDecryptedPassword(id) {
|
|
const stressfreiEmail = await prisma.stressfreiEmail.findUnique({
|
|
where: { id },
|
|
select: { emailPasswordEncrypted: true },
|
|
});
|
|
if (!stressfreiEmail?.emailPasswordEncrypted) {
|
|
return null;
|
|
}
|
|
try {
|
|
return (0, encryption_js_1.decrypt)(stressfreiEmail.emailPasswordEncrypted);
|
|
}
|
|
catch {
|
|
console.error('Fehler beim Entschlüsseln des Passworts');
|
|
return null;
|
|
}
|
|
}
|
|
// Passwort neu generieren und beim Provider setzen
|
|
async function resetMailboxPassword(id) {
|
|
const stressfreiEmail = await prisma.stressfreiEmail.findUnique({
|
|
where: { id },
|
|
select: { email: true, hasMailbox: true },
|
|
});
|
|
if (!stressfreiEmail) {
|
|
return { success: false, error: 'StressfreiEmail nicht gefunden' };
|
|
}
|
|
if (!stressfreiEmail.hasMailbox) {
|
|
return { success: false, error: 'Keine Mailbox für diese E-Mail-Adresse' };
|
|
}
|
|
// Neues Passwort generieren
|
|
const newPassword = (0, passwordGenerator_js_1.generateSecurePassword)();
|
|
const localPart = stressfreiEmail.email.split('@')[0];
|
|
// Passwort beim Provider ändern
|
|
const providerResult = await (0, emailProviderService_js_1.updateMailboxPassword)(localPart, newPassword);
|
|
if (!providerResult.success) {
|
|
return { success: false, error: providerResult.error || 'Fehler beim Aktualisieren des Passworts beim Provider' };
|
|
}
|
|
// Passwort verschlüsseln und lokal speichern
|
|
const passwordEncrypted = (0, encryption_js_1.encrypt)(newPassword);
|
|
await prisma.stressfreiEmail.update({
|
|
where: { id },
|
|
data: { emailPasswordEncrypted: passwordEncrypted },
|
|
});
|
|
return { success: true, password: newPassword };
|
|
}
|
|
//# sourceMappingURL=stressfreiEmail.service.js.map
|