# Labb 2: Undersöknings-API
I den här labben ska vi bygga ett API med hjälp av express för att hantera små undersökningar. Syftet är att öva på API-design och skapa en express-server utan att behöva koppla den till en databas.

Projektet går ut på att du ska bygga en server som håller koll på en lista med *polls* (undersökningar). Servern ska tillhanda hålla routes som låter dig
* skapa nya polls
* svara på en poll
* hämta en och flera polls och deras resultat
* avsluta polls
Listan av polls ska vara en lista med javascript-objekt som innehåller en fråga, svarsalternativ, samt om man den är öppen för röster eller ej. Objekten ska ha en struktur som exemplet nedan.
```javascript
{
question: "What is your favorite programming language?",
options: [
{ text: "JavaScript", votes: 3 },
{ text: "Python", votes: 7 },
{ text: "C#", votes: 1 }
],
isOpen: true
}
```
### 0. Sätta upp projektet
Skapa ett nytt NPM projekt och installera express. Skapa en server och lyssna på port 8080. Har du glömt hur man gör? [Läs här!](https://hackmd.io/@GL7e5JeyQiGQxrUSRZMx6A/BkQPmqH-be)
*När du sedan skriver din kod, kom ihåg att använda bra variabelnamn samt skriva kommentarer.*
### 1. Skapa polls
Skapa en route till `POST /api/poll`. Routen ska skapa ett nytt poll-objekt utifrån data som kommer i bodyn av requesten. Det objektet ska läggas till i en lista av polls. Pollen ska vara öppen för röstning om inget annat anges i bodyn. Bodyn ska vara på formatet som i följande exempel:
```
{
"question": "Best snack?",
"options": ["Chips", "Chocolate", "Fruit"]
}
```
Skicka tillbaka ett meddelande om att pollen har skapats.
### 2. Hämta polls
Skapa en route till `GET /api/poll` som skickar tillbaka alla polls i JSON-format.
Skapa också en route `GET /api/poll/:id` som skickar tillbaka den poll med motsvarande index i listan som id-parametern.
### 3. Rösta på polls
Skapa en route till `PUT /api/vote/:id` som ska öka röstantalet på ett av alternativen för den poll som anges. Vilket alternativ ska anges i en querystring på formatet `?option=1`, där siffran motsvarar index för det alternativet.
Skicka tillbaka ett meddelande om att rösten har motagits.
### 4. Stänga polls
Skapa en route till `POST /api/poll/:id/close` som ska stänga den polls som anges genom att ändra `isOpen` till `false` i poll-objektet. Uppdatera även routen från steg 3 till att bara öka röstning om pollen är öppen.
Skicka tillbaka ett meddelande om att pollen har stängts.
### 5. Vinnande poll
Skapa en route till `GET /api/poll/:id/winner` som ska skicka tillbaka vilket alternativ som har vunnit omröstning i den poll som anges.
### 6. Ta bort poll
Skapa en route till `DELETE /api/poll/:id` som ska ta bort den poll som anges.
Skicka tillbaka ett meddelande om att pollen har tagits bort.
### Extra
Det finns flera saker vi kan lägga till till vårt api.
* Lägg till validering av parametrar och queries som skickas så att de faktiskt har värden som motsvarar polls som existerar.
* Lägg till relevanta statuskoder i svaren från dina routes.
* Vi använder en id-parameter för att identifiera vilken poll vi vill hämta/ändra. Den används som index i listan av polls, vilket innebär att id:et för en poll kan ändras när vi tar bort polls. Skriv om din kod så att poll-objektet har en id-variabel som ska användas för att referera till den pollen.