Appearance
Full Stack I opintojakson tehtävät
Tehtävissä tekoälypohjaisten työkalujen hyödyntäminen edellyttää aina siitä mainitsemisen Lapin AMK:n tekoälyohjeistusta noudattaen. Mikäli tekoälyä on käytetty siitä mainitsematta, tämä johtaa tehtävän automaattiseen hylkäämiseen.
Tehtävien palautus
Kaikki tehtävät palautetaan Moodleen linkkinä github-repositorioon, tee tehtävien repositoriostasi joko julkisia tai lisää opintojakson ohjaaja "matiashiltunen" repositorioosi collaborator-roolilla. Tehtävien arvioiminen ei ole mahdollista ellei ohjaajalla ole pääsyä koodiin.
Ohjaajan github-käyttäjätili: https://github.com/MatiasHiltunen
Tehtäväsarja 1
Tehtävä edellyttää javaScript suoritusympäristön käyttöönottoa
Tehtävään liittyvä luentomateriaali
Alusta uusi TypeScript projekti ja luo sille GitHub-repositorio. Lisää alustettu projekti Githubiin. (2p)
Perehdy verkkoselaimen rajapintoihin, valitse 4 eri verkkoselaimen rajapintaa. Tee luomaasi projektiin tarvittavat koodit missä hyödynnät jokaista valitsemaasi selaimen rajapintaa, käyttäen TypeScript ohjelmointikieltä.
- Koodin tulee arvioinnin yhteydessä suorittua niin että valittujen selaimen rajapintojen käyttötarkoitus tulee demonstroitua vähintään tulostamalla selaimen konsoliin dataa, tai visualisoimalla toiminnallisuus käyttöliittymässä.
- Seuraavat TypeScriptin "kiertämisen" asiat vaikuttavat negatiivisesti pisteisiin: tietotyypin "any" käyttäminen ja TypeScriptin kääntäjän oletustoiminnallisuuden ylikirjoittaminen esim. ts-ignore annotaatiolla tai vastaavalla menetelmällä
- Kommentoi koodisi selittämällä omin sanoin perustellen ratkaisusi
Huomaa että linkin dokumentaatiossa esimerkit selaimen rajapintojen käyttämisestä ovat javaScriptillä ja sinun tulee lisätä tarvittavat tietotyyppien annotaatiot muuttaaksesi koodit TypeScript muotoon. (8p)
Palauta tehtävässä käyttämäsi GitHub-repositorion linkki Moodlen palautuslaatikkoon annetuun päivämäärään mennessä (ks. Moodle)
Apuja tehtävään
Voit perehtyä seuraavien javaScriptin perusteiden läpikäyntiin tarkoitettujen tallenteiden sisältöön ja hyödyntää näitä tehtävän apuna.
- Videoiden tarkemmat sisällöt kuvauksessa
Toisen opintojakson aikana järjestetyn koodipajan tallenteita aiheesta JavaScript
Videolla 1 käydään läpi javaScriptin perusteita, mm. JSON sekä value vs. referenssityypin muuttujat.
n. 01:15:00 kohdasta eteenpäin käydään läpi ns. "Vanilla Js" ratkaisu hyödyntämällä vite ympäristöä nodejs:n kanssa.
https://youtu.be/RXC7W_1k8fU?si=3zil5UoiQt4sjdaa
Videolla 2 jatkuu videolla 1 aloitetun "Vanilla Js" vite projektin läpikäyminen kohdasta n. 1:01:45
Tehtäväsarja 2
Tehtäväsarjaan liittyvä luentomateriaali
Tehtävässä voit hyödyntää luennon 3 aikana luotua React-peliprojektia.
1. Suunnittele ja toteuta sovellukseen uusi ominaisuus tai toiminto
Tehtävän kuvaus
Ominaisuus tai toiminto voi olla esimerkiksi sovelluksen toimintalogiikkaan liittyvä ratkaisu, uusi käyttöliittymäkomponentti, tai vaikkapa tilanhallintaan liittyvä toiminnallisuus.
Ominaisuuden tai toiminnallisuuden laajuus voidaan mitata usealla eri tavalla; kompleksisuuden perusteella, koodirivien määrällä, laadulla tai monella muulla eri mittarilla. Tästä syystä tehtävässä ei ole lukittua vähimmäismäärää koodirivejä tai vastaavaa mittaria käytössä.
Suositus täysien pisteiden saamiseksi tehtävästä on kuitenkin kirjoittaa tehtävässä enemmän kuin 50 riviä omaa koodia.
Ominaisuuden tai toiminnallisuuden pisteytys:
- A. Ominaisuus tai toiminto vaikuttaa positiivisesti kehittäjäkokemukseen (DX) tai käyttäjäkokemukseen (UX). Lisää tekemäsi koodin yhteyteen kommentti missä perustelet ratkaisusi tästä näkökulmasta. (4p)
- B. Kommentoi tekemäsi koodi kertomalla omin sanoin miten ymmärrät koodin toimivan. (2p)
- C. Koodi suorittuu arvioinnin yhteydessä ilman virheitä ja varoituksia (2p)
2. Perehdy käyttämäsi ohjelmointikielen eri kirjastoihin (esim. TS:llä npm-paketit), joista sovelluksessasi voisi olla hyötyä. Valitse yksi kirjasto ja ota se käyttöön sovelluksessasi.
Kirjaston dokumentaation pohjalta tee sovellukseesi toinen ratkaisu tai ominaisuus (tehtävän 1 lisäksi), joka hyödyntää valitsemaasi kirjastoa.
- Kirjastoa on hyödynnetty koodissa onnistuneesti ja koodi suorittuu arvioinnin yhteydessä ilman virheitä ja varoituksia (2p)
- Lisää koodiin yhteyteen kommentti kohtaan missä olet hyödyntänyt tätä kirjastoa ja miten. (1p)
- Lisää kommenttiin mukaan linkki valitsemasi kirjaston dokumentaatioon tai github-repositorioon. (1p)
3. Dokumentaatio
Perehdy README.md tiedostoon. Luo sitä hyödyntäen tehtävässä käyttämällesi projektille dokumentaatio.
- Dokumentaation tulee sisältää tiedot siitä mitä riippuvuuksia esim. ohjelmistojen osalta projektin käyttöönotossa on. (1p)
- Dokumentaation pohjalta henkilö, joka ei ole käyttänyt kyseistä tekniikkaa, osaisi suorittaa projektin koodin tai käynnistää sen soveltuvassa kehitysympäristössä. (1p)
Palauta tehtävässä käyttämäsi GitHub-repositorion linkki Moodlen palautuslaatikkoon annetuun päivämäärään mennessä (ks. Moodle)
Tehtäväsarja 3
Backend ja tietokannat
Aloitetaan sovellukseen uuden ominaisuuden lisääminen: keskustelupalsta.
Tämä tehtävä keskittyy keskustelupalstan tietorakenteen mallintamiseen vaatimusmäärittelyn pohjalta:
Ominaisuuden vaatimusmäärittely:
- Keskustelupalstassa kaikki käyttäjät voivat nähdä toistensa viestit
- Käyttäjät voivat aloittaa viestiketjun tai vastata jo olemassaoleviin viesteihin.
- Viestillä on tekstisisältö, aikaleima ja tieto siitä kuka viestin on lähettänyt. Lisäksi viesti voi olla vastaus toiseen viestiin.
- Käyttäjät voivat poistaa omia viestejä
- Jos aloitusviesti poistetaan, kaikki vastaukset siihen myös poistetaan
Vaatimusmäärittelystä poimitaan seuraavat asiat:
- Käyttäjätili on kytköksissä viestiin / postaukseen
- Käyttäjällä on oikeus poistaa omat viestinsä
- Viestin rakenne on lähtökohtaisesti sama, olipa se aloitusviesti tai vastaus viestiketjussa -> Voidaan käyttää samaa taulua aloituksille ja vastauksille
- Aikaleiman perusteella voidaan järjestää vastaukset jotka liittyvät aloitusviestiin, uusin vastaus esim. aina alimpana.
- Jos viestin tyyppi on vastaus, data-rakenteeseen tarvitaan vielä siis kenttä aloitusviestin
id
:lle, jotta tietokannasta voidaan listata vastaukset tälle aloitusviestille. Voidaan lisätä data-rakenteeseen esim. kenttäparent_post_id
. - Voidaan siis sopia että viesti on
aloitusviesti
, kun sillä on kenttäparent_post_id
tyhjä (NULL) - Vastaavasti kun viestillä
parent_post_id
kentässä on toisen viestinid
niin tiedetään sen olevan vastaus toiseen viestiin.
Yksittäisen postauksen datarakenne voisi sisältää siis esimerkiksi seuraavat tiedot:
id
, tietokanta lisää automaattisesti juoksevan kokonaisluvuncontent
, käyttäjiltä tuleva viestin sisältöcreated_at
, tietokanta lisää automaattisestiparent_post_id
, viestin yid
mihin viesti x on vastaus mikäli kenttä on tyhjä. Viiteavainposts
taulun omaanid
kenttään.user_id
, postauksen luoneen käyttäjän ID. Voisiko user_id ollanullable
? Nullable tarkoittaisi sitä että anonyymit käyttäjät voisivat lisätä myös viestejä. Supabasen kanssauser_id
kentällä olisi relaatioauth.users.id
tauluun.
Data-rakenne JSON muotoisena:
json
// Aloitusviesti, tiedetään kun parent_post_id on null
{
"id": 1,
"content": "Tämä on aloitusviesti",
"created_at": "2024-09-01 12:11:15.425297+00",
"parent_post_id": null,
"user_id": "c466549d-c355-4745-8a65-4bcef754c74b"
}
// Vastaukset aloitusviestiin:
[
{
"id": 2,
"content": "Tämä on vastaus ylempään aloitusviestiin",
"created_at": "2024-10-02 10:18:25.121797+00",
"parent_post_id": 1,
"user_id": "a136549d-d645-2745-4b65-5bcef754c74b"
},
{
"id": 3,
"content": "Tämä on toinen vastaus aloituspostaukseen",
"created_at": "2024-10-02 13:38:15.631747+00",
"parent_post_id": 1,
"user_id": "d236549d-r645-2745-4b65-5bcef754c74b"
}
]
// Vastaus voisi olla myös toiseen vastaukseen, tässä tapauksessa vastaus viestiin nro. 3
[
{
"id": 4,
"content": "Tämä on vastaus toiseen vastaukseen",
"created_at": "2024-10-02 13:38:15.631747+00",
"parent_post_id": 3,
"user_id": "c466549d-c355-4745-8a65-4bcef754c74b"
}
]
// Aloitusviesti, tiedetään kun parent_post_id on null
{
"id": 1,
"content": "Tämä on aloitusviesti",
"created_at": "2024-09-01 12:11:15.425297+00",
"parent_post_id": null,
"user_id": "c466549d-c355-4745-8a65-4bcef754c74b"
}
// Vastaukset aloitusviestiin:
[
{
"id": 2,
"content": "Tämä on vastaus ylempään aloitusviestiin",
"created_at": "2024-10-02 10:18:25.121797+00",
"parent_post_id": 1,
"user_id": "a136549d-d645-2745-4b65-5bcef754c74b"
},
{
"id": 3,
"content": "Tämä on toinen vastaus aloituspostaukseen",
"created_at": "2024-10-02 13:38:15.631747+00",
"parent_post_id": 1,
"user_id": "d236549d-r645-2745-4b65-5bcef754c74b"
}
]
// Vastaus voisi olla myös toiseen vastaukseen, tässä tapauksessa vastaus viestiin nro. 3
[
{
"id": 4,
"content": "Tämä on vastaus toiseen vastaukseen",
"created_at": "2024-10-02 13:38:15.631747+00",
"parent_post_id": 3,
"user_id": "c466549d-c355-4745-8a65-4bcef754c74b"
}
]
Valitse tietokantaratkaisu mitä hyödynnät tehtävässä. Voit käyttää tässä esim. Supabasea tai luennoilla käytettyä Drizzle ORM:ia, tai vaihtoehtoisesti muuta tietokantaratkaisua
Tehtävä ei edellytä ominaisuuden toteuttamista Client-sovellukseen (frontendiin)
Palautus
Luo git-repositorioon task_series_3.md
niminen markdown tiedosto. Dokumentoi tehtävässä tekemäsi toimenpiteet kattavasti kuvakaappausten kanssa kyseiseen tiedostoon.
Katso ohje md-tiedoston käyttämisessä dokumentoinnissa:
Kuvien lisäämisen näppärä apu: https://dev.to/francecil/vscode-new-version-179-supports-pasting-images-in-markdown-1fd2
1.
Toteuta määrittelyn pohjalta valitsemaasi tietokantaratkaisuun tarvittavat muutokset.
A)
Lisää tietokantaan ainakin posts
taulu määritellyn datarakenteen pohjalta. (5p)
B)
Lisää posts
tauluun viiteavain postaukseen itseensä: parent_post_id
-> id
, ks. termi self-referencing table (3p)
- Viiteavain omaan primary avaimeen mahdollistaa datan sisennetyn ketjuttamisen, ks. JSON muoto ylempää.
C)
Lisää tauluun vielä uusi kenttä (column), josta voisi olla hyötyä tällaisessa keskustelupalstan viestin datassa, esim. title tai topic . (2p)
2.
Lisää testidataa tietokantaan (voit lisätä datan suoraan tietokantaan käyttäen esim. supabasen table-editoria, drizzle-kit studiota)
A)
Lisää testimielessä tietokantaan viesti, aloituspostaus (aloitusviestillä viestillä on parent_post_id
arvo tyhjä, NULL) (2p)
B)
Lisää tietokantaan myös toinen viesti, tällä kertaa vastausviesti missä parent_post_id
:ssä on aiemmin lisäämäsi aloitusviestin id
. (2p)
Vastaa kysymyksiin esimerkin kanssa tai havainnollista koodilla:
C)
Millä tavalla saat haettua tietokannasta kaikki viestit jotka ovat aloitusviestejä? (3p)
D)
Miten saat haettua yksittäisen aloitusviestin id:n perusteella myös kaikki vastaukset kyseiseen aloitusviestiin yhdellä tietokantakyselyllä? (3p)
E)
Millä tavoin ratkaisisit viestien poistamiseen liittyvät mahdolliset ongelmat, kun aloitusviestiin on olemassa vastauksia? (3p)
3.
Suunnittele ja määrittele lisäominaisuus: Tykkäykset viesteihin
A)
Kuvaile suunnitelemasi lisäominaisuus (2p)
B)
Luo vaatimusmäärittely. Voit käyttää mallipohjana tehtäväsarjan kuvauksessa määriteltyä keskustelupalstastan määritelmää. (3p)
C)
Kuvaile tarvittavat muutokset keskustelupalstan data-rakenteeseen. (2p)
Palautuksen ja arviointi
Kuvakaappausten käyttäminen onnistuneesti (kuvat näkyvät githubin kautta md-tiedostoa tarkasteltaessa) osana MD-pohjaista palautusta (2p)
Tehtävä arvioidaan task_series_3.md
tiedostoon tehdyn dokumentoinnin perusteella.
Palauta tehtävässä käyttämäsi GitHub-repositorion linkki Moodlen palautuslaatikkoon annetuun päivämäärään mennessä (ks. Moodle)