Útfæra skal vefþjónustu fyrir „bókasafn“ með notendaumsjón. Gefin eru gögn fyrir bækur og flokka.
Hægt á að vera að skrá notendur með nafni, notendanafni og lykilorði. Auðkenning skal fara fram með JWT og passport, token er úthlutað þegar POST
að er á /login
.
Útfæra þarf middleware sem passar upp á slóðir sem eiga að vera læstar séu læstar nema token sé sent með í Authorization
haus í request.
Eftir að notandi er innskráður er möguleiki á að setja inn mynd fyrir notanda með því að framkvæma POST
á /users/me/profile
með mynd (.png
, .jpg
eða .jpeg
) í body á request. Þar sem ekki er hægt að vista myndir beint á disk á Heroku skal notast við Cloudinary, þjónustu sem geymir myndir og bíður upp á API til að vista, sækja og eiga við myndir. Heroku bíður upp á ókeypis útgáfu gegnum Cloudinary add-on.
Flæði væri:
- Notandi sendir
multipart/form-data
POST
á/users/me/profile
með mynd - Bakendi les mynd úr request, t.d. með
multer
- Mynd er send á cloudinary API, sjá Heroku: Cloudinary with node.js
- Ef allt gengur eftir skilar Cloudinary JSON hlut með upplýsingum
url
úr svari er vistað í notenda töflu
Útbúa þarf töflur fyrir eftirfarandi gögn, gefnar eru kröfur á gögnum sem passa þarf upp á þegar nýjar færslur eru gerðar eða eldri uppfærðar.
- Notendur
- Auðkenni, primary key
- Notendanafn, einstakt gildi, a.m.k. 3 stafir, krafist
- Lykilorðs hash, lykilorð verður að vera a.m.k. 6 stafir, krafist
- Nafn, ekki tómi strengurinn, krafist
- Slóð á mynd, ekki krafist
- Flokkar
- Auðkenni, primary key
- Heiti, einstakt gildi, ekki tómi strengurinn, krafist
- Bækur
- Auðkenni, primary key
- Titill, einstakt gildi, ekki tómi strengurinn, krafist
- ISBN13, einstakt gildi, nákvæmlega 13 stafa strengur gerður úr tölum, krafist
- Höfundur, ekki krafist
- Lýsing, lengri texti, ekki krafist
- Flokkur, foreign key í flokka töflu, krafist
- ISBN10, strengur, ekki krafist, ekki krafa að hafa með í verkefni
- Útgáfudagsetning, ekki krafist, strengur, ekki krafa að hafa með í verkefni
- Síðufjöldi, tala, stærri en 0, ekki krafist, ekki krafa að hafa með í verkefni
- Tungumál, 2 stafa strengur, ekki krafist, ekki krafa að hafa með í verkefni
- Lesnar bækur notenda
- Auðkenni
- Auðkenni notanda, foreign key í notanda töflu, krafist
- Auðkenni bókar, foreign key í bóka töflu, krafist
- Einkunn notanda, gildi úr eftirfarandi lista
1, 2, 3, 4, 5
þar sem1
er lægsta einkunn og5
hæsta, krafist - Dómur notanda, lengri texti, ekki krafist
Þar sem merkt er krafist verða gögn að innihalda gildi og þau að vera gild skv. lýsingu. Þar sem merkt er ekki krafst má sleppa gildi í gögnum, bæði þegar eining er búin til og henni skilað.
Þar sem merkt er primary key, foreign key eða einstakt gildi (unique) þarf að setja viðeigandi skoður á töflu, sjá https://www.postgresql.org/docs/current/static/ddl-constraints.html
Gögn eru gefin innan data/
möppu þar sem books.csv
inniheldur 532 færslur, fyrsta lína skilgreinir dálka. Ef "
kemur fyrir í texta er það kóðað sem ""
, t.d.
"Þetta er lýsing með ""gæsalöppum"""
. Gögn innihalda ekki nýlínu tákn.
Eftirfarandi slóðir eiga að vera til staðar, öll gögn sem send eru inn skulu vera á JSON
formi og gögnum skilað á JSON
formi.
/register
POST
býr til notanda og skilar án lykilorðs hash
/login
POST
með notendanafni og lykilorði skilar token
/users
GET
skilar síðu (sjá að neðan) af notendum- Lykilorðs hash skal ekki vera sýnilegt
/users/:id
GET
skilar stökum notanda ef til- Lykilorðs hash skal ekki vera sýnilegt
/users/me
GET
skilar innskráðum notanda (þ.e.a.s. þér)PATCH
uppfærir sendar upplýsingar um notanda fyrir utan notendanafn, þ.e.a.s. nafn eða lykilorð, ef þau eru gild
/users/me/profile
POST
setur eða uppfærir mynd fyrir notanda í gegnum Cloudinary og skilar slóð
/categories
GET
skilar síðu af flokkumPOST
býr til nýjan flokk og skilar
/books
GET
skilar síðu af bókumPOST
býr til nýja bók ef hún er gild og skilar
/books?search=query
GET
skilar síðu af bókum sem uppfylla leitarskilyrði, sjá að neðan
/books/:id
GET
skilar stakri bókPATCH
uppfærir bók
/users/:id/read
GET
skilar síðu af lesnum bókum notanda
/users/me/read
GET
skilar síðu af lesnum bókum innskráðs notandaPOST
býr til nýjan lestur á bók og skilar
/users/me/read/:id
DELETE
eyðir lestri bókar fyrir innskráðann notanda
Þegar gögn eru sótt, búin til eða uppfærð þarf að athuga hvort allt sé gilt og einingar séu til og skila viðeigandi status kóðum/villuskilaboðum ef svo er ekki.
Fyrir notanda sem ekki er skráður er inn skal vera hægt að:
- Skoða allar bækur og flokka
- Leita að bókum
Fyrir innskráðan notanda skal einnig vera hægt að:
- Uppfæra upplýsingar um sjálfan sig
- Skrá nýja bók
- Uppfæra bók
- Skrá nýjan flokk
- Skrá lestur á bók
- Eyða lestur á bók
Fyrir fyrirspurnir sem skila listum af gögnum þarf að _page_a þau gögn. Þ.e.a.s. að sækja aðeins takmarkað magn úr heildarlista í einu og láta vita af næstu síðu. Þetta kemur í veg fyrir að við sækjum of mikið af efni í einu, t.d. ef gagnagrunnur myndi innihalda tugþúsundir bóka og notanda.
Til að útfæra með postgres nýtum við LIMIT
og OFFSET
í fyrirspurnum. Við útfærum almennu fyrirspurnina (með ORDER BY <dálk til að raða eftir>
) en bætum síðan við t.d. LIMIT 10 OFFSET 0
sem biður um fyrstu 10 niðurstöður, LIMIT 10 OFFSET 10
myndi skila okkur næstu 10, þ.e. frá 11-20 o.s.fr.
Upplýsingum um limit og offset skal skila í svari ásamt gögnum á forminu:
{
"limit": 10,
"offset": 0,
"items": [
// 10 hlutir úr svari
]
}
Aðeins þarf að leita í bókatöflu í reitunum titil og lýsingarreitum. Postgres býður upp á textaleit í töflum án þess að setja upp eitthvað sérstakt, sjá Chapter 12. Full Text Search: Tables and Indexes.
Ekki þarf að útfæra „týnt lykilorð“ virkni.
Bækur geta aðeins verið í einum flokk.
Þegar gögn eru flutt inn í gagnagrunn getur verið gott að nýta await
í lykkju þó að eslint mæli gegn því. Ef t.d. er reynt að setja inn yfir 500 færslur í einu í gagnagrunn með Promise.all
, getur tenging rofnað vegna villu.
Verkefnið skal unnið í hóp, helst með þremur einstaklingum. Hópar með tveim eða fjórum einstaklingum eru einnig í lagi. Hafið samband við kennara ef ekki tekst eða ekki mögulegt að vinna í hóp.
Í rót verkefnis skal vera README.md
skjal sem tilgreinir:
- Upplýsingar um hvernig setja skuli upp verkefnið
- Hvernig gagnagrunnur og töflur eru settar upp
- Hvernig gögnum er komið inn í töflur
- Dæmi um köll í vefþjónustu
- Nöfn og notendanöfn allra í hóp
Verkefni þetta er sett fyrir á GitHub og almennt ætti að skila því úr einka (private) repo nemanda. Nemendur geta fengið gjaldfrjálsan aðgang að einka repos á meðan námi stendur, sjá https://education.github.com/.
Til að byrja er hægt að afrita þetta repo og bæta við á sínu eigin:
> git clone https://github.com/vefforritun/vef2-2018-h1.git
> cd vef2-2018-h1
> git remote remove origin # fjarlægja remote sem verkefni er í
> git remote add origin <slóð á repo> # bæta við í þínu repo
> git push
- 20% – Töflur og gögn lesin inn
- 30% – Auðkenning og notendaumsjón
- 50% – Vefþjónusta
Verkefni sett fyrir í fyrirlestri fimmtudaginn 22. febrúar 2018.
Einn aðili í hóp skal skila fyrir hönd allra og skila skal undir „Verkefni og hlutaprófa“ á Uglu í seinasta lagi fyrir lok dags fimmtudaginn 15. mars 2018.
Skilaboð skulu innihalda slóð á GitHub repo fyrir verkefni, slóð á Heroku og nöfn allra þá sem eru í hópnum. Dæmatímakennurum skal hafa verið boðið í repo (sjá leiðbeiningar). Notendanöfn þeirra eru ernir
og elvarhelga
.
Sett verða fyrir sex minni verkefni þar sem fimm bestu gilda 6% hvert, samtals 30% af lokaeinkunn.
Sett verða fyrir tvö hópa verkefni þar sem hvort um sig gildir 15%, samtals 30% af lokaeinkunn.