Skip to content

Kalenteri

Kimmo Koskinen edited this page Sep 18, 2016 · 1 revision

Johdanto

Toiminnon käyttötarkoituksena on näyttää leiriläiselle hänen oma tarkka päiväohjelmansa eri leiripäiviltä. Tämä on sovelluksen toivotuin ominaisuus ja sen päänäkymä.

Tiedot näkee vasta kirjauduttuaan, ja sitä ennen ruudussa näkyy kirjautumiskehotus.

Backend tietää sekä vakio-ohjelmat ja pestivuorot että erikseen lisätyt ”Lisää kalenteriin” -jutut. Niinpä nämä molemmat näkyvät tässä kalenterissa.

Kalenteri-toimintoa tehdään vain leiriä varten, mutta leirin jälkeen vastaava toiminto voisi olla pysyvässäkin sovelluksessa. Tämä voidaan ottaa nyt jo huomioon niissä kohdissa, missä se ei työtä lisää.

Backend-kommunikointi

Tämän toiminnon tiedot tulevat appin paikallisesta storagesta. Jos siellä ei ole mitään, appi lukee kaikki tiedot backendistä ja tallentaa ne paikalliseen storageen. Tämän jälkeen ne sitten tulevat paikallisesta storagesta näkyviin.

Myös tilanteessa, että käyttäjä muuttaa kielivalintaa, appi lukee kaikki tiedot uudestaan.

Tiedot tulevat backendistä täysin valmiina ja kaikissa tapauksissa ensin paikalliseen storageen, josta ruutuun.

Backend palauttaa tekstit suomeksi, ruotsiksi tai englanniksi appin kielivalinnan mukaan. Jos kielivalinta on joku muu, backend palauttaa tekstit englanniksi.

Alkulatauksen jälkeen appi tarkastaa JSON-datan kertomin määrävälein (ainakin aluksi kerran vuorokaudessa), onko tietoihin tullut muutoksia. Ei juuri tuolloin taustalla, vaan sitten kun käyttäjä appin käynnistää ja on kulunut yli vuorokausi edellisestä tarkastuksesta. Lisäksi käyttäjä voi käynnistää tarkastuksen käsin. Kalenterimerkintöjä saattaa tulla uusia, vanhoja poistua ja nykyisten tiedot päivittyä. Backendistä haetaan aina vain ne tiedot, jotka ovat muuttuneet viime hakemisen jälkeen.

Jos synkkaus epäonnistuu, niin vanhat tiedot säilyvät voimassa

Käyttäjä ei pysty muuttamaan tietoja sovelluksessa, paitsi poistamaan osan tapahtumista (ks. jäljempänä).

Käyttöliittymän toiminnot

"Yläpalkissa" on seuraavat toiminnot

  • Painike päivittää tiedot backendistä
  • Painike asetuksiin

Ruudussa kiinteästi ovat xxx

Seuraavassa on esimerkkikuva näytöstä, mutta ei välttämättä malli käyttöliittymästä tai asettelustaEsimerkkikuva Lisäksi seuraavat kommentit

  • Ei logoa tai RoihuApp-tekstiä ja ihmisen tilalle hammasratas
  • Näkyy päivä kerrallaan, voidaan vierittää pystysuunnassa
  • Pvm ja edellinen/seuraava-siirtymisnapit pysyvät näkyvissä
  • Taustaväri kertoo tapahtuman tyypin
  • Synkkauksen aikana teksti ”Päivitetään” ja tulos ”Valmis” tai ”Päivitys epäonnistui”
  • i-napin takana teksti ”Päivitetty 7.8.2015 22:36” eli viimeisin onnistunut päivityshetki
  • Yhtä tapahtumaa napauttamalla aukeavat sen lisätiedot Entä jos toimintoa käytetään leirin jälkeen, onko siirtyminen liian hankalaa Joku visuaalinen vihje, jos ajat menevät päällekkäin

