Meeskond: Spooky Scary Skeletons

From ICO wiki
Jump to navigationJump to search

Meeskond ja rollid

  • Kärt Palm
  • Karina Egipt - Projektijuht
  • Erika Ehmann
  • Silver Saks - Wiki pidaja

Idee

TODO list kooli õppeainete tarvis. Võimaldab märkida kalendrisse tähtaegu, mis on seotud õppeainega ja lisada nende kohta vajalikku infot(eeldatav ajakulu, ülesande maht, õppematerjalid, jne). Offline funktsionaalsus kohaliku andmebaasiga, mis replikeeritakse serverisse(kasutaja soovil). Online funktsionaalsus mis võimaldab "subscribeda" kas teatud õppeainesse, või gruppi. Sellisel juhul ilmuvad kalendrisse ka teiste antud grupis olevate kasutajate lisatud ülesanded, ning info nende kohta.

Analüüs

AVE 2.0 on kodutööde planeerimise rakendus, kuhu iga kasutaja saab lisada õppeaines antud kodutöid, lisada neile esitamise tähtaegu ja muud lisainformatsiooni.

Mõisted

  • Task - ülesanne, test, eksam, mille kasutaja kannab kalendrisse ja määrab vähemalt kohustuslikud atribuudid. Task'il saab olla vaid üks tähtaeg;
  • Alamtask - task, mis on osa suuremast tööst (kuulub mingi taski alla) ning millele saab määrata omaette atribuute;
  • Atribuut - task'i omadused (näiteks: tähtaeg, kirjeldus, kommentaarid, viited jne);
  • Õppeaine - Taske grupeeriv atribuut;
  • Grupp - Taske grupeeriv atribuut, mis on ülem õppeainest (ehk kui grupp on määratud, siis pakutakse antud taski ainult selle grupi liikmetele). Grupp võib eksisteerida ka ilma õppeaineta;
  • Subscribe - õppeainega, grupiga või task'iga liitumine, mille tulemusena ilmub vastava aine/grupi task'id kasutaja kalendrisse;

Rakenduse kirjeldus

Rakenduse eesmärgiks on hõlbustada kodutööde planeerimist ja tähtaegade järgimist. Rakendusse saab lisada kodutööde, testide ja eksamite tähtaegu. Sisestatud töid nimetame taskideks. Taskid võivad omakorda sisaldada muud antud ülesandega seotud infot (alamtähtajad, kommentaarid jne).

Rakendus on põhiliselt mõeldud IT Kolledži õppeainete tähtaegade märkimiseks. Sellel eesmärgil on tähtaja juurde võimalik märkida õppeaine Info õppeainete kohta tuleb importida kooli õppeinfosüsteemidest.

Rakenduse kasutamiseks on kohustuslik serveris konto loomine. Anonüümset offline kasutust ei ole.

Kasutaja saab ära märkida oma kooli(d) ja deklareeritud õppeained. Õppeainetele subscribe'ides saab kasutaja märkida ka oma õppegrupi või õppevormi (näiteks päevaõpe, kaugõpe, õhtuõpe - neid nimetame koondnimetusena “õppeaine versiooniks”). Kasutaja saab luua ka eraldiseisvaid õppetööga seotud või mitteseotud gruppe.

Rakendus pakub kasutajale ka teiste antud aine deklareerinud kasutajate poolt märgitud tähtaegu ja lisainfot nende kohta. Kasutajale pakutakse automaatselt see versioon taskist, mis hetkel on kasutajate hulgas kõige populaarsem. Kasutaja võib selle tagasi lükata, kui task teda ei huvita, või võtta vastu mõne muu versiooni taskist. Kasutaja võib teiste lisatud taskile ka ise atribuute lisada, mis juhul neid muudatusi pakutakse ka teistele kasutajatele.

Rakendus koosneb kahest põhilisest osast: klient ja server.

Klient

Klientprogramm võimaldab kasutajal lisada taske, hallata oma kasutajaprofiili ja vaadata ning lisada endale teiste poolt lisatud taske ja nende atribuute.

Klient suhtleb serveriga üle REST API.

