Table of Contents

Proiect - Etapa 1 - POO TV

 Logo Proiect

Obiective

Scenariu

Î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.

Context

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.

  • Etapa a doua a proiectului pleacă de la ideea realizării integrale a primei etape a proiectului;
  • În acest sens, recomandăm scrierea unui cod cât mai generic ce permite adăugarea de noi funcționalități și implementarea cerințelor treptat, conform timeline-ului oferit de către echipa de proiect.

Execuția proiectului

Descrierea modului de funcționare al platformei

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:  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:

Nu confundați paginile cu acțiunile care se pot realiza pe o anumită pagină;

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”.

Cele menționate mai sus reprezintă doar câteva exemple referitor la operațiile posibile la un anumit moment de timp, sau la erorile ce pot apărea (mai exact, tratarea exhaustivă a variantelor posibile din „Homepage neautentificat”). Este datoria voastră să tratați toate cazurile posibile conform descrierii de sistem de fișiere al platformei pentru celelalte pagini. De asemenea, structura paginii din figura anterioară nu este finală. Aceasta este baza de la care va porni evident, etapa următoare a proiectului.

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:

Format JSON input

Users - Format Input JSON și explicații

Click pentru exemplu

Click pentru exemplu

"users": [
    {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "standard",
        "country": "Romania",
        "balance": "200"
      }
    }
]

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ă.

Balanța disponibilă pentru un utilizator nu reprezintă numărul de tokeni pe care un utilizator îl are. Toți utilizatorii fie ei din JSON Array-ul de început, fie ei înregistrați pe parcursul testelor, încep cu 0 tokeni. Relația de echivalență între balanță și tokeni este de 1 la 1. Practic, în momentul în care se cumpără tokeni, 1 balance = 1 token. Orice operațiune de pe platformă se realizează în tokeni.

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.

Se consideră că utilizatorii ce sunt deja premium în JSON Array-ul din input sau cei ce se înregistrează direct ca utilizatori premium, nu au cumpărat niciun film la începutul fiecărui test. Practic, toți încep cu 0 filme / seriale cumpărate și 15 filme / seriale gratuite disponibile.

Movies - Format input JSON și explicații

Click pentru exemplu

Click pentru exemplu

"movies": [
    {
        "name": "John Wick: Chapter 3 - Parabellum",
	"year": "2019",
	"duration": 131,
	"genres": [
	    "Action",
	    "Thriller",
	    "Crime"
	],
	"actors": [
	    "Laurence Fishburne",
	    "Halle Berry",
	    "Keanu Reeves"
	],
	"countriesBanned": [
	    "Russia",
	    "Austria"
	]
    }
]

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.

Utilizatorii care reprezintă aceste țari nu pot nici măcar vizualiza filmul în lista de filme inițială, deci nu pot realiza absolut nicio acțiune asupra lor. Ele practic sunt inexistente / invizibile pentru utilizatorii din țara / țările banată / e.

Pentru prima etapa, sortarea se va face doar dupa rating si duration. In cazul in care ambele campuri sunt specificate in input, sortarea se va face mai intai dupa duration, iar apoi, in caz de egalitate, dupa rating.

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.

Rating-ul se va calcula folosind tipul de date Double și va fi exprimat ca un număr real cu două zecimale exacte;

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”

Click pentru exemplu

Click pentru exemplu

{
    "type": "change page",
    "page": "login"
}

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

Click pentru exemplu

Click pentru exemplu

{
    "type": "change page",
    "page": "see details",
    "movie": "movie title"
}

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”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "register",
      "feature": "register",
      "credentials": {
        "name": "Mihnea",
        "password": "acoperisvasile",
        "accountType": "standard",
        "country": "Ireland",
        "balance": "300"
      }
}

Acțiunea de „login”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "login",
      "feature": "login",
      "credentials" : {
        "name": "Ramsi",
        "password": "numiplacevelea"
      }
}

Acțiunea de „search”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "movies",
      "feature": "search",
      "startsWith": "Iubire din serai"
}

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”

Click pentru exemplu

Click pentru exemplu

{
    "type": "on page",
    "page": "movies",
    "feature": "filter",
    "filters": {
        "sort": {
            "rating": "decreasing",
	    "duration": "decreasing"
	},
	"contains": {
	    "actors": [
	        "Keanu Reeves",
		"Actor 2"
	    ],
	    "genre": [
		"Comedy",
		"Drama"
	    ]
	}
    }
}

