Rabu, 27 Maret 2019

contoh cara menggunakan hooks dan validasi pada sequelize

untuk validasi yag lebih lengkap kalian bisa menemukannya di halaman sequelize validasi dokumentasi
dan berikut ini adalah salah satu contoh menggunakan validasi bawaan sequelize dan validasi costume  dan bawaan sequelize:
'use strict';
const { Op } = require('sequelize')
module.exports = (sequelize, DataTypes) => {
  const Teacher = sequelize.define('Teacher', {
    first_name: DataTypes.STRING,
    last_name: DataTypes.STRING,
    email : {
      type:DataTypes.STRING,
      validate:{
        isEmail:{
          args:true,
          msg:'format email harus sesuai'
        },
        isUnique(){
          return Teacher.findAll({
            where:{
              email:this.email,
              [Op.ne] : {id:this.id}
              
            }
          })
          .then(found=>{
            if(found.length !== 0){
              throw new Error('email sudah terdaftar')
            }
          })
          .catch(err=>{
            throw new Error(err)
          })
        }
      }
    },
    SubjectId: DataTypes.INTEGER
  }, {});


``


dan untuk hooks kalian bisa menemukannya di sini :
dokumentasi hooks
dan contoh penggunaannya adalah :
``
'use strict';
module.exports = (sequelize, DataTypes) => {
  const Subject = sequelize.define('Subject', {
    subject_name: DataTypes.STRING
  }, {
    hooks: {
      beforeDestroy(subject, options) {
        return sequelize.models.Teacher.update({
            SubjectId: null
          }, {
            where: {
              SubjectId: this.id
            }
          })
      }
    }
  });
  Subject.associate = function (models) {
    Subject.hasMany(models.Teacher)
    Subject.belongsToMany(models.Student, {
      through: models.StudentSubject
    })
    // associations can be defined here
  };
  return Subject;
};


setup express

tags:
  -
---
### Getting started
1. npm init dan install dependencies
2. sequelize init
### Setting up our sequelize model
3. ubah config
4. db create
5. buat model
6. db migrate
7. generate migration jika diperlukan dan jangan lupa db migrate lagi. doc: http://docs.sequelizejs.com/manual/migrations.html
8. ubah model sesuai dengan perubahan migration
9.  buat associate:
 
   1. Jika 2 model memiliki hubungan **one to many**, pada model yang dimiliki oleh banyak model buat tambahan pada file model  *-nama model-.belongsTo(models.-nama model-, { foreignKey: -nama column baru/ key jika tidak ingin menggunakan default foreign key sequelize (ex: SubjectId) } )* dan **jangan lupa tambah kolom baru**
   2. sedangkan pada model yang memiliki banyak model tulis *-nama model-.hasMany(models.-nama model, { foreignKey:-nama column = nama key yang sama pada model belongsTo-})*
        ```
        contoh one to many:

        SUBJECT DAN TEACHER
     
        - Subject bisa memiliki banyak teacher maka pada model associatenya dibuat hasMany

        - Teacher hanya boleh memiliki satu subject saja maka pada model associatenya dibuat belongsTo

        - karna foreignKey disimpan pada tabel model si one dari hubungan one to many: table teacher ditambah kolom baru dengan nama -id model si many- (SubjectId)


        AIPORT DAN FLIGHTSCHEDULE

        - Airpot bisa memiliki banyak flightschedule maka pada model associatenya dibuat hasMany

        - Flightschedule hanya boleh memiliki satu airport saja maka pada model associatenya dibuat belongsTo

        ```

        - doc: http://docs.sequelizejs.com/manual/associations.html
     
        - extra doc: https://medium.com/@andrewoons/how-to-define-sequelize-associations-using-migrations-de4333bf75a7

10. Sekarang instance dari model masing-masing akan memiliki method associate contohnya getter dan setter. method yang digunakan untuk mengambil data atau menyimpan data model yang memiliki hubungan dengan instance atau bisa juga cukup menggunakan include (contoh menyusul). method layaknya method-method lain merupakan promise jadi jangan lupa return then catch

### Routing~

11. Pada app js buat variable berikut:
    ```JAVASCRIPT
    const express = require('express');
    const app = express();
    const port = 3000;
    ```
12. Setting beberapa middleware yang diperlukan:
    1.  view engine gunakan **set** => app.set('view engine', 'ejs')
    2.  body parser gunakan **use**:
        1.  json/body parser megunakan express => app.use(express.json())
        2.  url encoded untuk query* => app.use(express.urlencoded())
13. Masih di app.js setting route index.js pada folder route dengan => app.use('/', require('routes'))
14. Dan jangan lupa app.listen
    ```JAVASCRIPT
    app.set('view engine', 'ejs');
    app.use(express.json());
    app.use(express.urlencoded({ extended: true }));

    app.use('/', require('./routes'))

    app.listen(port, () => console.log(`App listening on port: ${port}`));
    ```
contoh halaman app.js
```const express = require('express')
const port = 3003
const app = express()
const index = require('./route/index.js')


app.set('view engine','ejs')
app.use(express.static('./public'))
app.use(express.urlencoded({extended:true}))
app.use('/',./routes)








app.listen(port,()=>{
    console.log(`working on http://127.0.0.1:${port}`)
})
```


15. Pindah ke routes
    1.  buat variable router => router = require('express').Router()
    2.  export router agar dapat terhubung => module.exports = router
    3.  yang biasanya menggunakan **app.get/post** di app.js, pada routes kita harus menggunakan **router.get/post**

ini adalah contoh penggunaan salah satu router. ex: index.js di folder routers
``const express = require('express')
const router = express.Router()
const {Student,Subject,Teacher} = require('../models')
const namarouter= require('./router')



router.get('/',(req,res)=>{
    res.render('index.ejs')
})
router.use('/router',namarouter)
router.get('/*',(req,res)=>{
    res.send('not found')
})
module.exports = router

``
16. Get or Post?
    1.  Get biasanya digunakan untuk menghandle penampilan data/halaman, ***then - res.render(-ejs path (string)-, -data yang akan ditampilkan (object)-)***
    2.  Post biasanya digunakan untuk menghandle penerimaan data/penyimpanan data, maka akan ada variable req.body/req.params/req.query. **olah data > jika eror(validasi) > redirect + err.message > jika tidak > redirect saja**