Klient hoiab lokaalselt andmeid SQLite andmebaasis, sinna replikeeritakse ka teiste kasutajate poolt lisatud muutused juhul kui kasutaja need aktsepteerib.

Klient peab oskama API kaudu küsida serverist teda huvitavaid värskendusi ehk klient peab pidama arvet selle üle milline osa infost tal on kohalikus andmebaasis olemas.

Rakendust käivitades küsitakse kasutajalt kasutajanime ja parooli, seejärel rakendus käivitub, kuvab antud kasutaja töölaua, ning üritab autentida ja sünkroniseerida serveriga.

Task'i lisamisel kalendrisse saab sellele lisada erinevat lisainfot sisaldavaid atribuute (vahetähtajad, töö detailsed nõuded, progress jmt). Rakendus hoiatab kasutajat, kui task'i täitmise tähtaeg on lähenemas.

Kliendi must-have funktsionaalsus:

  • Peab olema võimalik kasutajaks registreerida (kasutajakonto olemsolu on kohustuslik programmi kasutamiseks);
  • Kasutaja peab saama sisse logida kasutajanime ja parooliga;
  • Kasutaja peab saama registreerida ennast gruppidesse ja/või erinevate õppeainetele/kursustele;
  • Kasutaja peab saama sisestada taski kirjeldust (taski) koos esitamise tähtajaga oma kalendrisse;
  • Kasutaja peab saama taski kirjeldusena märkida:
    • Task'i täitmise tähtaega;
    • Task'i liiki : ainetöö, essee, kursusetöö, lõputöö, referaat, praktika aruanne, eksam, test, muu;
    • Taskiga seotud õppeaine ettantud nimekirjast;
    • Taskiga seotud grupi. Kui grupp on valitud, siis edastatakse task vaid grupi liikmetele
    • soovi korral kommentaariväljale lisainfot, viidet õppematerjalidele jne;
    • aja, millal rakendus teavitab kasutajat tähtaja lähenemisest (vabatahtlik, vaikimisi 3 päeva enne);
    • kas task on alustamata, pooleli või lõpetatud (st taski staatust)
  • Rakendus peab töötama nii online kui offline režiimis. Vaikimisi režiimiks on online, offline saab olla eelkõige ainult siis, kui arvuti ei ole internetiga ühendatud. Kui rakendus on offline, siis kajastub kasutajaliideses vastav teade;
  • Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;

Kliendi nice-to-have funktsionaalsus:

  • Statistika tehtud ülesannete kohta.
  • Kasutajakonto loomisel CAPTCHA kasutamine
  • Lokaalse andmebaasi krüpteerimine kasutaja parooli baasil

Server

Serveris toimub kasutajate haldus ja kõikide kasutajate poolt sisestatud info talletamine. Serveri põhiline ülesanne on vastavalt API käskudele andmebaasist andmete esitamine.