Acțiunea de „buy tokens”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "upgrades",
      "feature": "buy tokens",
      "count": "300"
}

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.

Numărul afișat în câmpul de „count” reprezintă atât numărul de tokeni pe care vrem să îl cumpărăm cât și numărul de bani din balance pe care trebuie să îi scădem (altfel spus, numberTokens += count și balance -= count);

Acțiunea de „buy premium account”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "upgrades",
      "feature": "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”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "see details",
      "feature": "purchase"
}

Acțiunea de „Watch”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "see details",
      "feature": "watch"
}

Acțiunea de „Like”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "see details",
      "feature": "like"
}

Acțiunea de „Rate a movie”

Click pentru exemplu

Click pentru exemplu

{
      "type": "on page",
      "page": "see details",
      "feature": "rate",
      "rate": 4
}

Format output JSON și explicații

Î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”

Click pentru exemplu

Click pentru exemplu

{
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
}

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”

Click pentru exemplu

Click pentru exemplu

{
    "currentUser": {
      "credentials": {
        "name": "SkF",
        "password": "beesknees",
        "accountType": "standard",
        "country": "Romania",
        "balance": "300"
      },
      "tokensCount": 0, // numărul de tokeni pe care îl are utilizatorul la momentul curent
      "numFreePremiumMovies": 15, // numărul de filme gratuite disponibile în caz de cont premium pe care le mai are utilizatorul la dispoziție
      "purchasedMovies": [], // filmele cumpărate de utilizator
      "watchedMovies": [], // filmele vizualizate de către utilizator
      "likedMovies": [], // filmele apreciate de către utilizator
      "ratedMovies": [] // filmele cărora utilizatorul curent le-a oferit o notă
    }
}

Î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

Click pentru exemplu

Click pentru exemplu

"currentMoviesList": [
      {
        "name": "John Wick: Chapter 3 - Parabellum",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      },
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      }
    ]

Î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ă?

Exemplu de test input – output integral și explicat

Î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:

Click pentru input

Click pentru input

