Fakultas Ilmu Komputer UI

Skip to content
Snippets Groups Projects
user avatar
DawnFall19 authored
5d7a9b04
History
Name Last commit Last update
.vscode
src
.gitignore
Cargo.toml
README.md
Rocket.toml

BambangShop Publisher App

Tutorial and Example for Advanced Programming 2024 - Faculty of Computer Science, Universitas Indonesia


About this Project

In this repository, we have provided you a REST (REpresentational State Transfer) API project using Rocket web framework.

This project consists of four modules:

  1. controller: this module contains handler functions used to receive request and send responses. In Model-View-Controller (MVC) pattern, this is the Controller part.
  2. model: this module contains structs that serve as data containers. In MVC pattern, this is the Model part.
  3. service: this module contains structs with business logic methods. In MVC pattern, this is also the Model part.
  4. repository: this module contains structs that serve as databases and methods to access the databases. You can use methods of the struct to get list of objects, or operating an object (create, read, update, delete).

This repository provides a basic functionality that makes BambangShop work: ability to create, read, and delete Products. This repository already contains a functioning Product model, repository, service, and controllers that you can try right away.

As this is an Observer Design Pattern tutorial repository, you need to implement another feature: Notification. This feature will notify creation, promotion, and deletion of a product, to external subscribers that are interested of a certain product type. The subscribers are another Rocket instances, so the notification will be sent using HTTP POST request to each subscriber's receive notification address.

API Documentations

You can download the Postman Collection JSON here: https://ristek.link/AdvProgWeek7Postman

After you download the Postman Collection, you can try the endpoints inside "BambangShop Publisher" folder. This Postman collection also contains endpoints that you need to implement later on (the Notification feature).

Postman is an installable client that you can use to test web endpoints using HTTP request. You can also make automated functional testing scripts for REST API projects using this client. You can install Postman via this website: https://www.postman.com/downloads/

How to Run in Development Environment

  1. Set up environment variables first by creating .env file. Here is the example of .env file:
    APP_INSTANCE_ROOT_URL="http://localhost:8000"
    Here are the details of each environment variable:
    variable type description
    APP_INSTANCE_ROOT_URL string URL address where this publisher instance can be accessed.
  2. Use cargo run to run this app. (You might want to use cargo check if you only need to verify your work without running the app.)

Mandatory Checklists (Publisher)

  • Clone https://gitlab.com/ichlaffterlalu/bambangshop to a new repository.
  • STAGE 1: Implement models and repositories
    • Commit: Create Subscriber model struct.
    • Commit: Create Notification model struct.
    • Commit: Create Subscriber database and Subscriber repository struct skeleton.
    • Commit: Implement add function in Subscriber repository.
    • Commit: Implement list_all function in Subscriber repository.
    • Commit: Implement delete function in Subscriber repository.
    • Write answers of your learning module's "Reflection Publisher-1" questions in this README.
  • STAGE 2: Implement services and controllers
    • Commit: Create Notification service struct skeleton.
    • Commit: Implement subscribe function in Notification service.
    • Commit: Implement subscribe function in Notification controller.
    • Commit: Implement unsubscribe function in Notification service.
    • Commit: Implement unsubscribe function in Notification controller.
    • Write answers of your learning module's "Reflection Publisher-2" questions in this README.
  • STAGE 3: Implement notification mechanism
    • Commit: Implement update method in Subscriber model to send notification HTTP requests.
    • Commit: Implement notify function in Notification service to notify each Subscriber.
    • Commit: Implement publish function in Program service and Program controller.
    • Commit: Edit Product service methods to call notify after create/delete.
    • Write answers of your learning module's "Reflection Publisher-3" questions in this README.

Your Reflections

This is the place for you to write reflections:

Mandatory (Publisher) Reflections

Reflection Publisher-1

  1. Interface tetap diperlukan, agar Open-Closed Principle terjaga, dimana subscriber dapat terbuka pada ekstensi namun tertutup pada modifikasi.

  2. Penggunaan Vec saja belum cukup karena Vec tidak menjamin keunikan, sehingga diperlukan DashMap karena menyediakan pencarian waktu konstan dan manajemen batasan unik.

  3. Pola singleton dapat memastikan bahwa hanya ada satu instance dari sebuah entitas, namun tidak memastikan bahwa akses dapat dilakukan secara aman, sehingga penggunaan DashMap tetap diperlukan karena memang dirancang untuk keamanan thread.

Reflection Publisher-2

  1. Agar setiap bagian dapat diurutkan berdasarkan tugasnya sehingga projek terlihat lebih rapi dan mudah dipelihara, lebih mudah dites per bagian kecil, dan lebih mudah dimodifikasi atau diekstensi tanpa memodifikasi atau mempengaruhi kode yang sudah ada.

  2. Jika hanya menggunakan model, maka interaksi antar model akan menjadi lebih sulit, karena semua fungsi dan implementasi berada di satu tempat yang sama, yang menyulitkan pengembangan, modifikasi, dan pemeliharaan kode.

  3. Postman dapat membantu pengecekan API endpoint agar dapat dipastikan bahwa perilaku endpoint tersebut sudah sesuai dengan yang diharapkan. Bagian inilah yang menurutku akan menjadi salah satu fungsi paling berguna ketika mengerjakan tugas kelompok, karena banyak endpoint akan dihasilkan ketika membuat sebuah proyek dengan arsitektur microservices.

Reflection Publisher-3

  1. Model push, karena publisher akan selalu mengirimkan notifikasi pada subscriber ketika terdapat update.

  2. Subscriber tidak akan mendapatkan informasi terbaru kecuali jika mereka memintanya. Salah satu masalahnya adalah subscriber akan menghabiskan banyak waktu untuk terus menerus meminta update, sedangkan jika tidak diminta secara terus menerus maka bisa saja subscriber meminta update terlalu lama dibanding waktu asli update.

  3. Tanpa multi threading maka notifikasi akan masuk satu per satu pada setiap subscriber. Jika jumlah subscriber sangat banyak, maka bisa saja terdapat subscriber yang baru mendapatkan notifikasi setelah beberapa detik, menit, atau bahkan hari semenjak notifikasi diberikan.