[](https://appcenter.ms)
[](https://github.com/JohannesSetiawan/nutrious-mobile/actions/workflows/pre-release.yml)
[](https://github.com/JohannesSetiawan/nutrious-mobile/actions/workflows/release.yml)
# Nutrious Mobile
## Nama Anggota Kelompok
1. Stelline Claudia - 2106700933
2. Dhafin Raditya Juliawan - 2106650304
3. Johannes Setiawan - 2106750345
4. Muhammad Faris Umar Rahman - 2106702402
5. Jaycent Gunawan Ongris - 2106750231
6. Annava Wisha Sikoko - 2106635493
## Tautan APK
[Link App Center](https://install.appcenter.ms/orgs/f02/apps/nutrious/distribution_groups/public)<br>
[Link Release Github](https://github.com/JohannesSetiawan/nutrious-mobile/releases/tag/1.0.0%2B1)
## Deskripsi Aplikasi
Aplikasi yang akan kami buat adalah Nutrious Mobile. Nutrious Mobile merupakan aplikasi *mobile* yang diadaptasi dari aplikasi [web](https://nutrious.up.railway.app/) yang telah kami buat
sebelumnya. Aplikasi ini kami buat untuk mendukung penyelesaian isu kesehatan global sebagaimana yang dibahas oleh pemimpin-pemimpin dunia pada Konferensi
G20. Spesifiknya, aplikasi ini berfokus pada permasalahan terkait bagaimana meningkatkan asupan gizi masyarakat untuk kualitas hidup yang lebih baik. Untuk
mengimplementasikan hal ini, kami membuat beberapa fitur pada aplikasi ini yang bermanfaat bagi pengguna aplikasi itu sendiri maupun masyarakat secara umum.
Fitur-fitur tersebut adalah *calorie tracker* untuk *tracking* kalori dari pengguna tiap harinya, *fundraising* untuk memberikan kesempatan kepada pengguna
melakukan donasi kepada orang-orang yang membutuhkan, *food-sharing* untuk memberikan informasi terkait lokasi pembagian makanan kepada masyarakat jika ada
pengguna yang ingin membagi makanan, *food recipe* untuk memberikan informasi terkait resep makanan sehat yang ditulis oleh pengguna, dan *blog* untuk
memberikan informasi atau artikel terkait kesehatan dan gizi yang ditulis oleh pengguna.
## Daftar Fitur yang Diimplementasikan dan Kontrak Kinerja
1. Fitur Utama (Jaycent Gunawan Ongris)<br>
Fitur ini terdiri dari halaman utama aplikasi, halaman *login*, halaman *dashboard* administrator, dan mengimplementasikan sistem autentikasi pada aplikasi.
2. Fundraising (Johannes Setiawan)<br>
Fitur ini terdiri dari halaman daftar donasi yang dibuka, formulir untuk membuka donasi baru, dan formulir untuk berdonasi. Selain itu, *user* yang terverifikasi bisa melihat dan/atau menutup donasi yang dibukanya.
3. Food-Sharing (Annava Wisha Sikoko)<br>
Fitur ini terdiri dari halaman daftar lokasi pembagian makanan yang ada, formulir untuk mendaftarkan lokasi pembagian makanan, serta fitur untuk menghapus dan mengedit lokasi pembagian makanan yang dibuat.
4. Calorie Tracker (Stelline Claudia)<br>
Fitur ini terdiri dari halaman daftar kalori yang dikonsumsi dan dibakar, formulir untuk menambahkan kalori yang dikonsumsi, formulir untuk menambah kalori yang dibakar, fitur untuk menghapus daftar kalori, dan fitur untuk mengedit daftar kalori.
5. Food Recipe (Muhammad Faris Umar Rahman)<br>
Fitur ini terdiri dari halaman yang berisi daftar resep makanan yang terdiri dari judul makanan, tanggal resep dibuat, nama pembuat resep, *ingredients* makanan,
dan langkah-langkah pembuatan makanan. Resep makanan dapat ditambahkan dari oleh *user* melalui fitur *add recipe* yang tersedia.
6. Blog (Dhafin Raditya Juliawan)<br>
Fitur ini terdiri dari halaman utama *blog post*, formulir untuk menambahkan *post* baru, fitur untuk menampilkan *post* dengan tag yang diinginkan oleh *user* dan fitur *upvote-downvote* sebuah *post*.
## Peran atau Aktor Pengguna Aplikasi
Terdapat dua jenis pengguna pada aplikasi ini, yaitu admin dan pengguna biasa (*user*). Admin dapat melihat siapa saja user yang sudah terdaftar, donasi yang dibuka oleh *user*, dan pesan yang dikirimkan oleh *user*. Sementara itu, *user* terdiri dari dua jenis, yaitu *user* yang sudah terverifikasi dan *user* yang belum terverifikasi. Semua *user* yang sudah *logged in* ke dalam aplikasi dapat melakukan donasi, membuat *log* terkait aktivitas yang berhubungan dengan penambahan atau pembakaran kalori, melihat lokasi pembagian makanan, membagikan resep makanan sehat, membuat *blog*, dan melakukan *upvote* atau *downvote* pada *blog*. Sementara itu, untuk alasan keamanan, hanya *user* yang sudah terverifikasi saja yang dapat membuka penggalangan dana dan memberikan informasi terkait lokasi pembagian makanan.
## Alur Pengintegrasian dengan *Web Service* dari PTS
1. Fitur Utama <br>
- Untuk sistem *login*, *user* akan memasukkan *username* dan *password* pada halaman yang tersedia. Selanjutnya, data terkait *username* dan *password* akan di-*pass* pada salah satu parameter *method* `login` yang disediakan oleh *package* `pbp_django_auth`. Data tersebut diteruskan ke URL `https://nutrious.up.railway.app/auth/login/` yang berisi fungsi `views` untuk *login* secara *asynchronous*. Fungsi tersebut akan menerapkan autentikasi terhadap *user* yang ingin *login* dan mengembalikan JSON berupa informasi dari *user* yang berhasil *login* atau *error message* jika *user* tidak berhasil *login*. Informasi yang didapatkan tersebut kemudian digunakan untuk menentukan apakah *role* *user* adalah admin atau pengguna biasa. Berdasarkan *role*-nya, *user* akan diarahkan ke *dashboard page* yang sesuai dengan *role* tersebut.
- Untuk sistem *logout*, *user* cukup mengklik tombol `Log Out` yang ada pada *drawer*. Setelah itu, dilakukan pemanggilan terhadap *method* `logout` yang disediakan oleh *package* `pbp_django_auth`, dengan parameter URL `https://nutrious.up.railway.app/auth/logout/` yang berisi fungsi `views` untuk *logout*. Jika berhasil *logout*, fungsi akan mengembalikan JSON yang berisi *status message* dari operasi tersebut dan *user* akan diarahkan ke *page* `Login-Register`.
- Untuk pengiriman *message* ke admin oleh pengguna biasa, pengguna tinggal memasukkan *message* yang ingin dikirim melalui kolom input yang telah disediakan. Setelah pengguna menekan tombol untuk kirim, data *message* yang dimasukkan oleh pengguna akan di-*pass* menjadi salah satu parameter *method* `post` yang disediakan oleh *package* `pbp_django_auth`. Data akan diteruskan ke URL `https://nutrious.up.railway.app/add-message/` yang berisi fungsi `views` untuk menambahkan *message* ke *database* secara *asynchronous*.
- Untuk melihat daftar pengguna pada *dashboard* admin, dilakukan pengambilan data dari URL
`https://nutrious.up.railway.app/json-user/` yang akan mengembalikan JSON berupa daftar pengguna beserta informasi yang terkait. Pengambilan data memanfaatkan *method* `get` yang disediakan oleh *package* `pbp_django_auth`. Setelah itu, akan dibuat *model class* `User` untuk pengaksesan data. Selanjutnya, dilakukan *loop* pada respons data tersebut untuk
kemudian dikonversi menjadi *instance* dari `User`, lalu ditambahkan ke `list`. Selanjutnya, dibuat `FutureBuilder` dengan parameter `future` yang berupa fungsi `Future` untuk *fetch* data dan mengembalikan `list of User`. Kemudian, `list` kembalian fungsi tersebut di-*pass* menjadi parameter `snapshot` untuk parameter `builder` di `FutureBuilder`. Selanjutnya, dilakukan *looping* di `list` tersebut untuk menampilkan informasi dari `User` dalam suatu `Container` yang menjadi `children` dari `ListView`. Kemudian, ketika ingin melihat detail dari pengguna, `Container` tersebut dapat diklik, yang kemudian *page* akan dipindahkan ke *page* yang berisi detail dari pengguna, yaitu pada *widget* `UserDetail`. Ketika dilakukan *push* ke *widget* tersebut, data `id` dan `detail` di-*pass* ke *widget* tersebut, lalu `detail` akan diekstrak untuk diambil nilai dari propertinya dan ditampilkan pada *page* detail tersebut.
- Untuk melihat daftar *fundraising* pada *dashboard* admin, dilakukan pengambilan data dari URL
`https://nutrious.up.railway.app/donation/json-with-name/` yang akan mengembalikan JSON berupa daftar donasi beserta informasi yang
terkait. Pengambilan data memanfaatkan *method* `get` yang disediakan oleh *package* `pbp_django_auth`. Setelah itu,
akan dibuat *model class* `Fundraising` untuk pengaksesan data. Selanjutnya, dilakukan *loop* pada respons data tersebut untuk
kemudian dikonversi menjadi *instance* dari `Fundraising`, lalu ditambahkan ke `list`. Selanjutnya, dibuat `FutureBuilder`
dengan parameter `future` yang berupa fungsi `Future` untuk *fetch* data dan mengembalikan `list of Fundraising`. Kemudian,
`list` kembalian fungsi tersebut di-*pass* menjadi parameter `snapshot` untuk parameter `builder` di `FutureBuilder`.
Selanjutnya, dilakukan *looping* di `list` tersebut untuk menampilkan informasi dari `Fundraising` dalam suatu `Container`
yang menjadi `children` dari `ListView`. Kemudian, ketika ingin melihat detail dari *fundraising*, `Container` tersebut dapat
diklik, yang kemudian *page* akan dipindahkan ke *page* yang berisi detail dari *fundraising*, yaitu pada *widget* `FundraisingDetail`.
Ketika dilakukan *push* ke *widget* tersebut, data `detail` akan di-*pass* ke *widget* tersebut, kemudian
diekstrak untuk diambil nilai dari propertinya dan ditampilkan pada *page* detail tersebut.
- Untuk melihat daftar *message* pada *dashboard* admin, dilakukan pengambilan data dari URL
`https://nutrious.up.railway.app/json-message-name/` yang akan mengembalikan JSON berupa daftar *message* beserta informasi yang
terkait. Pengambilan data memanfaatkan *method* `get` yang disediakan oleh *package* `pbp_django_auth`. Setelah itu,
akan dibuat *model class* `Message` untuk pengaksesan data. Selanjutnya, dilakukan *loop* pada respons data tersebut untuk
kemudian dikonversi menjadi *instance* dari `Message`, lalu ditambahkan ke `list`. Selanjutnya, dibuat `FutureBuilder`
dengan parameter `future` yang berupa fungsi `Future` untuk *fetch* data dan mengembalikan `list of Message`. Kemudian,
`list` kembalian fungsi tersebut di-*pass* menjadi parameter `snapshot` untuk parameter `builder` di `FutureBuilder`.
Selanjutnya, dilakukan *looping* di `list` tersebut untuk menampilkan informasi dari `Message` dalam suatu `Container`
yang menjadi `children` dari `ListView`. Kemudian, ketika ingin melihat detail dari *message*, `Container` tersebut dapat
diklik, yang kemudian *page* akan dipindahkan ke *page* yang berisi detail dari *message*, yaitu pada *widget* `MessageDetail`.
Ketika dilakukan *push* ke *widget* tersebut, data `detail` akan di-*pass* ke *widget* tersebut, kemudian
diekstrak untuk diambil nilai dari propertinya dan ditampilkan pada *page* detail tersebut.
2. Fitur Donation/Fundraising <br>
- `Donation List`: Pada fitur ini, akan dilakukan pengambilan data JSON pada fungsi `fetchDonation` dengan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/donation/json-verified/` yang akan mengembalikan data JSON berupa daftar donasi yang sudah diverifikasi oleh admin. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data donasi. Setiap data donasi akan dijadikan sebuah *instance* dari `Fundraising` dan dimasukkan ke dalam sebuah *list*. Setelah itu, *list* tersebut akan dikembalikan oleh fungsi tersebut untuk dilakukan *loop* dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Setiap objek donasi yang dibuat akan menjadi sebuah *clickable* `Container` yang menampilkan data nama donasi, pembuka donasi, dan jumlah donasi yang dibutuhkan. Saat diklik, halaman akan berpindah ke halaman detail dari `Container` donasi yang diklik.
- `Open Donation`: Pada fitur ini, terdapat sebuah *form* yang dapat digunakan *user* terverifikasi untuk membuka donasi baru. Pada halaman ini, setelah *user* melakukan submisi *form* dan datanya sudah divalidasi, data yang dimasukkan akan dikirim sebagai *parameter* untuk fungsi *async* bernama `create` yang menerima *parameter* `request`, `name`, `description`, dan `amountNeeded`. Data-data tersebut akan dikirim ke URL `https://nutrious.up.railway.app/donation/add-donatee/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari `name`, `description`, dan `amountNeeded` yang menjadi *argumen* untuk fungsi ini. Pengiriman data ke URL akan menyebabkan terbuatnya donasi baru dengan *user* yang melakukan pembukaan donasi sebagai pembuatnya. Donasi baru ini tidak akan muncul pada halaman `Donation List` karena belum terverifikasi. Akan tetapi, donasi baru ini akan tampil di halaman `Opened Donation List` dari *user* yang membuka donasi tersebut.
- `Donate`: Pada fitur ini, yaitu pada halaman `Donation Detail`, terdapat sebuah *form* yang dapat diisi oleh *user* untuk melakukan donasi terhadap donasi yang detailnya ditampilkan di halaman tersebut. Pada saat *user* melakukan submisi *form* donasi tersebut, *request*, id dari donasi yang dipilih, beserta jumlah donasi yang dimasukkan ke dalam *form* akan masuk ke dalam sebuah fungsi *async* yang bernama donasi dengan parameter `request`, `id`, dan `amount`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/donation/donate/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari id donasi dan jumlah yang didonasikan oleh *user*. Pengiriman data tersebut akan menambahkan nilai `collectedFunds` dari *instance* donasi yang bersangkutan dengan nilai dari `amount` dan mengembalikan sebuah `JSON response` yang akan dikembalikan oleh fungsi `donate`. Setelah itu, halaman akan berpindah ke halaman `Donation List`. Saat kita melihat detail dari donasi yang baru saja kita *donate*, maka bisa dilihat nilai dari `Collected Funds` akan bertambah dan nilai `Remaining Amount` akan berkurang saat nilainya masih lebih besar dari nol.
- `Opened Donation List`: Pada fitur ini, akan dilakukan pengambilan data JSON pada fungsi `fetchDonation` dengan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/donation/json-by-user/` yang akan mengembalikan data JSON berupa daftar donasi yang sudah dibuka oleh *user* yang melihat halaman `Opened Donation List` ini. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data donasi. Setiap data donasi akan dijadikan sebuah *instance* dari `Fundraising` dan dimasukkan ke dalam sebuah *list*. Setelah itu, *list* tersebut akan dikembalikan oleh fungsi tersebut untuk dilakukan *loop* dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Setiap objek donasi yang dibuat akan menjadi sebuah `Container` yang menampilkan data nama donasi, deskripsi donasi, jumlah donasi yang dibutuhkan, jumlah yang sudah terkumpul, status verifikasi (*verified* atau *not verified*), dan sebuah tombol untuk melakukan penutupan donasi.
- `Close Donation`: Pada halaman `Opened Donation List`, saat *user* menekan tombol `Close Donation`, maka akan dilakukan pemanggilan fungsi `delete` dengan mengirimkan argumen berupa `request` dan `id` dari donasi yang ingin ditutup (donasi yang keterangannya ada dalam `Container` tempat tombol yang diklik). Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/donation/json-by-user/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari id donasi yang ingin ditutup oleh *user*. Pengiriman data tersebut akan menghapus data donasi dengan `id` yang sesuai sehingga data donasi tersebut tidak akan ditampilkan pada semua halaman.
3. Fitur Blog <br>
- `Blog List`: Pada fitur ini, akan dilakukan pengambilan data JSON pada fungsi `fetchBlog` yang ada pada folder `utils` dengan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/blog/json/` yang akan mengembalikan data JSON berupa daftar blog yang tersedia pada database. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data donasi. Setiap data donasi akan dijadikan sebuah *instance* dari `Blog` dan dimasukkan ke dalam sebuah *list*. Setelah itu, *list* tersebut akan dikembalikan oleh fungsi tersebut untuk dilakukan *loop* dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Objek blog akan dimasukkan ke dalam sebuah card yang menampilkan judul blog, tanggal dibuat blog, tombol upvote downvote yang menampilkan nilainya, konten blog secara singkat, dan sebuah button "Read More" yang ketika di klik akan membukan halaman detail dari blog.
- `Blog Detail`: Pada fitur ini, page akan menampilkan detail dari sebuah blog yaitu konten yang ditampilkan secara menyeluruh. Setelah user memencet button "Read More" pada page utama, akan dipassing data `snapshot.data![index]` ke constructor BlogListDetail.
- `Create Blog`: Pada fitur ini, User akan ditampilkan *form* yang dapat digunakan *user* untuk membuat sebuah blog baru. Pada halaman ini, setelah *user* melakukan submisi *form* dan datanya sudah divalidasi, data yang dimasukkan akan dikirim sebagai *parameter* untuk fungsi *async* bernama `create` yang menerima *parameter* `request`, `title`, `tag`, dan `content`. Data-data tersebut akan dikirim ke URL `https://nutrious.up.railway.app/blog/add-post-flutter/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari `title`, `tag`, dan `content` yang menjadi *argumen* untuk fungsi ini. Pengiriman data ke URL akan menyebabkan terbuatnya blog baru dengan *user* yang mengunggah sebagai pembuatnya. Setelah blog berhasil terunggah, maka blog akan muncul ke page utama dan user lain bisa membaca dan memberikan upvote atau downvote.
- `Search Blog by Tag`: Pada fitur ini, akan ditampilkan berbagai macam tag yang tersedia dari seluruh blog yang ada pada database. Tag dari seluruh blog ini diambil dengan function fetchBlogTag() yang menggunakan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/blog/jsontag/`. Tag akan ditampilkan secara distinct dan tidak memiliki duplikat dan berada pada sebuah clickable container yang ketika di klik akan menampilkan blog yang sesuai dengan tag yang ingin dibaca oleh user dengan memanfaatkan method get dari url `https://nutrious.up.railway.app/blog/show-tag-flutter/<str:tag_yang_dicari>`.
4. Fitur Calorie Tracker
* `Calorie List`: Pada halaman ini, akan dilakukan pengambilan data pada fungsi `fetchCalorie` dengan memanfaatkan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/calorietracker/show_jsonf/` yang akan mengembalikan data JSON berupa daftar calorie yang telah diinput oleh user. Data JSON yang dikembalikan akan dilakukan looping, kemudian dijadikan sebuah *instance* dari `Calorie` dan ditambahkan ke dalam sebuah list. Setelah itu, *list* tersebut akan dikembalikan oleh fungsi tersebut untuk dilakukan *loop* dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Setiap objek donasi yang dibuat akan menjadi sebuah *clickable* `Container` yang jika di *click* akan menampilkan detail informasi berupa waktu ditambahkannya kalori, berapa kalori yang dikonsumsi/dibakar, kategori (hanya untuk kalori yang dikonsumsi) beserta deskripsinya, dan juga ada sebuah tombol close yang jika ditekan maka akan kembali menampilkan halaman `Calorie List`. Pada halaman ini juga akan tercantum sebuah Button dengan tulisan *“Tap me to see your information”* yang jika ditekan akan menampilkan informasi mengenai total kalori yang sudah dikonsumsi, dibakar, dan akumulasi kalorinya dengan cara di-scroll.
* `Add Calorie`: Fitur ini terdapat pada halaman `Calorie List` berupa *button* yang jika ditekan akan berpindah ke sebuah halaman berupa *form*. Halaman berupa *form* yang ditampilkan tersebut dapat digunakan oleh *user* untuk menambahkan kalori yang sudah dikonsumsinya, kategori beserta deskripsinya. Data yang diinput user akan divalidasi dan jika sudah *valid* maka akan dikirimkan ke fungsi *async* yang bernama `create` dengan parameter `request`, `calorie`, `description`, `category`, `isIncreasing`, `date`, dan `time`. Untuk parameter `isIncreasing` akan diberi nilai true, sedangkan untuk nilai `date` dan `time` akan diperoleh dari `DateTime.now` yang diformat dengan `DateFormat` dengan memanfaatkan *package* `intl`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/calorief/` dengan *method* `post` dari *package* `pbp_django_auth`. Pengiriman data ke URL akan menyebabkan terbuatnya daftar kalori yang baru sesuai dengan data yang diinput oleh user. Setelah berhasil dibuat, maka data kalori baru tersebut tersebut akan muncul di halaman `Calorie List`.
* `Reduce Calorie`: Fitur ini terdapat pada halaman `Calorie List` berupa *button* yang jika ditekan akan berpindah ke sebuah halaman berupa *form*. Halaman berupa *form* yang ditampilkan tersebut dapat digunakan oleh user untuk menambahkan kalori yang sudah dibakarnya beserta dengan deskripsinya. Data yang diinput user akan divalidasi dan jika sudah *valid* maka akan dikirimkan ke fungsi *async* yang bernama `create` dengan parameter `request`, `calorie`, `description`, `category`, `isIncreasing`, `date`, dan `time`. Untuk parameter `isIncreasing` akan diberi nilai false, sedangkan untuk nilai `date` dan `time` akan diperoleh dari `DateTime.now` yang diformat dengan `DateFormat` dengan memanfaatkan *package* `intl`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/calorief/` dengan *method* `post` dari *package* `pbp_django_auth`. Pengiriman data ke URL akan menyebabkan terbuatnya daftar kalori yang baru sesuai dengan data yang diinput oleh user. Setelah berhasil dibuat, maka data kalori baru tersebut tersebut akan muncul di halaman `Calorie List`.
* `Delete all` : Fitur ini terdapat pada halaman `Calorie List` berupa *button* yang jika ditekan akan menyebabkan seluruh daftar kalori terhapus. *Button* yang ditekan akan memanggil fungsi *async* yang bernama `deleteAll` dengan parameter `request` dan `nothing`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/deleteAllf/`
dengan *method* `post` dari *package* `pbp_django_auth`. Fungsi `deleteAll` memiliki parameter dengan nama `nothing` yang akan diisi string kosong karena sebenarnya tidak ada data yang ingin di-*passing*, akan tetapi method `post` menerima 2 parameter.
* `Delete` : Fitur ini terdapat pada `Container` daftar kalori berupa *button* yang jika ditekan maka `container` beserta data kalorinya akan hilang. *Button* *delete* ini akan memanggil fungsi *async* yang bernama `delete` dengan parameter `request` dan `id`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/deletef/` dengan *method* `post` dari *package* `pbp_django_auth`. *Method* tersebut mengirim data berupa JSON yang terdiri dari `id` data kalori yang ingin dihapus oleh *user*. Pengiriman data tersebut akan menghapus data kalori dengan `id` yang sesuai sehingga data kalori tersebut tidak akan ditampilkan lagi pada halaman `Calorie List`.
* `Edit` : Fitur ini terdapat pada `Container` daftar kalori berupa *button* yang jika ditekan maka kan berpindah ke sebuah halaman berupa *form*. Halaman berupa *form* yang ditampilkan tersebut dapat digunakan oleh user untuk mengedit data kalori yang sudah ditambahkannya sebelumnya. Data baru yang diinput user akan divalidasi dan jika sudah *valid* maka akan dikirimkan ke fungsi *async* yang bernama `editAddSavef` atau `editReduceSavef` sesuai dengan jenis kalorinya (apakah kalori yang dibakar atau dikonsumsi) dengan parameter `request`, `id`, `calorie`, `description`, dan `category` untuk `editAddSavef`, sedangkan untuk `editReduceSafef` dengan parameter `request`, `id`, `calorie`, dan `description`.
Fungsi `editAddSavef` akan melakukan pengiriman data ke URL`https://nutrious.up.railway.app/calorietracker/edit_add_savef/` , sedangkan untuk `editReduceSavef` akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/calorietracker/edit_reduce_savef/` dengan *method* `post` dari *package* `pbp_django_auth`. Pengiriman data ke URL akan menyebabkan terubahnya data kalori sesuai dengan yang sudah diinput oleh user. Setelah berhasil diubah, maka data kalori yang diubah akan berubah di halaman `Calorie List`.
5. Fitur Food-Sharing
* `Food-Sharing List`: Pada halaman ini, akan dilakukan pengambilan data JSON pada fungsi fetch `fetchFoodsharing` dengan menggunakan method `get` dari package `pbp_django_auth` dari url `https://nutrious.up.railway.app/foodsharing/show_jsonf` yang akan mengambilkan data JSON berupa daftar food sharing yang ditambahkan oleh semua pengguna terverifikasi. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data food-sharing. Setiap data tersebut akan dijadikan sebuah *instance* dari `Foodsharing` dan dimasukkan ke dalam suatu list. Selanjutnya, list akan dikembalikan oleh fungsi tersebuh untuk dilakukan loop dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Objek dari Foodsharing akan dimasukkan ke sebuah GFCard yang terdapat foto, lokasi food-sharing, deskripsi food-sharing, tanggal pembuatan, dan tanggal pembaharuan.
* `Add Food-Sharing`: Fitur ini terdapat pada halaman Food-Sharing List berupa *button* yang akan dipindah ke halaman lain berupa form. Fitur ini hanya dapat digunakan oleh *user* yang telah terverfikasi untuk membuat postingan lokasi food-sharing. Setelah data input *user* divalidasi dan jika sudah valid maka akan dikirimkan ke fungsi async yang bernama `create` dengan parameter `request`, `img`, `location`, `description`, `date`,`update_date`. Untuk nilai `date` dan `update_date` memanfaatkan package `intl` untuk mengambil nilai Datetime.now dan memformatnya menggunakan DateFormat. Setelah itu, datanya akan dikirim ke URL `https://nutrious.up.railway.app/foodsharing/foodsharingf` dengan method `post` dari package `pbp_django_auth`. Pengiriman data ke URL menyebabkan terbuatnya data foodsharing baru. Setelah itu, daftar baru tersebut akan di tampilkan pada halaman `Food-Sharing List`
* `Own Post`: Pada fitur ini, akan dilakukan pengambilan data JSON pada fungsi fetch `fetchFoodsharing` dengan menggunakan method `get` dari package `pbp_django_auth` dari url `https://nutrious.up.railway.app/foodsharing/show_json_by_user` yang akan mengambilkan data JSON berupa daftar food sharing yang ditambahkan oleh pengguna yang terverfikasi yang sedang login. Data JSON yang dikembalikan akan dilakukan loop untuk setiap data food-sharing milik *user*. Setiap data tersebut akan dijadikan sebuah *instance* dari `Foodsharing` dan dimasukkan ke dalam suatu list. Selanjutnya, list akan dikembalikan oleh fungsi tersebuh untuk dilakukan loop dengan `ListView.builder` yang menjadi kembalian dari `FutureBuilder`. Objek dari Foodsharing akan dimasukkan ke sebuah GFCard yang terdapat foto, lokasi food-sharing, deskripsi food-sharing, tanggal pembuatan, dan tanggal pembaharuan.
* `Edit Post`: Fitur ini terdapat pada masing-masing *card* yang ada di `Own Post` berupa *button* *edit*. Ketika menekan *button* tersebut maka akan terbuka *form* yang menampilkan semua value sebelumnya dan *user* dapat menginput data baru. Setelah data input *user* divalidasi dan jika sudah valid maka akan dikirimkan ke fungsi *async* yang bernama `editAddSavef` dengan parameter `request`, `img`, `location`, `description`, dan `update_date`. Untuk nilai `update_date` memanfaatkan package `intl` untuk mengambil nilai Datetime.now dan memformatnya menggunakan DateFormat. Fungsi `editAddSavef` akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/foodsharing/edit_add_savef` dengan method `post` dari package `pbp_django_auth`. Pengiriman data ke URL akan menyebabkan terubahnya data sebelumnya, yang akan langsung ditampilkan pada halaman `Food-Sharing List`.
* `Delete Post`: Fitur ini terdapat pada masing-masing *card* yang ada di `Own Post` berupa *button* *delete* yang jika ditekan data foodsharingnya akan hilang. Button dari `delete` ini akan memanggil fungsi *async* yang bernama `delete` dengan paramater `request` dan `id`. Fungsi tersebut akan melakukan pengiriman data ke URL `https://nutrious.up.railway.app/foodsharing/deletef` dengan method `post` dari package `pbp_django_auth`. Method tersebut mengirim data berupa JSON yang terdiri dari `id` data foodsharing yang mau dihapus oleh *user*. Pengiriman data tersebut akan menghapus data foodsharing dengan id yang sesuai sehingga data tersebut tidak akan ditampilkan pada semua halaman.
6. Fitur Food Recipes
* `Recipe List`: Ini merupakan fitur yang ditampilkan di halaman utama recipe, yaitu menampilkan resep resep yang sudah ditambahkan oleh pengguna. Fitur ini akan melaukan pengambilan data pada fungsi `fetcheCalorie` dengan memanfaatkan *method* `get` dari *package* `pbp_django_auth` dari URL `https://nutrious.up.railway.app/recipe/json/`
* `Add Recipe`: Fitur ini terletak pada floating action button yang tersedia di halaman recipe page utama. Ketika button ditekan, fitur mengarahkan halaman ke halaman input form, yang dapat diisi pengguna. Form terdiri dari nama makanan, bahan-bahan makanan, dan langkah-langkah pembuatan makanan. Lalu fungsi tersebut akan melalukan pengiriman data ke URL `https://nutrious.up.railway.app/recipe/add-flutter/` dengan method `post` dari package `pbp_django_auth`