A. Global Configuration
Kita akan membahas dotenv, dimana file ini digunakan untuk memyimpan konfigurasi pada aplikasi kita. Kalau sebelum nya konfigurasi kita tulis secara hardcode pada koding seperti pada saat membuat konfig typeorm
typeorm.config.ts
import { TypeOrmModuleOptions } from "@nestjs/typeorm";
export const typeOrmConfig: TypeOrmModuleOptions = {
type: "mysql",
host: "localhost",
port: 3307, //port default 3306 lihat xampp
username: "root", // username default xampp root
password: "root", // password default xampp string kosong
database: "belajar_nest_js",
entities: ["dist/**/*.entity{.ts,.js}"],
synchronize: true,
};
cara di atas sangatlah tidak direkomentasikan diterapkan pada project karena konfigurasi dari database kita simpan di kodingan sehingga kurang aman dan kurang fleksibel. Solusi dari masalah ini kita bisa menggunakan file .env
1. Instalasi Packege Config
Pertama kita instalasi dulu package untuk config
2. Import Module Config pada app module
kita import pada app module sebagai global agar bisa diakses oleh semua module
app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { typeOrmConfig } from './config/typeorm.config';
import { AuthModule } from './app/auth/auth.module';
import { MailModule } from './app/mail/mail.module';
import { ConfigModule } from '@nestjs/config';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true, // konfigurasi is global untuk semua module
}),
TypeOrmModule.forRoot(typeOrmConfig),
AuthModule,
MailModule,
],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
3. Buat File .env
buatlah file .env
DB_HOST = localhost
DB_USERNAME = root
DB_PASSWORD = root
DB_DATABASE = belajar_nest_js
DB_PORT = 3307
//JWT
JWT_SECRET = belajar_jwt
JWT_EXPIRED = 3600
//MAIL
MAIL_HOST = sandbox.smtp.mailtrap.io
MAIL_PORT = 2525
MAIL_USER = 116b44e4fce785
MAIL_PASS = 0a66404e****** // sesuaikan dengan mail password
BASE_CLIENT_URL = http://localhost:5002
4. Implentasi
Setelah kita membuat dotenv, selanjutnya kita akan lakuka penyesuai pada file-file barikut.
jwt.config.ts
typeorm.config.tsimport { TypeOrmModuleOptions } from '@nestjs/typeorm';
export const typeOrmConfig: TypeOrmModuleOptions = {
type: 'mysql',
host: process.env.DB_HOST,
port: Number(process.env.DB_PORT), //port default 3306 lihat xampp
username: process.env.DB_USERNAME, // username default xampp root
password: process.env.DB_PASSWORD, // password default xampp string kosong
database: process.env.DB_DATABASE,
entities: ['dist/**/*.entity{.ts,.js}'],
synchronize: true,
};
mail.module.ts
import { MailerModule } from '@nestjs-modules/mailer';
import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter';
import { Module } from '@nestjs/common';
import { MailService } from './mail.service';
import { join } from 'path';
@Module({
imports: [
MailerModule.forRoot({
transport: {
host: process.env.MAIL_HOST,
port: Number(process.env.MAIL_PORT),
auth: {
user: process.env.MAIL_USER,
pass: process.env.MAIL_PASS,
},
},
defaults: {
from: '"No Reply" <noreply@example.com>',
},
template: {
dir: join(__dirname, 'templates'),
adapter: new HandlebarsAdapter(),
options: {
strict: true,
},
},
}),
],
providers: [MailService],
exports: [MailService], // 👈 export for DI
})
export class MailModule {}
auth.service.ts
async forgotPassword(email: string): Promise<ResponseSuccess> {
const user = await this.authRepository.findOne({
where: {
email: email,
},
});
if (!user) {
throw new HttpException(
'Email tidak ditemukan',
HttpStatus.UNPROCESSABLE_ENTITY,
);
}
const token = randomBytes(32).toString('hex');
const link = `${process.env.BASE_CLIENT_URL}/auth/reset-password/${user.id}/${token}`; // sesuaikan client url
await this.mailService.sendForgotPassword({
email: email,
name: user.nama,
link: link,
});
const payload = {
user: {
id: user.id,
},
token: token,
};
await this.resetPasswordRepository.save(payload);
return this._success('Silahkan Cek Email');
}