Serveris asub tsentraalne andmebaas kogu rakenduse infoga(kõik task'id, nende atribuudid, jne). Kasutame PostgreSQL andmebaasi.

Suhtlus kliendi ja serveri vahel toimub üle REST api.

Andmebaasi skeem:

Serveri must-have funktsionaalsus:

  • Peab võimaldama suhtlust kliendi ja andmebaasi vahel
  • Registreerumisel saadetakse kasutajale e-mail registreerumist kinnitava lingiga.
  • Peab kliendi päringu peale suutma saata kõik kasutajat huvitavad andmed mida kasutaja klientprogrammi kohalikus andmebaasis veel ei ole.
  • Kasutaja peab saama muuta kalendrisse lisatud task’e. Muudatused peavadilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel viiakse task’i muudatused kasutaja kalendrisse;
  • Õppeainega/grupiga seotud taski lisamisel kalendrisse peab see ilmuma teavitusena kõikide kasutajate privaatkalendritesse, kes on ennast sellele ainele/gruppi registreerinud, ning igal kasutajal on siis võimalus teavitust aktsepteerida või tagasi lükata. Teavituse aktsepteerimisel lisatakse task’i kasutaja kalendrisse;
  • Server peab logisid kõigi tehtud toimingute kohta. Administraator saab määrata logimistaseme.
  • API on kättesaadav ainult üle turvalise ühenduse
  • Paroolid salvestatakse kasutades juhuslikult genereeritud salt-i ning PBKDF2 algorithmi (SHA256, 100 000 iteratsiooni)

Serveri nice-to-have funktsionaalsus:

  • API rate limiting
  • Bayesian spam filter
  • Iga kasutaja kohta iCal faili automaatne koostamine.
  • Push notifications

Projekti kirjeldus

Tehnoloogiad

DAL - Client

Kliendi DAL sai otsustatud ehitada Dapperi baasil, Entity frameworki asemel. Entity framework 6-l puudub täielik SQLite tugi(näiteks tabeleid ei saa luua). Ühtlasi häirib õppimise seisukohalt EF üleliigne abstraktsioonitase - äärmiselt keeruline on aru saada, mida su programm tegelikult teeb.

Alguses sai Dapperi jaoks koostatud SQL päringuid, kuid kuna väga suur osa päringutest olid äärmiselt sarnased, siis sai kasutusele võetud Dapper.SimpleCRUD. Keerulisemad päringud saab vajadusel käsitsi juurde teha, kuid lokaalse andmebaasi puhul ei tohiks selleks vajadust olla.

By default asub sqlite andmebaas failissüsteemis %appdata%\AVE\db.sqlite3 . Seda asukohta on võimalik programmi konfiguratsioonist muuta, kuid %AppData% kasutamine võimaldab 1) Iga Windowsi kasutaja jaoks oma personaalse andmebaasi loomist. 2) Teistel kasutajatel pole ligipääsu andmebaasifailile.

UI - Client

Autentikatsioon - Client

Kliendi kohalik autentikatsioon on mõeldud serveriga suhtlemise toetamiseks. Kohalikku andmebaasi salvestatakse kas kasutaja krüpteeritud parool või parooli räsi. Juhul kui salvestatud on parool, tähendab see, et kasutaja on valinud linnukese "jäta mind meelde", ning rakendusse sisselogimine toimub automaatselt. Vastasel juhul küsitakse kasutaja käest rakendust avades parooli, ning kohaliku räsi vastu võrreldakse seda juhul kui serveriga ühendust ei saa(rakendus on offline). Parooli hoidmise turvalisuse tõstmiseks kasutame Windows Data Protection API-t, mis kaitseb kohalikult säilitatavat parooli Windowsi kasutajahalduse vahenditega.

Server

Server kasutab klientidega suhtluseks RESTful apit ja JSON andmeformaati.

Autentikatsioon - Server

Kasutaja autentikatsioon toimub stateless auth mustrit kasutades.

Kasutaja autentimiseks saadab kasutaja oma kasutajanime, parooli ja juhuslikult genereeritud stringi POST meetodit kasutades https://<server>/login ressursile. Server kontrollib kasutaja parooli andmebaasi salvestatud hashi vastu, ning positiivse vastuse puhul lisab expiration timestampi ning keyed HMAC_SHA256 autentikatsioonikoodi, kasutades ainult serverile teadaolevat võtit. Transpordi käigus andmete turvalisuse eest hoolitseb TLS. TLS sertifikaadi kinnitamiseks kasutame kas StartCom või Let's Encrypt tasuta teenust.

Vastuseks saadud tokeni salvestab klientprogramm endale mällu, ning lisab hiljem igale API requestile. Konkreetne meetod pole oluline, aga kasutame vist Authentication headerit ja serialiseerime JSON objekti Base64 kodeeringuga.

Antud skeemi eelis on, et server ei pea arvet pidama aktiivsete sessioonide üle, vaid kontrollib lihtsalt HMAC vastavust ning kasutab tokenis olevat infot. Kriitiline on serveri võtit turvaliselt säilitada. Ideaalne oleks serveri võtme salvestamiseks kasutada TPM moodulit, kuid kasutades odavaid hostinguteenuseid ei ole see võimalik - võtit tuleb hoida failisüsteemis, ning võtmefailile peavad olema minimaalsed ligipääsuõigused.

