theman550 / DAT257-K9

Project for course DAT257
1 stars 1 forks source link

Nya parametrar för readTrips #13

Closed theman550 closed 4 years ago

theman550 commented 4 years ago

La till användarID och reseID som filter i readTrips samt fixade några gamla funktioner så att de funkar med nya de nya identifierarna i databasen. Flyttade writeTrip()-testet från main-loopen så att vi inte får en ny resa vid varje API-call.

AndreasWJ commented 4 years ago

Lite pedantisk här men om du har tid skulle du bara kunna döpa om reseId/tripId vid rese endpoint till endast "id"? 🧐 Det är standard inom REST att "id" ska existera och samtidigt referera till den endpoint man skickar förfrågan till. Exempelvis /api/trips?id=1,2,3,4 för att hämta resor med id 1, 2, 3, och 4

thezzern commented 4 years ago

Lite pedantisk här men om du har tid skulle du bara kunna döpa om reseId/tripId vid rese endpoint till endast "id"? 🧐 Det är standard inom REST att "id" ska existera och samtidigt referera till den endpoint man skickar förfrågan till. Exempelvis /api/trips?id=1,2,3,4 för att hämta resor med id 1, 2, 3, och 4

Som jag fattar koden så hämtar readtrips olika svar från databasen beroende på vilken get som är satt. Om ni refererar till en specifik resa och vill göra en förändring, kanske att en plats blivit upptagen då returnar den metoden den raden så att den kan modifieras (förutsätter att en sån kommer så småningom). Likadant kan en modifikation för en specifik resa från en specifik user också requestats och om då userID används för att identifiera vilken user det talas om behövs både tripID och userID(?) Ska tillägga att jag funderade på förut om det är ett userID vi kommer få eller ett username (vet ej vad som är smidigast då vi inte börjat på den delen med inloggning ännu) så om userID --> username så skulle det inte vara någon konflikt och vi skulle kunna göra så tripID --> id, men om userID ska användas så blir det kanske bäst att ha både?

AndreasWJ commented 4 years ago

Lite pedantisk här men om du har tid skulle du bara kunna döpa om reseId/tripId vid rese endpoint till endast "id"? 🧐 Det är standard inom REST att "id" ska existera och samtidigt referera till den endpoint man skickar förfrågan till. Exempelvis /api/trips?id=1,2,3,4 för att hämta resor med id 1, 2, 3, och 4

Som jag fattar koden så hämtar readtrips olika svar från databasen beroende på vilken get som är satt. Om ni refererar till en specifik resa och vill göra en förändring, kanske att en plats blivit upptagen då returnar den metoden den raden så att den kan modifieras (förutsätter att en sån kommer så småningom). Likadant kan en modifikation för en specifik resa från en specifik user också requestats och om då userID används för att identifiera vilken user det talas om behövs både tripID och userID(?) Ska tillägga att jag funderade på förut om det är ett userID vi kommer få eller ett username (vet ej vad som är smidigast då vi inte börjat på den delen med inloggning ännu) så om userID --> username så skulle det inte vara någon konflikt och vi skulle kunna göra så tripID --> id, men om userID ska användas så blir det kanske bäst att ha både?

Hmm, ska se om jag förstår. Som du säger ska readtrips hämta olika rader från databasen beroende på:

Jag ska också nämna att man får vara försiktig med route och query parametrar. Eftersom man ska aldrig kunna specificera båda samtidigt eftersom route parametrar har syftet att peka på en enda rad medan query parametrar har syftet att peka på 0-X antal rader.

och om då userID används för att identifiera vilken user det talas om behövs både tripID och userID(?) Menar du situationen då man är intresserad av en resas id och användar id samtidigt? Typ api/trips?userId=5&tripId=1?

Vet inte hur databas modellen ser ut men det spelar ingen roll egentligen om ni har en "id" eller "tripId" kolumn, det jag menar är att id inuti en query parameter ska referera till resursen. Och när jag skriver resurs menar jag /api/{resurs}/..., alltså menar jag trips, users, etc.

Om jag är helt borta, skicka iväg ett exempel så jag fattar 😅

thezzern commented 4 years ago

Jag tänkte mer på denna biten nedanför som samtidigt lyssnar efter get[tripID] och get[userID] att man behöver skilja på dem i det fallet(?). Men det kanske inte är meningen att man ska ha flera sånna här isset($_GET..) checks i samma php block/fil i REST? För om man ska ha som nedanför så vet man inte vad "id" skulle vara. Men vi kanske har fattat fel om hur kommunikationen sker mellan :s

elseif(isset($_GET['tripID'])){ $sql = "SELECT * FROM Resa WHERE tripID = '{$_GET['tripID']}'"; } elseif(isset($_GET['userID'])){

theman550 commented 4 years ago

Andreas har rätt i att vi inte följer REST-dokumentet vi satte upp, det var jag halvt om halvt medveten om. Hade fetingbannat mig själv ifrån att jobba mer med den här kursen idag och större delen av imorgon så jag ville bara få upp en lösning imorse så att frontend kunde börja leka med att läsa in resor om de ville. Det som går att köra nu är api.php?function=getTrips för att få alla resor i DB och api.php?function=getTrips&tripID=X för att få en resa, borde räcka för deras task med att bygga upp listan med kort innehållandes alla resor samt att kunna klicka in sig på ett av korten.

Kikar mer på att göra det REST-compliant efter lunch imorgon :)

AndreasWJ commented 4 years ago

Jag tänkte mer på denna biten nedanför som samtidigt lyssnar efter get[tripID] och get[userID] att man behöver skilja på dem i det fallet(?). Men det kanske inte är meningen att man ska ha flera sånna här isset($_GET..) checks i samma php block/fil i REST? För om man ska ha som nedanför så vet man inte vad "id" skulle vara. Men vi kanske har fattat fel om hur kommunikationen sker mellan :s

elseif(isset($_GET['tripID'])){ $sql = "SELECT * FROM Resa WHERE tripID = '{$_GET['tripID']}'"; } elseif(isset($_GET['userID'])){

Ahhh ok, nu fattar jag.

Det ni bör göra är att först skriva en conditional(en if-statement eller vad som helst) som identifierar om det finns en route parameter eller flera query parametrar i GET förfrågan. Om det inte finns en 'api/trips/5'(där id = 5) eller 'api/trips?xxxxx' så bör förfrågan se ut som 'api/trips'. Vilket är det enkla fallet, returnera alla rader, vilket ni gjort! 👍

Sedan bör ni kolla om det finns en route parameter, helt enkelt kolla om det finns en ytterligare slash följt av ett id nummer. Vet inte om PHP har någon sådan inbyggd funktion, vet att det finns i Node/Express. Om det finns en query parameter, så kör ni:

$sql = "SELECT * FROM Resa WHERE tripID = '{$_GET['id']}'";

Sedan det sista fallet som är svårast att implementera är att kolla vilka query parametrar som finns i förfrågan. För att ge ett exempel: /api/trips?userId=5&start=Kinna Då vill ni generera följande SQL:

$sql = "SELECT * FROM Resa WHERE Start = '{$_GET['from']}' AND userID = '{$_GET['userID']}'";

Beroende på vilka query parametrar som finns vill ny bygga på SQL query ovan.