Skip to content

Repository files navigation

HonNoMachi Logo

📚 HonNoMachi (本の街 - Grad knjiga)

Android Kotlin Jetpack Compose Firebase License

HonNoMachi je Android aplikacija namijenjena ljubiteljima knjiga. Omogućuje registriranim korisnicima da postanu dio zajednice u kojoj mogu prodavati knjige koje im više ne trebaju i otkrivati nove naslove za svoju kolekciju.

📖 Dokumentacija • 🐛 Prijavi Bug • 📋 Product Backlog List


Sadržaj


O projektu

HonNoMachi (本の街 - "Grad knjiga") je mobilna platforma koja spaja kupce i prodavače rabljenih knjiga. Aplikacija pruža intuitivno korisničko iskustvo s fokusom na sigurnost transakcija i jednostavnost korištenja.

Ključne značajke:

  • Sigurna autentifikacija korisnika (Email/Lozinka, Google OAuth)
  • Pretraživanje i filtriranje knjiga po nazivu, žanru i autoru
  • Košarica s integriranim plaćanjem
  • Simulacija plaćanja putem Stripe integracije
  • Upravljanje korisničkim profilom
  • Administratorski panel za moderaciju

Tech Stack

Kategorija Tehnologija
Jezik Kotlin
UI Framework Jetpack Compose + Material Design 3
Arhitektura MVVM (Model-View-ViewModel)
Backend Firebase (Authentication, Firestore, Storage, Cloud Functions)
Cloud Functions TypeScript / Node.js 22
Plaćanje Stripe Android SDK (simulacija)
Async Operations Kotlin Coroutines + Flow
Dependency Injection Hilt
Version Control Git / GitHub (Git Flow workflow)
CI/CD GitHub Actions
Project Management Jira + Confluence

Preduvjeti

Prije nego započnete s instalacijom, provjerite imate li sljedeće:

  • Android Studio Ladybug (2024.2.1) ili novije
  • JDK 17 ili novije
  • Android SDK s minimalno API 26 (Android 8.0 Oreo)
  • Git instaliran na računalu
  • Firebase projekt (ili pristup postojećem projektu tima)
  • Google Play Services na uređaju/emulatoru

Instalacija

1. Kloniranje repozitorija

git clone https://github.com/25-26-izvanredni-tim/HonNoMachi.git
cd HonNoMachi

2. Firebase konfiguracija

Važno: Datoteka google-services.json nije uključena u repozitorij zbog sigurnosnih razloga.

Opcija A: Zatražite datoteku od člana tima putem sigurnog kanala.

Opcija B: Preuzmite iz Firebase konzole:

  1. Prijavite se na Firebase Console
  2. Odaberite projekt HonNoMachi
  3. Idite na Project Settings → Your apps → Android app
  4. Preuzmite google-services.json
  5. Premjestite datoteku u app/ direktorij projekta

3. Stripe konfiguracija (test okruženje)

  1. U local.properties dodajte: STRIPE_PUBLISHABLE_KEY=pk_test_...
  2. U CI okruženju postavite varijablu: STRIPE_PUBLISHABLE_KEY=pk_test_...
  3. Nikada ne stavljajte Stripe secret key (sk_...) u Android aplikaciju
  4. Backend secret-e za Cloud Functions postavite preko Firebase CLI: npx firebase-tools functions:secrets:set STRIPE_SECRET_KEY --project <firebase-project-id> npx firebase-tools functions:secrets:set STRIPE_WEBHOOK_SECRET --project <firebase-project-id> npx firebase-tools functions:secrets:set STRIPE_WALLET_WEBHOOK_SECRET --project <firebase-project-id>
  5. Deploy backend funkcija (PowerShell: navodnici oko --only): npx firebase-tools deploy --only "functions:createCheckoutPaymentIntent,functions:addToCartAndReserve,functions:removeFromCartAndRelease,functions:cancelCheckout,functions:releaseExpiredCheckoutSessions,functions:releaseExpiredCartReservations,functions:createWalletTopupIntent,functions:stripeWebhook,functions:stripeWalletWebhook" --project <firebase-project-id>
  6. U Stripe Dashboardu dodajte checkout webhook endpoint: https://us-central1-<firebase-project-id>.cloudfunctions.net/stripeWebhook i uključite evente: payment_intent.succeeded, payment_intent.payment_failed, payment_intent.canceled
  7. U Stripe Dashboardu dodajte wallet webhook endpoint: https://us-central1-<firebase-project-id>.cloudfunctions.net/stripeWalletWebhook i uključite evente: payment_intent.succeeded, payment_intent.payment_failed, payment_intent.canceled, charge.refunded

