BeerPressure: Difference between revisions

From ICO wiki
Jump to navigationJump to search
Line 92: Line 92:
</source>
</source>


'''POST /api/v1/Account/login'''
'''POST /api/v1/account/login'''
<source>   
<source>   
Params: LoginViewModel
Params: LoginViewModel
Line 99: Line 99:
</source>
</source>


'''POST /api/v1/Account/logout'''
'''POST /api/v1/account/logout'''
<source>   
<source>   
Params: -
Params: -
Line 107: Line 107:




'''POST /api/v1/Account/addRole'''
'''POST /api/v1/account/addRole'''
<source>   
<source>   
Params: role
Params: role
Line 122: Line 122:
</source>
</source>


'''GET /api/v1/Users/{id}'''
'''GET /api/v1/users/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 129: Line 129:
</source>
</source>


'''POST /api/v1/Users'''
'''POST /api/v1/users'''
<source>   
<source>   
Params: UserDTO
Params: UserDTO
Line 136: Line 136:
</source>
</source>


'''PUT /api/v1/Users/{id}'''
'''PUT /api/v1/users/{id}'''
<source>   
<source>   
Params: int id, UserDTO
Params: int id, UserDTO
Line 143: Line 143:
</source>
</source>


'''PUT /api/v1/Users/deactivate/{id}'''
'''PUT /api/v1/users/deactivate/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 150: Line 150:
</source>
</source>


'''DELETE /api/v1/Users/{id}'''
'''DELETE /api/v1/users/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 165: Line 165:
</source>
</source>


'''GET /api/v1/Promotions/{id}'''
'''GET /api/v1/promotions/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 172: Line 172:
</source>
</source>


'''POST /api/v1/Promotions'''
'''POST /api/v1/promotions'''
<source>   
<source>   
Params: PromotionDTO
Params: PromotionDTO
Line 179: Line 179:
</source>
</source>


'''PUT /api/v1/Promotions/{id}'''
'''PUT /api/v1/promotions/{id}'''
<source>   
<source>   
Params: int id, PromotionDTO
Params: int id, PromotionDTO
Line 186: Line 186:
</source>
</source>


'''DELETE /api/v1/Promotions/{id}'''
'''DELETE /api/v1/promotions/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 201: Line 201:
</source>
</source>


'''GET /api/v1/Restaurants/search?name=th'''
'''GET /api/v1/restaurants/search?name=th'''
<source>   
<source>   
Params: string name
Params: string name
Line 208: Line 208:
</source>
</source>


'''GET /api/v1/Restaurants/Top'''
'''GET /api/v1/restaurants/top'''
<source>   
<source>   
Params: int amount
Params: int amount
Line 215: Line 215:
</source>
</source>


'''GET /api/v1/Restaurants/{id}'''
'''GET /api/v1/restaurants/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 222: Line 222:
</source>
</source>


'''GET /api/v1/Restaurants/{userId}'''
'''GET /api/v1/restaurants/{userId}'''
<source>   
<source>   
Params: int userId
Params: int userId
Line 229: Line 229:
</source>
</source>


'''POST /api/v1/Restaurants'''
'''POST /api/v1/restaurants'''
<source>   
<source>   
Params: RestaurantDTO
Params: RestaurantDTO
Line 236: Line 236:
</source>
</source>


'''PUT /api/v1/Restaurants/{id}'''
'''PUT /api/v1/restaurants/{id}'''
<source>   
<source>   
Params: int id, RestaurantDTO
Params: int id, RestaurantDTO
Line 243: Line 243:
</source>
</source>


'''DELETE /api/v1/Restaurants/{id}'''
'''DELETE /api/v1/restaurants/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 258: Line 258:
</source>
</source>


'''GET /api/v1/Menus/{id}'''
'''GET /api/v1/menus/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 265: Line 265:
</source>
</source>


'''POST /api/v1/Menus'''
'''POST /api/v1/menus'''
<source>   
<source>   
Params: MenuDTO
Params: MenuDTO
Line 272: Line 272:
</source>
</source>


'''PUT /api/v1/Menus/{id}'''
'''PUT /api/v1/menus/{id}'''
<source>   
<source>   
Params: int id, MenuDTO
Params: int id, MenuDTO
Line 279: Line 279:
</source>
</source>


