created API For Aplication Absensi

This commit is contained in:
2025-10-14 14:08:11 +07:00
commit 96d206d892
56 changed files with 6533 additions and 0 deletions

13
app/config/config.json Normal file
View File

@@ -0,0 +1,13 @@
{
"development": {
"username": "oxinos",
"password": "Z9jUA33GwblqN1Vk06",
"database": "absens",
"host": "31.97.110.178",
"dialect": "mysql"
}
}

13
app/config/db.config.js Normal file
View File

@@ -0,0 +1,13 @@
require('dotenv').config();
const { Sequelize } = require('sequelize');
const config = {
username: process.env.DB_USERNAME,
password: process.env.DB_PASSWORD,
database: process.env.DB_DATABASE,
host: process.env.DB_HOST,
port : process.env.DB_PORT,
dialect: process.env.DB_CONNECTION || 'mysql'
};
module.exports = config;

34
app/config/mail.config.js Normal file
View File

@@ -0,0 +1,34 @@
const nodemailer = require('nodemailer')
require('dotenv').config()
const transporter = nodemailer.createTransport({
host: process.env.MAIL_HOST,
port: process.env.MAIL_PORT,
secure: false, // true for 465, false for other ports
auth: {
user: process.env.MAIL_USERNAME, // Perbaikan di sini
pass: process.env.MAIL_PASSWORD // Perbaikan di sini
},
tls: {
rejectUnauthorized: false // Untuk development, hati-hati di production
}
})
const sendMail = async ({to, subject, html}) => { // Diubah ke object destructuring
try {
await transporter.sendMail({
from: `"${process.env.MAIL_FROM_NAME}" <${process.env.MAIL_FROM_ADDRESS}>`, // Ditambahkan >
to,
subject,
html
})
console.log('Email sent successfully')
} catch (error) {
console.error('Error sending email:', error)
throw error
}
}
module.exports = {
sendMail
}

View File

@@ -0,0 +1,42 @@
require('dotenv').config();
const parseNumber = (value, fallback) => {
const parsed = Number(value);
return Number.isNaN(parsed) ? fallback : parsed;
};
const retryDelayMs = parseNumber(process.env.RABBITMQ_RETRY_DELAY_MS, 6000);
const exchangeName = process.env.RABBITMQ_EXCHANGE || 'ai.story.exchange';
const config = {
url: process.env.RABBITMQ_URL || 'amqp://guest:guest@localhost:5672',
prefetch: parseNumber(process.env.RABBITMQ_PREFETCH, 1),
retry: {
maxAttempts: parseNumber(process.env.RABBITMQ_MAX_RETRY_ATTEMPTS, 5),
delayMs: retryDelayMs,
},
exchange: {
name: exchangeName,
type: process.env.RABBITMQ_EXCHANGE_TYPE || 'direct',
routingKeys: {
story: process.env.RABBITMQ_STORY_ROUTING_KEY || 'story.generate',
retry: process.env.RABBITMQ_RETRY_ROUTING_KEY || 'story.generate.retry',
deadLetter: process.env.RABBITMQ_DEAD_LETTER_ROUTING_KEY || 'story.generate.dead',
},
},
queues: {
storyGeneration: {
name: process.env.RABBITMQ_QUEUE || 'ai.story.queue',
},
retry: {
name: process.env.RABBITMQ_RETRY_QUEUE || 'ai.story.retry.queue',
messageTtl: retryDelayMs,
},
deadLetter: {
name: process.env.RABBITMQ_DEAD_LETTER_QUEUE || 'ai.story.dlq',
},
},
};
module.exports = config;