Akhirnya sudah mencapai pembelajaran akhir di CAMP Ruangguru, ini adalah tugas akhir kalian yang wajib diselesaikan sebagai syarat kelulusan dari CAMP Ruangguru.
Ini adalah lanjutan aplikasi dari assignment sebelumnya yaitu Task Tracker Plus yang dirancang untuk membantu mahasiswa dalam mengatur jadwal studi mereka. Dibangun menggunakan bahasa pemrograman Go (Golang).
Pada tugas ini, kalian akan mengimplementasikan konsep REST API dan juga akan membangun sebuah aplikasi web yang akan mengimplementasikan konsep MVC. Aplikasi ini adalah monolith dimana seluruh sistemnya memakai server, logika, database, hingga user interface yang sama:
- users
- Mengirim permintaan POST ke endpoint
/user/register
untuk proses registrasi - Mengirim permintaan POST ke endpoint
/user/login
untuk proses login - Mendapatkan daftar user dengan task dan kategorinya dengan mengirimkan permintaan GET ke endpoint
/user/tasks
.
- Mengirim permintaan POST ke endpoint
- task
- Menambahkan tugas baru dengan mengirimkan permintaan POST ke endpoint
/task/add
. - Mengambil informasi tugas berdasarkan ID dengan mengirimkan permintaan GET ke endpoint
/task/get/:id
. - Memperbarui informasi tugas dengan mengirimkan permintaan PUT ke endpoint
/task/update/:id
. - Menghapus tugas dengan mengirimkan permintaan DELETE ke endpoint
/task/delete/:id
. - Mendapatkan daftar tugas dengan mengirimkan permintaan GET ke endpoint
/task/list
. - Mendapatkan daftar tugas berdasarkan ID kategori dengan mengirimkan permintaan GET ke endpoint
/task/category/:id
.
- Menambahkan tugas baru dengan mengirimkan permintaan POST ke endpoint
- category
- Menambahkan kategori baru dengan mengirimkan permintaan POST ke endpoint
/category/add
. - Mengambil informasi kategori berdasarkan ID dengan mengirimkan permintaan GET ke endpoint
/category/get/:id
. - Memperbarui informasi kategori dengan mengirimkan permintaan PUT ke endpoint
/category/update/:id
. - Menghapus kategori dengan mengirimkan permintaan DELETE ke endpoint
/category/delete/:id
. - Mendapatkan daftar kategori dengan mengirimkan permintaan GET ke endpoint
/category/list
.
- Menambahkan kategori baru dengan mengirimkan permintaan POST ke endpoint
API ini menggunakan database PostgreSQL untuk menyimpan data pengguna, tugas dan kategori.
Note: untuk mengakses endpoint
task
dancategory
pengguna harus melakukan login terlebih dahulu.
Client (Frontend)
-
index
-
Halaman landing page dari aplikasi ini dapat diakses dari root endpoint
/
Disini berjalan di
http://localhost:8080/
-
-
users
- Tampilkan halaman login dengan endpoint
/client/login
. - Proses autentikasi pengguna dengan endpoint
/client/login/process
menggunakan metode POST. - Tampilkan halaman registrasi dengan endpoint
/client/register
. - Proses pendaftaran pengguna baru dengan endpoint
/client/register/process
menggunakan metode POST.. - Logout pengguna dengan endpoint
/client/logout
.
- Tampilkan halaman login dengan endpoint
-
dashboard
- Tampilkan halaman dashboard dengan endpoint
/client/dashboard
.
- Tampilkan halaman dashboard dengan endpoint
-
task
- Tampilkan halaman tugas dengan endpoint
/client/task
.
- Tampilkan halaman tugas dengan endpoint
-
category
- Tampilkan halaman kategori dengan endpoint
/client/category
.
- Tampilkan halaman kategori dengan endpoint
-
modal
- Tampilkan halaman modal dengan endpoint
/client/modal
.
- Tampilkan halaman modal dengan endpoint
Aplikasi ini memiliki 4 tabel utama, yaitu sessions
, users
, tasks
dan categories
. Tabel sessions
digunakan untuk menyimpan data session dari pengguna yang sedang login, tabelusers
digunakan untuk menyimpan data pengguna, tabel tasks
digunakan untuk menyimpan data-data tugas dan tabel categories
digunakan untuk menyimpan data-data kategori.
Satu user
bisa memiliki satu sessions
sehingga memiliki relasi one to one
. Satu user
bisa memiliki banyak task
dan satu kategori bisa memiliki banyak task
, sehingga relasi antara user
dengan task
adalah one to many
, begitu juga dengan relasi category
dengan task
, one-to-many
.
π repository
Ini adalah fungsi yang berinteraksi dengan database Postgres menggunakan GORM:
Warning : abaikan code yang tidak berhubungan dengan instruksi di bawah ini pada folder
repository
-
repository/session.go
AddSessions
: fungsi ini menerima parameter bertipemodel.Session
dan berfungsi menyimpan data sesuai parameter tersebut ke tabelsessions
UpdateSessions
: fungsi ini menerima parameter bertipemodel.Session
dan berfungsi mengubah data session sesuai parameter tersebut ke tabelsessions
dengan kondisi sama antara email parameter dengan database.DeleteSession
: fungsi ini menerima parameter token bertipestring
dan berfungsi menghapus data tabelsessions
sesuai dengan target token dari parameter yang diterima.SessionAvailToken
: fungsi ini menerima parameter token bertipestring
dan berfungsi memeriksa apakah token tersedia pada tabelsessions
sesuai dengan kolom token sama dengan nilai dari parameter.- Jika session ditemukan, maka kembalikan data session dalam bentuk
model.Session
dan errornil
- Jika session tidak ditemukan, maka kembalikan data session kosong dalam bentuk
model.Session
dan error message
- Jika session ditemukan, maka kembalikan data session dalam bentuk
SessionAvailEmail
: fungsi ini menerima parameter email bertipestring
dan berfungsi memeriksa apakah token tersedia pada tabelsessions
sesuai dengan kolom email sama dengan nilai dari parameter.- Jika session ditemukan, maka kembalikan data session dalam bentuk
model.Session
dan errornil
- Jika session tidak ditemukan, maka kembalikan data session kosong dalam bentuk
model.Session{}
dan error message
- Jika session ditemukan, maka kembalikan data session dalam bentuk
-
repository/user.go
GetUserByEmail
: fungsi ini menggunakan library GORM untuk mengambil data pengguna berdasarkan alamat email yang diberikan sebagai argumen. Pertama-tama, fungsi akan mengeksekusi sebuah querySELECT
untuk mencari pengguna dengan email yang cocok di dalam tabelusers
. Query tersebut akan menggunakan klausaWHERE
dengan kondisi email yang diberikan.- Jika pengguna dengan email yang cocok ditemukan, data pengguna akan diassign ke variabel
user
yang merupakan objek dari modelUser
. fungsi akan mengembalikanuser
dannil
sebagai error. - Namun jika tidak ditemukan pengguna dengan email yang cocok, fungsi akan mengembalikan
user
kosong dannil
sebagai error. - Jika terjadi error lain selama proses tersebut, fungsi akan mengembalikan error yang terjadi.
- Jika pengguna dengan email yang cocok ditemukan, data pengguna akan diassign ke variabel
GetUserTaskCategory
: fungsi ini digunakan untuk mendapatkan kategori tugas pengguna dari database. Fungsi ini menjalankan query menggunakan library GORM yang melakukan beberapa join dan memilih kolom tertentu dari tabelusers
,tasks
, dancategories
. Hasil kategori tugas pengguna akan dikembalikan sebagai slice[]model.UserTaskCategory
.- Fungsi ini mengembalikan daftar kategori tugas pengguna yang ditemukan dan
nil
sebagai error. - Jika terjadi error saat menjalankan query, fungsi ini akan mengembalikan error yang terjadi.
- Fungsi ini mengembalikan daftar kategori tugas pengguna yang ditemukan dan
-
repository/task.go
Update
: fungsi akan mengeksekusi sebuah queryUPDATE
untuk memperbarui data tugas tersebut di dalam tabeltasks
berdasarkan id yang diberikan pada parameter. Query tersebut akan menggunakan nilai dari variabelmodel.Task
yang diberikan sebagai argumen.- Jika proses tersebut berhasil, fungsi akan mengembalikan
nil
sebagaierror
. - Namun jika terjadi error pada proses tersebut, fungsi akan mengembalikan
error
yang terjadi.
- Jika proses tersebut berhasil, fungsi akan mengembalikan
Delete
: fungsi untuk menghapus data tugas berdasarkanid
yang diberikan sebagai argumen. Fungsi ini akan mengeksekusi sebuah queryDELETE
untuk menghapus data tugas denganid
tersebut dari tabeltasks
.- Jika proses tersebut berhasil, fungsi akan mengembalikan
nil
sebagaierror
. - Namun jika terjadi error pada proses tersebut, fungsi akan mengembalikan
error
yang terjadi.
- Jika proses tersebut berhasil, fungsi akan mengembalikan
GetList
: fungsi untuk mengambil daftar data tugas dari tabeltasks
. Fungsi akan mengeksekusi sebuah querySELECT
untuk mengambil semua data tugas yang ada dalam tabel.- Jika proses tersebut berhasil, fungsi akan mengembalikan slice
[]*model.Task
yang berisi data tugas yang ditemukan, sertanil
sebagaierror
. - Namun jika terjadi error pada proses tersebut, fungsi akan mengembalikan
nil
sebagai slice[]*model.Task
, sertaerror
yang terjadi.
- Jika proses tersebut berhasil, fungsi akan mengembalikan slice
GetTaskCategory
: fungsi untuk mengambil kategori tugas berdasarkanid
yang diberikan sebagai argumen. Fungsi akan mengeksekusi sebuah querySELECT
dengan menggunakan join tabel antaratasks
dancategories
untuk mengambil informasi kategori tugas yang sesuai denganid
yang diberikan.- Jika proses tersebut berhasil, fungsi akan mengembalikan slice
[]*model.TaskCategory
yang berisi kategori tugas yang ditemukan, sertanil
sebagaierror
. - Namun jika terjadi error pada proses tersebut, fungsi akan mengembalikan
nil
sebagai slice[]*model.TaskCategory
, sertaerror
yang terjadi.
- Jika proses tersebut berhasil, fungsi akan mengembalikan slice
-
repository/category.go
Update
: fungsi untuk memperbarui kategori berdasarkanid
yang diberikan sebagai argumen. Fungsi akan mengeksekusi sebuah queryUPDATE
untuk memperbarui data kategori yang sesuai denganid
yang diberikan dalam tabelcategories
. Query tersebut akan menggunakan nilai dari variabelmodel.Category
yang diberikan sebagai argumen.- Jika proses tersebut berhasil, fungsi akan mengembalikan
nil
sebagaierror
. - Namun jika terjadi error pada proses tersebut, fungsi akan mengembalikan
error
yang terjadi.
- Jika proses tersebut berhasil, fungsi akan mengembalikan
Delete
: fungsi untuk menghapus kategori berdasarkanid
yang diberikan sebagai argumen. Fungsi akan mengeksekusi sebuah queryDELETE
untuk menghapus data kategori denganid
tersebut dari tabelcategories
.- Jika proses tersebut berhasil, fungsi akan mengembalikan
nil
sebagaierror
. - Namun jika terjadi error pada proses tersebut, fungsi akan mengembalikan
error
yang terjadi.
- Jika proses tersebut berhasil, fungsi akan mengembalikan
GetList
: fungsi untuk mengambil daftar kategori dari tabelcategories
. Fungsi akan mengeksekusi sebuah querySELECT
untuk mengambil semua data kategori yang ada dalam tabel.- Jika proses tersebut berhasil, fungsi akan mengembalikan slice
[]*model.Category
yang berisi data kategori yang ditemukan, sertanil
sebagaierror
. - Namun jika terjadi error pada proses tersebut, fungsi akan mengembalikan
nil
sebagai slice[]*model.Category
, sertaerror
yang terjadi.
- Jika proses tersebut berhasil, fungsi akan mengembalikan slice
π service
Layer service digunakan untuk memproses data sesuai dengan aturan bisnis yang telah ditentukan.
-
service/session.go
GetSessionByEmail
: fungsi ini menggunakan repositorysessionRepo
untuk menampilkan data session tabel sessions kolom email sama dengan email yang diberikan dari parameter.- Jika session ditemukan, maka kembalikan data session dalam bentuk
model.Session
dan errornil
- Jika session tidak ditemukan, maka kembalikan data session kosong dalam bentuk
model.Session{}
dan error message
- Jika session ditemukan, maka kembalikan data session dalam bentuk
-
service/user.go
GetUserTaskCategory
: Fungsi ini digunakan untuk mendapatkan kategori tugas pengguna.- Fungsi akan memanggil repository
userRepo
untuk mengambil daftar kategori tugas pengguna dari database. - Jika pengambilan data berhasil, fungsi akan mengembalikan daftar kategori tugas pengguna tersebut.
- Jika terjadi error selama proses pengambilan data, fungsi akan mengembalikan error yang terjadi.
- Fungsi akan memanggil repository
-
service/task.go
Update
: fungsi ini menggunakan repositorytaskRepository
untuk memperbarui data tugas.- Jika pembaruan berhasil, fungsi mengembalikan
nil
sebagaierror
- Jika terjadi error, fungsi mengembalikan
error
yang terjadi.
- Jika pembaruan berhasil, fungsi mengembalikan
Delete
: fungsi ini menggunakan repositorytaskRepository
untuk menghapus data tugas berdasarkanid
.- Jika penghapusan berhasil, fungsi mengembalikan
nil
sebagaierror
. - Jika terjadi error, fungsi mengembalikan
error
yang terjadi.
- Jika penghapusan berhasil, fungsi mengembalikan
GetList
: fungsi ini menggunakan repositorytaskRepository
untuk mengambil daftar tugas.- Jika pengambilan daftar tugas berhasil, fungsi mengembalikan daftar tugas (
[]*model.Task
) dannil
sebagaierror
. - Jika terjadi error saat pengambilan daftar tugas, fungsi mengembalikan nil sebagai daftar tugas (
[]*model.Task
) danerror
yang terjadi.
- Jika pengambilan daftar tugas berhasil, fungsi mengembalikan daftar tugas (
GetTaskCategory
: fungsi ini menggunakan repositorytaskRepository
untuk mengambil daftar tugas beserta dengan kategorinya.- Jika pengambilan kategori tugas berhasil, fungsi mengembalikan kategori tugas (
[]*model.TaskCategory
) dannil
sebagaierror
. - Jika terjadi error saat pengambilan kategori tugas, fungsi mengembalikan
nil
sebagai kategori tugas ([]*model.TaskCategory
) danerror
yang terjadi.
- Jika pengambilan kategori tugas berhasil, fungsi mengembalikan kategori tugas (
-
service/category.go
Update
: fungsi ini menggunakan repositorycategoryRepository
untuk memperbarui data kategori berdasarkanid
yang diberikan dari parameter.- Jika pembaruan berhasil, fungsi mengembalikan
nil
sebagaierror
- Jika terjadi error, fungsi mengembalikan
error
yang terjadi.
- Jika pembaruan berhasil, fungsi mengembalikan
Delete
: fungsi ini menggunakan repositorycategoryRepository
untuk menghapus data kategori berdasarkanid
.- Jika penghapusan berhasil, fungsi mengembalikan
nil
sebagaierror
. - Jika terjadi error, fungsi mengembalikan
error
yang terjadi.
- Jika penghapusan berhasil, fungsi mengembalikan
GetList
: fungsi ini menggunakan repositorycategoryRepository
untuk mengambil daftar kategori.- Jika pengambilan daftar kategori berhasil, fungsi mengembalikan daftar kategori (
[]*model.Category
) dannil
sebagaierror
. - Jika terjadi error saat pengambilan daftar kategori, fungsi mengembalikan
nil
sebagai daftar kategori ([]*model.Category
) danerror
yang terjadi.
- Jika pengambilan daftar kategori berhasil, fungsi mengembalikan daftar kategori (
π middleware
Di file middleware/auth.go
terdapat fungsi Auth()
yang digunakan untuk melakukan autentikasi pengguna dengan menggunakan JWT (JSON Web Token). Middleware ini berfungsi untuk mengecek apakah user yang mengakses suatu endpoint atau route tertentu sudah terotentikasi atau belum. Fungsi ini terdiri dari beberapa langkah:
-
Mengambil cookie dengan nama session_token dari request dengan key
session_token
. Cookie ini berisi JWT token yang digunakan untuk autentikasi. -
Parsing JWT token pada cookie tersebut untuk mendapatkan claims yang berisi informasi mengenai
email
. JWT token pada cookie tersebut akan di-parse menggunakan JWT library pada Go, yaitu jwt-go. Setelah di-parse, claims pada token tersebut akan dimasukkan ke dalam structClaims
.type Claims struct { Email int `json:"email"` jwt.StandardClaims }
Claims pada JWT token ini dapat berisi informasi user yang terotentikasi seperti user ID, email, dan lain-lain. Disini, hanya user ID yang dimasukkan ke dalam context.
-
Menentukan respons HTTP berdasarkan hasil parsing JWT token dan keberadaan cookie.
- Jika parsing token gagal, maka akan mengembalikan respon HTTP dengan status code 401 atau 400 tergantung dari jenis error yang terjadi. Jika token tidak valid, maka akan mengembalikan respon HTTP dengan status code 401.
- Jika cookie session_token tidak ada, maka akan mengembalikan respon HTTP dengan status code 401 jika request memiliki header Content-Type dengan nilai "application/json", atau melakukan redirect ke halaman login jika tidak.
-
Menyimpan nilai Email dari claims ke dalam context dengan key "email". Nilai Email ini nantinya akan dapat digunakan di handler atau endpoint selanjutnya.
-
Setelah semua langkah selesai, middleware akan memanggil Next untuk melanjutkan request ke handler atau endpoint selanjutnya.
π api
Warning : abaikan code yang tidak berhubungan dengan instruksi di bawah ini pada folder
api
-
api/user.go
-
method
Login
: adalah sebuah handler yang menerima parameter*gin.Context
. Method ini akan melakukan login user dengan memanggil userService.Login dengan parameter context dan*model.User
yang sudah didapatkan dari body request.-
Method ini wajib mengirim data json dengan contoh format sebagai berikut:
{ "email": <string>, "password": <string> }
-
Jika data
email
ataupassword
kosong maka method ini akan mengembalikan response dengan status code400
dan pesan error sebagai berikut:{ "error": "email or password is empty" }
-
Jika terjadi error saat menggunakan
userService.Login
, maka method ini akan mengembalikan response dengan status code500
dan pesan error sebagai berikut:{ "error": "error internal server" }
-
Jika user berhasil login, maka method ini akan membuat token JWT dengan
Email
sebagai payload danexpirationTime
sebagai waktu kadaluwarsa. Setelah itu, token JWT akan di-sign dengan menggunakanmodel.JwtKey
.-
Setelah token JWT berhasil di-sign, method akan membuat
cookie
baru dengan namasession_token
dan valuetokenString
yang sudah didapatkan dari JWT sebelumnya. Jika cookie dengan namasession_token
sudah ada, maka value cookie tersebut akan diganti dengantokenString
yang baru. -
Method akan mengembalikan response dengan status code
200
dan data user yang sudah login. Jika sukses, maka response akan berisi status200
dan data JSON berikut:{ "user_id": <int>, "message": "login success" }
-
-
-
Method
GetUserTaskCategory
: Ini adalah handler yang menerima parameter*gin.Context
. Method ini digunakan untuk mendapatkan daftar tugas pengguna dengan kategori yang terkait. Method ini akan memanggil fungsiuserService.GetUserTaskCategory
untuk mengambil data tugas pengguna.-
Method ini tidak memerlukan input dari permintaan. Permintaan dapat dikirim tanpa body atau dengan body kosong.
-
Jika terjadi error saat menggunakan
userService.GetUserTaskCategory
, method ini akan mengembalikan respons dengan kode status500
dan pesan error sebagai berikut:{ "error": "error internal server" }
-
Jika data tugas pengguna berhasil diambil, method ini akan mengembalikan respons dengan kode status
200
dan data JSON yang berisi daftar tugas pengguna dengan kategori terkait. -
Contoh respons dengan kode status
200
:[ { "ID": 1, "Fullname": "test", "Email": "test@mail.com", "Task": "Task 2", "Deadline": "2023-06-01", "Priority": 1, "Status": "Completed", "Category": "Category 2" }, { "ID": 1, "Fullname": "test", "Email": "test@mail.com", "Task": "Task 5", "Deadline": "2023-06-07", "Priority": 5, "Status": "In Progress", "Category": "Category 3" } ]
-
-
-
api/task.go
-
UpdateTask
: fungsi ini digunakan untuk mengupdate data mahasiswa denganid
yang sesuai dengan nilai yang diberikan sebagai argumen.- Jika nilai
id
tidak valid, fungsi akan mengirimkan respons dengan kode status400
dan pesan error dalam format JSON{"error": "invalid task ID"}
. - Jika data yang diberikan tidak valid, fungsi akan mengirimkan respons dengan kode status
400
dan pesan error dalam format JSON. - Selanjutnya, fungsi memanggil
Update
daritaskService
untuk memperbarui tugas dengantaskID
yang diberikan sebagai argumen. AssigntaskID
ke structmodel.Task.ID
yang akan dikirim ke fungsi tersebut.- Jika proses berhasil, fungsi akan mengirimkan respons dengan kode status
200
dan pesan sukses dalam format JSON{"message": "update task success"}
. - Jika terjadi error pada proses tersebut, fungsi akan mengirimkan respons dengan kode status
500
dan pesan error dalam format JSON.
- Jika proses berhasil, fungsi akan mengirimkan respons dengan kode status
- Jika nilai
-
DeleteTask
: fungsi ini digunakan untuk menghapus tugas denganid
yang sesuai dengan nilai yang diberikan sebagai argumen.- Jika nilai
id
tidak valid, fungsi akan mengirimkan respons dengan kode status400
dan pesan error dalam format JSON{"error": "invalid task ID"}
. - Selanjutnya, fungsi memanggil
Delete
daritaskService
untuk menghapus tugas dengantaskID
yang diberikan sebagai argumen.- Jika terjadi error saat proses penghapusan, fungsi akan mengirimkan tanggapan JSON dengan kode status HTTP
500
Internal Server Error dan pesan error. - Jika tidak terjadi error dalam proses penghapusan, fungsi akan mengirimkan tanggapan JSON dengan kode status HTTP
200
OK dan pesan sukses{"message": "delete Task success"}
.
- Jika terjadi error saat proses penghapusan, fungsi akan mengirimkan tanggapan JSON dengan kode status HTTP
- Jika nilai
-
GetTaskList
: fungsi ini digunakan untuk mendapatkan daftar tugas.- Pertama, fungsi memanggil
GetList
daritaskService
untuk mendapatkan daftar tugas.-
Jika terjadi error saat mengambil daftar tugas, fungsi akan mengirimkan tanggapan JSON dengan kode status HTTP
500
Internal Server Error dan pesan error yang sesuai ke client. -
Jika tidak terjadi error, fungsi akan mengirimkan tanggapan JSON dengan kode status HTTP
200
OK dan daftar tugas ke client. Contoh:[ { "id": 1, "title": "Task 1", "deadline": "2023-05-30", "priority": 2, "category_id": "1", "status": "In Progress" }, { "id": 2, "title": "Task 2", "deadline": "2023-06-10", "priority": 1, "category_id": "2", "status": "Completed" }, ... ]
-
- Pertama, fungsi memanggil
-
GetTaskListByCategory
: fungsi ini digunakan untuk mendapatkan daftar tugas dengan nama kategorinya.- Pertama, fungsi memanggil
GetTaskListByCategory
daritaskService
untuk mendapatkan daftar tugas.-
Jika terjadi error saat mengambil daftar tugas, fungsi akan mengirimkan tanggapan JSON dengan kode status HTTP
500
Internal Server Error dan pesan error yang sesuai ke client. -
Jika tidak terjadi error, fungsi akan mengirimkan tanggapan JSON dengan kode status HTTP
200
OK dan daftar tugas beserta nama kategorinya ke client. Contoh:[ { "id": 1, "title": "Task 1", "category": "Category 1" }, { "id": 2, "title": "Task 2", "category": "Category 2" }, ... ]
-
- Pertama, fungsi memanggil
-
-
api/category.go
UpdateCategory
: fungsi ini digunakan untuk mengupdate kategori denganid
yang sesuai dengan nilai yang diberikan sebagai argumen.- Jika nilai
id
tidak valid (gagal dikonversi menjadi tipe data int), fungsi akan mengirimkan respons JSON dengan kode status HTTP400
Bad Request dan pesan error dalam format JSON{"error": "invalid Category ID"}
. - Jika data yang diberikan tidak valid, fungsi akan mengirimkan respons JSON dengan kode status HTTP
400
Bad Request dan pesan error dalam format JSON. - Jika data yang diberikan valid, fungsi akan memanggil fungsi
Update
padacategoryService
untuk mengupdate kategori dengan ID yang sesuai dengan nilai yang diberikan.- Jika proses update berhasil, fungsi akan mengirimkan respons JSON dengan kode status HTTP
200
OK dan pesan sukses dalam format JSON{"message": "category update success"}
. - Namun jika terjadi error pada proses update, fungsi akan mengirimkan respons JSON dengan kode status HTTP
500
Internal Server Error dan pesan error dalam format JSON.
- Jika proses update berhasil, fungsi akan mengirimkan respons JSON dengan kode status HTTP
- Jika nilai
DeleteCategory
: fungsi ini digunakan untuk menghapus kategori denganid
yang sesuai dengan nilai yang diberikan sebagai argumen.- Jika nilai
id
tidak valid (gagal dikonversi menjadi tipe data int), fungsi akan mengirimkan respons JSON dengan kode status HTTP400
Bad Request dan pesan error dalam format JSON{"error": "Invalid category ID"}
. - Jika nilai
id
valid, fungsi akan memanggil fungsiDelete
padacategoryService
untuk menghapus kategori denganID
yang sesuai dengan nilai yang diberikan.- Jika proses penghapusan berhasil, fungsi akan mengirimkan respons JSON dengan kode status HTTP
200
OK dan pesan sukses dalam format JSON{"message": "category delete success"}
. - Namun jika terjadi error pada proses penghapusan, fungsi akan mengirimkan respons JSON dengan kode status HTTP
500
Internal Server Error dan pesan error dalam format JSON.
- Jika proses penghapusan berhasil, fungsi akan mengirimkan respons JSON dengan kode status HTTP
- Jika nilai
GetCategoryList
: fungsi ini digunakan untuk mendapatkan daftar kategori.- Fungsi memanggil
GetList
daricategoryService
untuk mendapatkan daftar kategori.-
Jika terjadi error saat mengambil daftar kategori, fungsi akan mengirimkan respons JSON dengan kode status HTTP
500
Internal Server Error dan pesan error yang sesuai ke client. -
Jika tidak terjadi error, fungsi akan mengirimkan respons JSON dengan kode status HTTP
200
OK dan daftar kategori ke client. Contoh:[ { "id": 1, "name": "Category 1" }, { "id": 2, "name": "Category 2" }, ... ]
-
- Fungsi memanggil
Untuk tugas pada Client (Frontend), kamu diminta untuk melengkapi tampilan user interface pada file berikut dengan mengikuti acceptance criteria yang di jelaskan:
-
File:
views/main/index.html
Contoh tampilan:
Berikut adalah acceptance criteria dari halaman
index.html
(Landing Page) yang harus dibuat:- Halaman menampilkan setidaknya tiga elemen dengan tag
div
atausection
. - Halaman memiliki setidaknya satu jenis tag heading, yaitu
h1
,h2
,h3
,h4
,h5
, atauh6
. - Halaman memiliki setidaknya satu elemen dengan tag
p
. - Halaman memiliki elemen dengan tag
h1
yang memiliki teks"Task Tracker Plus"
. - Halaman memiliki tautan yaitu tag
a
dengan teks"Login"
dan atributhref
yang mengarah ke"/client/login"
. - Halaman memiliki tautan yaitu tag
a
dengan teks"Register"
dan atributhref
yang mengarah ke"/client/register"
. - Halaman memiliki setidaknya satu class tailwind untuk tag
div
atausection
- Halaman memiliki setidaknya satu class tailwind untuk tag heading, yaitu
h1
,h2
,h3
,h4
,h5
, atauh6
- Halaman memiliki setidaknya satu class tailwind untuk responsive design, yaitu class 'sm:','md:', 'lg:', 'xl:' atau '2xl:'
- Halaman menampilkan setidaknya tiga elemen dengan tag
-
File:
views/auth/register.html
Contoh tampilan:
Berikut adalah acceptance criteria dari halaman
Register
yang harus dibuat:- Halaman memiliki setidaknya satu jenis tag heading, yaitu
h1
,h2
,h3
,h4
,h5
, atauh6
. - Halaman menampilkan 3 elemen dengan tag
input
, masing-masing memiliki atributtype
dengan nilaitext
,email
danpassword
. - Halaman memiliki elemen dengan tag
button
yang memiliki teks"Register"
. - Halaman memiliki tautan yaitu tag
a
dengan teks"Login"
dan atributhref
yang mengarah ke"/client/login"
. - Halaman memiliki setidaknya satu class tailwind untuk tag
div
atausection
- Halaman memiliki setidaknya satu class tailwind untuk tag heading, yaitu
h1
,h2
,h3
,h4
,h5
, atauh6
- Halaman memiliki setidaknya satu class tailwind untuk responsive design, yaitu class 'sm:','md:', 'lg:', 'xl:' atau '2xl:'
- Halaman memiliki setidaknya satu jenis tag heading, yaitu
-
File:
views/auth/login.html
Contoh tampilan:
Berikut adalah acceptance criteria dari halaman
Login
yang harus dibuat:- Halaman memiliki setidaknya satu jenis tag heading, yaitu
h1
,h2
,h3
,h4
,h5
, atauh6
. - Halaman memiliki input field dengan tag
input
dan atributtype
bernilai"email"
. - Halaman memiliki input field dengan tag
input
dan atributtype
bernilai"password"
. - Halaman memiliki elemen dengan tag
button
yang memiliki teks"Login"
. - Halaman memiliki tautan yaitu tag
a
dengan teks"Register"
dan atributhref
yang mengarah ke"/client/register"
. - Halaman memiliki setidaknya satu class tailwind untuk tag
div
atausection
- Halaman memiliki setidaknya satu class tailwind untuk tag heading, yaitu
h1
,h2
,h3
,h4
,h5
, atauh6
- Halaman memiliki setidaknya satu class tailwind untuk responsive design, yaitu class 'sm:','md:', 'lg:', 'xl:' atau '2xl:'
- Halaman memiliki setidaknya satu jenis tag heading, yaitu
Sebelum kalian menjalankan grader-cli test
, pastikan kalian sudah mengubah database credentials pada file main.go
(line 64) dan main_test.go
(line 86) sesuai dengan database kalian. Kalian cukup mengubah nilai dari "username"
, "password"
dan "database_name"
saja.
Contoh:
dbCredentials = Credential{
Host: "localhost",
Username: "postgres", // <- ubah ini
Password: "postgres", // <- ubah ini
DatabaseName: "kampusmerdeka", // <- ubah ini
Port: 5432,
}
Input:
POST /api/v1/user/register HTTP/1.1
Host: localhost:8080
Content-Type: application/json
{
"fullname": "John Doe",
"email": "johndoe@example.com",
"password": "password123"
}
Expected Output / Behavior:
-
Jika registrasi berhasil, server harus mengembalikan kode status HTTP
201
Created dan respons JSON dengan pesan sukses:{ "message": "register success" }
-
Jika terjadi kesalahan validasi data registrasi, server harus mengembalikan kode status HTTP
400
Bad Request dan respons JSON dengan pesan kesalahan:{ "error": "invalid data" }
-
Jika terjadi kesalahan server saat menyimpan data pengguna, server harus mengembalikan kode status HTTP
500
Internal Server Error dan respons JSON dengan pesan kesalahan:{ "error": "internal server error" }
Input:
POST /api/v1/user/login HTTP/1.1
Host: localhost:8080
Content-Type: application/json
{
"email": "johndoe@example.com",
"password": "password123"
}
Expected Output / Behavior:
-
Jika login berhasil, server harus mengembalikan kode status HTTP
200
OK dan respons JSON dengan pesan sukses:{ "message": "login success" }
-
Jika terjadi kesalahan validasi data login, server harus mengembalikan kode status HTTP
400
Bad Request dan respons JSON dengan pesan kesalahan:{ "error": "email or password is empty" }
-
Jika terjadi kesalahan server saat melakukan login, server harus mengembalikan kode status HTTP
500
Internal Server Error dan respons JSON dengan pesan kesalahan:{ "error": "internal server error" }
Input:
POST /api/v1/task/add HTTP/1.1
Host: localhost:8080
Content-Type: application/json
{
"title": "Task 1",
"deadline": "2023-06-30",
"priority": 2,
"category_id": "1",
"status": "In Progress"
}
Expected Output / Behavior:
-
Jika permintaan berhasil, server harus mengembalikan kode status HTTP
200
OK dan respons JSON dengan pesan sukses:{ "message": "add task success" }
-
Jika permintaan gagal karena kesalahan validasi, server harus mengembalikan kode status HTTP
400
Bad Request dan respons JSON dengan pesan kesalahan:{ "error": "invalid data" }
-
Jika terjadi kesalahan server saat menyimpan tugas, server harus mengembalikan kode status HTTP
500
Internal Server Error dan respons JSON dengan pesan kesalahan:{ "error": "internal server error" }
Input:
GET /api/v1/task/list HTTP/1.1
Host: localhost:8080
Expected Output / Behavior:
-
Jika permintaan berhasil, server harus mengembalikan kode status HTTP
200
OK dan respons JSON dengan daftar tugas.[ { "id": 1, "title": "Task 1", "deadline": "2023-05-30", "priority": 2, "category_id": "1", "status": "In Progress" }, { "id": 2, "title": "Task 2", "deadline": "2023-06-10", "priority": 1, "category_id": "2", "status": "Completed" }, ... ]
-
Jika terjadi kesalahan saat mendapatkan daftar tugas, server harus mengembalikan kode status HTTP
500
Internal Server Error dan respons JSON dengan pesan kesalahan.{ "error": "[error messages]" }
Input:
PUT /api/v1/task/update/{id} HTTP/1.1
Host: localhost:8080
Content-Type: application/json
{
"title": "Task 1",
"deadline": "2023-06-30",
"priority": 2,
"category_id": "1",
"status": "In Progress"
}
Expected Output / Behavior:
-
Jika permintaan berhasil dan ID tugas valid, server harus mengembalikan kode status HTTP
200
OK dan respons JSON dengan pesan sukses.{ "message": "update Task success" }
-
Jika permintaan gagal karena ID tugas tidak valid, server harus mengembalikan kode status HTTP
400
Bad Request dan respons JSON dengan pesan kesalahan.{ "error": "Invalid task ID" }
-
Jika permintaan gagal karena format data tugas tidak sesuai yang diharapkan, server harus mengembalikan kode status HTTP
400
Bad Request dan respons JSON dengan pesan kesalahan.{ "error": "[error messages]" }
-
Jika terjadi kesalahan saat memperbarui data tugas, server harus mengembalikan kode status HTTP
500
Internal Server Error dan respons JSON dengan pesan kesalahan.{ "error": "[error messages]" }
Input:
DELETE /api/v1/task/delete/{id} HTTP/1.1
Host: localhost:8080
Expected Output / Behavior:
-
Jika permintaan berhasil dan ID tugas valid, server harus mengembalikan kode status HTTP
200
OK dan respons JSON dengan pesan sukses.{ "message": "delete Task success" }
-
Jika permintaan gagal karena ID tugas tidak valid, server harus mengembalikan kode status HTTP
400
Bad Request dan respons JSON dengan pesan kesalahan.{ "error": "Invalid task ID" }
-
Jika terjadi kesalahan saat menghapus tugas, server harus mengembalikan kode status HTTP
500
Internal Server Error dan respons JSON dengan pesan kesalahan.{ "error": "[error messages]" }