4. Sinkronizacija i pokretanje

  1. Otvorite projekt u Android Studiju
  2. Kliknite Sync Now za sinkronizaciju Gradle datoteka
  3. Povežite Android uređaj ili pokrenite emulator
  4. Kliknite Run 'app' ili koristite Shift + F10

Ako pokrećete Gradle iz terminala:

# Windows PowerShell
.\gradlew.bat :app:assembleDebug
# Bash / Git Bash
./gradlew :app:assembleDebug

Detaljne upute

Za detaljnije upute o postavljanju projekta, pogledajte: Development Setup - Confluence


Funkcionalnosti

Sprint 01

Autentifikacija korisnika

  • Registracija putem Email/Lozinka s validacijom podataka
  • Email verifikacija (Firebase Authentication verifikacijski tok)
  • Prijava/Odjava — sigurna autentifikacija postojećih korisnika
  • Validacija forme (real-time provjera email formata i politike lozinke)
  • Ponovno slanje verifikacijskog emaila
  • Pohrana korisničkih podataka u Firestore bazu

Sprint 02

Autentifikacija

  • Google OAuth prijava/registracija (Firebase Auth + Credential Manager)

Upravljanje knjigama

  • Pregled svih dostupnih knjiga (HomePage s LazyColumn)
  • Pretraga po naslovu s dinamičkim filtriranjem
  • Detaljni pregled pojedine knjige (galerija slika, svi podaci)

Korisnički profil

  • Ažuriranje podataka (ime, prezime, kontakt, adresa)
  • Promjena lozinke (validacija jačine + poništavanje sesija)
  • Promjena e-maila uz sigurnosne korake (ponovna verifikacija)

Kvaliteta i stabilnost

  • Lokalizacija EN/HR (string resursi, enumi: BookGenre, BookCondition, Currency)
  • Lint korak dodan u CI pipeline prije builda

Sprint 03

Kreiranje ponude knjige

  • Model podataka za ponude (naslov, autor, žanr, godina, izdavač, opis, stanje, cijena, slike)
  • UI za kreiranje i uređivanje ponuda s upravljanjem stanjima (loading/saving/error)
  • ViewModel i business logika za upravljanje ponudama
  • Unit testovi za validaciju i business logiku

Košarica

  • CartItemModel i CartRepository s Firestore integracijom (real-time snapshotListener)
  • Dodavanje u košaricu s prevencijom dupliciranja
  • Pregled košarice, brisanje artikala i prikaz ukupne cijene (CartPage)
  • Indikator košarice (BadgedBox) s real-time ažuriranjem badge-a
  • CartViewModel s Hilt DI i upravljanjem stanjima (Loading/Success/Error)

Firebase Crashlytics

  • Setup i integracija Firebase Crashlytics (plugin, konzola, Version Catalog)
  • CrashlyticsManager za centralizirano hvatanje non-fatal grešaka
  • Automatsko praćenje trenutnog ekrana i prijavljenog korisnika (userId)
  • Pristanak korisnika na analitiku i Crashlytics (GDPR)
  • Firebase Alerts i Slack notifikacije za crash izvještaje

Unapređenje arhitekture (MVVM + SOLID)

  • Reorganizacija paketa (ui/, data/, di/)
  • Hilt setup (@HiltAndroidApp, @AndroidEntryPoint, AppModule)
  • Refaktoriranje Firebase logike u repozitorije (AuthRepository, BookRepository)
  • ViewModeli s @HiltViewModel i UiState data klasama po ekranu

