mirror of
https://github.com/immich-app/immich.git
synced 2026-01-09 03:42:35 -08:00
* feat: notifications * UI works * chore: pr feedback * initial fetch and clear notification upon logging out * fix: merge --------- Co-authored-by: Alex Tran <alex.tran1502@gmail.com>
121 lines
3.8 KiB
TypeScript
121 lines
3.8 KiB
TypeScript
import { BadRequestException, Injectable } from '@nestjs/common';
|
|
import { AuthDto } from 'src/dtos/auth.dto';
|
|
import { mapNotification, NotificationCreateDto } from 'src/dtos/notification.dto';
|
|
import { SystemConfigSmtpDto } from 'src/dtos/system-config.dto';
|
|
import { NotificationLevel, NotificationType } from 'src/enum';
|
|
import { EmailTemplate } from 'src/repositories/email.repository';
|
|
import { BaseService } from 'src/services/base.service';
|
|
import { getExternalDomain } from 'src/utils/misc';
|
|
|
|
@Injectable()
|
|
export class NotificationAdminService extends BaseService {
|
|
async create(auth: AuthDto, dto: NotificationCreateDto) {
|
|
const item = await this.notificationRepository.create({
|
|
userId: dto.userId,
|
|
type: dto.type ?? NotificationType.Custom,
|
|
level: dto.level ?? NotificationLevel.Info,
|
|
title: dto.title,
|
|
description: dto.description,
|
|
data: dto.data,
|
|
});
|
|
|
|
return mapNotification(item);
|
|
}
|
|
|
|
async sendTestEmail(id: string, dto: SystemConfigSmtpDto, tempTemplate?: string) {
|
|
const user = await this.userRepository.get(id, { withDeleted: false });
|
|
if (!user) {
|
|
throw new Error('User not found');
|
|
}
|
|
|
|
try {
|
|
await this.emailRepository.verifySmtp(dto.transport);
|
|
} catch (error) {
|
|
throw new BadRequestException('Failed to verify SMTP configuration', { cause: error });
|
|
}
|
|
|
|
const { server } = await this.getConfig({ withCache: false });
|
|
const { html, text } = await this.emailRepository.renderEmail({
|
|
template: EmailTemplate.TEST_EMAIL,
|
|
data: {
|
|
baseUrl: getExternalDomain(server),
|
|
displayName: user.name,
|
|
},
|
|
customTemplate: tempTemplate!,
|
|
});
|
|
const { messageId } = await this.emailRepository.sendEmail({
|
|
to: user.email,
|
|
subject: 'Test email from Immich',
|
|
html,
|
|
text,
|
|
from: dto.from,
|
|
replyTo: dto.replyTo || dto.from,
|
|
smtp: dto.transport,
|
|
});
|
|
|
|
return { messageId };
|
|
}
|
|
|
|
async getTemplate(name: EmailTemplate, customTemplate: string) {
|
|
const { server, templates } = await this.getConfig({ withCache: false });
|
|
|
|
let templateResponse = '';
|
|
|
|
switch (name) {
|
|
case EmailTemplate.WELCOME: {
|
|
const { html: _welcomeHtml } = await this.emailRepository.renderEmail({
|
|
template: EmailTemplate.WELCOME,
|
|
data: {
|
|
baseUrl: getExternalDomain(server),
|
|
displayName: 'John Doe',
|
|
username: 'john@doe.com',
|
|
password: 'thisIsAPassword123',
|
|
},
|
|
customTemplate: customTemplate || templates.email.welcomeTemplate,
|
|
});
|
|
|
|
templateResponse = _welcomeHtml;
|
|
break;
|
|
}
|
|
case EmailTemplate.ALBUM_UPDATE: {
|
|
const { html: _updateAlbumHtml } = await this.emailRepository.renderEmail({
|
|
template: EmailTemplate.ALBUM_UPDATE,
|
|
data: {
|
|
baseUrl: getExternalDomain(server),
|
|
albumId: '1',
|
|
albumName: 'Favorite Photos',
|
|
recipientName: 'Jane Doe',
|
|
cid: undefined,
|
|
},
|
|
customTemplate: customTemplate || templates.email.albumInviteTemplate,
|
|
});
|
|
templateResponse = _updateAlbumHtml;
|
|
break;
|
|
}
|
|
|
|
case EmailTemplate.ALBUM_INVITE: {
|
|
const { html } = await this.emailRepository.renderEmail({
|
|
template: EmailTemplate.ALBUM_INVITE,
|
|
data: {
|
|
baseUrl: getExternalDomain(server),
|
|
albumId: '1',
|
|
albumName: "John Doe's Favorites",
|
|
senderName: 'John Doe',
|
|
recipientName: 'Jane Doe',
|
|
cid: undefined,
|
|
},
|
|
customTemplate: customTemplate || templates.email.albumInviteTemplate,
|
|
});
|
|
templateResponse = html;
|
|
break;
|
|
}
|
|
default: {
|
|
templateResponse = '';
|
|
break;
|
|
}
|
|
}
|
|
|
|
return { name, html: templateResponse };
|
|
}
|
|
}
|