'''DELETE /api/v1/Menus/{id}'''
'''DELETE /api/v1/menus/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 294: Line 294:
</source>
</source>


'''GET /api/v1/Dishes/Daily'''
'''GET /api/v1/dishes/daily'''
<source>   
<source>   
Params: bool vegan, bool glutenFree, bool lactoseFree
Params: bool vegan, bool glutenFree, bool lactoseFree
Line 301: Line 301:
</source>
</source>


'''GET /api/v1/Dishes/search?title=th'''
'''GET /api/v1/dishes/search?title=th'''
<source>   
<source>   
Params: string title
Params: string title
Line 308: Line 308:
</source>
</source>


'''GET /api/v1/Dishes/Pricelimit'''
'''GET /api/v1/dishes/pricelimit'''
<source>   
<source>   
Params: decimal priceLimit
Params: decimal priceLimit
Line 315: Line 315:
</source>
</source>


'''GET /api/v1/Dishes/Top'''
'''GET /api/v1/dishes/top'''
<source>   
<source>   
Params: int amount
Params: int amount
Line 322: Line 322:
</source>
</source>


'''GET /api/v1/Dishes/{id}'''
'''GET /api/v1/dishes/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 329: Line 329:
</source>
</source>


'''POST /api/v1/Dishes'''
'''POST /api/v1/dishes'''
<source>   
<source>   
Params: DishDTO
Params: DishDTO
Line 336: Line 336:
</source>
</source>


'''PUT /api/v1/Dishes/{id}'''
'''PUT /api/v1/dishes/{id}'''
<source>   
<source>   
Params: int id, DishDTO
Params: int id, DishDTO
Line 343: Line 343:
</source>
</source>


'''DELETE /api/v1/Dishes/{id}'''
'''DELETE /api/v1/dishes/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 358: Line 358:
</source>
</source>


'''GET /api/v1/Ingredients/{id}'''
'''GET /api/v1/ingredients/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 365: Line 365:
</source>
</source>


'''POST /api/v1/Ingredients'''
'''POST /api/v1/ingredients'''
<source>   
<source>   
Params: IngredientDTO
Params: IngredientDTO
Line 372: Line 372:
</source>
</source>


'''PUT /api/v1/Ingredients/{id}'''
'''PUT /api/v1/ingredients/{id}'''
<source>   
<source>   
Params: int id, IngredientDTO
Params: int id, IngredientDTO
Line 379: Line 379:
</source>
</source>


'''DELETE /api/v1/Ingredients/{id}'''
'''DELETE /api/v1/ingredients/{id}'''
<source>   
<source>   
Params: int id
Params: int id
Line 394: Line 394:
</source>
</source>


'''GET /api/v1/Ratings/Restaurant/{id}'''
'''GET /api/v1/ratings/restaurant/{id}'''
<source>   
<source>   
Params: int restaurantId
Params: int restaurantId
Line 401: Line 401:
</source>
</source>


'''POST /api/v1/Ratings/Dish/{id}'''
'''POST /api/v1/ratings/dish/{id}'''
<source>   
<source>   
Params: int dishRating
Params: int dishRating
Line 408: Line 408:
</source>
</source>


'''POST /api/v1/Ratings/Restaurant/{id}'''
'''POST /api/v1/ratings/restaurant/{id}'''
<source>   
<source>   
Params: int restaurantRating
Params: int restaurantRating

Revision as of 20:02, 27 May 2018

Meeskond ja rollid

  • Sigrid Aasma (arendaja)
  • Evelin Jõgi (arendaja)
  • Martin Kask (projektijuht, arendaja)
  • Marko Nõu (arendaja)

Idee

Toidukohtade põhimenüüde ja päevapakkumiste teenus

Soovime pakkuda toidukohtade põhimenüüde ja päevapakkumiste teenust. On olemas mitmeid kodulehti “päevapakkumised”, kus on kirjas toidukohtade päevapraed. Kuid tavaliselt sellistel lehtedel ei ole masinloetavaid andmeid ehk siis varianti, et saad saata API pihta mingi kuupäeva koos päevapraadidega andmete uuendamiseks ja saad sama API käest küsida tänaseid päevapraade. Andmeid võiks saada küsida restorani, kuupäeva, asukoha või otsisõna/otsisõnaosa põhiselt. Selline teenus lihtsustaks ka toidukohtade päevapakkumiste haldamist, kuna praegu peavad teenuse pakkujad vastavat informatsiooni uuendama mitmes erinevas kohas - nii erinevates portaalides, kui ka enda veebileheküljel. Samuti oleks toidukohtade kogu menüü haldamine ühes kohas.

