Sekilas Intro MVC Model
Sebelum memulai refactoring dan restruktur code, mari kita bahas sedikit model MVC. MVC adalah arsiktektur yang memisahkan logic code menjadi Model, View dan Controller.
Model untuk Business Logic, View untuk Presentation Logic dan Controller untuk Application logic. Untuk lebih jelas, lihat diagram dibawah.

Application logic fokus dalam menangani request dan response, menjadi penghubung antara model dan view.
Sedangkan business logic akan menangani aturan business, contoh aturan validasi saat memasukan data tour baru, atau hanya user yang membeli tour yang dapat melihat tour yang dibelinya.
Umumnya pendekatan yang dilakukan adalah fat models / thin controller, yaitu: sebanyak mungkin menyimpan logic di models dan buat controller seminim mungkin.
Refactor dan restuktur
Saat proses refactoring dan restrukturing, ada beberapa code yang dipindah, dihapus dan ditambahkan serta file baru dibuat.
Kita mulai dari file server.js. Pindahkan code yang dibuat pada modul sebelumnya, ke file baru yaitu tourModel.js, simpan file di direktori baru, pada tutorial direktori models.
//tourModel.js
const mongoose = require('mongoose');
const tourSchema = new mongoose.Schema({
name: {
type: String,
required: [true, 'Nama tour harus diisi'],
unique: true
},
rating: {
type: Number,
default: 4.5
},
price: {
type: Number,
required: [true, 'Harga tour harus diisi']
}
});
const Tour = mongoose.model('Tour', tourSchema);
module.exports = Tour;
//file server.js
const mongoose = require('mongoose');
const app = require('./app');
const db = 'mongodb+srv://<ISI_USRNM>:<ISI_PSWRD>@cluster0.x6e8z.mongodb.net/<ISI_DBNAME>?retryWrites=true&w=majority';
mongoose.connect(db, {
useNewUrlParser: true,
useCreateIndex: true,
useUnifiedTopology: true,
useFindAndModify: false
}).then(con => {
console.log('DB Connected');
});
const port = 3000;
app.listen(port, ()=>{
console.log(`Listening on port ${port}...`);
});
File tourController.js akan banyak perubahan. Code untuk fungsi validasi dibuang karena sesuai arsitektur MVC, logic business disimpan di model (lihat validasi pada tourModel.js diatas pada option type seperti required dan unique).
Code untuk akses file json juga dibuang, karena sekarang kita akan menyimpan data ke mongoDB. Beberapa code di comment dahulu agar tidak menimbulkan error.
tourController.js akan menggunakan tour model dengan mengimport file tourModel.js.
const Tour = require('./../models/tourModel');
exports.getAllTours = (req, res) => {
res.status(200).json({
status: 'success',
// results: tours.length ,
// data: {
// tours: tours
// }
});
}
exports.getTours = (req, res) => {
// res.status(200).json({
// status: 'success',
// data: {
// tour: tour
// }
// });
}
exports.createTour = (req, res) => {
res.status(201).json({
status: 'success',
data: {
tour: newTour
}
});
}
exports.updateTour = (req, res)=> {
res.status(201).json({
status: 'success',
data: {
tour: 'data updated'
}
});
}
exports.deleteTour = (req, res)=> {
res.status(204).json({
status: 'success',
data: null
});
}
Pada file tourRouter.js juga ada perubahan, karena code validasi yang kita buang pada tourController.js
const express = require('express');
const tourCtrl = require('../controllers/tourController');
const router = express.Router();
router.route('/').get(tourCtrl.getAllTours).post(tourCtrl.createTour);
router.route('/:id').get(tourCtrl.getTours).patch(tourCtrl.updateTour).delete(tourCtrl.deleteTour);
module.exports = router;
Refactoring dan restruktur code sudah selesai. Pada modul selanjutnya kita akan mulai coding tourController.js untuk melakukan operasi CRUD yang sudah terhubung ke database.
Tutorial ini sengaja dibuat proses tahap refactoring dan restruktur dengan tujuan sebagai contoh penerapan MVC arsitektur. Semoga cukup jelas dan bisa dipahami.