18.5.10

Menüü kliendi kaudu saab lisada andmeid

Kliendi mis suhtleb menuu veebiteenuse vastu, sai endale funktsionaalsuse toodete, kategooriate ja kasutajate lisamiseks.
Igas tabis on nupp, millele vajutamisel kuvatakse vorm, mille täitmisel tehakse päring teenusele, ning kuvatakse vastus messageboxina õnnestumisest või mitteõnnestumisest. Peale negatiivset vastust saab vormi edasi täita ning positiivse vastuse korral näeb kasutaja grid, millele on tehtud värskendus.

17.5.10

Uhke värk

Teenuse/kliendi koodi on valmis juba üle 1000de rea. Kõvasti rohkem kui ootasime. Mida kaugemale jõudsime, seda rohkem kasvas huvi ning tekkis ideid uute asjade tegemiseks.

Kirjutan siia pikemalt enda tehtud meetoditest ning jamadest nende tegemisel.

Esimene kõige raskem osa oli vast arusaamine, et mis pagana asi see veebiteenus on. Temperatuuri konvertimise näitest jäi nagu kuidagi väheks. Aga kuna kogemus on kõige parem õpetaja, siis kõigepealt tuli praktika ja siis teooria. Arusaamine tekkis sageli alles meetodite tegemise ajal, et mis ja kuidas võiks olla. Aga vähemalt tekkis.

Veebiteenuse tegemisega alustas Kristjan, tehes valmis lihtsamad funktsioonid. Kuna põhi oli all, siis asjade täiendamine ning juurde tegemine olid ka veidi lihtsamad.

Kõigepealt sai tehtud sisse-välja logimine ning kõik sessioonidega seotud. Eeskujuks VRII-he 9sas praks. Iga kasutaja sisselogimise ajal genereeritakse talle unikaalne session_key, mille olemasolu kontrollitakse iga sisselogimist eeldava funktsiooni juures.funktsioon uuendaSessiooni pikendab sessiooni logimist eeldavate meetodite kasutamisel, kontrolliSessiooni vaatab kas sessioon on veel aktiivne. Väljalogimisel kirjutatakse sessiooni aegumise aeg üle DateTime.Now-ga.

Paroooli hashimiseks on kasutusel sha1 algoritm. Parool salvestatakse andmebaasi hashitud kujul ning sisselogimisel sisestatud parool hashitakse ning võrreldakse andmebaasis olevaga.

Vahepeal sai tehtud toodete ning kasutajatega seotud funktsioone. (lisaKasutajagrupp, lisaKategooria jne).

Kasutaja lisamist on kahte tüüpi:
üks ei eelda sisselogimist ning paneb loodava kasutaja grupiks automaatselt tavakastuaja.
Teine lisamine on mõeldud administraatorile ja sellega saab lisada tähtsamaid asjapulki (teisi adminne, müüjaid jms).

Seejärel tulid kasutajarollid. Algselt pandi kasutajale ta kasutajagrupiID kasutaja tabelisse, kuid et kasutaja saaks olla ka mitmes eri rollis, siis oli vaja vahetabelit kasutaja_rollis. Lisades kasutajat andmebaasi, tuli lisada ka tema id ja kasutajagrupi id tabelisse kasutaja_rollis.
Iga meetodi juures on öeldud mis kasutajaõigused peavad olema selle meetodi teostamiseks ning toimub õiguste kontroll.


Raskeimad kohad:
kasutajagruppide haldus, sisselogimine. Raske oli nende tööpõhimõtet leiutada. SQL süntaksiga harjumine võttis ka kaua, õigeid näiteid oli raske leida.

Tüütu oli see, et alguses heauskselt valmistehtud asi vajas sageli täiendamist ja ümberegemist, osaliselt oma läbimõtlematuse pärast, osalt ka asja ülesehituse tõttu. (andmebaasitabelite muutmised, uuendaSessiooni lisamine igalepoole jms).

Oma lollusest jamasin kõige kauem kasutajanime olemasolu kontrolliga (et ei tekiks topelt nimesi andmebaasi). Kuna ma ei pannud datareaderit while sisse, siis ta küll kontrollis ilusti, et kas kasutajanimi on olemas, kuid kui polnud, siis sain errori: Exception Details: System.InvalidOperationException: Invalid attempt to read when no data is present. Loogiline värk küll, kuid kuidagi ei saanud tast lahti. Proovisin leiutada igasugu eri rakette, et seda korda saada (ExecuteNonQuery()-ga lugeda ridu, et milles muutus on toimunud ja sellejärgi if-lause jms). Kui 3h hiljem juhuslikult visual basicu tutorialist leidsin if lause readeri ümbert, siis ei teadnudki kas nutta oma lollusest või naerda kergendusest, et korda sai.


Antud teenuse tegemine andis väga hästi ülevaate, et mis asi on veebiteenus. Ja tundub et lausa täitsa asjalik asi on pikas perspektiivis: muudatusi teha on inimlik.
Kuna meist keegi pole varasema kogemusega superprogeja ning pooled käivad tööl jms, siis arvan, et tulemusega võib täitsa rahul olla. Pole viimasel õhtul tehtud suva käkk, et midagigi oleks. Ka ajakasutus oli enamvähem: alustasime tegemisega peale töö välja kuulutamist. Peale esimest nädalat küll tekkis paus sisse, kuid vähemalt olime asjad läbi rääkinud ning oli teada mis vaja teha on.

Saime mitmed korrad kokku kohvikus arutamaks, et mida ja mismoodi teha, kuid kodeerimine toimus igalühel eraldi. Failide jagamiseks kasutasime Dropboxi.

Tööjaotus:
Liisa: XML asjad, teenus
Hannes: teenuse klient
Jürgen: Flickri API
Kristjan: Teenus

Selle projekti puhul oli hea teha asju mitme peale, igaüks sai tegeleda millegagi teistest mitte oluliselt sõltudes. Polnud kattuvaid jubinaid jms. Lõpupoole oli tüütu teha klienti ja rakendust samal ajal,kuid see polnud suur mure.

Tahaksin tänada ka Madist, kellel tänu mu rumalatele küsimustele jõudis juuste halliks minemise aeg kindlasti nii mõnegi aasta võrra lähemale.

14.5.10

Menüü klient

Nonii, nüüd juba mõnda aega tegelenud menüüteenuse kliendiga, mis on kirjutatud WPF-is. Teenuse meetodites ilmnes väikseid buge, mis said täna silutud. Klient kuvab hetkel tooteid, kasutajaid, gruppe ning kasutajagruppe.
Rakenduse käivitamisel kuvatakse kasutajale login aken:


Nime ja paroolilahtril on kontroll sisu täitmise kohta ning üle teenuse kontrollitakse kasutajanime ja parooli õigust.
Kui kõik läheb hästi, pääseb kasutaja ligi aknale, milles kuvatakse gridis:
  • Kõik tooted
  • Tootegrupid
  • Kasutajad
  • Kasutajagrupid


Järgmise uuendusena lisan lisamise ning kustutamise funkstioonid.

12.5.10

valmis on hunnik meetodeid, näiteks:
kasutajagrupi lisamine
kasutajagrupi kustutamine
kategooria lisamine
kategooria kustutamine
toote lisamine
toote kustutamine
kasutaja loomine
kasutaja sisselogimine
kasutaja väljalogimine
toote menüüsse lisamine
toote menüüst kustutamine


Igal meetodi poole pöördumisel ( va kasutajahalduse meetodid ) tuleb kaasa anda vastava kasutaja sessiooni võti. Iga meetodi alguses kontrollitakse kas antud kasutaja sessioon on veel aktiivne, ning kui on, alles siis saab meetodit kasutada.

11.5.10

Teenuse log in/log out

Läbi sünnitusvalude olemas login/logout.

Logini ideoloogia on pärit VR2-he 9dast praktikumist.

login (antakse kaasa kasutajanimi ja parool - meetod converdib parooli sha1'te ja võrdleb baasis olevaga ja tagastab true/false + lisab sessioonide andmebaasi unikaalse session key mingi tähtajaga. Session key salvestatakse andmebaasi, mitte xml-i)

logout (antakse kaasa session key ja meetod märgib baasis selle aegunuks tagastab true/false)

Kontrolli/uuenda session key-d. kõigile ülejäänud meetoditele, kui nende poole pöördutakse, tuleks kaasa anda session key - meetod kontrollib baasist kas see session key on veel aktiivne ning kui on, saab seda meetodit kasutada


PS, tundub et jürgeni API ka täitsa töötab. kiitus

10.5.10

API bugfixes, BETA release

Tegin täna siis sellist beta-testimist ka edukamalt. Leidsin üksikud vead, millele ka lahenduse sain.

  • olin suutnud vahepeal kaotada ära "tagasi" nupu thumbnailide laadimise (arvasin, et foreachi koodi ei pea kordama)
  • API kräshis kui otsida sõna ilma tekstita. Ehk siis teostades tühiotsingut. Veateate küll andis aga kräshis. Point oli siis selles, et hetke lehekülge kuvav leibel sai väärtuseks "null" siis, mille ma ära parandasin.
Lisaks lisasin võimaluse avada otsitud pildi inimese profiili. Ma ei tea, niisama. Beta testimine igati oodatud ka teiste poolt.

Valminud ka installer.

API nutt ja hala

Alustasin siis API arendamisega 3ndal Mail, valmis sai ta täna lõunaks. Aega läks siis nädalake, töötunde 30+. 

Kõige raskem osa oli pildi uploadimine. Pildi ID genereeritakse nime, kirjelduse ja tagi järgi aga see oli read-only. Asjale lähenesin lihtsalt valesti, muutes seda read-only väärtust kui piisas var muutuja tegemisest, mis ise ID genereeris.

Mure valmistas pikalt ka pildiotsingu lehekülgede vahetamine nuppudega "järgmine" ja "eelmine". Nimelt teenuse pages funktsiooni ei osanud ma nupuvajutusega suurendada. Tuli teha lihtsalt globaalne muutuja meetodist väljapoole ja meetodis kasutada liitmisel this'i.

Inimese otsingul arvasin alguses, et tegin valesti, et pärisnime ei saa, aga tuli välja, et see on lihtsalt niivõrd vähestel kasutajatel määratud, et tõenäosus seda saada ongi väike. Seepärast jätsin ta üldse välja.
Võrdlemisi huvitavalt lahendasin ka selle, et kui inimese otsing on sooritatud, siis saab ka tema ankeedi avada. Kasutasin listboxi indekseid.