Esialgne prototüüp: navigeeritav versioon

Kasutatav arendustehnoloogia

Veebiteenuse loomisel kasutame ASP.NET Core tehnoloogiat ja kursusel õpitud arendusmustreid.

Klientrakenduse loomisel kasutame Node.js + React'i.

Veebiteenuse analüüs

Pakume toidukohtade põhimenüüde ja päevapakkumiste teenust, kuhu on kokku koondatud erinevate toidukohtade menüüd üle Eesti. Põhimenüü alla kuuluvad pikaajalised menüüd, mis kehtivad püsivalt, hooajaliselt või mingil konkreetsel nädalapäeval. Päevapakkumiste alla kuuluvad konkreetse kuupäevaga seotud päevapakkumised. Päevapakkumiste korral kuvatakse lisainfona, kas pakkumine kehtib mingis konkreetses ajavahemikus või kogu toidukoha lahtioleku aja.

Eesmärk on koguda ühte kohta kokku erinevate toidukohtade menüüd ja päevapakkumised, et kliendid saaksid mugavalt ja kiiresti oma valikuid teha. Kliendid käivad enamasti päevapakkumisi söömas lõuna ajal ja selleks ettenähtud aeg on piiratud. Sellepärast on oluline, et klient saaks teha oma valiku võimalikult kiiresti. Tänu loodavale veebiteenusele ei pea kliendid käima erinevates portaalides, et tutvuda erinevate toidukohtade pakkumistega. Kuna teenust on mugav kasutada ja klient saab oma valiku kiiresti tehtud, siis tõenäoliselt teeb klient valiku selles keskkonnas olevate toiduasutuste seast. Lisaks võimaldab teenus toiduasutustel paika panna oma pikaajalisem põhimenüü ning seda rakenduses ja võimalusel ka söögikohas kuvada. Sellepärast on ka toidukohtade huvi antud keskkonnas üleval olla ja meiega oma andmeid jagada, sest see suurendab nende klientuuri ning muudab oma menüü haldamise kergemaks.

Veebiteenuse loomisel lähtume eelkõige sellest, et kliendil oleks teenust mugav kasutada ja ta saaks oma valiku kiiresti tehtud. Arvestame, et kliendid on erinevad. Mõni eelistab mõnda kindlat toidukohta, sel juhul saab ta valida oma soovitud kohad ja võrrelda nende kohtade tänase päeva pakkumisi ning menüüsid. Mõnele inimesele on oluline pakutav söök ja ta eelistab pakkumist otsida prae nimetuses oleva sõna või sõnaosa järgi ning lähtuda seejärel valiku tegemisel toidukoha keskmisest hindest või toidu hinnast. Mõne kliendi jaoks on oluline hind ja selleks, et oma valikut teha sobivas hinnavahemikus on tal võimalik sisestada maksimum hinna piirang. Kindlasti on antud teenuse juures kõikide klientide jaoks oluline päevapakkumiste asukohapõhine eristatus. Kliendid, kes soovivad oma konto luua, võivad oma eelistatud valikud meelde jätta ja järgmisel korral kuvatakse neid talle automaatselt.

Teenuse must-have funktsionaalsus tagab teenuse toimimise ja põhifunktsioonid. Teenuse nice-to-have funktsionaalsus annab rakendusele lisandväärtust.

Arvestades pakutava teenusega, siis näeme, et aktiivseim teenuse kasutamine võib olla tööpäevadel vahemikus 11.00-15.00, kui kliendid tutvuvad päevapakkumistega. Teenus peab tekkivale koormusele vastu pidama.

Teenuse pakkumine peab olema turvaline. Selle tagamiseks tuleb sisestatavaid andmeid valideerida ja andmebaasi sisestavate andmete mahtu piirata. Toidukohtade sisestatud andmed peavad olema kaitstud, et toitude koostised ei saaks avalikuks. Põhjendatud juhtudel on võimalik kasutajaid lukku panna.

Kasutajad

  • Admin - lehe administraator, kellel on õigus lehte, kasutajaid ja nende õiguseid hallata. Tema huvi on, et teenus toimiks tõrgeteta.
  • Toiduasutus (tasuta kasutaja) - saab hoida lehel ühte põhimenüüd ja päevapakkumisi.
  • Toiduasutus (tellimusega kasutaja) - saab hoida lehel piiramatu arv põhimenüüsid ja päevapakkumisi.

