feat: wrap up translation logic

This commit is contained in:
Mohamed Marrouchi
2024-09-24 11:23:40 +01:00
parent 16e7431d83
commit ecb8d9745a
35 changed files with 291 additions and 260 deletions

View File

@@ -23,7 +23,10 @@ import { SentMessageInfo } from 'nodemailer';
import { AttachmentRepository } from '@/attachment/repositories/attachment.repository';
import { AttachmentModel } from '@/attachment/schemas/attachment.schema';
import { AttachmentService } from '@/attachment/services/attachment.service';
import { LanguageRepository } from '@/i18n/repositories/language.repository';
import { LanguageModel } from '@/i18n/schemas/language.schema';
import { I18nService } from '@/i18n/services/i18n.service';
import { LanguageService } from '@/i18n/services/language.service';
import { LoggerService } from '@/logger/logger.service';
import { installUserFixtures } from '@/utils/test/fixtures/user';
import {
@@ -69,6 +72,7 @@ describe('AuthController', () => {
PermissionModel,
InvitationModel,
AttachmentModel,
LanguageModel,
]),
],
providers: [
@@ -86,6 +90,8 @@ describe('AuthController', () => {
PermissionRepository,
InvitationRepository,
InvitationService,
LanguageRepository,
LanguageService,
JwtService,
{
provide: MailerService,

View File

@@ -20,7 +20,10 @@ import { SentMessageInfo } from 'nodemailer';
import { AttachmentRepository } from '@/attachment/repositories/attachment.repository';
import { AttachmentModel } from '@/attachment/schemas/attachment.schema';
import { AttachmentService } from '@/attachment/services/attachment.service';
import { LanguageRepository } from '@/i18n/repositories/language.repository';
import { LanguageModel } from '@/i18n/schemas/language.schema';
import { I18nService } from '@/i18n/services/i18n.service';
import { LanguageService } from '@/i18n/services/language.service';
import { LoggerService } from '@/logger/logger.service';
import { IGNORED_TEST_FIELDS } from '@/utils/test/constants';
import { installPermissionFixtures } from '@/utils/test/fixtures/permission';
@@ -75,6 +78,7 @@ describe('UserController', () => {
PermissionModel,
InvitationModel,
AttachmentModel,
LanguageModel,
]),
JwtModule,
],
@@ -108,6 +112,8 @@ describe('UserController', () => {
},
AttachmentService,
AttachmentRepository,
LanguageService,
LanguageRepository,
ValidateAccountService,
{
provide: I18nService,

View File

@@ -16,7 +16,10 @@ import { Test, TestingModule } from '@nestjs/testing';
import { ISendMailOptions, MailerService } from '@nestjs-modules/mailer';
import { SentMessageInfo } from 'nodemailer';
import { LanguageRepository } from '@/i18n/repositories/language.repository';
import { LanguageModel } from '@/i18n/schemas/language.schema';
import { I18nService } from '@/i18n/services/i18n.service';
import { LanguageService } from '@/i18n/services/language.service';
import { LoggerService } from '@/logger/logger.service';
import { IGNORED_TEST_FIELDS } from '@/utils/test/constants';
import {
@@ -55,6 +58,7 @@ describe('InvitationService', () => {
RoleModel,
PermissionModel,
InvitationModel,
LanguageModel,
]),
JwtModule,
],
@@ -66,6 +70,8 @@ describe('InvitationService', () => {
PermissionRepository,
InvitationRepository,
InvitationService,
LanguageRepository,
LanguageService,
JwtService,
Logger,
{

View File

@@ -18,6 +18,7 @@ import { MailerService } from '@nestjs-modules/mailer';
import { config } from '@/config';
import { I18nService } from '@/i18n/services/i18n.service';
import { LanguageService } from '@/i18n/services/language.service';
import { LoggerService } from '@/logger/logger.service';
import { BaseService } from '@/utils/generics/base-service';
@@ -42,6 +43,7 @@ export class InvitationService extends BaseService<
@Optional() private readonly mailerService: MailerService | undefined,
private logger: LoggerService,
protected readonly i18n: I18nService,
public readonly languageService: LanguageService,
) {
super(repository);
}
@@ -63,6 +65,7 @@ export class InvitationService extends BaseService<
const jwt = await this.sign(dto);
if (this.mailerService) {
try {
const defaultLanguage = await this.languageService.getDefaultLanguage();
await this.mailerService.sendMail({
to: dto.email,
template: 'invitation.mjml',
@@ -70,7 +73,7 @@ export class InvitationService extends BaseService<
token: jwt,
// TODO: Which language should we use?
t: (key: string) =>
this.i18n.t(key, { lang: config.chatbot.lang.default }),
this.i18n.t(key, { lang: defaultLanguage.code }),
},
subject: this.i18n.t('invitation_subject'),
});

View File

@@ -21,7 +21,10 @@ import { SentMessageInfo } from 'nodemailer';
import { AttachmentRepository } from '@/attachment/repositories/attachment.repository';
import { AttachmentModel } from '@/attachment/schemas/attachment.schema';
import { AttachmentService } from '@/attachment/services/attachment.service';
import { LanguageRepository } from '@/i18n/repositories/language.repository';
import { LanguageModel } from '@/i18n/schemas/language.schema';
import { I18nService } from '@/i18n/services/i18n.service';
import { LanguageService } from '@/i18n/services/language.service';
import { LoggerService } from '@/logger/logger.service';
import { installUserFixtures, users } from '@/utils/test/fixtures/user';
import {
@@ -52,6 +55,7 @@ describe('PasswordResetService', () => {
RoleModel,
PermissionModel,
AttachmentModel,
LanguageModel,
]),
JwtModule,
],
@@ -62,6 +66,8 @@ describe('PasswordResetService', () => {
AttachmentService,
AttachmentRepository,
RoleRepository,
LanguageService,
LanguageRepository,
LoggerService,
PasswordResetService,
JwtService,

View File

@@ -22,6 +22,7 @@ import { compareSync } from 'bcryptjs';
import { config } from '@/config';
import { I18nService } from '@/i18n/services/i18n.service';
import { LanguageService } from '@/i18n/services/language.service';
import { LoggerService } from '@/logger/logger.service';
import { UserService } from './user.service';
@@ -35,6 +36,7 @@ export class PasswordResetService {
private logger: LoggerService,
private readonly userService: UserService,
public readonly i18n: I18nService,
public readonly languageService: LanguageService,
) {}
public readonly jwtSignOptions: JwtSignOptions = {
@@ -59,6 +61,7 @@ export class PasswordResetService {
if (this.mailerService) {
try {
const defaultLanguage = await this.languageService.getDefaultLanguage();
await this.mailerService.sendMail({
to: dto.email,
template: 'password_reset.mjml',
@@ -66,7 +69,7 @@ export class PasswordResetService {
token: jwt,
first_name: user.first_name,
t: (key: string) =>
this.i18n.t(key, { lang: config.chatbot.lang.default }),
this.i18n.t(key, { lang: defaultLanguage.code }),
},
subject: this.i18n.t('password_reset_subject'),
});

View File

@@ -7,6 +7,7 @@
* 3. SaaS Restriction: This software, or any derivative of it, may not be used to offer a competing product or service (SaaS) without prior written consent from Hexastack. Offering the software as a service or using it in a commercial cloud environment without express permission is strictly prohibited.
*/
import { CACHE_MANAGER } from '@nestjs/cache-manager';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { JwtModule } from '@nestjs/jwt';
import { MongooseModule } from '@nestjs/mongoose';
@@ -17,7 +18,10 @@ import { SentMessageInfo } from 'nodemailer';
import { AttachmentRepository } from '@/attachment/repositories/attachment.repository';
import { AttachmentModel } from '@/attachment/schemas/attachment.schema';
import { AttachmentService } from '@/attachment/services/attachment.service';
import { LanguageRepository } from '@/i18n/repositories/language.repository';
import { LanguageModel } from '@/i18n/schemas/language.schema';
import { I18nService } from '@/i18n/services/i18n.service';
import { LanguageService } from '@/i18n/services/language.service';
import { LoggerService } from '@/logger/logger.service';
import { installUserFixtures, users } from '@/utils/test/fixtures/user';
import {
@@ -46,6 +50,7 @@ describe('ValidateAccountService', () => {
RoleModel,
PermissionModel,
AttachmentModel,
LanguageModel,
]),
JwtModule,
],
@@ -56,6 +61,8 @@ describe('ValidateAccountService', () => {
UserRepository,
RoleService,
RoleRepository,
LanguageService,
LanguageRepository,
LoggerService,
{
provide: MailerService,
@@ -74,6 +81,14 @@ describe('ValidateAccountService', () => {
t: jest.fn().mockImplementation((t) => t),
},
},
{
provide: CACHE_MANAGER,
useValue: {
del: jest.fn(),
get: jest.fn(),
set: jest.fn(),
},
},
],
}).compile();
validateAccountService = module.get<ValidateAccountService>(

View File

@@ -19,6 +19,8 @@ import { MailerService } from '@nestjs-modules/mailer';
import { config } from '@/config';
import { I18nService } from '@/i18n/services/i18n.service';
import { LanguageService } from '@/i18n/services/language.service';
import { LoggerService } from '@/logger/logger.service';
import { UserService } from './user.service';
import { UserCreateDto } from '../dto/user.dto';
@@ -35,7 +37,9 @@ export class ValidateAccountService {
@Inject(JwtService) private readonly jwtService: JwtService,
private readonly userService: UserService,
@Optional() private readonly mailerService: MailerService | undefined,
private logger: LoggerService,
private readonly i18n: I18nService,
private readonly languageService: LanguageService,
) {}
/**
@@ -73,17 +77,28 @@ export class ValidateAccountService {
const confirmationToken = await this.sign({ email: dto.email });
if (this.mailerService) {
await this.mailerService.sendMail({
to: dto.email,
template: 'account_confirmation.mjml',
context: {
token: confirmationToken,
first_name: dto.first_name,
t: (key: string) =>
this.i18n.t(key, { lang: config.chatbot.lang.default }),
},
subject: this.i18n.t('account_confirmation_subject'),
});
try {
const defaultLanguage = await this.languageService.getDefaultLanguage();
await this.mailerService.sendMail({
to: dto.email,
template: 'account_confirmation.mjml',
context: {
token: confirmationToken,
first_name: dto.first_name,
t: (key: string) =>
this.i18n.t(key, { lang: defaultLanguage.code }),
},
subject: this.i18n.t('account_confirmation_subject'),
});
} catch (e) {
this.logger.error(
'Could not send email',
e.message,
e.stack,
'ValidateAccount',
);
throw new InternalServerErrorException('Could not send email');
}
}
}