All projects

EasyBook

EasyBook is a user-friendly digital library designed for seamless access to a wide range of books. With EasyBook, users can effortlessly borrow books, request new titles, manage their profiles, upgrade to a premium account, and pay fines using cashless transactions.

Year

2024

Category

Website

Tool

Node.js, Express, MySQL, Midtrans, JWT, Cron

Case Study

Problem

Traditional library circulation operations are frequently hindered by slow physical return queues, manual tracking of overdue loans, and error-prone cash fine collections that often cause bookkeeping discrepancies. Furthermore, members lack a structured platform to submit procurement requests for desired book titles, and institutions miss opportunities to monetize premium tier perks (e.g., expanded borrowing quotas). EasyBook was engineered as a digital library REST API engine that automates overdue fine invoicing and facilitates instant cashless settlements directly from the borrower’s device.

My role

I developed this platform as the Sole Backend Engineer (authoring 180+ commits in the perpus-service repository), handling server architecture, MySQL relational schema, third-party integrations, and scheduled automation jobs:

  • Relational Database Design (MySQL): Designed comprehensive circulation models (user, buku, kategori, kategori_buku, peminjaman, pembayaran, koleksi_pribadi, ulasan, request_buku).
  • Scheduled Automated Fining Engine: Created a background cron routine (node-cron) executing daily at 09:00 WIB to flag overdue loans as terlambat and idempotently insert standard fine invoices (IDR 5,000) without duplicates.
  • Midtrans Cashless Integration: Implemented Midtrans Snap payment token generation and webhook handlers to support cashless fine settlement and instant membership tier upgrades.
  • Stateless Authentication & Role Guards: Secured endpoints using JSON Web Tokens (JWT) enforcing role-based permissions across Borrowers/Members, Library Staff, and System Administrators.
  • Automated Reporting & Notifications: Integrated pdfkit-table to compile monthly circulation audit summaries into downloadable PDF reports, and wired nodemailer to dispatch email return reminders to borrowers approaching their due dates.

System architecture

EasyBook platform architecture diagram

The backend operates as an isolated REST service ready for web and mobile frontends:

  • Node.js Express Engine: Features modular routers (/buku, /peminjaman, /pembayaran, /user, /request, /ulasan) handling JSON payloads and multipart book cover uploads (multer).
  • Midtrans Payment Gateway: Integrates digital wallets (GoPay, QRIS) and Virtual Account bank transfers. Upon payment confirmation, Midtrans webhooks trigger instant ledger updates and clear borrowing blocks.
  • Background Cron Engine (node-cron): Manages recurring lifecycle jobs independently from user HTTP requests.
  • MySQL Connection Pool: Utilizes mysql2 connection pooling to maintain low overhead during peak request spikes.

Key endpoints

Method Path Function & Role
POST /user/login & /user/register User authentication & JWT Bearer token issuance
GET /buku & POST /buku Public book discovery / Staff catalog insertion
POST /peminjaman Checkout physical book (atomic inventory decrement)
PUT /peminjaman/kembali/:id Confirm return and calculate overdue penalties
POST /pembayaran/bayar Request Midtrans Snap Token for fine or upgrade fees
POST /pembayaran/notifikasi Webhook callback listener for Midtrans settlements
POST /pembayaran/upgrade Submit request for Premium Membership tier
POST /request Submit procurement requests for new book acquisitions
GET /peminjaman/laporan-pdf Generate and export tabular circulation reports in PDF
POST /ulasan Post star ratings and reviews on returned titles

Technical challenges

1. Idempotent fine generation without duplicates. Daily automated cron scripts risk generating multiple duplicate invoices for the same overdue record if not strictly constrained. We enforced idempotency at the database query level using a subquery guard.

2. Physical inventory synchronization under concurrent requests. To avoid negative inventory counts, the borrowing endpoint checks book stock atomically before insertion. If available stock $>0$, the stock is decremented immediately; upon returned check-in, the quantity increments back into the pool.

3. Webhook signature validation & verification. Because payment callbacks originate externally, raw parameters cannot be trusted blindly. The webhook handler cross-references order_id, gross_amount, and verified transaction statuses against internal database invoices before upgrading user privileges or clearing outstanding fines.

4. Dual payment settlement channels (Cash vs Cashless). While digital transactions are handled via Midtrans, library members occasionally prefer settling fines physically at the circulation desk. A dedicated pembayaranTunai endpoint accessible exclusively to authorized staff enables manual verification with complete audit logging.

Future improvements

  • Migrate raw SQL queries to a type-safe query builder or ORM (such as Prisma or Kysely) to improve code maintainability.
  • Add physical Barcode / QR Code scanning integrations to streamline check-in and check-out workflows at physical counters.
  • Move cron routines and heavy PDF report rendering into dedicated worker threads or background job queues.
Live Technical Simulator
Interactive Backend Simulatorv1.2 · Live

Simulate Midtrans payment webhook lifecycle and idempotency defense against replay attacks or network retries.

01. INBOUNDIDLE

POST /midtrans/webhook

Payload & SHA-512 Hash

02. SECURITYWAIT

Verify Signature

Midtrans API Double-Check

03. IDEMPOTENCYWAIT

State Transition Guard

getOriginal('status')

04. SIDE EFFECTSWAIT

DB::transaction

Assign Room & Invoice PDF

laravel-worker.log0 ms

// System ready. Click one of the action buttons above to simulate.

View More Projects

↑↓ navigate↵ selectesc close
fijri.my.id