Toiduasutused on teenusest huvitatud, et nende menüüde haldamine oleks kerge ja mugav ning nad saaksid oma klientide arvu suurendada.

  • Külastaja - klient, kes valib söögikohta. Tema on huvitatud eelkõige sellest, et teenust saaks kasutada mugavalt ja kiirelt ning toidukohtade valik oleks võimalikult suur.

Rakenduse must-have funktsionaalsus

  • Kasutajad saavad sisse logida
  • Kasutajatel on erinevad rollid: admin, toidukoht (tasuta ja tasulise tellimusega), klient
  • Kasutajate arvepidamine kasutajate lõikes:
    • sisselogimise kuupäev, kellaaeg
    • pakkumiste lisamine
    • pakkumiste muutmine
    • pakkumiste kustutamine
    • õiguste kehtimise periood (tasuta ja tellimusega toidukoht)
    • pakkumistele klikkimise arv
  • Kasutajaid on võimalik hallata:
    • kasutajale õiguste andmine (menüüde arvu suurendamine, tellimusega toidukohal), rolli määramine
    • Kasutajat on võimalik piirata: õiguseid piirata (piiratud menüüde arv, tasuta liitunud toidukohal) ja lukku panna
  • Päevapakkumisi/menüüsid saab küsida:
    • toidukoha järgi,
    • kuupäeva põhiselt (ainult päevapakkumisi),
    • asukoha põhiselt,
    • toidu nimetuses esineva otsisõna/otsisõna osa põhiselt,
    • hinna põhiselt (max hinna piirang).
  • Klientrakenduses realiseeritakse CRUD meetodid (menüüsid/päevapakkumisi saab sisestada, lugeda, uuendada, kustutada)
  • Toidukohale saab anda hindeid ja kuvatakse keskmist hinnet.
  • Toidule saab anda hindeid ja kuvatakse keskmist hinnet.

Nice-to-have funktsionaalsus

  • Info selle kohta, kas päevapakkumine on otsas
  • Päevapakkumisi/menüüsid saab kommenteerida ja neid kommentaare kuvatakse avalikult.
  • Söögikohtade kodulehtedelt otsimise script, mis genereerib juba olemasolevate kodulehtede baasil päevamenüüsid.
  • Toiduvaliku piiramine allergeenide/vegan/jms. koostisosade põhiselt.
  • Aruandlused ja võrdlused toidukohtadele, et võrrelda end konkurentidega.
  • Teenus soovitab toidukohtadele nende varasemate päevapraadide populaarsuse alusel uue nädala menüüd.
  • Erinevad toidukohtade/toitude pingeread klientidele, et anda valikuteks ideid.
  • Soovitused klientidele, mida teised kliendid sarnaste eelistustega on veel valinud.

Andmebaasi ülesehitus

API v1 dokumentatsioon

Account

POST /api/v1/account/register

Params: RegisterViewModel

Returns: token

POST /api/v1/account/login

  
Params: LoginViewModel

Returns: token

POST /api/v1/account/logout

  
Params: -

Returns: -


POST /api/v1/account/addRole

  
Params: role

Returns: -

Users

GET /api/v1/users

  
Params: -

Returns: List<UserDTO>

GET /api/v1/users/{id}

  
Params: int id

Returns: UserDTO

POST /api/v1/users

  
Params: UserDTO

Returns: UserDTO

PUT /api/v1/users/{id}

  
Params: int id, UserDTO

Returns: -

PUT /api/v1/users/deactivate/{id}

  
Params: int id

Returns: -

DELETE /api/v1/users/{id}

  
Params: int id

Returns: -

Promotions

GET /api/v1/promotions

 
Params: -

Returns: List<PromotionDTO>

GET /api/v1/promotions/{id}

  
Params: int id

Returns: PromotionDTO

POST /api/v1/promotions

  
Params: PromotionDTO

Returns: PromotionDTO

PUT /api/v1/promotions/{id}

  
Params: int id, PromotionDTO

Returns: -

DELETE /api/v1/promotions/{id}

  
Params: int id

Returns: -

Restaurants

GET /api/v1/restaurants

  
Params: -

Returns: List<RestaurantDTO>

GET /api/v1/restaurants/search?name=th

  
Params: string name

Returns: List<RestaurantDTO>