Skeem on sarnane JSON Web Token skeemile (RFC 7519)

Arendusmustrid

Versioonikontroll

Versioonikontrolli kasutuse käigus ilmnes Visual Studio viga/tegemata töö: NuGet packageid solutionisse lisades pidid teised kasutajad pakettide tööle saamiseks endal kohalikult (solution)\packages\ kataloogi enne buildi ära kustutama. Selle vea paranduseks on tarvis lisada solutioni kataloogi .tfignore fail sisuga

\packages

ja .nuget\NuGet.config fail sisuga:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <solution>
    <add key="disableSourceControlIntegration" value="true" />
  </solution>
</configuration>

Seejärel Source code explorer aknast serveri versioon packages kataloogist ära kustutada. Edaspidi ei laeta packages kataloogi versioonikontrolli, ning NuGet automatic restore saab automaatselt vajalikud paketid buildides taastatud.

API kirjeldus ja dokumentatsioon

Api kirjeldus asub aadressil http://docs.ave.apiary.io/ WCF genereerib ilusti ka ise koodi põhjal API dokumentatsiooni. See on plaanis kasutusele võtta hiljem, kui serveri kood on valmis, ning server on avalikult online.

Koodi stiilireeglid

Otsustasime, et kogu programmi kood, muutujanimed ja koodi kommentaarid on ingliskeelsed. Muutujanimedel kasutame järgmiseid reegleid:

  • Klassi privaatmuutujad algavad _ prefiksiga;
  • Klassi avalikud meetodid ja muutujad algavad suurtähega;
  • Kõik muud muutujad algavad väiketähega;

Kõik muutujanimed peavad sisaldama ainult US-ASCII tähti või numbreid ( ^[a-zA-Z0-9]+$ ). Liigendamiseks on suurtähed.

Muutujad peavad võimalikult täpselt kirjeldama oma sisu abstraktsel tasemel. Erandiks on meetodi- ja funktsioonisisesed muutujad millede sisu on kontekstist lihtsalt tuletatav. Näiteks "i" tsükliloendurina jne.

Muutujanimed ei tohi sisaldada tüübiviidet.

"Maagilised" muutujad peavad olema deklareeritud konstantidena, ning omama kommentaari. Kõiki selliseid muutujaid peab olema võimalik programmi konfiguratsioonifailist muuta.

Litsents

Kogu rakendus avaldatakse GNU General Public License v3.0 all. (GPL) Rakenduse dokumentatsioon avaldatakse ITK Wikis, järgides ITK Wiki litsentsitingimusi.

Avaldatud failid

Andmebaasi Skeem (DBDesigner)

Arendusprotsess

  • 8.10.2015 - Loodud wiki leht ja lepitud kokku esimene kohtumine idee leidmiseks ja algseks analüüsiks.
  • 19.10.2015 - Esimene kohtumine. Leitud idee rakenduse loomiseks, määratud rollid esimeseks analüüsietapiks.
  • 1.11.2015 - Teine kohtumine. Valmis analüüs.
  • 6.11.2015 - Lisatud retsensioon meeskonnale Premium.
  • 11.11.2015 - Esimene tõmmis kasutajaliidesest TFS-is
  • 12.11.2015 - Loodud esialgne API kirjeldus, vajab veel täiendamist arenduse käigus
  • 15.11.2015 - Loodud kliendi kohaliku andmebaasi skeem
  • 17.11.2015 - Kolmas kohtumine, lepitud kokku ajad mil koos koodi kirjutada. Ühtlasi loodud rakenduse kihtide skeem.
  • 21.11.2015 - Koos koodi kirjutatud pisut. Kasutajaliides hakkas asju tegema, API server vastab käskudele.
  • 28.11.2015 - Algselt MSSQL+EF kliendi DAL migreeritud SQLite+Dapper lahendusele.
  • 30.11.2015 - Rakendust esitletud C# praktikumis.
  • 31.11.2015 - Neljas kohtumine, lepitud kokku ülesannete jaotus ja arenduskava järgmiseks nädalaks.

Lisad

[2]