Pada folder application akan berisi 1 file yang bernama application yang mana isi dari file application hanya memuat global middleware, Selain itu dibuatnya file application juga untuk memisahkan file server atau main app yang berisi proses listen port(menjalankan applikasi).
Menggapa file application dan server harus dipisahkan ????
Tujuan file tersebut dipisahkan karena unutuk mempermudah proses automation testing(unit test) karena by default ketika kita menggunakan jest sebagai unit test jest tidak dapat menjalankan unit test jika source(target/server) contain proses listeningport(menjalankan server)
jadi file server digunakan untuk listening port(start server) dan file application digunakan untuk melakukan automation test
Pada Folder controllers disini akan memuat semua file controllers
Folder db disini akan memuat 2 folder yaitu config dan models :
- config: pada folder ini akan memuat konfigurasi-konfigurasi dari database, misalnya seperti koneksi database, database pooling dan sebagainya
- models: pada folder ini akan memuat semua model atau repository yang digunakan untuk berinteraksi dengan database.
Pada folder errors akan memuat semua jenis execptions atau custom exceptions, misalnya kita membuat sebuah custum exception yang digunakan untuk menghadle data yang tidak ditemukan didalam database maka kita bisa membuat file custom exception tersebut pada folder errors.
Pada folder middlewares ini akan memuat semua jenis middleware mulai dari :
- buil-in-middleware
- exception-handler-middleware
- third-party-midddleware
- application-middleware
Didalam folder routes akan memuat semua routes
Didalam folder services akan memuat semua service dan bisnis logic dari applikasi
Folder utils atau bisa disebut juga dengan helper akan memuat semua kode(codingan) yang kurang relavan dengan proses bisnis logic atau untuk menyimpan fungsi yang sifatnya reussable(dipakai berkali-kali)
Pada folder validations disini akan memuat file-file validation atau codingan yang digunakan untuk melakukan validasi
pada foldet tests ini akan memuat semua file automation test(unit test)
Degan demikian maka kode yang akan dikembangkan menjadi modular dan tiap-tiap file akan berfokus pada logic nya masing-masing dan tiap-tiap logic menjadi desentralize(terletak pada tempatnya masing-masing sesuai dengan kriterianya). Dengan demikian harapanya akan mempermudah proses maintanance kode, ketika kita perlu melakukan perubahan pada suatu logic misalnya "Ah....saya sepertinya butuh mengubah response dari exception ketika terjadi Error UsrnameNotFound" maka kita hanya perlu mambukan folder exception dan mengubahnya sesuai dengan case.
Pada dasarnya filosofi dari struktur folder tesebut menganut filosofi Rak atau lemari. yang mana pada lemari atau rak buku dsb akan memisahkan baju atau buku sesuai dengan tempatnya masing-masing misalnya ketika kita ingin menyimpan baju main, baju kerja, baju tidur kita akan memisahkan tempat-tempat baju tersebut sesuai dengan tempatnya masing-masing yang tujuanya agar mudah kita ingin mencarinya baju atau buku tersebut ... "Ahh.... aku mau kerja maka aku bisa mencari baju kerjaku di lemari sesuai pada tempat baju kerja diletakan :)"
Sallam Penullis : Diatas merupakan best practice versi penulis berdasarkan case-case yang pernah dialami oleh penulis jikalau temen-temen memiliki bestpractice yang lain lets discus now guys:) cheerss: >_<
Writen by anata alliano
{
"firstName": "audia",
"lastName": "naila",
"email": "naila@adams.co.id",
"password": "randomPass"
}{
"message": "Successfully register"
}{
"firstName": "audia",
"lastName": "naila",
"email": "nailaadams.co.id",
"password": "randomPass"
}{
"message": [
{
"validation": "email",
"code": "invalid_string",
"message": "Invalid email",
"path": ["email"]
}
]
}{
"firstName": "audia",
"lastName": "naila",
"email": "another@gmail.com",
"password": "randomPass"
}{
"message": "email with another@gmail.com alredy use, please use another email"
}{
"firstName": "abdillah",
"lastName": "Alli",
"email": "another@gmail.com",
"password": "secreet-pass",
"Address": {
"country": "Indonesian",
"province": "East java",
"city": "Surabaya",
"vilage": "Konoha"
}
}{
"message": "Successfully register"
}{
"firstName": 23498732,
"lastName": "Alli",
"email": "another@gmail.com",
"password": "secreet-pass",
"Address": {
"country": "Indonesian",
"province": "East java",
"city": "Surabaya",
"vilage": "Konoha"
}
}{
"message": [
{
"code": "invalid_type",
"expected": "string",
"received": "number",
"path": ["firstName"],
"message": "Expected string, received number"
}
]
}{
"email": "naila@adams.co.id",
"password": "randomPass"
}{
"message": "successfully login",
"token": "546fa1df-274e-4fae-937c-e6ca6d13d38e"
}{
"email": "nailaadams.co.id",
"password": "randomPass"
}invalid type
{
"message": [
{
"validation": "email",
"code": "invalid_string",
"message": "Invalid email",
"path": ["email"]
}
]
}{
"email": "naila@adams.co.id",
"password": "randomPass"
}{
"message": "email or password wrong"
}{
"email": "somethingadams.co.id",
"password": 1342254
}{
"message": [
{
"validation": "email",
"code": "invalid_string",
"message": "Invalid email",
"path": ["email"]
},
{
"code": "invalid_type",
"expected": "string",
"received": "number",
"path": ["password"],
"message": "Expected string, received number"
}
]
}{
"email": "naila@adams.co.id",
"password": "randomPass"
}{
"message": "successfully login",
"token": "650b6ba2-1952-4a32-a62f-7dbd29ad2a31"
}Required : X-API-TOKEN
{
"name": "Rinso",
"category": "Sembako"
}{
"secureId": "31253071-1eff-4828-8d60-d6ebf24dac77",
"id": 15,
"name": "Rinso",
"category": "Sembako",
"updatedAt": "2024-05-23T05:36:32.747Z",
"createdAt": "2024-05-23T05:36:32.747Z"
}Required: X-API-TOKEN
{
"country": "Indonesian",
"province": "East java",
"city": "Surabaya",
"vilage": "Konoha"
}{
"secureId": "ee976e56-d5d5-425e-a502-3b19292ea8aa",
"id": 39,
"country": "Indonesian",
"province": "East java",
"city": "Surabaya",
"vilage": "Konoha",
"UserId": 79,
"updatedAt": "2024-05-23T05:38:19.072Z",
"createdAt": "2024-05-23T05:38:19.072Z"
}Required: X-API-TOKEN
{
"productId": 14
}{
"secureId": "545ce2e2-e182-4467-8ba9-38fcb2fcaa5f",
"id": 12,
"buyer": "abdillah",
"product": "Rinso",
"country": "Indonesian",
"province": "East java",
"city": "Surabaya",
"vilage": "Konoha",
"updatedAt": "2024-05-23T05:43:31.203Z",
"createdAt": "2024-05-23T05:43:31.203Z"
}Required: X-API-TOKEN
GET http://localhost:9000/v1/transaction
[
{
"id": 11,
"secureId": "8335e4d6-d876-440c-8417-08c59ff3774f",
"product": "Rinso",
"buyer": "abdillah",
"country": "Indonesian",
"province": "East java",
"city": "Surabaya",
"vilage": "Konoha",
"createdAt": "2024-05-23T02:59:13.478Z",
"updatedAt": "2024-05-23T02:59:13.478Z"
},
{
"id": 12,
"secureId": "545ce2e2-e182-4467-8ba9-38fcb2fcaa5f",
"product": "Rinso",
"buyer": "abdillah",
"country": "Indonesian",
"province": "East java",
"city": "Surabaya",
"vilage": "Konoha",
"createdAt": "2024-05-23T05:43:31.203Z",
"updatedAt": "2024-05-23T05:43:31.203Z"
}
]