---
# System prepended metadata

title: 'Labb 2: Undersöknings-API'

---

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

![image](https://hackmd.io/_uploads/S1UkNyUbWe.png)

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.