În ziua de astăzi, platformele de vizualizare de filme sau seriale precum Netflix sau HBO MAX au luat o amploare extrem de mare atât în România, dar mai ales în întreaga lume.
În acest sens, pentru că știm că ți-ai dat silința de-a lungul întregului semestru pentru a vizualiza cele mai recente filme sau episoade din serialele favorite, vrem să îți oferim posibilitatea de a implementa o platformă similară cu scopul de a înțelege și funcționalitățile acesteia.
Te invităm să ajuți cât mai curând atât întreaga planetă pentru ca aceasta să poată vizualiza în continuare serialele și filmele preferate, cât și pe tine pentru că ne dorim să te bucuri alături de familie de sărbători și nu lucrând la proiectul de POO.
Ne dorim implementarea unei platfome pentru vizualizarea de filme și seriale. Inițial ne gândim la câteva funcționalități standard, primele care ne vin în minte, pe care le vom propune noi după cum urmează: register, login, logout, search, view movie, rating, etc.
Rolul vostru este să implementați funcționalitățile acestei pagini din perspectiva unui utilizator și să îi transmiteți acestuia ce anume are voie și nu are voie să realizeze la un anumit moment de timp, pe platforma voastră.
Ulterior, în etapa a doua a proiectului ne vom da seama că platforma noastră a devenit foarte populară, iar cerințele utilizatorilor sunt mult mai mari decât posibilitățile acesteia. Astfel, vom adăuga noi funcționalități, drept continuare a celor deja existente.
Structura
Platforma va funcționa pe principiul unui sistem de fișiere după cum urmează:
Vizualizarea și explicarea structurii
Aceasta este structura platformei pe care trebuie să o implementați:
În cele ce urmează, explicăm puțin structura platformei noastre în prima etapă pentru a avea o privire de ansamblu asupra acesteia:
Ca să înțelegem mai bine structura secvențială sub formă de sistem de fișiere explicată mai sus, ne vom uita pe figură și oferim niște exemple:
Exemplu: Pagina de login și acțiunea de login sunt două lucruri total diferite: pagina de login face parte din ierarhia de pagini, iar acțiunea de login este un eveniment ce se poate realiza doar dacă mă aflu pe pagina de login. Altfel spus, pentru a realiza acțiunea de login, trebuie mai întâi să mă aflu pe pagina de login;
De asemenea, explicația imbricărilor pentru acțiuni este similară cu cea a paginilor. Adică, pentru a realiza o acțiune trebuie realizată mai întâi acțiunea părinte (dacă aceasta există). Exemplu: pentru a putea realiza acțiunea de „Like”, trebuie mai întâi realizată acțiunea de „Watch”. La rândul ei, pentru a putea realiza acțiunea de „Watch”, trebuie realizată mai întâi acțiunea de „Purchase”.
Workflow-ul unui user pe platformă
Vrem să înțelegem care sunt acțiunile posibile la un anumit moment de timp pentru un utilizator. Din acel moment vom ști că orice altă acțiune nu este permisă.
Sunt un utilizator al acestei platforme / aplicații. Primesc ca primă pagină „Homepage neautentificat”;
După ce realizez cu succes una dintre aceste două funcționalități voi fi mutat pe pagina „Homepage autentificat” de unde am acces la trei noi pagini:
Users - Format Input JSON și explicații
După cum se poate observa, așa cum am zis și în secțiunea de „Execuția proiectului”, în fiecare fișier de input de tip JSON se va afla un JSON Array de utilizatori.
Fiecare utilizator este identificat prin nume, parolă, tipul de cont (standard/premium), țara din care provine (aceasta este țara folosită pentru a vedea care sunt filmele care pot / nu pot fi vizualizate într-o anumită țară) și balanța disponibilă.
Singura diferență în această etapă între un utilizator standard și un utilizator premium este faptul că utilizatorul premium are dreptul să cumpere 15 filme gratuite înainte ca acesta să plătească 2 tokeni / film la fel ca un utilizator standard. Alte avantaje pentru utilizatorul premium vor apărea în etapa a doua.
Movies - Format input JSON și explicații
După cum se poate observa, așa cum se oferă un JSON Array de utilizatori inițiali, așa se oferă și un JSON Array de filme existente pe platformă. Spre deosebire de lista de utilizatori, cea de filme nu se poate modifica prin nicio operațiune de-a lungul primei etape.
Orice astfel de film este identificat prin: nume, an de apariție, durată, genuri din care face parte, actori care joacă în film și țările în care filmul este interzis.
Definim rating-ul unui film ca fiind media aritmetică a tuturor rating-urilor utilizatorilor care au dat o notă filmului respectiv. Utilizatorii care nu au oferit niciun rating unui anumit film nu sunt luați în considerare. Exemplu: dacă avem 5 utilizatori dintre care doar 3 au oferit rating asupra unui film, rating-ul final al filmului va fi media aritmetică a celor 3 rating-uri oferite.
De fiecare dată când se primește un nou rating asupra unui film, se recalculează integral. Nu reciclați rezultatul de până atunci! Exemplu: dacă luăm situația de mai sus în care avem un rating calculat din 3 note oferite, în momentul în care apare o a 4-a notă, rating-ul se calculează din nou de la capăt. Nu folosiți faptul că noul rating = (vechiul rating * 3 + nota a 4-a) / 4 deoarece o să apară diferențe la zecimale față de rezultatele de referință oferite de noi.
Actions - Format input JSON și explicații
Așa cum am explicat anterior există două tipuri mari de acțiuni în prima etapă: „change page” și „on page”. Acestea se află toate într-un JSON Array și se execută secvențial conform ordinii în care sunt în listă. Se pot executa doar dacă pagina pe care vrem să ne mutăm / acțiunea pe care vrem să o facem este disponibilă de pe acea pagină.
Acțiunea de tip „change page”
Acțiunea de tip „change page” conține (cu o singură excepție), indiferent de situație două câmpuri: cel de „type” prin care identificăm că este vorba despre o schimbare de pagină și cel de „page” prin care anunțăm pagina pe care dorim să facem mutarea.
Acțiunea de tip „change page” - excepție pentru See Details
Acțiunea de tip „change page” pentru schimbarea corectă a paginii pe „see details” conține exact aceleași câmpuri ca toate celelalte acțiuni de tip „change page”, dar și unul în plus, „movie” pentru a putea determina pentru care dintre filmele afișate pe pagină dorim afișarea detaliilor.
Acțiunile de tip „on page” Așa cum am menționat anterior, acțiunile de tip „on page” sunt numeroase și depind ca input de la pagină la pagină. Toate sunt identificate prin câmpul „type” ce are întotdeauna valoarea de „on page”. În cele ce urmează vom detalia toate tipurile de acțiuni posibile. Vom oferi detalii acolo unde considerăm că JSON-ul nu vorbește de la sine:
Acțiunea de „register”
Acțiunea de „login”
Acțiunea de „search”
Acțiunea de tip search este de fapt tot o filtrare în care condiția este că titlul filmelor trebuie să înceapă obligatoriu cu string-ul oferit în câmpul „startsWith”.
După aplicarea unei operațiuni de tip search, din lista filmelor ce exista, vor rămâne disponibile pentru viitoare acțiuni doar acelea care au începutul numelui identic cu string-ul din „startsWith”.
Acțiunea de „filter”
Acțiunea de „buy tokens”
După cum putem observa, acțiunea de „buy tokens” este realizată pe pagina de „upgrades”, caracterizată de un feature de „buy”, și numele obiectului pe care îl cumpărăm, adică „tokens” (moneda platformei). Toate acestea sunt urmate de numărul de tokeni pe care vrem să îl cumpărăm.
Acțiunea de „buy premium account”
Analog ca la operațiunea de „buy tokens”. Valoarea unui cont premium este egală cu 10 tokens. Deci, după o operațiune de acest tip, contul curent devine din standard în premium, iar numărul de tokens scade cu 10. Altfel spus: tokens -= 10.
Acțiunea de „Purchase”
Acțiunea de „Watch”
Acțiunea de „Like”
Acțiunea de „Rate a movie”
În cadrul acestui proiect, există mai multe situații în care oferim output. Outputul se oferă per tip de comandă și are următorul format general:
Format general de „Output”
Cele trei câmpuri din exemplul de mai sus sunt populate în funcție de situație după cum urmează:
Format pentru câmpul de „currentUser”
În cazul în care avem un utilizator autentificat pe platformă la un anumit moment de timp, câmpul de „currentUser” are formatul prezentat mai sus. Putem observa faptul că se afișează datele la output după cum urmează:
Fiecare câmp care reprezintă o listă de filme este populat cu detalii despre filme în întregime (exact așa cum au fost primite în input) la care se adaugă câteva câmpuri (numărul de like-uri pe care le are filmul curent, rating-ul filmului curent calculat așa cum a fost precizat anterior, și numărul de rating-uri pe care l-a primit filmul respectiv) după cum urmează:
Format pentru popularea oricărui câmp care reprezintă o listă de filme
În acest sens există mai jos un test discutat input - output integral pentru a înțelege mai bine cum se populează aceste structuri.
Output-ul este oferit în una dintre următoarele situații:
Care sunt pașii pentru a genera output-ul în funcție de comandă?
În cele ce urmează o să explicăm un exemplu puțin mai complex, integral de input-output ca să fie destul de ușor de înțeles flow-ul aplicației și cum gândim platforma:
Explicații privind testul de input-output de deasupa:
Cum gândim inputul?
Pentru început stocăm toți utilizatorii și filmele deja existente pe platformă din input, după care executăm acțiunile rând pe rând, secvențial, așa cum am precizat mai sus:
În acest fel, am parcurs împreună un test input-output ca să putem observa cum gândim și afișăm corespunzător mesajele cerute!
Pentru testarea soluției, rulați funcția main a clasei Test. Aceasta va rula atât testele, cât și checkstyle-ul. Pentru rularea checkerului, aveți nevoie ca proiectul vostru să aibă încărcate bibliotecile pentru citirea fișierelor JSON. Mai multe detalii aici.
Punctajul constă din:
Depunctările pentru designul și organizarea codului se vor scădea din punctajul testelor. Dacă vor apărea depunctări specifice temei în momentul evaluării, nemenționate pe pagina cu depunctări generale, ele se vor încadra în limitele de maxim 15 pentru design, 10p pentru README. Dacă tema nu respectă cerințele, sau nu are design OOP, atunci pot apărea depunctări suplimentare.
Bonusuri: La evaluare, putem oferi bonusuri pentru design foarte bun, cod bine documentat, dar și pentru diverse elemente suplimentare alese de voi.
Unul din obiectivele temei este învățarea respectării code-style-ului limbajului pe care îl folosiți. Aceste convenții (de exemplu cum numiți fișierele, clasele, variabilele, cum indentați) sunt verificate pentru temă de către tool-ul checkstyle.
Pe pagina de Recomandări cod găsiți câteva exemple de coding style.
Dacă numărul de erori depistate de checkstyle depășește 30, atunci punctele pentru coding-style nu vor fi acordate. Dacă punctajul este negativ, acesta se trunchiază la 0.
Exemple:
punctaj_total = 125
și nr_erori = 200
⇒ nota_finala = 115
punctaj_total = 125
și nr_erori = 29
⇒ nota_finala = 125
punctaj_total = 80
și nr_erori = 30
⇒ nota_finala = 80
punctaj_total = 80
și nr_erori = 31
⇒ nota_finala = 70
Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:
README