Skip to content

onetag-dev/nodejs-test

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

38 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Test Backend Developer OneTag

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.

Requisiti tecnici

Affinché il progetto possa essere avviato correttamente, è necessario che sulla macchina del candidato siano installati:

Ai fini di sviluppo, si consiglia di installare anche:

Cosa fare

  1. Leggere attentamente questo README.
  2. Clonare questo repository.
  3. 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.
  4. Creare l'archivio .zip di consegna tramite il comando npm run build.
  5. Compilare il form di consegna caricando l'archivio prodotto al passo precedente.

Specifica

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.

Database

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.

Servizi esterni

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.

Songs

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)

Auth

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

/access-token

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"
}

Tutti i comandi

  • npm start (o npm 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.
  • 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.

FAQ

  • È 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 moduli js 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 (con npm install) ed eventuali script npm aggiuntivi previsti dal candidato.

  • È 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 costrutti Promise/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.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published