Sprint 04

Modularnost učitavanja slika

  • Izdvojen image_uploader modul za prijenos slika (Firebase Storage)
  • ImageUploader sučelje s FirebaseImageUploader implementacijom
  • Result sealed klasa za upravljanje pogreškama (success/error)
  • ImageUploaderModule s Hilt DI
  • Konfiguracija Firebase Storage pravila i ažuriranje dozvola u AndroidManifest.xml

Sprint 05

Refaktoriranje UI komponenti

  • Refaktoriran AddPage.kt – validacija u ViewModel, custom state holder, form polja kao zasebne composable komponente
  • Refaktoriran AuthRepository.kt – Firestore operacije u zasebnu klasu, getUserDocument() helper, konstante za kolekcije
  • Refaktoriran ProfileScreen.kt – boje u temu, ekstrahirana ProfileEditForm composable, stringovi u resources
  • Refaktoriran AuthViewModel.kt – callbackovi zamijenjeni sa StateFlow, pojednostavljen init blok, uklonjeni magic stringovi
  • Kreirane reusable auth komponente (EmailInputField, PasswordInputField)
  • Refaktoriran LoginScreen.kt, SignupScreen.kt i ChangePasswordScreen.kt – integrirane zajedničke auth komponente, uklonjen duplicirani kod

Testna pokrivenost

  • Unit testovi za AuthViewModel (19), AddBookViewModel (25), HomeViewModel (6)
  • Unit testovi za AuthRepository (12), BookRepository (5), ProfileRepository (8), CartRepository (5)
  • Unit testovi za FirestoreUserDataSourceImpl (4), Result<T> (3), ImageSourceInitializer (+2)
  • Pokrivenost koda (JaCoCo) povećana s 3.6% na 29.39% (89 novih testova u 10 test klasa)

Administratorski pregled korisnika

  • Administratorska navigacija, zaštita ruta i Firestore sigurnosna pravila
  • AdminRepository – dohvat, pretraga i filtriranje korisnika po statusu
  • Sučelje – lista korisnika, pretraga i filteri, detaljan prikaz, account status sekcija
  • Unit testovi: AdminRepositoryTest (11), AdminViewModelTest (3), AdminUserListViewModelTest (8), UserDetailViewModelTest (4)
  • Instrumentirani testovi: AdminScreenTest (4)

Suspenzija i reaktivacija korisnika

  • Pozadinska logika suspenzije i reaktivacije korisnika
  • Firestore sigurnosna pravila za suspenziju
  • Sučelje – dijalog, akcije i efekti suspenzije na korisnički račun

Narudžbe i košarica

  • OrderRepository – ažuriranje statusa knjige u SOLD i brisanje iz košarica svih korisnika
  • Validacija nedostupnih knjiga pri dodavanju u košaricu
  • Konverzija valuta (USD u EUR), HomePage prikazuje samo dostupne knjige
  • Unit i Instrumented testovi za upravljanje košaricom

Sprint 06

Plaćanje putem Stripea

  • Integracija Stripe Android SDK-a za simulaciju plaćanja (HNM-101/102)
  • Stripe Checkout flow — kreiranje PaymentIntent-a, Success/Cancel ekrani
  • Cloud Functions backend (TypeScript) — createCheckoutPaymentIntent, stripeWebhook, stripeWalletWebhook
  • Rezervacija knjiga u košarici s automatskim istekom (TTL 15 min, max 60 min)
  • Scheduled Cloud Functions za čišćenje isteklih rezervacija i checkout sesija
  • Konverzija valuta (EUR ↔ USD) na backend i frontend razini

Wallet (digitalni novčanik)

  • Implementacija wallet sustava unutar aplikacije (PaymentSheet)
  • Cloud Function createWalletTopupIntent za nadopunu novčanika
  • Stripe Wallet webhook za praćenje transakcija (uspjeh, neuspjeh, refund)

Obavijesti o kupnji

  • Email servis za obavijesti o kupnji putem Nodemailer-a (HNM-103)
  • Email obavijesti kupcu i prodavaču nakon uspješne transakcije
  • Korisničke postavke za uključivanje/isključivanje obavijesti

