Questo README contiene tutte le istruzioni per sviluppare e consegnare il test tecnico di candidatura alla posizione di Backend Developer per il team main-tag
di OneTag.
Affinché il progetto possa essere avviato correttamente, è necessario che sulla macchina del candidato siano installati:
Ai fini di sviluppo, si consiglia di installare anche:
- Leggere attentamente questo README.
- Clonare questo repository.
- Estenderne i contenuti modificando il file
index.js
e/o aggiungendo tutti i file e/o le sottocartelle che il candidato ritiene necessari/e, con il fine di realizzare un'applicazione che rispetti la specifica. - Creare l'archivio .zip di consegna tramite il comando
npm run build
. - Compilare il form di consegna caricando l'archivio prodotto al passo precedente.
Dopo aver clonato questo repository, lo si estenda con il fine di realizzare una piccola applicazione in Node.js facendo uso del framework Express (già installato). L'applicazione da sviluppare consiste di un webserver (in ascolto all'URL http://localhost:8080) che deve esporre un'API con le seguenti rotte:
-
Path Metodo Esempio di body di risposta /
GET <!DOCTYPE html> <html> <head></head> <body>Hello World!</body> </html>
Risponde con una pagina HTML contenente il messaggio "Hello World!"
-
Path Metodo Esempio di body in richiesta Esempio di body in risposta /books
POST { "name": "Treasure Island", "author": "Robert Louis Stevensonr", "publisher": "Cassell and Company", "edition": 1, "pages": 292, "releaseDate": "1983-11-14" }
{ "id": "a9f694c5-2099-404c" }
Inserisce all'interno della collection
books
di MongoDB un nuovo document con i dati presenti nel body della chiamata. Se l'oggetto passato nel body non rispetta il modello (vedi sotto) la rotta deve rispondere con un opportuno codice di errore. La rotta deve rispondere con un oggetto JSON contenente l'id del documento appena aggiunto. -
Path Metodo Esempio di body in risposta /books/[id]
GET { "name": "Treasure Island", "author": "Robert Louis Stevensonr", "publisher": "Cassell and Company", "edition": 1, "pages": 292, "releaseDate": "1983-11-14" }
Preleva dalla collection
books
di MongoDB il documento con_id
uguale al parametro[id]
specificato nel path e lo restituisce in formato JSON. Se tale documento non è presente nella collection la rotta risponde con un opportuno codice di errore. -
Path Metodo Esempio di body in risposta /songs
GET [ { "genre": "Jazz", "songs": [ ... ] }, { "genre": "Pop", "songs": [ ... ] }, ... ]
Recupera una lista di pezzi musicali chiamando il servizio esterno Songs (vedi sotto), ne aggrega i dati ottenuti e restituisce la lista JSON di tutti i generi musicali, ciascuno contenente l'array dei pezzi musicali che ne fanno parte.
Un'istanza locale di MongoDB 5 è automaticamente avviata dal comando npm start
ed è raggiungibile sulla porta di default dell'host virtuale database
.
Il database usato dall'applicazione deve chiamarsi test-nodejs
, come specificato nel file .env
.
La collection books
deve contenere documenti che soddisfano il seguente schema:
{
"name": string,
"author": string,
"publisher": string,
"edition": number,
"pages": number,
"releaseDate": string // (data in formato YYYY-MM-DD)
}
La chiave della collection books
è costituita dai campi name
, author
, publisher
, edition
e non devono di conseguenza esistere due documenti nella collection che presentano identici i valori di tutti questi campi. L'_id di un nuovo document può essere autogenerato da MongoDB.
I servizi esterni rappresentano una simulazione in locale di API di terze parti a cui il candidato deve appoggiarsi per implementare l'applicazione da consegnare.
Il servizio esterno Songs viene avviato automaticamente dal comando npm start
ed è in ascolto all'URL http://localhost:9009. Tale servizio esterno è un'API che espone le rotte:
-
Path Metodo Esempio di body in risposta /count
GET { "count": 1800 }
Restituisce il numero totale di pezzi musicali.
-
Path Metodo Esempio di body in risposta /
GET [ { "id": "e941a0a2-818f", "name": "La vie en rose", "author": "Édith Piaf", "genre": "Chanson", "description": "..." }, ... ]
Restituisce una lista JSON di pezzi musicali. Questa rotta è paginata e richiede pertanto due parametri nel query string:
Chiave Valore offset
Rappresenta il numero di risultati da skippare (o, detta in altri termini, il primo risultato da restituire) limit
Rappresenta il numero massimo di risultati da restituire (valore massimo 500)
I pezzi musicali restituiti dal servizio esterno rispettano tutti il seguente schema:
{
"id": string,
"name": string,
"author": string,
"genre": string,
"description": string,
}
Nota: Questo servizio esterno è autenticato e necessita di un token da inserire nell' header HTTP 'TOKEN-V1' di tutte le chiamate. Il token può essere recuperato richiamando il servizio esterno Auth (vedi sotto)
Il servizio esterno Auth viene avviato automaticamente dal comando npm start
ed è in ascolto all'URL http://localhost:9010. Tale servizio esterno è un'API che espone la rotta:
Path | Metodo | Azione | Esempio di body in risposta |
---|---|---|---|
|
GET |
Restituisce un token per l'autenticazione del servizio esterno Songs. Il token è valido per un'ora in seguito alla sua creazione. |
{
"TOKEN-V1": "02a43f29ac6f4d"
} |
npm start
(onpm run start
) avvia tutti i processi dell'applicazione in dei container Docker:- Un'istanza di MongoDB 5 in ascolto su
localhost
alla sua porta di default. - L'API sviluppata dal candidato, con
index.js
come entry point ed in ascolto all'URL http://localhost:8080. Per favorire lo sviluppo, questo processo è avviato tramite nodemon, configurato per riavviare automaticamente il processo in seguito a qualsiasi modifica dei suoi sorgenti (index.js
e tutti i moduli da esso eventualmente importati). - Il servizio esterno Songs, in ascolto all'URL http://localhost:9009.
- Il servizio esterno Auth, in ascolto all'URL http://localhost:9010.
- Nota: richiede
npm install
.
- Un'istanza di MongoDB 5 in ascolto su
npm run build
: comprime la cartella del progetto (node_modules
esclusi) in un archivio al percorso./dist/consegna.zip
. Questo archivio deve essere consegnato tramite il form di consegna.
- È possibile modificare qualsiasi file di questa cartella?
Il candidato può modificare e/o aggiungere qualsiasi file/cartella al progetto, con le seguenti eccezioni:- I contenuti della cartella
__SEALED__
non devono essere modificati. I modulijs
contenuti in questa cartella non possono essere importati dal codice scritto dal candidato. - Il file
index.js
nella root del progetto non deve essere spostato né rinominato, poiché viene assunto essere l'entry point dell'applicazione sviluppata dal candidato. - Il file
package.json
non deve essere modificato, ad eccezione di eventuali dipendenze aggiunte ad esso dall'istallazione di nuovi packages (connpm install
) ed eventuali script npm aggiuntivi previsti dal candidato.
- I contenuti della cartella
- È ammesso installare nuovi packages tramite npm?
Si, è ammesso installare qualsivoglia nuovo package.Nota: Dopo aver installato un nuovo package è necessario riavviare il comando
npm start
.
- È necessario adottare qualche stile di scrittura di codice JavaScript in particolare?
È preferibile la scrittura di codice JavaScript ES6 e l'uso dei costruttiPromise/async/await
per la gestione di task asincroni, ove possibile.
- È possibile consegnare un'implementazione parziale della specifica?
È possibile consegnare un'implementazione parziale, che sarà valutata con un punteggio inferiore.