├── config └── database.js ├── controllers └── Product.js ├── index.js ├── models └── Product.js ├── package-lock.json ├── package.json ├── routes └── routes.js └── sequelize_db.sql /config/database.js: -------------------------------------------------------------------------------- 1 | // import sequelize 2 | import { Sequelize } from "sequelize"; 3 | 4 | // create connection 5 | const db = new Sequelize('sequelize_db', 'root', '', { 6 | host: 'localhost', 7 | dialect: 'mysql' 8 | }); 9 | 10 | // export connection 11 | export default db; -------------------------------------------------------------------------------- /controllers/Product.js: -------------------------------------------------------------------------------- 1 | // Import model Product 2 | import Product from "../models/Product.js"; 3 | 4 | // Get semua product 5 | export const getProducts = async (req, res) => { 6 | try { 7 | const product = await Product.findAll(); 8 | res.send(product); 9 | } catch (err) { 10 | console.log(err); 11 | } 12 | } 13 | 14 | // Get product berdasarkan id 15 | export const getProductById = async (req, res) => { 16 | try { 17 | const product = await Product.findAll({ 18 | where: { 19 | id: req.params.id 20 | } 21 | }); 22 | res.send(product[0]); 23 | } catch (err) { 24 | console.log(err); 25 | } 26 | } 27 | 28 | // Create product baru 29 | export const createProduct = async (req, res) => { 30 | try { 31 | await Product.create(req.body); 32 | res.json({ 33 | "message": "Product Created" 34 | }); 35 | } catch (err) { 36 | console.log(err); 37 | } 38 | } 39 | 40 | // Update product berdasarkan id 41 | export const updateProduct = async (req, res) => { 42 | try { 43 | await Product.update(req.body, { 44 | where: { 45 | id: req.params.id 46 | } 47 | }); 48 | res.json({ 49 | "message": "Product Updated" 50 | }); 51 | } catch (err) { 52 | console.log(err); 53 | } 54 | } 55 | 56 | 57 | // Delete product berdasarkan id 58 | export const deleteProduct = async (req, res) => { 59 | try { 60 | await Product.destroy({ 61 | where: { 62 | id: req.params.id 63 | } 64 | }); 65 | res.json({ 66 | "message": "Product Deleted" 67 | }); 68 | } catch (err) { 69 | console.log(err); 70 | } 71 | } -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | // Import express 2 | import express from "express"; 3 | // Import cors 4 | import cors from "cors"; 5 | // Import connection 6 | import db from "./config/database.js"; 7 | // Import router 8 | import Router from "./routes/routes.js"; 9 | 10 | // Init express 11 | const app = express(); 12 | // use express json 13 | app.use(express.json()); 14 | // use cors 15 | app.use(cors()); 16 | 17 | // Testing database connection 18 | try { 19 | await db.authenticate(); 20 | console.log('Connection has been established successfully.'); 21 | } catch (error) { 22 | console.error('Unable to connect to the database:', error); 23 | } 24 | 25 | // use router 26 | app.use(Router); 27 | 28 | // listen on port 29 | app.listen(5000, () => console.log('Server running at http://localhost:5000')); -------------------------------------------------------------------------------- /models/Product.js: -------------------------------------------------------------------------------- 1 | // import sequelize 2 | import { Sequelize } from "sequelize"; 3 | // import connection 4 | import db from "../config/database.js"; 5 | 6 | // init DataTypes 7 | const { DataTypes } = Sequelize; 8 | 9 | // Define schema 10 | const Product = db.define('products', { 11 | // Define attributes 12 | title: { 13 | type: DataTypes.STRING 14 | }, 15 | price: { 16 | type: DataTypes.DOUBLE 17 | } 18 | },{ 19 | // Freeze Table Name 20 | freezeTableName: true 21 | }); 22 | 23 | // Export model Product 24 | export default Product; -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sequelize-app", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@types/node": { 8 | "version": "14.14.13", 9 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.13.tgz", 10 | "integrity": "sha512-vbxr0VZ8exFMMAjCW8rJwaya0dMCDyYW2ZRdTyjtrCvJoENMpdUHOT/eTzvgyA5ZnqRZ/sI0NwqAxNHKYokLJQ==" 11 | }, 12 | "accepts": { 13 | "version": "1.3.7", 14 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 15 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 16 | "requires": { 17 | "mime-types": "~2.1.24", 18 | "negotiator": "0.6.2" 19 | } 20 | }, 21 | "any-promise": { 22 | "version": "1.3.0", 23 | "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", 24 | "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" 25 | }, 26 | "array-flatten": { 27 | "version": "1.1.1", 28 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 29 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 30 | }, 31 | "body-parser": { 32 | "version": "1.19.0", 33 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 34 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 35 | "requires": { 36 | "bytes": "3.1.0", 37 | "content-type": "~1.0.4", 38 | "debug": "2.6.9", 39 | "depd": "~1.1.2", 40 | "http-errors": "1.7.2", 41 | "iconv-lite": "0.4.24", 42 | "on-finished": "~2.3.0", 43 | "qs": "6.7.0", 44 | "raw-body": "2.4.0", 45 | "type-is": "~1.6.17" 46 | } 47 | }, 48 | "bytes": { 49 | "version": "3.1.0", 50 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 51 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 52 | }, 53 | "content-disposition": { 54 | "version": "0.5.3", 55 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 56 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 57 | "requires": { 58 | "safe-buffer": "5.1.2" 59 | } 60 | }, 61 | "content-type": { 62 | "version": "1.0.4", 63 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 64 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 65 | }, 66 | "cookie": { 67 | "version": "0.4.0", 68 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 69 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 70 | }, 71 | "cookie-signature": { 72 | "version": "1.0.6", 73 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 74 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 75 | }, 76 | "cors": { 77 | "version": "2.8.5", 78 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 79 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 80 | "requires": { 81 | "object-assign": "^4", 82 | "vary": "^1" 83 | } 84 | }, 85 | "debug": { 86 | "version": "2.6.9", 87 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 88 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 89 | "requires": { 90 | "ms": "2.0.0" 91 | } 92 | }, 93 | "denque": { 94 | "version": "1.4.1", 95 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 96 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" 97 | }, 98 | "depd": { 99 | "version": "1.1.2", 100 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 101 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 102 | }, 103 | "destroy": { 104 | "version": "1.0.4", 105 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 106 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 107 | }, 108 | "dottie": { 109 | "version": "2.0.2", 110 | "resolved": "https://registry.npmjs.org/dottie/-/dottie-2.0.2.tgz", 111 | "integrity": "sha512-fmrwR04lsniq/uSr8yikThDTrM7epXHBAAjH9TbeH3rEA8tdCO7mRzB9hdmdGyJCxF8KERo9CITcm3kGuoyMhg==" 112 | }, 113 | "ee-first": { 114 | "version": "1.1.1", 115 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 116 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 117 | }, 118 | "encodeurl": { 119 | "version": "1.0.2", 120 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 121 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 122 | }, 123 | "escape-html": { 124 | "version": "1.0.3", 125 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 126 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 127 | }, 128 | "etag": { 129 | "version": "1.8.1", 130 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 131 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 132 | }, 133 | "express": { 134 | "version": "4.17.1", 135 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 136 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 137 | "requires": { 138 | "accepts": "~1.3.7", 139 | "array-flatten": "1.1.1", 140 | "body-parser": "1.19.0", 141 | "content-disposition": "0.5.3", 142 | "content-type": "~1.0.4", 143 | "cookie": "0.4.0", 144 | "cookie-signature": "1.0.6", 145 | "debug": "2.6.9", 146 | "depd": "~1.1.2", 147 | "encodeurl": "~1.0.2", 148 | "escape-html": "~1.0.3", 149 | "etag": "~1.8.1", 150 | "finalhandler": "~1.1.2", 151 | "fresh": "0.5.2", 152 | "merge-descriptors": "1.0.1", 153 | "methods": "~1.1.2", 154 | "on-finished": "~2.3.0", 155 | "parseurl": "~1.3.3", 156 | "path-to-regexp": "0.1.7", 157 | "proxy-addr": "~2.0.5", 158 | "qs": "6.7.0", 159 | "range-parser": "~1.2.1", 160 | "safe-buffer": "5.1.2", 161 | "send": "0.17.1", 162 | "serve-static": "1.14.1", 163 | "setprototypeof": "1.1.1", 164 | "statuses": "~1.5.0", 165 | "type-is": "~1.6.18", 166 | "utils-merge": "1.0.1", 167 | "vary": "~1.1.2" 168 | } 169 | }, 170 | "finalhandler": { 171 | "version": "1.1.2", 172 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 173 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 174 | "requires": { 175 | "debug": "2.6.9", 176 | "encodeurl": "~1.0.2", 177 | "escape-html": "~1.0.3", 178 | "on-finished": "~2.3.0", 179 | "parseurl": "~1.3.3", 180 | "statuses": "~1.5.0", 181 | "unpipe": "~1.0.0" 182 | } 183 | }, 184 | "forwarded": { 185 | "version": "0.1.2", 186 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 187 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 188 | }, 189 | "fresh": { 190 | "version": "0.5.2", 191 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 192 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 193 | }, 194 | "generate-function": { 195 | "version": "2.3.1", 196 | "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz", 197 | "integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==", 198 | "requires": { 199 | "is-property": "^1.0.2" 200 | } 201 | }, 202 | "http-errors": { 203 | "version": "1.7.2", 204 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 205 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 206 | "requires": { 207 | "depd": "~1.1.2", 208 | "inherits": "2.0.3", 209 | "setprototypeof": "1.1.1", 210 | "statuses": ">= 1.5.0 < 2", 211 | "toidentifier": "1.0.0" 212 | } 213 | }, 214 | "iconv-lite": { 215 | "version": "0.4.24", 216 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 217 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 218 | "requires": { 219 | "safer-buffer": ">= 2.1.2 < 3" 220 | } 221 | }, 222 | "inflection": { 223 | "version": "1.12.0", 224 | "resolved": "https://registry.npmjs.org/inflection/-/inflection-1.12.0.tgz", 225 | "integrity": "sha1-ogCTVlbW9fa8TcdQLhrstwMihBY=" 226 | }, 227 | "inherits": { 228 | "version": "2.0.3", 229 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 230 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 231 | }, 232 | "ipaddr.js": { 233 | "version": "1.9.1", 234 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 235 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 236 | }, 237 | "is-property": { 238 | "version": "1.0.2", 239 | "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", 240 | "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" 241 | }, 242 | "lodash": { 243 | "version": "4.17.20", 244 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", 245 | "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" 246 | }, 247 | "long": { 248 | "version": "4.0.0", 249 | "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", 250 | "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" 251 | }, 252 | "lru-cache": { 253 | "version": "6.0.0", 254 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", 255 | "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", 256 | "requires": { 257 | "yallist": "^4.0.0" 258 | } 259 | }, 260 | "media-typer": { 261 | "version": "0.3.0", 262 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 263 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 264 | }, 265 | "merge-descriptors": { 266 | "version": "1.0.1", 267 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 268 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 269 | }, 270 | "methods": { 271 | "version": "1.1.2", 272 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 273 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 274 | }, 275 | "mime": { 276 | "version": "1.6.0", 277 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 278 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 279 | }, 280 | "mime-db": { 281 | "version": "1.44.0", 282 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 283 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 284 | }, 285 | "mime-types": { 286 | "version": "2.1.27", 287 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 288 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 289 | "requires": { 290 | "mime-db": "1.44.0" 291 | } 292 | }, 293 | "moment": { 294 | "version": "2.29.1", 295 | "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", 296 | "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" 297 | }, 298 | "moment-timezone": { 299 | "version": "0.5.32", 300 | "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.32.tgz", 301 | "integrity": "sha512-Z8QNyuQHQAmWucp8Knmgei8YNo28aLjJq6Ma+jy1ZSpSk5nyfRT8xgUbSQvD2+2UajISfenndwvFuH3NGS+nvA==", 302 | "requires": { 303 | "moment": ">= 2.9.0" 304 | } 305 | }, 306 | "ms": { 307 | "version": "2.0.0", 308 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 309 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 310 | }, 311 | "mysql2": { 312 | "version": "2.2.5", 313 | "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.2.5.tgz", 314 | "integrity": "sha512-XRqPNxcZTpmFdXbJqb+/CtYVLCx14x1RTeNMD4954L331APu75IC74GDqnZMEt1kwaXy6TySo55rF2F3YJS78g==", 315 | "requires": { 316 | "denque": "^1.4.1", 317 | "generate-function": "^2.3.1", 318 | "iconv-lite": "^0.6.2", 319 | "long": "^4.0.0", 320 | "lru-cache": "^6.0.0", 321 | "named-placeholders": "^1.1.2", 322 | "seq-queue": "^0.0.5", 323 | "sqlstring": "^2.3.2" 324 | }, 325 | "dependencies": { 326 | "iconv-lite": { 327 | "version": "0.6.2", 328 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", 329 | "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", 330 | "requires": { 331 | "safer-buffer": ">= 2.1.2 < 3.0.0" 332 | } 333 | } 334 | } 335 | }, 336 | "named-placeholders": { 337 | "version": "1.1.2", 338 | "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", 339 | "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", 340 | "requires": { 341 | "lru-cache": "^4.1.3" 342 | }, 343 | "dependencies": { 344 | "lru-cache": { 345 | "version": "4.1.5", 346 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", 347 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", 348 | "requires": { 349 | "pseudomap": "^1.0.2", 350 | "yallist": "^2.1.2" 351 | } 352 | }, 353 | "yallist": { 354 | "version": "2.1.2", 355 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 356 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 357 | } 358 | } 359 | }, 360 | "negotiator": { 361 | "version": "0.6.2", 362 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 363 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 364 | }, 365 | "object-assign": { 366 | "version": "4.1.1", 367 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 368 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 369 | }, 370 | "on-finished": { 371 | "version": "2.3.0", 372 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 373 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 374 | "requires": { 375 | "ee-first": "1.1.1" 376 | } 377 | }, 378 | "parseurl": { 379 | "version": "1.3.3", 380 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 381 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 382 | }, 383 | "path-to-regexp": { 384 | "version": "0.1.7", 385 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 386 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 387 | }, 388 | "proxy-addr": { 389 | "version": "2.0.6", 390 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 391 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 392 | "requires": { 393 | "forwarded": "~0.1.2", 394 | "ipaddr.js": "1.9.1" 395 | } 396 | }, 397 | "pseudomap": { 398 | "version": "1.0.2", 399 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 400 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 401 | }, 402 | "qs": { 403 | "version": "6.7.0", 404 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 405 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 406 | }, 407 | "range-parser": { 408 | "version": "1.2.1", 409 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 410 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 411 | }, 412 | "raw-body": { 413 | "version": "2.4.0", 414 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 415 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 416 | "requires": { 417 | "bytes": "3.1.0", 418 | "http-errors": "1.7.2", 419 | "iconv-lite": "0.4.24", 420 | "unpipe": "1.0.0" 421 | } 422 | }, 423 | "retry-as-promised": { 424 | "version": "3.2.0", 425 | "resolved": "https://registry.npmjs.org/retry-as-promised/-/retry-as-promised-3.2.0.tgz", 426 | "integrity": "sha512-CybGs60B7oYU/qSQ6kuaFmRd9sTZ6oXSc0toqePvV74Ac6/IFZSI1ReFQmtCN+uvW1Mtqdwpvt/LGOiCBAY2Mg==", 427 | "requires": { 428 | "any-promise": "^1.3.0" 429 | } 430 | }, 431 | "safe-buffer": { 432 | "version": "5.1.2", 433 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 434 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 435 | }, 436 | "safer-buffer": { 437 | "version": "2.1.2", 438 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 439 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 440 | }, 441 | "semver": { 442 | "version": "7.3.4", 443 | "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", 444 | "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", 445 | "requires": { 446 | "lru-cache": "^6.0.0" 447 | } 448 | }, 449 | "send": { 450 | "version": "0.17.1", 451 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 452 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 453 | "requires": { 454 | "debug": "2.6.9", 455 | "depd": "~1.1.2", 456 | "destroy": "~1.0.4", 457 | "encodeurl": "~1.0.2", 458 | "escape-html": "~1.0.3", 459 | "etag": "~1.8.1", 460 | "fresh": "0.5.2", 461 | "http-errors": "~1.7.2", 462 | "mime": "1.6.0", 463 | "ms": "2.1.1", 464 | "on-finished": "~2.3.0", 465 | "range-parser": "~1.2.1", 466 | "statuses": "~1.5.0" 467 | }, 468 | "dependencies": { 469 | "ms": { 470 | "version": "2.1.1", 471 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 472 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 473 | } 474 | } 475 | }, 476 | "seq-queue": { 477 | "version": "0.0.5", 478 | "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", 479 | "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" 480 | }, 481 | "sequelize": { 482 | "version": "6.3.5", 483 | "resolved": "https://registry.npmjs.org/sequelize/-/sequelize-6.3.5.tgz", 484 | "integrity": "sha512-MiwiPkYSA8NWttRKAXdU9h0TxP6HAc1fl7qZmMO/VQqQOND83G4nZLXd0kWILtAoT9cxtZgFqeb/MPYgEeXwsw==", 485 | "requires": { 486 | "debug": "^4.1.1", 487 | "dottie": "^2.0.0", 488 | "inflection": "1.12.0", 489 | "lodash": "^4.17.15", 490 | "moment": "^2.26.0", 491 | "moment-timezone": "^0.5.31", 492 | "retry-as-promised": "^3.2.0", 493 | "semver": "^7.3.2", 494 | "sequelize-pool": "^6.0.0", 495 | "toposort-class": "^1.0.1", 496 | "uuid": "^8.1.0", 497 | "validator": "^10.11.0", 498 | "wkx": "^0.5.0" 499 | }, 500 | "dependencies": { 501 | "debug": { 502 | "version": "4.3.1", 503 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 504 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 505 | "requires": { 506 | "ms": "2.1.2" 507 | } 508 | }, 509 | "ms": { 510 | "version": "2.1.2", 511 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 512 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 513 | } 514 | } 515 | }, 516 | "sequelize-pool": { 517 | "version": "6.1.0", 518 | "resolved": "https://registry.npmjs.org/sequelize-pool/-/sequelize-pool-6.1.0.tgz", 519 | "integrity": "sha512-4YwEw3ZgK/tY/so+GfnSgXkdwIJJ1I32uZJztIEgZeAO6HMgj64OzySbWLgxj+tXhZCJnzRfkY9gINw8Ft8ZMg==" 520 | }, 521 | "serve-static": { 522 | "version": "1.14.1", 523 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 524 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 525 | "requires": { 526 | "encodeurl": "~1.0.2", 527 | "escape-html": "~1.0.3", 528 | "parseurl": "~1.3.3", 529 | "send": "0.17.1" 530 | } 531 | }, 532 | "setprototypeof": { 533 | "version": "1.1.1", 534 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 535 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 536 | }, 537 | "sqlstring": { 538 | "version": "2.3.2", 539 | "resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.2.tgz", 540 | "integrity": "sha512-vF4ZbYdKS8OnoJAWBmMxCQDkiEBkGQYU7UZPtL8flbDRSNkhaXvRJ279ZtI6M+zDaQovVU4tuRgzK5fVhvFAhg==" 541 | }, 542 | "statuses": { 543 | "version": "1.5.0", 544 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 545 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 546 | }, 547 | "toidentifier": { 548 | "version": "1.0.0", 549 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 550 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 551 | }, 552 | "toposort-class": { 553 | "version": "1.0.1", 554 | "resolved": "https://registry.npmjs.org/toposort-class/-/toposort-class-1.0.1.tgz", 555 | "integrity": "sha1-f/0feMi+KMO6Rc1OGj9e4ZO9mYg=" 556 | }, 557 | "type-is": { 558 | "version": "1.6.18", 559 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 560 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 561 | "requires": { 562 | "media-typer": "0.3.0", 563 | "mime-types": "~2.1.24" 564 | } 565 | }, 566 | "unpipe": { 567 | "version": "1.0.0", 568 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 569 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 570 | }, 571 | "utils-merge": { 572 | "version": "1.0.1", 573 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 574 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 575 | }, 576 | "uuid": { 577 | "version": "8.3.2", 578 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", 579 | "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" 580 | }, 581 | "validator": { 582 | "version": "10.11.0", 583 | "resolved": "https://registry.npmjs.org/validator/-/validator-10.11.0.tgz", 584 | "integrity": "sha512-X/p3UZerAIsbBfN/IwahhYaBbY68EN/UQBWHtsbXGT5bfrH/p4NQzUCG1kF/rtKaNpnJ7jAu6NGTdSNtyNIXMw==" 585 | }, 586 | "vary": { 587 | "version": "1.1.2", 588 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 589 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 590 | }, 591 | "wkx": { 592 | "version": "0.5.0", 593 | "resolved": "https://registry.npmjs.org/wkx/-/wkx-0.5.0.tgz", 594 | "integrity": "sha512-Xng/d4Ichh8uN4l0FToV/258EjMGU9MGcA0HV2d9B/ZpZB3lqQm7nkOdZdm5GhKtLLhAE7PiVQwN4eN+2YJJUg==", 595 | "requires": { 596 | "@types/node": "*" 597 | } 598 | }, 599 | "yallist": { 600 | "version": "4.0.0", 601 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", 602 | "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" 603 | } 604 | } 605 | } 606 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sequelize-app", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "type": "module", 7 | "scripts": { 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "keywords": [], 11 | "author": "", 12 | "license": "ISC", 13 | "dependencies": { 14 | "cors": "^2.8.5", 15 | "express": "^4.17.1", 16 | "mysql2": "^2.2.5", 17 | "sequelize": "^6.3.5" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /routes/routes.js: -------------------------------------------------------------------------------- 1 | // Import express 2 | import express from "express"; 3 | // Import Controller Product 4 | import { 5 | getProducts, 6 | getProductById, 7 | createProduct, 8 | updateProduct, 9 | deleteProduct 10 | } from "../controllers/Product.js"; 11 | 12 | // Init express router 13 | const router = express.Router(); 14 | 15 | // Route get semua product 16 | router.get('/products', getProducts); 17 | // Route get product by id 18 | router.get('/products/:id', getProductById); 19 | // Route create product baru 20 | router.post('/products', createProduct); 21 | // Route update product by id 22 | router.put('/products/:id', updateProduct); 23 | // Route delete product by id 24 | router.delete('/products/:id', deleteProduct); 25 | 26 | // export router 27 | export default router; -------------------------------------------------------------------------------- /sequelize_db.sql: -------------------------------------------------------------------------------- 1 | -- phpMyAdmin SQL Dump 2 | -- version 4.9.0.1 3 | -- https://www.phpmyadmin.net/ 4 | -- 5 | -- Host: 127.0.0.1 6 | -- Generation Time: Dec 13, 2020 at 11:25 PM 7 | -- Server version: 10.3.16-MariaDB 8 | -- PHP Version: 7.3.7 9 | 10 | SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; 11 | SET AUTOCOMMIT = 0; 12 | START TRANSACTION; 13 | SET time_zone = "+00:00"; 14 | 15 | 16 | /*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; 17 | /*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; 18 | /*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; 19 | /*!40101 SET NAMES utf8mb4 */; 20 | 21 | -- 22 | -- Database: `sequelize_db` 23 | -- 24 | 25 | -- -------------------------------------------------------- 26 | 27 | -- 28 | -- Table structure for table `products` 29 | -- 30 | 31 | CREATE TABLE `products` ( 32 | `id` int(11) NOT NULL, 33 | `title` varchar(200) DEFAULT NULL, 34 | `price` int(11) DEFAULT NULL, 35 | `createdAt` date DEFAULT NULL, 36 | `updatedAt` date DEFAULT NULL 37 | ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 38 | 39 | -- 40 | -- Dumping data for table `products` 41 | -- 42 | 43 | INSERT INTO `products` (`id`, `title`, `price`, `createdAt`, `updatedAt`) VALUES 44 | (2, 'Product 2 Edited', 9999, '2020-12-13', '2020-12-13'), 45 | (3, 'Product 3', 3000, '2020-12-13', '2020-12-13'); 46 | 47 | -- 48 | -- Indexes for dumped tables 49 | -- 50 | 51 | -- 52 | -- Indexes for table `products` 53 | -- 54 | ALTER TABLE `products` 55 | ADD PRIMARY KEY (`id`); 56 | 57 | -- 58 | -- AUTO_INCREMENT for dumped tables 59 | -- 60 | 61 | -- 62 | -- AUTO_INCREMENT for table `products` 63 | -- 64 | ALTER TABLE `products` 65 | MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4; 66 | COMMIT; 67 | 68 | /*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; 69 | /*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; 70 | /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; 71 | --------------------------------------------------------------------------------