Portfelj kupljenih i prodanih knjiga

  • ShelfPage s tabovima "Purchased" i "Sold" za pregled povijesti transakcija (HNM-108)
  • Filtriranje i prikaz knjiga po statusu kupnje/prodaje

Upravljanje ponudama prodavača

  • My Listings ekran za upravljanje vlastitim ponudama (HNM-109)
  • Filtriranje ponuda po statusu (All/Active/Inactive)
  • Toggle vidljivosti ponude (AVAILABLE ↔ INACTIVE) i brisanje ponuda
  • Integracija My Listings kao treći tab na ShelfPage

Email obavijesti za suspenziju

  • Email obavijest korisniku pri suspenziji i reaktivaciji računa (HNM-300)
  • Cloud Function trigger na promjenu statusa korisnika u Firestore-u

Poboljšanja UI-a

  • Vizualna poboljšanja AuthScreen, ProfileScreen i BookDetailScreen (HNM-300)

DevOps i kontinuirana isporuka

  • Automatsko potpisivanje Release APK-a keystoreom putem GitHub Secrets
  • Distribucija potpisanog APK-a putem Firebase App Distribution za interni QA
  • Automatsko verzioniranje buildova na temelju Git tagova
  • ProGuard obfuskacija u release build konfiguraciji
  • Nadogradnja Node.js runtime-a s v20 na v22 za Cloud Functions

Kvaliteta koda

  • Rješavanje SonarQube arhitekturalnih i sigurnosnih nalaza
  • Smanjenje kognitivne kompleksnosti UI metoda
  • Reorganizacija build skripti — grupiranje dependencija, verzije u Version Catalog
  • Zamjena deprecated hiltViewModel importa u svim UI komponentama
  • Zamjena ponavljajućih string literala s imenovanim konstantama

Sprint 07 (Završni sprint)

Guard pravila za suspendirane korisnike

  • Implementacija guard pravila za suspendirane korisnike (HNM-112)

Monetizacija putem oglasa

  • Implementacija monetizacije putem oglasa (HNM-113)

Contributing

Projekt koristi Git Flow workflow sa sljedećom strukturom grana:

Workflow

  1. Kreirajte novu granu iz develop
  2. Implementirajte promjene
  3. Kreirajte Pull Request prema develop
  4. Zatražite code review od barem jednog člana tima
  5. Nakon odobrenja, merge u develop
GitFlow example diagram

DevOps

Projekt koristi DevOps prakse za automatizaciju procesa razvoja, testiranja i isporuke.

1. Planiranje

  • Jira za upravljanje projektom i praćenje zadataka
  • Firebase Rules — upravljanje pravilima autentifikacije, Firestore baze i Storage-a ručno putem Firebase konzole (bez Firebase CLI / Infrastructure as Code pristupa)

