{"id":29212093,"url":"https://github.com/ialoig/fantasta-server","last_synced_at":"2026-04-12T06:35:06.876Z","repository":{"id":185840944,"uuid":"481533379","full_name":"ialoig/fantasta-server","owner":"ialoig","description":"The most exciting Fantacalcio auction ⚽️ 🏆","archived":false,"fork":false,"pushed_at":"2023-08-03T11:00:51.000Z","size":1669,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-12T06:35:04.889Z","etag":null,"topics":["docker","docker-compose","docker-container","mocha","mocha-chai","mongodb","mongoosejs","react","reactjs"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ialoig.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-04-14T08:53:08.000Z","updated_at":"2022-04-14T09:13:18.000Z","dependencies_parsed_at":null,"dependency_job_id":"5b1cfd72-6c22-4fb1-b57f-e5f8bbb50ba9","html_url":"https://github.com/ialoig/fantasta-server","commit_stats":null,"previous_names":["ialoig/fantasta-server"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ialoig/fantasta-server","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ialoig%2Ffantasta-server","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ialoig%2Ffantasta-server/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ialoig%2Ffantasta-server/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ialoig%2Ffantasta-server/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ialoig","download_url":"https://codeload.github.com/ialoig/fantasta-server/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ialoig%2Ffantasta-server/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31706765,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-12T06:22:27.080Z","status":"ssl_error","status_checked_at":"2026-04-12T06:21:52.710Z","response_time":58,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","docker-container","mocha","mocha-chai","mongodb","mongoosejs","react","reactjs"],"created_at":"2025-07-02T22:06:57.685Z","updated_at":"2026-04-12T06:35:06.840Z","avatar_url":"https://github.com/ialoig.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 💻 Fantasta server\r\n\r\nServer side of the fantasta application. It receives API calls from the mobile application querying the mongodb if necessary. It handles also the football player auction that is running on different devices belonging to the same league.\r\n\r\n## Dependencies\r\n\r\n1. 📥 docker\r\n2. 📥 npm\r\n3. 📥 node\r\n\r\n# Build, Test, Run\r\n\r\nWe use Docker to launch the application in different environments: debug, test, production.\r\n\r\n## 📦 Docker\r\n\r\n### ◽️ Test with docker\r\n\r\nIt spawns the *fantasta_mongo* and *fantasta_server* docker containers. Then run tests in the *fantasta_server* container.\r\n\r\n```shell\r\nnpm run docker-test\r\n```\r\n\r\n### ◽️ Run with docker (DEBUG)\r\n\r\nIt spawns the *fantasta_mongo* and *fantasta_server* docker containers in **debug** mode. It mounts local *src* directory in the *fantasta_server* container and run the server with *nodemon* -\u003e any local change in */src* directory will trigger a server restart with the new code.\r\n\r\n```shell\r\n\u003e npm run docker-debug\r\n```\r\n\r\n### ◽️ Run with docker (PRODUCTION)\r\n\r\nIt spawns the *fantasta_mongo* and *fantasta_server* docker containers in **production** mode. Run the server as a service in the background.\r\n\r\n```shell\r\n\u003e npm run docker-prod\r\n```\r\n\r\n## 🖥 Local\r\n\r\n### ◽️ Test locally\r\n\r\nRun tests on the local machine (requires docker mongo to be running already)\r\n\r\n```shell\r\n\u003e npm run test\r\n```\r\n\r\n### ◽️ Run locally (DEBUG)\r\n\r\nRun tests on the local machine (requires docker mongo to be running already)\r\n\r\n```shell\r\nnpm run debug\r\n```\r\n\r\n# 🔍 Monitoring\r\n\r\nPrometheus and Grafana docker containers are responsible for getting and showing metrics produced by the application. [Prometheus client](https://github.com/siimon/prom-client) is running on the server and it is collecting metrics from the application. The server itself exposes those metrics via API call that prometheus docker container is scraping at regular intervals.\r\nPrometheus containers is later on sending those metrics to the grafana container making them available in the dashboards.\r\n\r\nUseful links:\r\n\r\n* [Server metric API call](http://localhost:3000/fantasta/metrics)\r\n* [Collected metrics by Prometheus](http://localhost:9090)\r\n* [Grafana](http://localhost:3001)\r\n\r\n# 🌱 MONGO DB\r\n\r\n## Useful commands\r\n\r\nTo open a `MongoDB CLI` run the command:\r\n\r\n```shell\r\nmongo\r\n```\r\n\r\nShow all databases instances:\r\n\r\n```shell\r\n\u003e show dbs\r\n```\r\n\r\nIt will show you all the databases instances.\r\n\r\n```shell\r\nadmin           0.000GB\r\nconfig          0.000GB\r\nfantasta_debug  0.000GB\r\nfantasta_test   0.000GB\r\nlocal           0.000GB\r\n```\r\n\r\nYou can now select what do you prefer by running:\r\n\r\n```shell\r\n\u003e use fantasta_debug\r\n```\r\n\r\nThe selected instance is now active. You can nwo query tables inside.\r\n\r\n`Users` table :\r\n\r\n```shell\r\n\u003e db.users.find()\r\n```\r\n\r\n`Teams` table :\r\n\r\n```shell\r\n\u003e db.teams.find()\r\n```\r\n\r\n`Leagues` table :\r\n\r\n```shell\r\n\u003e db.leagues.find()\r\n```\r\n\r\nFind a `user` with a specific email:\r\n\r\n```shell\r\n\u003e db.users.find({email: \"user02@email.com\"})\r\n```\r\n\r\n## How to drop database\r\n\r\nYou can drob entire instance by running the following command:\r\n\r\n```shell\r\n\u003e db.dropDatabase()\r\n```\r\n\r\nNow all the entries within the db instance are deleted. You can restart the server instance to get a new seed of entries (it will run automatically when it does not found any entries).\r\n\r\n\u003e NOTE: Please check server console log to view if Seed has been executed correctyl at startup (it will show you something like below)\r\n\r\n```shell\r\nfantasta_server    | [seed] user found in db: 1\r\nfantasta_server    | [seed] starting to seed db ...\r\nfantasta_server    | [seed] insert users: 10\r\nfantasta_server    | [seed] insert leagues: 12\r\nfantasta_server    | [seed]  ... done\r\nfantasta_server    | [seed] insert markets (empty): 12\r\nfantasta_server    | [seed]  ... done\r\nfantasta_server    | [seed] insert teams: 14\r\nfantasta_server    | [seed]  ... done\r\nfantasta_server    | [seed] Done. Database seeded!\r\n```\r\n\r\n# ESLINT\r\n\r\nThey are two types of module syntax for nodejs. The `commonJS` syntax, that uses **require** and **module.exports**, and the `ES syntax`, that use **import * from \"path\"** style of module.\r\n\r\nBy default, `nodejs` will try to load modules with the CommonJS syntax. If you want to use the ES syntax, you must specify `\"type\":\"module\"` in your `package.json`. But you can't mix them up. You can use one syntax, but not both\r\n\r\n## [@babel/eslint-parser](https://www.npmjs.com/package/@babel/eslint-parser)\r\n\r\n### When should I use @babel/eslint-parser?\r\n\r\nESLint's default parser and core rules [only support the latest final ECMAScript standard](https://github.com/eslint/eslint/blob/a675c89573836adaf108a932696b061946abf1e6/README.md#what-about-experimental-features) and do not support experimental (such as new features) and non-standard (such as Flow or TypeScript types) syntax provided by Babel. @babel/eslint-parser is a parser that allows ESLint to run on source code that is transformed by Babel.\r\n\r\n**Note:** You only need to use @babel/eslint-parser if you are using Babel to transform your code. If this is not the case, please use the relevant parser for your chosen flavor of ECMAScript (note that the default parser supports all non-experimental syntax as well as JSX).\r\n\r\n### How does it work?\r\n\r\nESLint allows for the use of [custom parsers](https://eslint.org/docs/developer-guide/working-with-custom-parsers). When using this plugin, your code is parsed by Babel's parser (using the configuration specified in your [Babel configuration file](https://babeljs.io/docs/en/configuration)) and the resulting AST is\r\ntransformed into an [ESTree](https://github.com/estree/estree)-compliant structure that ESLint can understand. All location info such as line numbers,\r\ncolumns is also retained so you can track down errors with ease.\r\n\r\n**Note:** ESLint's core rules do not support experimental syntax and may therefore not work as expected when using `@babel/eslint-parser`. Please use the companion [`@babel/eslint-plugin`](https://github.com/babel/babel/tree/main/eslint/babel-eslint-plugin) plugin for core rules that you have issues with.\r\n\r\n## [@babel/eslint-plugin](https://github.com/babel/babel/tree/main/eslint/babel-eslint-plugin)\r\n\r\nCompanion rules for `@babel/eslint-parser`. `@babel/eslint-parser` does a great job at adapting `eslint`\r\nfor use with Babel, but it can't change the built-in rules to support experimental features.\r\n`@babel/eslint-plugin` re-implements problematic rules so they do not give false positives or negatives.\r\n\r\n# 📑 NOTES\r\n\r\nIl tema è la gestione della lista giocatori all'interno del Market\r\n\r\n## 📌 SOLUZIONE 1: LISTA MERCATO UNICA\r\n\r\n* La `Lista statistiche` aggiornata periodicamente da fantagazzetta; Nuovo schema nel DB `Statistics`\r\n\r\n* La `Lista completa` aggiornata periodicamente da fantagazzetta; se un giocatore lascia la SerieA è eliminato dalla lista viene settato il flag delete=true\r\n\r\n* La `Lista mercato` creata al momento della creazione del mercato, come snapshot della `Lista completa` in quel momento. E' un array di oggetti definito come:\r\n\r\n```shell\r\n{\r\n    _id: Number,\r\n    actualPrice: Number\r\n}\r\n```\r\n\r\nQuando il mobile parte:\r\n\r\n* footballPlayers.get\r\n* statistics.get (usando la stessa logica con il controllo versione)\r\n\r\nQuando il mobile fa Market.create:\r\n\r\n* il server crea la `Lista mercato` a partire dalla `Lista completa` filtrando deleted=true e la salva in `market.footballPlayers`\r\n\r\n```shell\r\n{\r\n    _id: Number,\r\n    actualPrice: Number\r\n}\r\n```\r\n\r\nDopo che il client fa Market.create/Market.join, nell'oggetto market abbiamo la lista di giocatori disponibili congelata al momento della creazione del market.\r\n\r\nes:\r\n\r\n1. giocatore id = 123\r\n1. Lista completa[123] -\u003e prendo tutte le informazioni (anche se e' eliminato)\r\n1. betHistory[123] -\u003e prendo le informazioni di team e di valore di acquisto\r\n\r\n#### STATISTICHE\r\n\r\nSembrerebbe che i giocatori venduti all'estero non vengono eliminati, quindi abbiamo a disposizione le informazioni di tutti i calciatori.\r\n\r\n### ✏️ TODO\r\n\r\n⬜️ modificare schema in DB `FootballPlayers`. Contiene la lista dei giocatori anno per anno (aggiungi campo `season: \"2020-2021\"`). Rimuovere `statistics`\r\n\r\n```shell\r\nseason: String\r\nversion: Number,\r\nlist: {\r\n    type: Object\r\n}\r\n```\r\n\r\n⬜️ Modificare API `footballPlayers.get` per ottenere solo la lista dei giocatori (senza `statistiche`)\r\n\r\n⬜️ creare nuovo schema in DB `Statistics`. Contiene le statistiche anno per anno (aggiungi campo `season: \"2020-2021\"`)\r\n\r\n```shell\r\nseason: String\r\nversion: Number,\r\nlist: {\r\n    type: Object\r\n}\r\n```\r\n\r\n⬜️ Creare API `statistics.get` per ottenere la `Lista statistiche`.\r\nUsare logica controllo versione per capire se il client ha bisogno di scaricare la nuova lista.\r\n\r\n✅ modifica allo schema market con aggiunta del campo `market.footballPlayers` come Array di oggetti.\r\n\r\n```shell\r\n{\r\n    id: Number,\r\n    actualPrice: Number\r\n}\r\n```\r\n\r\n⬜️ Popolare il campo `market.footballPlayers` alla creazione del market ordinato in base a `league.auctionType`, ovvero:\r\n\r\n* `auctionType=RANDOM` -\u003e ordinamento random\r\n* `auctionType=ALFABETICO` -\u003e ordinamento alfabetico\r\n\r\n⬜️ modifica allo schema market con aggiunta del campo `market.footballPlayersIndex` come Number.\r\n\r\nUtilizzato dal server come indice di accesso all'array `market.footballPlayers` per capire quale giocatore deve essere lanciato all'asta per i casi\r\n`auctionType=RANDOM` e `auctionType=ALFABETICO`. Altrimenti `market.footballPlayersIndex=null`\r\n\r\n⬜️ gestione app meno sicure per l'invio di email tramite google account\r\n\u003chttps://support.google.com/accounts/answer/6010255?authuser=1\u0026p=lsa_blocked\u0026hl=it\u0026authuser=1\u0026visit_id=637846110020700193-994282476\u0026rd=1#more-secure-apps\u0026zippy=%2Cse-lopzione-accesso-app-meno-sicure-%C3%A8-attiva-per-il-tuo-account%2Cusare-una-password-per-lapp\u003e\r\n\r\n### ❓ Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto\r\n\r\n* dato l'ID di un giocatore (es: footballPlayerID=123):\r\n    1. se *betHistory[123]* esiste -\u003e il giocatore e' stato gia' acquistato, mostro il team e il valore di acquisto\r\n    1. se *footballPlayers[123]* esiste -\u003e il giocatore è ancora in SerieA e (svincolato o eliminato), mostro le sue informazioni\r\n    1. Errore in tutti gli altri casi\r\n    \u003e N.B: i casi sopra sono mutuamente esclusivi\r\n\r\n### 🗂 USE CASES\r\n\r\n### 1. Pagina `Players` a mercato non esistente\r\n\r\n*Voglio visualizzare la lista di giocatori completa e aggiornata*\r\n\r\n* mostro tutta la lista giocatori presa da `footballPlayers` e le relative informazioni\r\n\r\n### 2. Pagina `Players` a mercato aperto\r\n\r\n*Voglio visualizzare i giocatori disponibili nel mercato e non gli eventuali nuovi arrivi, in modo da avere coerenza tra la lista di giocatori che posso selezionare quando c'è l'asta in corso e la lista nella pagina Players.*\r\n\r\n* prendo l'oggetto `market` aperto\r\n* prendo la lista giocatori da `market.footballPlayers` che contiene la lista dei giocatori disponibili per quel mercato\r\n* verifica giocatore disponibile e informazioni di acquisto (vedi paragrafo *Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto*)\r\n\r\n### 3. Pagina `Players` a mercato chiuso\r\n\r\n_Voglio visualizzare la lista completa di giocatori, comprensiva dei nuovi arrivi. I giocatori già acquistati dai partecipanti devono mostrare le informazioni del `nome del Team` e del `valore di acquisto`_\r\n\r\n* prendo la lista giocatori da `footballPlayers`\r\n* prendo l'oggetto `market` (ultimo in ordine temporale)\r\n* verifica giocatore disponibile e informazioni di acquisto (vedi paragrafo *Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto*)\r\n\r\n### 4. Lista `seleziona giocatore` nell'asta\r\n\r\n*Voglio visualizzare la lista giocatori del mercato, esclusi quelli che sono già stati assegnati, ovvero solo gli svincolati*\r\n\r\n* prendo l'oggetto `market` aperto\r\n* prendo la lista giocatori da `market.footballPlayers` che contiene la lista dei giocatori disponibili per quel mercato\r\n* verifica giocatore disponibile (vedi paragrafo *Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto*)\r\n\r\n### 5. Apertura `nuovo mercato` quando è già stato eseguito un mercato precedentemente (es. apertura mercato di Gennaio)\r\n\r\n*Devo creare una nuova lista giocatori e visualizzare le informzioni dei giocatori che sono stati già stati assegnati con la/le asta/e precedente/i*\r\n\r\n* inizializzo `market.footballPlayer` con `Lista completa`\r\n* `market.betHistory` non viene cancellato ma contiene lo storico delle aste precedenti\r\n* verifica giocatore disponibile e informazioni di acquisto (vedi paragrafo *Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto*)\r\n\r\n## 📌 SOLUZIONE 2: LISTA GIOCATORI CON FLAG DELETED\r\n\r\n* La `Lista statistiche` aggiornata periodicamente da fantagazzetta; Nuovo schema nel DB `Statistics`\r\n\r\n* La `Lista completa` aggiornata periodicamente da fantagazzetta; se un giocatore lascia la SerieA deve essere flaggato come deleted (`deleted=true`)\r\n\r\n* La `Lista mercato` creata al momento della creazione del mercato, come snapshot della `Lista completa` in quel momento dei soli giocatori disponibili `deleted=false`. E' un array di oggetti definito come:\r\n\r\n```shell\r\n{\r\n    _id: Number,\r\n    actualPrice: Number\r\n}\r\n```\r\n\r\nQuando il mobile parte:\r\n\r\n* footballPlayers.get\r\n* statistics.get (usando la stessa logica con il controllo versione)\r\n\r\nQuando il mobile fa Market.create:\r\n\r\n* il server crea la `Lista mercato` a partire dalla `Lista completa` e la salva in `market.footballPlayers`\r\n\r\n```shell\r\n{\r\n    _id: Number,\r\n    actualPrice: Number\r\n}\r\n```\r\n\r\nDopo che il client fa Market.create/Market.join, nell'oggetto market abbiamo la lista di giocatori congelata al momento della creazione del market.\r\n\r\nCon l'ausilio di `Lista completa` possiamo recuperare tutte le informazioni dei giocatori del market, che giochino ancora in Serie A o meno\r\n\r\nes:\r\n\r\n1. giocatore id = 123\r\n1. Lista completa[123] -\u003e prendo tutte le informazioni\r\n1. betHistory[123] -\u003e prendo le informazioni di team e di valore di acquisto\r\n\r\n#### STATISTICHE\r\n\r\nSembrerebbe che i giocatori venduti all'estero non vengono eliminati, quindi abbiamo a disposizione le informazioni di tutti i calciatori.\r\n\r\n### ✏️ TODO\r\n\r\n⬜️ modificare schema in DB `FootballPlayers`. Contiene la lista dei giocatori anno per anno (aggiungi campo `season: \"2020-2021\"`). Rimuovere `statistics`\r\n\r\n```shell\r\nseason: String\r\nversion: Number,\r\nlist: {\r\n    type: Object\r\n}\r\n```\r\n\r\n⬜️ Modificare API `footballPlayers.get` per ottenere solo la lista dei giocatori (senza `statistiche`)\r\n\r\n⬜️ creare nuovo schema in DB `Statistics`. Contiene le statistiche anno per anno (aggiungi campo `season: \"2020-2021\"`)\r\n\r\n```shell\r\nseason: String\r\nversion: Number,\r\nlist: {\r\n    type: Object\r\n}\r\n```\r\n\r\n⬜️ Creare API `statistics.get` per ottenere la `Lista statistiche`.\r\nUsare logica controllo versione per capire se il client ha bisogno di scaricare la nuova lista.\r\n\r\n⬜️ modifica allo schema market con aggiunta del campo `market.footballPlayers` come Array di oggetti.\r\n\r\n```shell\r\n{\r\n    id: Number,\r\n    actualPrice: Number\r\n}\r\n```\r\n\r\nPopolare il campo `market.footballPlayers` alla creazione del market ordinato in base a `league.auctionType`, ovvero:\r\n\r\n* `auctionType=RANDOM` -\u003e ordinamento random\r\n* `auctionType=ALFABETICO` -\u003e ordinamento alfabetico\r\n\r\n⬜️ modifica allo schema market con aggiunta del campo `market.footballPlayersIndex` come Number.\r\n\r\nUtilizzato dal server come indice di accesso all'array `market.footballPlayers` per capire quale giocatore deve essere lanciato all'asta per i casi\r\n`auctionType=RANDOM` e `auctionType=ALFABETICO`. Altrimenti `market.footballPlayersIndex=null`\r\n\r\n⬜️ gestione app meno sicure per l'invio di email tramite google account\r\n\u003chttps://support.google.com/accounts/answer/6010255?authuser=1\u0026p=lsa_blocked\u0026hl=it\u0026authuser=1\u0026visit_id=637846110020700193-994282476\u0026rd=1#more-secure-apps\u0026zippy=%2Cse-lopzione-accesso-app-meno-sicure-%C3%A8-attiva-per-il-tuo-account%2Cusare-una-password-per-lapp\u003e\r\n\r\n### ❓ Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto\r\n\r\n* dato l'ID di un giocatore (es: footballPlayerID=123):\r\n    1. se *betHistory[123]* esiste -\u003e il giocatore e' stato gia' acquistato, mostro il team e il valore di acquisto\r\n    1. recupero *footballPlayers[123]* -\u003e se il giocatore ha il flag *deleted=true* significa che non è più in serieA e mostro il flag `deleted`\r\n    1. Errore in tutti gli altri casi\r\n    \u003e N.B: i casi sopra sono mutuamente esclusivi\r\n\r\n### 🗂 USE CASES\r\n\r\n### 1. Pagina `Players` a mercato non esistente\r\n\r\n*Voglio visualizzare la lista di giocatori completa e aggiornata*\r\n\r\n* mostro tutta la lista giocatori presa da `footballPlayers` e le relative informazioni\r\n\r\n### 2. Pagina `Players` a mercato aperto\r\n\r\n*Voglio visualizzare i giocatori disponibili nel mercato e non gli eventuali nuovi arrivi, in modo da avere coerenza tra la lista di giocatori che posso selezionare quando c'è l'asta in corso e la lista nella pagina Players.*\r\n\r\n* prendo l'oggetto `market` aperto\r\n* prendo la lista giocatori da `market.footballPlayers` che contiene la lista dei giocatori disponibili per quel mercato\r\n* verifica giocatore disponibile e informazioni di acquisto (vedi paragrafo *Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto*)\r\n\r\n### 3. Pagina `Players` a mercato chiuso\r\n\r\n_Voglio visualizzare la lista completa di giocatori, comprensiva dei nuovi arrivi. I giocatori già acquistati dai partecipanti devono mostrare le informazioni del `nome del Team` e del `valore di acquisto`_\r\n\r\n* prendo la lista giocatori da `footballPlayers`\r\n* prendo l'oggetto `market` (ultimo in ordine temporale)\r\n* verifica giocatore disponibile e informazioni di acquisto (vedi paragrafo *Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto*)\r\n\r\n### 4. Lista `seleziona giocatore` nell'asta\r\n\r\n*Voglio visualizzare la lista giocatori del mercato, esclusi quelli che sono già stati assegnati, ovvero solo gli svincolati*\r\n\r\n* prendo l'oggetto `market` aperto\r\n* prendo la lista giocatori da `market.footballPlayers` che contiene la lista dei giocatori disponibili per quel mercato\r\n* verifica giocatore disponibile (vedi paragrafo *Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto*)\r\n\r\n### 5. Apertura `nuovo mercato` quando è già stato eseguito un mercato precedentemente (es. apertura mercato di Gennaio)\r\n\r\n*Devo creare una nuova lista giocatori e visualizzare le informzioni dei giocatori che sono stati già stati assegnati con la/le asta/e precedente/i*\r\n\r\n* inizializzo `market.footballPlayer` con `Lista completa`\r\n* `market.betHistory` non viene cancellato ma contiene lo storico delle aste precedenti\r\n* verifica giocatore disponibile e informazioni di acquisto (vedi paragrafo *Come verificare se un giocatore è disponibile e reperire le informazioni di acquisto*)\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fialoig%2Ffantasta-server","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fialoig%2Ffantasta-server","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fialoig%2Ffantasta-server/lists"}