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