2. Verzioniranje programskog koda

  • Git kao sustav za kontrolu verzija s Git Flow workflow strategijom
  • GitHub kao udaljeni repozitorij i platforma za suradnju
  • Struktura grana: master (produkcija), develop (razvoj), feature/*, bugfix/*, release/*
  • Obvezni Pull Requesti s code reviewom prije merga u develop

3. Izgradnja

  • Gradle (Kotlin DSL) kao sustav za izgradnju projekta
  • Automatska izgradnja Debug APK-a unutar CI pipeline-a na svakom push-u i PR-u
  • Automatska izgradnja Release APK-a pri push-u na master granu
  • Konfiguracija: compileSdk = 36, minSdk = 26, targetSdk = 36, JDK 17

4. Kontinuirana integracija (CI)

CI pipeline pokreće se automatski na svakom push i pull request prema master i develop granama putem GitHub Actions. Pipeline uključuje:

Korak Opis Ovisi o
Lint provjera KTlint i Android Lint analiza koda -
Unit testovi Pokretanje unit testova s generiranjem JaCoCo izvještaja o pokrivenosti koda -
SonarCloud analiza Statička analiza koda, code smells, bugovi, sigurnosni propusti i prikaz pokrivenosti koda Unit testovi
Build Debug APK Kompilacija debug verzije aplikacije Lint provjera, Unit testovi
Build Release APK Kompilacija release verzije (samo pri push-u na master) Lint provjera, Unit testovi
  • Concurrency control — upravljanje istovremenim pokretanjima pipeline-a za istu granu

5. Automatsko testiranje

  • JUnit za unit testove
  • MockK za mockiranje ovisnosti u testovima
  • Fake Repository — lažne implementacije repozitorija za izolirano testiranje bez vanjskih ovisnosti
  • Jetpack Compose Testing (ui-test-junit4) za testiranje UI komponenti
  • Espresso za instrumentacijske (androidTest) testove
  • Coroutines Test (kotlinx-coroutines-test) za testiranje asinkronog koda
  • Navigation Testing za testiranje navigacijskih tokova
  • Automatsko pokretanje testova u CI pipeline-u na svakom push-u i PR-u

6. Kontinuirana isporuka (CD)

Planirane aktivnosti za kontinuiranu isporuku:

  • Automatsko potpisivanje release APK-a (keystore putem GitHub Secrets)
  • Distribucija putem Firebase App Distribution za interni QA
  • Verzioniranje buildova na temelju Git tagova

7. Analiza kvalitete programskog koda

  • KTlint — statička analiza i provjera stila Kotlin koda prema službenim konvencijama
  • Android Lint — detekcija potencijalnih bugova, sigurnosnih propusta i performansnih problema
  • JaCoCo — generiranje izvještaja o pokrivenosti koda testovima (XML + HTML)
  • SonarCloud — kontinuirana inspekcija kvalitete koda (statička analiza, code smells, bugovi, sigurnosni propusti) s integracijom JaCoCo izvještaja za prikaz pokrivenosti koda
  • Upload lint i JaCoCo izvještaja kao CI artefakata za pregled nakon svakog builda

8. Upravljanje konfiguracijom

  • GitHub Secrets za sigurno pohranjivanje osjetljivih podataka (GOOGLE_SERVICES_JSON, SONAR_TOKEN)
  • Gradle Kotlin DSL (build.gradle.kts) za deklarativnu konfiguraciju projekta i ovisnosti
  • Version Catalog (libs.versions.toml) za centralizirano upravljanje verzijama biblioteka
  • .gitignore za isključivanje osjetljivih i generiranih datoteka iz repozitorija

9. Nadgledanje (Operate & Monitor)

Notifikacije i komunikacija

  • GitHub-Slack integracija — automatske obavijesti u Slack kanalu o push eventima, pull requestovima, code reviewovima i statusu CI pipeline-a

Praćenje performansi

Implementirani alati:

  • Firebase Analytics — praćenje korisničkih događaja i ponašanja unutar aplikacije
  • Firebase Crashlytics — automatsko prikupljanje i analiza crash izvještaja

Dokumentacija

Kompletan Project Wiki dostupan je na Confluence:

HonNoMachi Confluence Space

Ključne stranice

Dokument Opis
Project Overview Pregled projekta i ciljevi
System Architecture Dijagram arhitekture sustava
Development Setup Upute za postavljanje projekta
Product Backlog Lista svih User Storyja
Korisnička dokumentacija Upute za korištenje aplikacije
UX Design Wireframovi i dizajn smjernice

Tim

Projekt razvija tim studenata Fakulteta organizacije i informatike (FOI), Varaždin.

Član Email Uloga
Ivan Giljević igiljevic@student.foi.hr Developer
Denis Kuzminski dkuzminsk22@student.foi.hr Developer
Zlatko Pračić zpracic@student.foi.hr Developer
Mislav Žnidarec mznidarec@student.foi.hr Developer

Kolegij: Analiza i razvoj programa
Akademska godina: 2025/2026
Institucija: Fakultet organizacije i informatike, Varaždin


Status projekta: Dovršeni svi sprintovi Zadnje ažuriranje: 02.04.2026.

About

Hon No Machi

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages