Acest proiect simuleaza functionarea unui site care permite publicarea de anunturi de vanzare de produse, similar cu OLX.
Utilizatorii pot fi vanzatori (sellers) sau cumparatori (customers). Pentru a cumpara un produs, acestia au puncte pe site (pe care le pot cumpara cu bani reali, teoretic). Fiecare produs expus are un pret in puncte.
Site-ul e distribuit (componenta de server web poate rula pe mai multe instante).
Fiecare componenta ruleaza intr-un container separat de docker, iar intreaga aplicatie este un stack.
- Modul de autentificare si gestionare roluri (Keycloak)
- Baza de date (PostgreSQL)
- Server web HTTP (Flask)
- Cache distribuit (Redis)
- Broker de notificari (MQTT)
- Modul pentru cereri de inregistrare utilizatori noi (Flask)
Din perspectiva utilizatorului nou: Utilizatorul intra pe site, se logheaza (sau isi creeaza un cont direct din Keycloak daca nu are deja unul). By default va primi roluri default din Keycloak, dar daca doreste rolul de seller sau de customer trebuie sa publice o cerere in platforma de tichete si un administrator ii va da acces.
Din perspectiva cumparatorului: Cumparatorul poate intra pe lista cu toate produsele sau poate cauta un produs dupa nume in bara de search de pe prima pagina. Poate intra pe pagina unui produs si il poate cumpara, daca acesta mai e disponibil si daca are banii necesari. In pagina sa proprie poate vedea si ce produse a cumparat in trecut si cati bani mai are.
Din perspectiva vanzatorului: Seller-ul are un dashboard unde poate vedea toate anunturile publicate de el. Anunturile nu pot fi editate, pot fi doar sterse si repostate. Vanzatorul primeste notificari si bani in cont cand un cumparator a cumparat un produs.
Din perspectiva adminului: Daca un utilizator posteaza anunturi nepotrivite, administratorul le poate sterge si ii poate restrictiona contul dandu-i rolul de 'banned'. Adminul are un dashboard de unde poate administra toate anunturile existente si poate face cereri catre api end-ul /delete/<product_id> pentru a sterge un anunt.
GET
/ - home
/login - login si register
/callback - redirect pt Keycloak
/customer - customer dashboard
/seller - seller dashboard
/admin - admin dashboard
/logout - logout
/upload-product - formularul de upload
/products - lista tuturor produselor
/product/<id> - pagina unui produs <id>
/buy/<id> - cumpara produsul <id>
/profile/<user> - profilul lui <user>
/messages - mesajele primite/trimise
POST
/upload-product - pentru formularul din aceeasi pagina
/profile/<user> - trimite mesajul din formular catre <user>
Am considerat oportuna separarea partii de tichete de restul site-ului, deoarece aceasta componenta va fi folosita mai rar decat intregul site. Pe aceasta platforma secundara utilizatorii pot crea cereri pentru inregistrarea unui cont care trebuie sa fie aprobate de un administrator.
Ceea ce e interesant la aceasta platforma e faptul ca este folosita fara un sistem de login propriu, pot intra pe ea doar utilizatorii care sunt logati deja pe platforma principala si au un token de sesiune valid.
Rutele modulului pentru tichete sunt urmatoarele:
GET
/ - home
/create_ticket - ruta cu formular pentru un nou ticket
/opentickets - tichetele deschise pt admin
/mytickets - tichetele mele pt user
/ticket/<tid> - vezi tichetul cu id tid si formular pt raspuns
POST
/create_ticket - primeste datele din formular si salveaza noul tichet
/ticket/<tid> - raspunde la tichet prin formular
Cand un eveniment se produce, backend-ul de Flask posteaza un mesaj catre brokerul de MQTT in topicul asociat utilizatorului implicat. Brokerul distribuie mesajul catre utilizato, care asculta cu un client MQTT pe topicul sau. Daca clientul e conectat, ii va creste numarul de notificari necitite pe clopotel si in partea din dreapta jos va vedea un text.
Exista notificari pentru urmatoarele evenimente:
- am primit un mesaj
- cineva a cumparat produsul meu
- produsul meu a ramas cu stoc 0
Clientii au niste puncte locale la nivelul bazei de date cu care pot face tranzactii.
Tranzactiile sunt pastrate persistent in baza de date. Cand un client cumpara un produs ii scad punctele din cont.
Conditiile de cursa care ar fi putut aparea la cumpararea unui produs cand clientul nu are fonduri suficiente sau cumpararea unui produs care nu mai e in stoc au fost tratate prin salvarea datelor despre stoc si banii utilizatorului logat in memoria cache distribuita Redis.
docker build flask -t flask-lad
docker build registration -t flask-registration
docker stack deploy -c stack/stack.yml olx
docker stack services olxServiciul de web poate rula pe mai multe instante distribuite. Pentru a fi mai clar asta, pe pagina home apare si numele host-ului de pe care ruleaza serverul.
docker service scale olx_web=NUM_REPLICASFunctionarea corecta a componentelor individuale a fost testata prin teste unitare.
- Pentru functiile care interactioneaza cu baza de date exista testele test_dbconn.py.