Seuraavassa on kirjautumiskehotus, joka näytetään kun käyttäjä ei vielä ole kirjautunutKirjautumiskehotus

Seuraavassa on kirjautumisnäkymä, jonka tuottaa PartioID-kirjautuminenKirjautumisnäkymä

xxx xxx

xxx Käyttötarkoitus Tarvitaan edellisen kanssa Ruudun sisältö Ei logoa, RoihuApp-tekstiä ja ihmisen tilalle hammasratas Tapahtuman tiedot joko listan seassa (ks. oikealla) tai sitten aukeavat omaan ruutuunsa Pvm, viikonpäivä, otsikko, alkuaika, kesto, loppuaika, paikkateksti, karttaruutu esim. R13, kuva ja skrollaavat lisätiedot Usein simppeleitä (mitä ruuaksi, ohjelmalaakson varusteet, pestin pomo), mutta esim. avajaisista voisi olla laulujen sanat sekä kunkin esiintyjän valokuva ja tarkemmat tiedot Jos erillinen ruutu, niin myös nuolinapit seuraavaan ja edeltävään tapahtumaan Toiminnallisuus Napit ja vieritys (otsikkopalkki ei vieri piiloon) Lisätieto sulkeutuu kun otsikkoa napauttaa uudelleen tai kun napauttaa jotain toista otsikkoa (jolloin aukeaa sen lisätiedot) tai kun vaihtaa päivää Toisessa osiossa käydessä avaustilanne säilyy Poistaa voi itse lisäämiään ja peruttuja pakollisia xxx

Roihu App Backend API Read User Events JSON

Backend palauttaa käyttäjän kalenteritapahtumat. Appi lähettää REST-kutsussa kielen FI, SV tai EN, jonka mukaan title ja description ovat jotain näistä kielistä. Tai jos appi lähettää muun kielen, Backend palauttaa englantia.

Appi tallentaa backendin antaman kielen, jotta jos käyttäjä vaihtaa kielen myöhemmin, appi pyytää kaiken uudestaan.

Appi tallentaa backendin antaman ajankohdan (timestamp), jotta appi voi seuraavalla synkkauksella pyytää vain kyseisen ajan jälkeen tulleet muutokset. Backend palauttaa 5 s varhaisemman ajan kuin nykyhetki. Näin seuraavalla synkkauksella tulee varmasti pyydettyä myös aivan viimeisimmät muutokset, vaikka näin liikenne hieman kasvaakin. Alla ei vielä ole kuvattu, miten appi ilmoittaa em. ajankohdan REST-kutsussa.

Jos tapahtuman id:tä ei ole appilla ennestään, appi lisää tapahtuman. Muutoin appi päivittää tapahtuman tiedot uuden datan mukaisiksi.

Jos tapahtuman tietoihin muuttuu rsvp_status=ecanceled, appi vaihtaa tapahtuman käyttöliittymässä harmaaksi (tms.) ja mahdollistaa, että käyttäjä voi sen deletoida.

Käyttäjän sallitaan deletoida tapahtumia, joiden rsvp_status on attending tai ecanceled. Tällöiin rsvp_statukseksi tulee ucanceled ja tapahtuma poistuu appissa näkyvistä. Jollain valinnalla deletoidut voisi toki vielä tuoda näkyviin.

Jos place/location sisältää WGS84-koordinaatit, ei campmapgrid-koordinaatteja tarvita eikä käytetä. Leiriä varten katuosoitteeseen liittyvät kentät voisi kenties myös jättää pois.

Backend-tietokannan tapahtumataulu

Tämä kuvaus ei ota huomioon sitä, että kolmikielisyys tulee todellisuudessa useamman taulun rakenteen kautta. Muutenkin kyseessä on enempi luonnos kuin kiveen hakattu speksi.

Seuraavassa kenttien nimet ja selitykset.

event_source

Meidän täytynee erotella, mitkä tietueet ovat SharePointista ja mitkä appista käyttäjien lisäämänä. Tähän riittänee numero 1 = SharePoint ja numero 2 = appi. Eli ei maksane vaivaa käyttää erillistä kooditaulua.

event_id

Yksikäsitteinen tietue-id, varmaankin auto-incrementillä.

sharepoint_id

Jotta SharePointissa tapahtuvista muutoksista pysytään kärryillä, tarvittaneen erikseen se id, jonka SharePoint-rajapinta tänne palauttaa.

eventType

Appin värikoodausta varten tarvitaan tapahtuman tyyppi. Valikoima on:

  • Ruokailu
  • Päiväohjelma
  • Iltaohjelma
  • Tapaaminen
  • Kokous
  • Virvatuli
  • Muu (tämä on SharePointissa merkitty muuksi)
  • Tuntematon (tämä on SharePointissa sellainen, jota bäkkäri ei tunnista)

Valikoima luultavasti päivittyy vielä, jolloin muutokset täytyy koodata sekä bäkkäriin että appiin.

Onkohan nämä parasta välittää appiin numerokoodilla.

eventTitle

Esim. Jalista suoralla.

SharePoint palauttaa tämän kolmella kielellä, mutta appissa käyttäjä syöttää vain yhden tekstin. Jälkimmäinen ainokainen pitäisi palauttaa appille riippumatta, mitä kieltä se pyytää.

eventDescription

Kolmikielinen leipäteksti.

SharePoint palauttaa tämän kolmella kielellä, mutta appissa käyttäjä syöttää vain yhden tekstin. Jälkimmäinen ainokainen pitäisi palauttaa appille riippumatta, mitä kieltä se pyytää.

location_name

SharePoint palauttaa tämän kolmella kielellä, mutta appissa käyttäjä syöttää vain yhden tekstin. Jälkimmäinen ainokainen pitäisi palauttaa appille riippumatta, mitä kieltä se pyytää.

last_modified

Milloin SharePointin joku kenttä viimeksi muuttui tai milloin appin käyttäjä lähetti uuden tapahtuman.

SharePointin tiedot tulevat useammasta listasta koottuna (perus, käännökset, paikat). Jos on liian työlästä selvittää näistä kaikista oikeasti viimeinen muutoshetki, niin esim. paikat voidaan jättää huomiotta.

rsvp_status

Tämä on ennestään jo tietokannassa, mutta on turha, koska seuraava status-kenttä korvaa tämän.

status

Kolme vaihtoehtoa:

  • searchable = tapahtuma on appissa haettavissa tapahtumahaku-osiossa
  • mandatory = virallista ohjelmaa SharePointista; tämä siis näkyy aina käyttäjän kalenterissa, jos vaan ikäkausi, alaleiri ja aalto täsmäävät
  • canceled = tapahtuma on peruutettu

start_time

Tapahtuman alkupvm ja kellonaika

end_time

Tapahtuman loppupvmm ja kellonaika

gpsLatitude

Paikan WGS84-leveyspiiri, joka saattaa myös puuttua.

gpsLongitude

Paikan WGS84-pituuspiiri, joka saattaa myös puuttua.

gridLatitude

Leirikoordinaatiston leveyspiiri eli kirjain A-Z, joka saattaa myös puuttua

gridLongitude

Leirikooridnaatiston pituuspiiri eli 01-30, kahdella numerolla, joka saattaa myös puuttua

subcamp

Jos tapahtuma on vain yhden alaleirin, tässä on sen nimi suomeksi (niitä ei kaiketi ole käännetty)

camptroop

Jos tapahtuma on vain yhden leirilippukunnan, tässä on sen nimi suomeksi. Nimilistaa ei vielä ole saanut, joten ei myöskään ole tietoa, onko niillä numerokoodeja.

age_groups

