simpan histori

This commit is contained in:
unknown 2025-05-12 05:11:47 +07:00
parent 9f89fee3f4
commit 3a4c8bfeb0
6 changed files with 210 additions and 8 deletions

View File

@ -4,9 +4,9 @@ DB_USER=root
DB_NAME=sibayam DB_NAME=sibayam
API_URL=http://localhost:5000 API_URL=http://localhost:5000
JWT_SECRET=2c5t0ny38989t03cr4ny904r8xy12jc JWT_SECRET=2c5t0ny38989t03cr4ny904r8xy12jc
EMAIL_HOST=email_host EMAIL_HOST=sandbox.smtp.mailtrap.io
EMAIL_PORT=2525 EMAIL_PORT=""
EMAIL_USER=email_user EMAIL_USER=""
EMAIL_PASS=email_pass EMAIL_PASS=""
SENDGRID_API_KEY=your_send_grid_api_key SENDGRID_API_KEY=""
EMAIL_FROM=sibayam52@gmail.com EMAIL_FROM=""

View File

@ -1,7 +1,10 @@
const { Rule_penyakit, Rule_hama, Gejala, Penyakit, Hama } = require('../models'); const { Rule_penyakit, Rule_hama, Gejala, Penyakit, Hama, Histori } = require('../models');
const moment = require('moment');
exports.diagnosa = async (req, res) => { exports.diagnosa = async (req, res) => {
const { gejala } = req.body; // array of id_gejala const { gejala } = req.body; // array of id_gejala
const userId = req.user?.id; // Use optional chaining to avoid errors if req.user is undefined
const tanggal_diagnosa = moment().format('YYYY-MM-DD');
if (!gejala || !Array.isArray(gejala)) { if (!gejala || !Array.isArray(gejala)) {
return res.status(400).json({ message: 'Gejala harus berupa array' }); return res.status(400).json({ message: 'Gejala harus berupa array' });
@ -196,6 +199,63 @@ exports.diagnosa = async (req, res) => {
attributes: ['id', 'kode', 'nama'] attributes: ['id', 'kode', 'nama']
}); });
if (!userId) {
console.error('ID user tidak ditemukan pada request. Histori tidak dapat disimpan.');
} else {
const idGejalaDipilih = gejala;
const semuaHasil = [...hasilPenyakit, ...hasilHama];
if (semuaHasil.length > 0) {
const hasilTerbesar = semuaHasil.reduce((max, current) => {
return current.probabilitas > max.probabilitas ? current : max;
});
// Base histori data without id_gejala
const baseHistoriData = {
userId: userId,
tanggal_diagnosa: tanggal_diagnosa,
hasil: hasilTerbesar.probabilitas
};
if (hasilTerbesar.id_penyakit) {
baseHistoriData.id_penyakit = hasilTerbesar.id_penyakit;
} else if (hasilTerbesar.id_hama) {
baseHistoriData.id_hama = hasilTerbesar.id_hama;
}
try {
// Option 1: Store only the first gejala ID if we're limited to one record
// if (idGejalaDipilih.length > 0) {
// await Histori.create({
// ...baseHistoriData,
// id_gejala: parseInt(idGejalaDipilih[0]) // Store as integer
// }, { timestamps: false });
// console.log('Histori berhasil disimpan dengan gejala utama');
// }
// Option 2 (Uncomment if you want to create multiple records):
// Create multiple records - one for each gejala
const historiPromises = idGejalaDipilih.map(gejalaId => {
return Histori.create({
...baseHistoriData,
id_gejala: parseInt(gejalaId) // Store as integer
}, { timestamps: false });
});
await Promise.all(historiPromises);
console.log(`Histori berhasil disimpan untuk ${idGejalaDipilih.length} gejala`);
} catch (error) {
console.error('Gagal menyimpan histori:', error.message);
}
} else {
console.log('Tidak ada hasil untuk disimpan ke histori.');
}
}
// Kirim hasil perhitungan sebagai respons // Kirim hasil perhitungan sebagai respons
res.json({ res.json({
input_gejala: gejalaSummary, input_gejala: gejalaSummary,

View File

@ -11,10 +11,16 @@ const roleMiddleware = (roles) => {
} }
try { try {
// Log token untuk memastikan diterima
console.log('Token diterima:', token);
// Verify the token // Verify the token
const decoded = jwt.verify(token, process.env.JWT_SECRET); const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded; req.user = decoded;
// Log decoded token
console.log('Decoded Token:', decoded);
// Check if the user has one of the allowed roles // Check if the user has one of the allowed roles
if (roles.includes(req.user.role)) { if (roles.includes(req.user.role)) {
next(); next();
@ -27,4 +33,5 @@ const roleMiddleware = (roles) => {
}; };
}; };
module.exports = roleMiddleware; module.exports = roleMiddleware;

View File

@ -0,0 +1,66 @@
'use strict';
/** @type {import('sequelize-cli').Migration} */
module.exports = {
async up(queryInterface, Sequelize) {
await queryInterface.createTable('histori', {
id: {
allowNull: false,
autoIncrement: true,
primaryKey: true,
type: Sequelize.INTEGER
},
userId: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: 'users', // sesuaikan dengan nama tabel Users kamu
key: 'id'
},
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
},
id_gejala: {
type: Sequelize.INTEGER,
allowNull: false,
references: {
model: 'gejala', // sesuaikan dengan nama tabel Gejalas kamu
key: 'id'
},
onUpdate: 'CASCADE',
onDelete: 'CASCADE'
},
id_penyakit: {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: 'penyakit',
key: 'id'
},
onUpdate: 'CASCADE',
onDelete: 'SET NULL'
},
id_hama: {
type: Sequelize.INTEGER,
allowNull: true,
references: {
model: 'hama',
key: 'id'
},
onUpdate: 'CASCADE',
onDelete: 'SET NULL'
},
tanggal_diagnosa: {
type: Sequelize.DATE,
allowNull: false
},
hasil: {
type: Sequelize.FLOAT,
allowNull: false
},
});
},
async down(queryInterface, Sequelize) {
await queryInterface.dropTable('histori');
}
};

66
backend/models/histori.js Normal file
View File

@ -0,0 +1,66 @@
'use strict';
const { Model, DataTypes } = require('sequelize');
module.exports = (sequelize) => {
class Histori extends Model {
static associate(models) {
// Relasi ke User
Histori.belongsTo(models.User, {
foreignKey: 'userId',
as: 'user'
});
// Relasi ke Gejala (satu gejala per baris)
Histori.belongsTo(models.Gejala, {
foreignKey: 'id_gejala',
as: 'gejala'
});
// Relasi ke Penyakit (opsional)
Histori.belongsTo(models.Penyakit, {
foreignKey: 'id_penyakit',
as: 'penyakit'
});
// Relasi ke Hama (opsional)
Histori.belongsTo(models.Hama, {
foreignKey: 'id_hama',
as: 'hama'
});
}
}
Histori.init({
userId: {
type: DataTypes.INTEGER,
allowNull: false
},
id_gejala: {
type: DataTypes.INTEGER,
allowNull: false
},
id_penyakit: {
type: DataTypes.INTEGER,
allowNull: true
},
id_hama: {
type: DataTypes.INTEGER,
allowNull: true
},
tanggal_diagnosa: {
type: DataTypes.DATE,
allowNull: false
},
hasil: {
type: DataTypes.FLOAT,
allowNull: false
}
}, {
sequelize,
modelName: 'Histori',
tableName: 'histori',
timestamps: false // kalau kamu pakai kolom createdAt & updatedAt
});
return Histori;
};

View File

@ -1,6 +1,7 @@
const express = require('express'); const express = require('express');
const router = express.Router(); const router = express.Router();
const { diagnosa } = require('../controller/diagnosaController'); const { diagnosa } = require('../controller/diagnosaController');
const roleMiddleware = require('../middleware/roleMiddleware');
console.log('Diagnosa function:', diagnosa); console.log('Diagnosa function:', diagnosa);
/** /**
@ -9,6 +10,8 @@ console.log('Diagnosa function:', diagnosa);
* post: * post:
* summary: Melakukan diagnosa penyakit dan hama menggunakan Teorema Bayes * summary: Melakukan diagnosa penyakit dan hama menggunakan Teorema Bayes
* tags: [Diagnosa] * tags: [Diagnosa]
* security:
* - BearerAuth: []
* requestBody: * requestBody:
* required: true * required: true
* content: * content:
@ -152,6 +155,6 @@ console.log('Diagnosa function:', diagnosa);
* 500: * 500:
* description: Terjadi kesalahan pada server * description: Terjadi kesalahan pada server
*/ */
router.post('/', diagnosa); router.post('/', roleMiddleware(['user', 'admin']), diagnosa);
module.exports = router; module.exports = router;