GET /api/v1/restaurants/top

  
Params: int amount

Returns: List<RestaurantDTO>

GET /api/v1/restaurants/{id}

  
Params: int id

Returns: RestaurantDTO

GET /api/v1/restaurants/{userId}

  
Params: int userId

Returns: List<RestaurantDTO>

POST /api/v1/restaurants

  
Params: RestaurantDTO

Returns: RestaurantDTO

PUT /api/v1/restaurants/{id}

  
Params: int id, RestaurantDTO

Returns: -

DELETE /api/v1/restaurants/{id}

  
Params: int id

Returns: -

Menus

GET /api/v1/menus

Params: -

Returns: List<MenuDTO>

GET /api/v1/menus/{id}

  
Params: int id

Returns: MenuDTO

POST /api/v1/menus

  
Params: MenuDTO

Returns: MenuDTO

PUT /api/v1/menus/{id}

  
Params: int id, MenuDTO

Returns: -

DELETE /api/v1/menus/{id}

  
Params: int id

Returns: -

Dishes

GET /api/v1/dishes

  
Params: -

Returns: List<DishDTO>

GET /api/v1/dishes/daily

  
Params: bool vegan, bool glutenFree, bool lactoseFree

Returns: List<DishDTO>

GET /api/v1/dishes/search?title=th

  
Params: string title

Returns: List<DishDTO>

GET /api/v1/dishes/pricelimit

  
Params: decimal priceLimit

Returns: List<DishDTO>

GET /api/v1/dishes/top

  
Params: int amount

Returns: List<DishDTO>

GET /api/v1/dishes/{id}

  
Params: int id

Returns: DishDTO

POST /api/v1/dishes

  
Params: DishDTO

Returns: DishDTO

PUT /api/v1/dishes/{id}

  
Params: int id, DishDTO

Returns: -

DELETE /api/v1/dishes/{id}

  
Params: int id

Returns: -

Ingredients

GET /api/v1/ingredients

  
Params: -

Returns: List<IngredientDTO>

GET /api/v1/ingredients/{id}

  
Params: int id

Returns: IngredientDTO

POST /api/v1/ingredients

  
Params: IngredientDTO

Returns: IngredientDTO

PUT /api/v1/ingredients/{id}

  
Params: int id, IngredientDTO

Returns: -

DELETE /api/v1/ingredients/{id}

  
Params: int id

Returns: -

Ratings

GET /api/v1/ratings/dish/{id}

  
Params: int dishId

Returns: DishDTO, int dishRating

GET /api/v1/ratings/restaurant/{id}

  
Params: int restaurantId

Returns: RestaurantDTO, int restaurantRating

POST /api/v1/ratings/dish/{id}

  
Params: int dishRating

Returns: DishDTO, int dishRating

POST /api/v1/ratings/restaurant/{id}

  
Params: int restaurantRating

Returns: RestaurantDTO, int restaurantRating

Lõpptoote kasutusjuhend

TODO


Logiraamat

07.02.2018

Gupi loomine ning suhtluskanali seadistamine

24.03.2018

Trello boardi loomine

25.03.2018

Wiki lehe loomine. Esimene tõsisem projekti koosolek ning tegevuskava paika panemine.

26.03.2018

Alustasime veebiteenuse analüüsiga ja funktsionaalsuse kirjeldamisega.

27.03.2018

Täiendasime veebiteenuse analüüsi.

Esmase andmebaasi mudeli koostamine.

Postitatud esimeste analüüsi arutelude põhjal valminud algne prototüüp.

30.03.2018

Valmis andmebaasimudel.

08.04.2018

Tehtud muudatused analüüsis vastavalt tagasisidele.

19.04.2018

Loodud projekti põhi koos domeenimudelitega. Projekt lisatud Githubi: https://github.com/sikumiku/TaisKohtApi

05-06.05.2018

Osalesime hackathonil. Lisatud controllerid, service'id koos vajalike kihtidega.

16.05.2018

Uuendatud andmebaasimudelit, DTO'sid.

18-19.05.2018

Lisatud klientrakendus, security, äriloogikat.

20.05.2018

Lisatud API dokumentatsioon.

22-24.05.2018

Uuendatud contoller'eid, service'id.

25-27.05.2018

Uuendatud contoller'eid, service'id. Lisatud kasutajate ja rollide kontrolle meetoditesse. Täiustatud klientrakendust. Swagger dokumentatsioon.