Koodattaneen kiinteästi seuraavat bitit:

  • 0x4 = perheleiri
  • 0x8 = tarpojat
  • 0x10 = samoajat
  • 0x20 = vaeltajat
  • 0x40 = aikuiset

participant_count

Niiden käyttäjien määrä, jotka linkkitaulun kautta ovat tässä tapahtumassa. Tieto pitää palauttaa aina kun joku 17.000 appista sitä kysyy, joten kannattanee olla taulussa eikä laskea aina lennosta.

Backend-tietokannan linkkitaulu

Tämä taulu linkittää tapahtumat ja käyttäjät, eli kenttinä on tapahtuman id ja käyttäjän id.

Linkkitauluun tulee muutoksia seuraavasti:

  1. Kun käyttäjä lisää appin tapahtumahausta tapahtuman omaan kalenteriinsa, tai kalenteristaan poistaa ei-pakollisen tapahtuman
  2. Kun Rekistä tulevat käyttäjätiedot päivittyvät, niin tämän käyttäjän pakollisten tapahtumien osallistumiset tulee käydä läpi
  3. Kun SharePointista tulevat pakolliset tapahtumatiedot päivittyvät, niin ko. tapahtuman osallistumiset tulee käydä läpi

Jos kohdat 2 ja 3 ovat liian työläitä, niin vaihtoehtona lienee, että pakollisia tapahtumia ei ole lainkaan linkkitaulussa, vaan lista rakennetaan lennosta aina, kun kyseisen käyttäjän appi pyytää kalenteritietoja.

JSON

/*=============================================================
  Roihu 2016 - Finnjamboree, July 2016
  Roihu App - Mobile Application
  -------------------------------------------------------------

  SPECIFICATION OF THE BACKEND REST API
  Sakari Kouti
  Created Nov 11, 2015
  Last modified Feb  10, 2016

=============================================================*/

/*=============================================================
  READ USER EVENTS
=============================================================*/

/*-------------------------------------------------------------
  Request (Read user events)
  URI....: /me/events
  Method.: GET
  Headers: Authorization: Bearer ABC123 (OAUTH 2 token)
           What about an MD5 hash?
           Accept-Language: FI, SV tai EN
  Params.: xxx
-------------------------------------------------------------*/

/*-------------------------------------------------------------
  Response (Read user events)
-------------------------------------------------------------*/

{
  "timestamp": "2016-02-10T20:10:05+0300", /* time and date when data was retrieved */
  "events": [
    {
      "last_modified": "2016-01-14T12:45:06Z", /* when any of the fields was last modified */
      "rsvp_status": "attending", /* attending = user has booked from the event search
                                    mandatory = user cannot delete, official program
                                    ucanceled = user has deleted from her calendar
                                    ecanceled = entire event has been cancelled */
      "start_time": "2016-07-22T18:00:00+0300",
      "end_time": "2016-07-22T19:00:00+0300",
      "id": "907824855971753",  /* or maybe a GUID? */
      "type": "xxx", /* helps in color coding, such as meals with a certain color */
      "title": "Jalista suoralla", /* or in English/Swedish, depending on mobile lang */
      "description": "Ensin pelaillaan\nja sitten pelaillaan.", /* or English/Swedish */
      "place_name": "Aalto Design Factory",
      "latitude": 60.1809692,
      "longitude": 24.8316593,
      "campmapgrid_latitude": "13", /* camp map has 50 x 50 meter grid */
      "campmapgrid_longitude": "R"
      "subcamp": "Xyz", /* if not empty, event is only for this subcamp */
      "camptroop": "117 Lommo", /* if not empty, event is only for this */
      "agelevels": [
        {
          "agelevel": "rover"
        },
        {
          "agelevel": "adult"
        }
      ],
      "participant_count": 75, /* how many people have this in calendar */
      "photo": "AkjX234jS" /* Base64 encoding? */
    }
  ]
}
Clone this wiki locally