{
  "users": [
    {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "standard",
        "country": "Romania",
        "balance": "200"
      }
    },
    {
      "credentials": {
        "name": "Mihail",
        "password": "discret",
        "accountType": "premium",
        "country": "Russia",
        "balance": "1337"
      }
    }
  ],
  "movies": [
    {
      "name": "John Wick: Chapter 3 - Parabellum",
      "year": "2019",
      "duration": 131,
      "genres": [
        "Action",
        "Thriller",
        "Crime"
      ],
      "actors": [
        "Laurence Fishburne",
        "Halle Berry",
        "Keanu Reeves"
      ],
      "countriesBanned": [
        "Russia"
      ]
    },
    {
      "name": "Titanic",
      "year": "2019",
      "duration": 131,
      "genres": [
        "Action",
        "Thriller",
        "Crime"
      ],
      "actors": [
        "Laurence Fishburne",
        "Halle Berry",
        "Keanu Reeves"
      ],
      "countriesBanned": [
        "Russia"
      ]
    }
  ],
  "actions": [
    {
      "type": "change page",
      "page": "login"
    },
    {
      "type": "on page",
      "feature": "login",
      "credentials": {
        "name": "Eduard",
        "password": "parolamea"
      }
    },
    {
      "type": "change page",
      "page": "register"
    },
    {
      "type": "on page",
      "page": "register",
      "feature": "register",
      "credentials": {
        "name": "Ramsi",
        "password": "numiplacevelea",
        "accountType": "standard",
        "country": "Ireland",
        "balance": "300"
      }
    },
    {
      "type": "change page",
      "page": "login"
    },
    {
      "type": "on page",
      "page": "login",
      "feature": "login",
      "credentials": {
        "name": "Ramsi",
        "password": "numiplacevelea"
      }
    },
    {
      "type": "change page",
      "page": "movies"
    },
    {
      "type": "on page",
      "page": "movies",
      "feature": "search",
      "startsWith": "Iubire din serai"
    },
    {
      "type": "on page",
      "page": "movies",
      "feature": "filter",
      "filters": {
        "sort": {
          "rating": "decreasing",
          "duration": "decreasing"
        },
        "contains": {
          "actors": [
            "Keanu Reeves"
          ]
        }
      }
    },
    {
      "type": "change page",
      "page": "logout"
    },
    {
      "type": "change page",
      "page": "login"
    },
    {
      "type": "on page",
      "page": "login",
      "feature": "login",
      "credentials": {
        "name": "Eduard",
        "password": "nicigand"
      }
    },
    {
      "type": "change page",
      "page": "login"
    },
    {
      "type": "on page",
      "page": "login",
      "feature": "login",
      "credentials": {
        "name": "Eduard",
        "password": "secret"
      }
    },
    {
      "type": "change page",
      "page": "upgrades"
    },
    {
      "type": "on page",
      "page": "upgrades",
      "feature": "buy tokens",
      "count": "50"
    },
    {
      "type": "on page",
      "page": "upgrades",
      "feature": "buy premium account"
    },
    {
      "type": "change page",
      "page": "movies"
    },
    {
      "type": "change page",
      "page": "see details",
      "movie": "AAA"
    },
    {
      "type": "change page",
      "page": "see details",
      "movie": "BBBB"
    },
    {
      "type": "change page",
      "page": "see details",
      "movie": "Titanic"
    },
    {
      "type": "on page",
      "page": "see details",
      "feature": "purchase",
      "objectType": "movie",
      "movie": "Titanic"
    },
    {
      "type": "on page",
      "page": "see details",
      "feature": "watch",
      "objectType": "movie",
      "movie": "Titanic"
    },
    {
      "type": "on page",
      "page": "see details",
      "feature": "like",
      "objectType": "movie",
      "movie": "Titanic"
    },
    {
      "type": "change page",
      "page": "movies"
    },
    {
      "type": "change page",
      "page": "see details",
      "movie": "John Wick: Chapter 3 - Parabellum"
    },
    {
      "type": "on page",
      "page": "see details",
      "feature": "like",
      "objectType": "movie",
      "movie": "John Wick: Chapter 3 - Parabellum"
    },
    {
      "type": "on page",
      "page": "see details",
      "feature": "rate",
      "objectType": "movie",
      "movie": "John Wick: Chapter 3 - Parabellum",
      "rate": "5"
    },
    {
      "type": "on page",
      "page": "see details",
      "feature": "watch",
      "objectType": "movie",
      "movie": "John Wick: Chapter 3 - Parabellum"
    },
    {
      "type": "on page",
      "page": "see details",
      "feature": "like",
      "objectType": "movie",
      "movie": "John Wick: Chapter 3 - Parabellum"
    },
    {
      "type": "on page",
      "page": "see details",
      "feature": "rate",
      "objectType": "movie",
      "movie": "John Wick: Chapter 3 - Parabellum",
      "rate": "5"
    }
  ]
}

Click pentru output

Click pentru output

