{"id":25606943,"url":"https://github.com/panntod/school-lib-modul","last_synced_at":"2025-10-06T21:23:12.659Z","repository":{"id":202601444,"uuid":"692637450","full_name":"panntod/School-Lib-Modul","owner":"panntod","description":"repo to explore node js by learning sequelize and express, according to the module from smk telkom malang.","archived":false,"fork":false,"pushed_at":"2024-02-10T23:59:34.000Z","size":1532,"stargazers_count":6,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-27T02:51:21.671Z","etag":null,"topics":["cors","express-js","mysql","node-js","sequelize"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/panntod.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2023-09-17T05:26:32.000Z","updated_at":"2024-03-27T17:54:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"a24c345b-5f2b-412d-a515-d73ccf6db204","html_url":"https://github.com/panntod/School-Lib-Modul","commit_stats":null,"previous_names":["panntod/project-school-lib","panntod/school-lib-modul"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panntod%2FSchool-Lib-Modul","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panntod%2FSchool-Lib-Modul/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panntod%2FSchool-Lib-Modul/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/panntod%2FSchool-Lib-Modul/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/panntod","download_url":"https://codeload.github.com/panntod/School-Lib-Modul/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248710438,"owners_count":21149188,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cors","express-js","mysql","node-js","sequelize"],"created_at":"2025-02-21T19:17:48.925Z","updated_at":"2025-10-06T21:23:07.611Z","avatar_url":"https://github.com/panntod.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"#  Belajar Dasar Node dan Express Js 🚀\n\n## Deskripsi\n\nDalam repo ini, berisikan documentation belajar node dan express pribadi saya untuk mempermudah belajar bagi pemula untuk mendalami node js, materi ini didapat dari [Modul Node Dasar - SMK Telkom Malang](https://drive.google.com/drive/folders/10cFXJ3iqhzZaIs8GOb0RZSjKJZCEOG-X?usp=drive_link).\n\n### Installation\n\nPastikan sudah menginstal Node msi atau download menggunakan link:\n\n[Download Node for Windows](https://nodejs.org/dist/v21.4.0/node-v21.4.0-x64.msi).\n\nuntuk memastikan apakah node sudah terinstal secara global di computer, jalankan perintah ini:\n```\nnode -v\n#or\nnode --version\n```\n\n## Pengenalan Singkat REST API\n\nWebsite merupakan sekumpulan halaman yang diakses menggunakan browser yang dapat dilihat secara umum  banyak pengguna internet. Pengembang atau pembuat halaman website dikenal sebagai web developer. Seiring berjalannya waktu, tugas dari seorang web developer lebih spesifik dan secara umum terbagi menjadi dua bagian yaitu back-end dan front-end.\nKarena back-end dan front-end adalah bagian yang terpisah, tentu membutuhkan penghubung diantara keduanya agar halaman web yang dibuat dapat digunakan sesuai dengan peruntukannya. Untuk menghubungkan kedua bagian tersebut menggunakan tool yang disebut \u003cstrong\u003eApplication Programming Interface (API).\u003c/strong\u003e API digunakan sebagai antarmuka dari sebuah aplikasi agar dapat digunakan oleh aplikasi yang lain. Dalam pengembangan layanan berbasis web, implementasi dari API adalah \u003cstrong\u003eREST API.\u003c/strong\u003e REST merupakan singkatan dari \u003cstrong\u003eRE\u003c/strong\u003epresentational \u003cstrong\u003eS\u003c/strong\u003etate \u003cstrong\u003eT\u003c/strong\u003eransfer yang merupakan standar arsitektur komunikasi berbasis web yang digunakan sebagai jembatan antara back-end dan front-end. REST API menggunakan protocol HTTP (Hypertext Transfer Protocol) sebagai protocol komunikasi data. REST API menyampaikan perintah atau permintaan (request) dari sisi frontend agar diproses oleh sisi backend, selanjutnya sisi backend mengolah data sesuai dengan permintaan dan mengembalikan response kepada sisi frontend.\n\n## Pengenalan Http Method\n\nHTTP adalah singkatan dari \u003cstrong\u003eHypertext Transfer Protocol\u003c/strong\u003e. Protokol ini digunakan untuk mentransfer data melalui internet, terutama untuk mengakses halaman web. Ini adalah protokol komunikasi yang digunakan antara klien (seperti browser web) dan server (tempat di mana situs web disimpan).\n*ada banyak framework untuk mengolah http di node, tapi dalam modul ini akan memakai `express.js` \n\n### Beberapa contoh method HTTP yang umum digunakan:\n- GET: Method ini digunakan untuk meminta data dari suatu resource di server. Contohnya adalah saat Anda mengakses sebuah halaman web melalui browser. Permintaan GET mengambil informasi tanpa mengubah data yang ada di server.\n\n- POST: Method ini digunakan untuk mengirimkan data ke server untuk membuat atau memperbarui resource. Misalnya, ketika Anda mengisi formulir pendaftaran online dan mengklik tombol \"Submit\", data yang Anda masukkan dikirimkan ke server menggunakan method POST.\n\n- PUT: Method ini digunakan untuk mengirimkan data ke server untuk memperbarui atau membuat resource di lokasi yang ditentukan. Biasanya digunakan dalam aplikasi yang memungkinkan pengguna untuk memperbarui informasi.\n\n- DELETE: Method ini digunakan untuk menghapus resource yang ditentukan di server. Misalnya, ketika Anda ingin menghapus postingan di media sosial, permintaan DELETE akan dikirimkan ke server untuk menghapus konten tersebut.\n\n- PATCH: Method ini digunakan untuk memperbarui sebagian kecil dari resource di server. Dibandingkan dengan PUT yang menggantikan seluruh resource, PATCH digunakan untuk melakukan perubahan kecil atau spesifik pada resource.\n\nuntuk dokumentasi lengkap bisa dilihat di [`Modul Pengenalan REST API`](https://drive.google.com/drive/folders/10cFXJ3iqhzZaIs8GOb0RZSjKJZCEOG-X?usp=drive_link).\n\n## Pengenalan Sequelize\n\nSequelize adalah sebuah ORM (Object-Relational Mapping) untuk Node.js yang mendukung berbagai macam basis data relasional seperti MySQL, PostgreSQL, SQLite, dan lainnya. Ini memudahkan pengembang dalam berinteraksi dengan basis data menggunakan objek JavaScript, mengabstraksi query SQL dan memungkinkan manipulasi data dengan lebih mudah.\n\n### Cara instalasi Sequelize:\n```cmd\n#npm\nnpm install --save sequelize\n\n#yarn\nyarn add sequelize\n\n#pnpm\npnpm install sequelize\n```\n### Cara membuat Sequelize init:\n- Jalankan perintah:\n```cmd\nnpx sequelize-cli init\n#Atau jika Anda sudah menginstall Sequelize CLI secara global:\nsequelize-cli init\n```\nPerintah sequelize-cli init akan membuat struktur proyek Sequelize yang standar, termasuk folder config, models, migrations, dan seeders. Ini akan mempersiapkan proyek Anda untuk mulai menggunakan Sequelize dengan basis data yang sudah ditentukan.\n\nPastikan untuk menyesuaikan konfigurasi basis data Anda di file config/config.json setelah inisialisasi agar Sequelize dapat terhubung ke basis data yang diinginkan.\n\nuntuk dokumentasi lengkap bisa dilihat di [`Sequelize Documentation`](https://sequelize.org/).\n### Sequelize Relationship\nSequelize relationships adalah cara untuk menghubungkan antara model-model data dalam basis data relasional menggunakan Sequelize, sehingga model-model tersebut bisa saling terkait satu sama lain.\n\nIni mirip dengan hubungan antar tabel dalam basis data relasional. Dalam Sequelize, terdapat beberapa jenis hubungan antara model-model:\n\n- `One-to-One`: Setiap entitas pada satu model terhubung dengan tepat satu entitas pada model lain. Misalnya, setiap User memiliki satu Profile.\n\n- `One-to-Many`: Setiap entitas pada satu model terhubung dengan banyak entitas pada model lain. Contohnya, satu Author dapat memiliki banyak Books.\n\n- `Many-to-Many`: Banyak entitas pada satu model terhubung dengan banyak entitas pada model lain. Sebagai contoh, Student dapat memiliki banyak Subjects, dan setiap Subject bisa memiliki banyak Students.\n\nSequelize menyediakan metode untuk mendefinisikan dan mengonfigurasi jenis-jenis hubungan ini antara model-model. Anda dapat menggunakan fungsi-fungsi seperti `belongsTo`, `hasMany`, `hasOne`, dan `belongsToMany` untuk menentukan bagaimana model-model saling berhubungan.\n\n- `belongsTo`: Menghubungkan model dengan hubungan satu-ke-satu atau satu-ke-banyak dimana model yang terkait (target) berada di sisi yang mempunyai kunci asing (foreign key). Misalnya, jika Anda memiliki model Comment yang 'belongsTo' Post, maka setiap Comment akan memiliki kunci asing yang menunjuk ke Post.\n\n- `hasMany`: Hubungan sebaliknya dari belongsTo. Ini menghubungkan model dengan hubungan satu-ke-banyak dimana model yang terkait (target) memiliki kunci asing yang merujuk kembali ke model asal. Contohnya, jika Post memiliki 'hasMany' Comment, setiap Post dapat memiliki banyak Comment.\n\n- `hasOne`: Menghubungkan model dengan hubungan satu-ke-satu. Ini serupa dengan belongsTo, tetapi menegaskan bahwa setiap entitas dalam model memiliki tepat satu entitas yang terkait dalam model lain.\n\n- `belongsToMany`: Digunakan ketika hubungan antara model-model melibatkan asosiasi banyak-ke-banyak. Misalnya, jika Anda memiliki model User dan model Group, dan seorang User dapat berada di banyak Group dan sebaliknya, Anda akan menggunakan 'belongsToMany'.\n\nDengan menggunakan Sequelize relationships, Anda dapat melakukan operasi join, mengambil data terkait dari beberapa tabel sekaligus, dan membuat kueri yang lebih kompleks untuk mengelola data dalam basis data relasional dengan lebih mudah dan terstruktur.\n### Sequelize Migration dan Model\n`Sequelize Migration`: Ini adalah alat yang memungkinkan Anda untuk mengelola skema basis data. Migration adalah file JavaScript yang berisi instruksi untuk membuat atau mengubah struktur tabel dan kolom dalam basis data Anda. Dengan menggunakan migration, Anda dapat membuat perubahan pada struktur basis data secara terkendali dan dapat diterapkan secara teratur ke berbagai lingkungan (development, production, dll.) tanpa kehilangan data.\n\n`Sequelize Model`: Model dalam Sequelize adalah representasi dari tabel dalam basis data dalam bentuk objek JavaScript. Setiap model biasanya terkait dengan tabel dalam basis data dan memungkinkan Anda untuk melakukan operasi CRUD (Create, Read, Update, Delete) pada data dalam tabel tersebut menggunakan objek JavaScript. Anda dapat mendefinisikan struktur, hubungan, validasi, dan operasi lainnya pada model untuk mengelola data secara terstruktur.\n\n## Pengenalan Express Js\n\nExpress.js adalah framework web yang berbasis pada Node.js yang memudahkan pembuatan aplikasi web dengan Node. Express menyediakan berbagai fitur untuk membangun server HTTP dengan mudah, seperti routing, middleware, pengelolaan permintaan dan respons, dan masih banyak lagi.\n### Beberapa Fitur di Express Js\n- Routing: Express memungkinkan definisi rute untuk menangani permintaan HTTP ke berbagai endpoint. Misalnya:\n```js\nconst express = require('express');\nconst app = express();\n\napp.get('/', (req, res) =\u003e {\n    res.send('Halo, ini adalah halaman utama!');\n});\n\napp.post('/users', (req, res) =\u003e {\n    // Logic untuk menambah pengguna ke basis data\n    res.send('Pengguna berhasil ditambahkan!');\n});\n```\n- Middleware: Middleware adalah fungsi-fungsi yang dijalankan sebelum permintaan tiba ke handler akhir. Contohnya adalah middleware untuk logging, autentikasi, manipulasi data, dll.\n```js\napp.use(express.json()); // Middleware untuk meng-handle body JSON pada request\napp.use(loggerMiddleware); // Contoh middleware untuk logging\n```\n- Handler/ Controller untuk Permintaan HTTP: Express memungkinkan Anda menangani berbagai jenis permintaan HTTP seperti GET, POST, PUT, DELETE, dll.\n```js\napp.get('/products/:id', (req, res) =\u003e {\n    const productId = req.params.id;\n    // Logika untuk mengambil informasi produk berdasarkan ID\n    res.send(`Informasi produk dengan ID ${productId}`);\n});\n```\nuntuk dokumentasi lengkap bisa dilihat di [`Express Documentation`](https://expressjs.com/).\n\n\n## Pembuatan Aplikasi School Library\n`langkah 1` :  \njalankan perintah:\n```\nnpm init --y \n```\n\n`langkah 2` :\ninstal dependencies:\n```\nnpm install body-parser cors express fs joi jsonwebtoken md5 multer mysql2 path sequelize\n```\nlalu jalankan perintah ini untuk menginisiasikan sequelize\n```\nnpx sequelize-cli init\n```\n*jika terjadi error `ERR!` code ENOENT || `ERR!` syscall istat maka jalankan perintah ini terlebih dahulu ```npm install npm -g``` lalu ulangi inisialisasi sequelize\n\n`langkah 3` :\nbuat database dengan menjalankan perintah ini:\n```sql\nCREATE DATABASE school_library;\n```\nsesuaikan `config.json` dengan database yang dimiliki:\n```json\n\"development\": {\n    \"username\": \"root\",\n    \"password\": null,\n    \"database\": \"school_library\",\n    \"host\": \"127.0.0.1\",\n    \"dialect\": \"mysql\"\n},\n```\n\n`langkah 4` :\nsequelize migration dan model:\n\nDalam kasus ini kita akan membuat struktur tabel seperti berikut ini.\n\u003cdiv align=\"center\"\u003e\n    \u003cimg src=\"https://github.com/panntod/School-Lib-Modul/blob/main/table-designer.png?raw=true\" alt=\"foto table desiger\" style=\"display: block; margin-left: auto; margin-right: auto;\"\u003e\n\u003c/div\u003e\n\n*Struktur tabel yang dibuat terlebih dahulu adalah tabel yang bersifat parent (tidak ada relasi ke tabel yang lain)\n\n- pembuatan migration dan model `book`, jalankan perintah ini:\n```\nnpx sequelize-cli model:generate --name Book --attributes isbn:string,title:string,author:string,publisher:string,category:string,stock:integer,cover:string\n```\n- pembuatan migration dan model `member`, jalankan perintah ini:\n```\nnpx sequelize-cli model:generate --name Member --attributes name:string,gender:string,contact:string,address:string\n```\n- pembuatan migration dan model `admin`, jalankan perintah ini:\n```\nnpx sequelize-cli model:generate --name Admin --attributes name:string,contact:string,address:string,username:string,password:string\n```\n- pembuatan migration dan model `borrow`, jalankan perintah ini:\n```\nnpx sequelize-cli model:generate --name Borrow --attributes memberID:integer,adminID:integer,date_of_borrow:date,date_of_return:date,status:boolean\n```\n- pembuatan migration dan model `details_of_borrow`, jalankan perintah ini:\n```\nnpx sequelize-cli model:generate --name DetailOfBorrow --attributes borrowID:integer,bookID:integer,qty:integer\n```\n\n`langkah 5` :\nSequelize Relationship:\n\nsesuaikan semua isi di `models`, contoh:\nRelasi tabel “admins” dan tabel “borrows” dengan key “id” dari tabel “admins” dan key “adminID” dari tabel “borrows”. Dari sisi tabel “admins”, relasi yang terjadi adalah “each admin has many borrowed books”. Oleh karena itu di file model “admin” kita akan menambahkan code untuk membuat relasi tersebut.\n```js\nclass admin extends Model {\n   //Ini adalah metode statis yang digunakan untuk mendefinisikan asosiasi atau hubungan antara model \"admin\" dengan model-model lain. \n   static associate(models) {\n     this.hasMany(models.borrow, {\n       foreignKey: `adminID`, as: \"borrow\"\n     })\n   }\n}\n```\n\nSedangkan relasi dari sisi tabel “borrows”, relasi yang terjadi adalah “each\nborrowed book belongs to one admin”. Oleh karena itu di file model “borrow”\nkita akan menambahkan code untuk mengimplementasi relasi tersebut.\n```js\nclass borrow extends Model {\n       //Ini adalah metode statis yang digunakan untuk mendefinisikan asosiasi atau hubungan antara model \"borrow\" dengan model-model lain. \n       static associate(models) {\n        this.belongsTo(models.admin)\n        this.belongsTo(models.member)\n        this.hasMany(models.detail_of_borrow, {\n          foreignKey: `borrowID`, as: \"detail_of_borrow\"\n        })\n      }\n}\n```\n*lakukan kepada semua table yang memiliki relationship\n\n`langkah 6` :\nLakukan migrate database dengan perintah:\n```\nnpx sequelize-cli db:migrate\n```\n\njika terjadi error jalankan perintah ini:\n```\nnpx sequelize-cli db:migrate:undo:all\n```\n*pastikan urutan file di `/migration` adalah `book`, `member`, `admin`, `borrow`, `detail_of_borrow`, lalu ulangi `db:migrate`\n\n- Setelah ini kalian bisa melanjutkan dengan membaca  [`3. Modul Node - Sequelize - Part 2`](https://drive.google.com/drive/folders/10cFXJ3iqhzZaIs8GOb0RZSjKJZCEOG-X?usp=drive_link) atau melihat code yang sudah saya publikasi kan di repositori ini\n\n## Urutan Pembuatan file: \n1. config (done)\n2. migration (done)\n3. models (done)\n4. seeders (optional)\n5. controller\n     - upload\n     - book\n     - admin\n     - member\n     - borrow\n6. routes\n     - book\n     - admin\n     - member\n     - borrow\n7. image (folder kosong)\n8. middleware\n     - auth\n     - validate\n9. routes\n     - auth\n10. server\n\n## Tata cara clone repositori ini\n- jalankan perintah:\n```git\ngit clone https://github.com/panntod/School-Lib-Modul.git\n```\n- masuk ke direktori, lalu jalankan perintah ini:\n```bash\nnpm install\nor\npnpm install\n```\n- untuk menjalankan aplikasi init gunakan perintah ini:\n```bash\nnpm start\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpanntod%2Fschool-lib-modul","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpanntod%2Fschool-lib-modul","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpanntod%2Fschool-lib-modul/lists"}