[
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": null,
    "currentMoviesList": [],
    "currentUser": {
      "credentials": {
        "name": "Ramsi",
        "password": "numiplacevelea",
        "accountType": "standard",
        "country": "Ireland",
        "balance": "300"
      },
      "tokensCount": 0,
      "numFreePremiumMovies": 15,
      "purchasedMovies": [],
      "watchedMovies": [],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "John Wick: Chapter 3 - Parabellum",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      },
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Ramsi",
        "password": "numiplacevelea",
        "accountType": "standard",
        "country": "Ireland",
        "balance": "300"
      },
      "tokensCount": 0,
      "numFreePremiumMovies": 15,
      "purchasedMovies": [],
      "watchedMovies": [],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": null,
    "currentMoviesList": [],
    "currentUser": {
      "credentials": {
        "name": "Ramsi",
        "password": "numiplacevelea",
        "accountType": "standard",
        "country": "Ireland",
        "balance": "300"
      },
      "tokensCount": 0,
      "numFreePremiumMovies": 15,
      "purchasedMovies": [],
      "watchedMovies": [],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "John Wick: Chapter 3 - Parabellum",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      },
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Ramsi",
        "password": "numiplacevelea",
        "accountType": "standard",
        "country": "Ireland",
        "balance": "300"
      },
      "tokensCount": 0,
      "numFreePremiumMovies": 15,
      "purchasedMovies": [],
      "watchedMovies": [],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": null,
    "currentMoviesList": [],
    "currentUser": {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "standard",
        "country": "Romania",
        "balance": "200"
      },
      "tokensCount": 0,
      "numFreePremiumMovies": 15,
      "purchasedMovies": [],
      "watchedMovies": [],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "John Wick: Chapter 3 - Parabellum",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      },
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "premium",
        "country": "Romania",
        "balance": "150"
      },
      "tokensCount": 40,
      "numFreePremiumMovies": 15,
      "purchasedMovies": [],
      "watchedMovies": [],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "premium",
        "country": "Romania",
        "balance": "150"
      },
      "tokensCount": 40,
      "numFreePremiumMovies": 15,
      "purchasedMovies": [],
      "watchedMovies": [],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "premium",
        "country": "Romania",
        "balance": "150"
      },
      "tokensCount": 40,
      "numFreePremiumMovies": 14,
      "purchasedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 0,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "watchedMovies": [],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "premium",
        "country": "Romania",
        "balance": "150"
      },
      "tokensCount": 40,
      "numFreePremiumMovies": 14,
      "purchasedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 0,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "watchedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 0,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "likedMovies": [],
      "ratedMovies": []
    }
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 1,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "premium",
        "country": "Romania",
        "balance": "150"
      },
      "tokensCount": 40,
      "numFreePremiumMovies": 14,
      "purchasedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "watchedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "likedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "ratedMovies": []
    }
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "John Wick: Chapter 3 - Parabellum",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      },
      {
        "name": "Titanic",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 1,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "premium",
        "country": "Romania",
        "balance": "150"
      },
      "tokensCount": 40,
      "numFreePremiumMovies": 14,
      "purchasedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "watchedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "likedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "ratedMovies": []
    }
  },
  {
    "error": null,
    "currentMoviesList": [
      {
        "name": "John Wick: Chapter 3 - Parabellum",
        "year": "2019",
        "duration": 131,
        "genres": [
          "Action",
          "Thriller",
          "Crime"
        ],
        "actors": [
          "Laurence Fishburne",
          "Halle Berry",
          "Keanu Reeves"
        ],
        "countriesBanned": [
          "Russia"
        ],
        "numLikes": 0,
        "rating": 0,
        "numRatings": 0
      }
    ],
    "currentUser": {
      "credentials": {
        "name": "Eduard",
        "password": "secret",
        "accountType": "premium",
        "country": "Romania",
        "balance": "150"
      },
      "tokensCount": 40,
      "numFreePremiumMovies": 14,
      "purchasedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "watchedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "likedMovies": [
        {
          "name": "Titanic",
          "year": "2019",
          "duration": 131,
          "genres": [
            "Action",
            "Thriller",
            "Crime"
          ],
          "actors": [
            "Laurence Fishburne",
            "Halle Berry",
            "Keanu Reeves"
          ],
          "countriesBanned": [
            "Russia"
          ],
          "numLikes": 1,
          "rating": 0,
          "numRatings": 0
        }
      ],
      "ratedMovies": []
    }
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  },
  {
    "error": "Error",
    "currentMoviesList": [],
    "currentUser": null
  }
]

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!

Indicații

Testarea soluției

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.

Evaluare

Punctajul constă din:

  • Folosirea git pentru versionare va fi verificată din folderul .git pe care trebuie să îl includeți în arhiva temei.
  • Punctajul se va acorda dacă ați făcut minim 3 commit-uri relevante și cu mesaj sugestiv.
  • NU este permis să aveți repository-urile de git publice până la deadline-ul hard.

  • Pentru aceasta etapa este suficient sa folositi un singur design pattern, data fiind organizarea orelor de laborator.
  • Totusi, tineti cont de faptul ca la finalul etapei a2a va trebui sa aveti 4 design patterns, deci aveti grija cum va structurati codul.

Pe pagina Indicații pentru teme găsiți indicații despre scrierea README-ului și depunctările generale pentru teme

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.

Temele vor fi testate împotriva plagiatului. Orice tentativă de copiere va duce la anularea punctajului de pe parcursul semestrului şi repetarea materiei atât pentru sursă(e) cât şi pentru destinație(ii), fără excepție.

Checkstyle

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:

Upload temă

Arhiva pe care o veţi urca pe VMChecker va trebui să conţină în directorul rădăcină:

Resurse și linkuri utile