{"id":28380277,"url":"https://github.com/interes-group/b-vsa-ls22-project2","last_synced_at":"2026-07-07T00:31:15.674Z","repository":{"id":37245362,"uuid":"485793847","full_name":"Interes-Group/b-vsa-ls22-project2","owner":"Interes-Group","description":"B-VSA LS 21/22 Zadanie semestrálneho projektu 2","archived":false,"fork":false,"pushed_at":"2022-06-22T20:58:20.000Z","size":261,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-24T16:45:08.135Z","etag":null,"topics":["assignement","course","http-server","java","jersey","jpa","rest-api","sql"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"unlicense","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Interes-Group.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2022-04-26T13:16:47.000Z","updated_at":"2022-06-14T18:21:41.000Z","dependencies_parsed_at":"2022-09-08T13:22:54.690Z","dependency_job_id":null,"html_url":"https://github.com/Interes-Group/b-vsa-ls22-project2","commit_stats":null,"previous_names":[],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/Interes-Group/b-vsa-ls22-project2","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Interes-Group%2Fb-vsa-ls22-project2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Interes-Group%2Fb-vsa-ls22-project2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Interes-Group%2Fb-vsa-ls22-project2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Interes-Group%2Fb-vsa-ls22-project2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Interes-Group","download_url":"https://codeload.github.com/Interes-Group/b-vsa-ls22-project2/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Interes-Group%2Fb-vsa-ls22-project2/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35210429,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-06T02:00:07.184Z","response_time":106,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["assignement","course","http-server","java","jersey","jpa","rest-api","sql"],"created_at":"2025-05-30T03:08:05.418Z","updated_at":"2026-07-07T00:31:15.358Z","avatar_url":"https://github.com/Interes-Group.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# B-VSA LS 21/22 - Semestrálny projekt 2\n\n![Java 1.8](https://img.shields.io/badge/Java-1.8-blue)\n![EclipseLink 2.7.10](https://img.shields.io/badge/EclipseLink-2.7.10-green)\n[![Public domain](https://img.shields.io/badge/License-Unlicense-lightgray)](https://unlicense.org)\n\nCieľom 2. semestrálneho projektu je naprogramovať webovú aplikáciu publikujúc RESTful API podľa definovanej\nšpecifikácie. Projekt má nadväzovať na semestrálny projekt 1, v ktorom ste mali implementovať spojenie s SQL databázou s\npoužitím technológie JPA.\n\nV tomto projekte vychádzajte z riešenia pre 1. semestrálny projekt. Zachovajte asociácie a objekty definované v 1.\nprojekte. Nakoľko predmetom tohto zadania je implementácia REST webových služieb, môžete upraviť riešenie z\npredchádzajúceho zadania podľa svojho najlepšieho vedomia a svedomia, tak aby splnilo toto zadanie.\n\n## Funkcionalita\n\nAplikácia musí zabezpečiť CRUD operácie cez publikované REST služby. Taktiež musí poskytovať službu pre rezervovanie\nparkovacieho miesta používateľom pre vlastné auto. Rezervácia môže byť vytvorené iba na špecifický čas. Po zavolaním\nslužby pre ukončenie rezervácie sa zapíše čas ukončenia a vypočíta celková cena rezervácie.\n\nAplikácia musí umožniť používateľovi zobrazenie zoznamu rezervácií za špecifický deň a parkovacie miesto, zoznam svojich\naktívnych rezervácií a taktiež musí obsahovať možnosť kontroly obsadenosti parkovacieho domu.\n\nPri vymazaní parkovacieho domu musia byť vymazané aj všetky jeho poschodia aj parkovacie miesta. Rovnako ak je vymazaný\nzákazník musia byť vymazané aj jeho autá. Ak je vymazaná entita všetky jeho asociácie musia byť vynulované.\n\n## Špecifikácia\n\nPri implementácií použite protokol HTTP/1.1, ako formát prenášaných objektov použite **application/json** s UTF-8\nkódovaním. Pri chybových stavoch môžete vrátiť prázdnu odpoveď. Kód odpovede nastavte tak, aby najlepšie vystihla povahu\nodpovede [https://www.restapitutorial.com/httpstatuscodes.html](https://www.restapitutorial.com/httpstatuscodes.html).\n\nPre identifikáciu používateľa požiadavky použite autentifikačný mechanizmu **Basic access\nauthentication** [https://en.wikipedia.org/wiki/Basic_access_authentication](https://en.wikipedia.org/wiki/Basic_access_authentication)\n. Prihlasovacie údaje použité nasledovné:\n\n- prihlasovacie meno = používateľov email\n- heslo = id v databáze\n\nREST služby implementujte ako bezstavové. **Nevytvárajte žiadnu** používateľskú **reláciu** (Session), nevytvárajte žiadne\nautorizačné tokeny, či iné spôsoby relácie a udržiavania stavu používateľa. **Authorization HTTP hlavička musí byť**\nzaslaná\ns každým dopytom na služby.\n\nAplikáciu **implementujte vo** frameworku **Jersey** ako tzv. **'standalone' webovú aplikáciu** (po vzore cvičení). Výstupom\nriešenia musí byť spustiteľný JAR subor. HTTP server aplikácie má počúvať **na porte 8080**. V rámci implementácie služieb,\nktoré majú vrátiť kolekciu objektov nemusíte riešiť stránkovanie. **Pri štarte** aplikácie **vytvorte** jedného testovacieho\n**používateľa s emailom admin@vsa.sk**.\n\nV nasledujúcej sekcii je uvedená špecifikácia jednotlivých služieb pre REST resources. Štruktúra objektov uvedených pri\nslužbách je na konci tohto dokumentu. Parametre uvedené pri GET službách slúžia na dodatočné vyhľadanie REST resource-u.\n\n### Parkovací dom\n\n| Metóda | Url            | Parametre                                             | Kód pre úspešnú odpoveď | Objekt dopytu | Objekt odpovede        |\n|--------|----------------|-------------------------------------------------------|-------------------------|---------------|------------------------|\n| GET    | /carparks      | **name**: String (názov parkovacieho domu; nepovinný) | 200                     |               | Array\\\u003cParkovací dom\\\u003e |\n| GET    | /carparks/{id} |                                                       | 200                     |               | Parkovací dom          |\n| POST   | /carparks      |                                                       | 201                     | Parkovací dom | Parkovací dom          |\n| PUT    | /carparks/{id} |                                                       | 200                     | Parkovací dom | Parkovací dom          |\n| DELETE | /carparks/{id} |                                                       | 204                     |               |                        |\n\n### Poschodie parkovacieho domu\n\n| Metóda | Url                                | Kód pre úspešnú odpoveď | Objekt dopytu | Objekt odpovede    | Poznámka                                                  |\n|--------|------------------------------------|-------------------------|---------------|--------------------|-----------------------------------------------------------|\n| GET    | /carparks/{id}/floors              | 200                     |               | Array\\\u003cPoschodie\\\u003e |                                                           |\n| GET    | /carparks/{id}/floors/{identifier} | 200                     |               | Poschodie          | Implementuj ak má Poschodie kompozitný primárny kľúč      |\n| GET    | /carparkfloors/{id}                | 200                     |               | Poschodie          | Implementuj ak má Poschodie auto-generovaný primárny kľúč |\n| POST   | /carparks/{id}/floors              | 201                     | Poschodie     | Poschodie          |                                                           |\n| PUT    | /carparks/{id}/floors/{identifier} | 200                     | Poschodie     | Poschodie          |                                                           |\n| DELETE | /carparks/{id}/floors/{identifier} | 204                     |               |                    |                                                           |\n\n### Parkovacie miesto\n\n| Metóda | Url                                      | Parametre                                                                       | Kód pre úspešnú odpoveď | Objekt dopytu     | Objekt odpovede            |\n|--------|------------------------------------------|---------------------------------------------------------------------------------|-------------------------|-------------------|----------------------------|\n| GET    | /carparks/{id}/spots                     | **free**: Boolean (true pre voľné miesta, false pre obsadené miesta; nepovinné) | 200                     |                   | Array\\\u003cParkovacie miesto\\\u003e |\n| GET    | /carparks/{id}/floors/{identifier}/spots |                                                                                 | 200                     |                   | Array\\\u003cParkovacie miesto\\\u003e |\n| GET    | /parkingspots/{id}                       |                                                                                 | 200                     |                   | Parkovacie miesto          |\n| POST   | /carparks/{id}/floors/{identifier}/spots |                                                                                 | 201                     | Parkovacie miesto | Parkovacie miesto          |\n| PUT    | /parkingspots/{id}                       |                                                                                 | 200                     | Parkovacie miesto | Parkovacie miesto          |\n| DELETE | /parkingspots/{id}                       |                                                                                 | 204                     |                   |                            |\n\n### Auto\n\n| Metóda | Url        | Parametre                                                                                | Kód pre úspešnú odpoveď | Objekt dopytu | Objekt odpovede |\n|--------|------------|------------------------------------------------------------------------------------------|-------------------------|---------------|-----------------|\n| GET    | /cars      | **user**: Long (Id majiteľa auta; nepovinné) \u003cbr/\u003e **vrp**: String (EČV auta; nepovinné) | 200                     |               | Array\\\u003cAuto\\\u003e   |\n| GET    | /cars/{id} |                                                                                          | 200                     |               | Auto            |\n| POST   | /cars      |                                                                                          | 201                     | Auto          | Auto            |\n| PUT    | /cars/{id} |                                                                                          | 200                     | Auto          | Auto            |\n| DELETE | /cars/{id} |                                                                                          | 204                     |               |                 |\n\n### Zákazník\n\n| Metóda | Url         | Parametre                                        | Kód pre úspešnú odpoveď | Objekt dopytu | Objekt odpovede   |\n|--------|-------------|--------------------------------------------------|-------------------------|---------------|-------------------|\n| GET    | /users      | **email**: String (email používateľa; nepovinné) | 200                     |               | Array\\\u003cZákazník\\\u003e |\n| GET    | /users/{id} |                                                  | 200                     |               | Zákazník          |\n| POST   | /users      |                                                  | 201                     | Zákazník      | Zákazník          |\n| PUT    | /users/{id} |                                                  | 200                     | Zákazník      | Zákazník          |\n| DELETE | /users/{id} |                                                  | 204                     |               |                   |\n\n### Rezervácia\n\n| Metóda | Url                    | Parametre                                                                                                                                                                                                      | Kód pre úspešnú odpoveď | Objekt dopytu | Objekt odpovede     |\n|--------|------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|-------------------------|---------------|---------------------|\n| GET    | /reservations          | **user**: Long (id používateľa; nepovinné) \u003cbr/\u003e **spot**: Long (id parkovacieho miesta; povinné iba v kombinácií s 'date') \u003cbr/\u003e **date**: Date (dátum; format yyyy-MM-dd; povinné iba v kombinácií s 'spot') | 200                     |               | Array\\\u003cRezervácia\\\u003e |\n| GET    | /reservations/{id}     |                                                                                                                                                                                                                | 200                     |               | Rezervácia          |\n| POST   | /reservations/{id}/end |                                                                                                                                                                                                                | 200                     | Prázdny       | Rezervácia          |\n| POST   | /reservations          |                                                                                                                                                                                                                | 201                     | Rezervácia    | Rezervácia          |\n| PUT    | /reservations/{id}     |                                                                                                                                                                                                                | 200                     | Rezervácia    | Rezervácia          |\n\n### Skupina A - Zľavový kupón\n\n| Metóda | Url                         | Parametre                                  | Kód pre úspešnú odpoveď | Objekt dopytu | Objekt odpovede        |\n|--------|-----------------------------|--------------------------------------------|-------------------------|---------------|------------------------|\n| GET    | /coupons                    | **user**: Long (id používateľa; nepovinné) | 200                     |               | Array\\\u003cZľavový kupón\\\u003e |\n| GET    | /coupons/{id}               |                                            | 200                     |               | Zľavový kupón          |\n| POST   | /coupons/{id}/give/{userId} |                                            | 200                     | Prázdny       | Zľavový kupón          |\n| POST   | /coupons                    |                                            | 201                     | Zľavový kupón | Zľavový kupón          |\n| DELETE | /coupons/{id}               |                                            | 204                     |               |                        |\n\n### Skupina B - Typ auta\n\n| Metóda | Url            | Parametre                                     | Kód pre úspešnú odpoveď | Objekt dopytu | Objekt odpovede   |\n|--------|----------------|-----------------------------------------------|-------------------------|---------------|-------------------|\n| GET    | /cartypes      | **name**: String (názov typu auta; nepovinné) | 200                     |               | Array\\\u003cTyp auta\\\u003e |\n| GET    | /cartypes/{id} |                                               | 200                     |               | Typ auta          |\n| POST   | /cartypes      |                                               | 201                     | Typ auta      | Typ auta          |\n| DELETE | /cartypes/{id} |                                               | 204                     |               |                   |\n\n### Skupina C - Sviatok\n\n| Metóda | Url            | Parametre                                                   | Kód pre úspešnú odpoveď | Objekt dopytu | Objekt odpovede  |\n|--------|----------------|-------------------------------------------------------------|-------------------------|---------------|------------------|\n| GET    | /holidays      | **date**: Date(dátum sviatku; format yyyy-MM-dd; nepovinné) | 200                     |               | Array\\\u003cSviatok\\\u003e |\n| POST   | /holidays      |                                                             | 201                     | Sviatok       | Sviatok          |\n| DELETE | /holidays/{id} |                                                             | 204                     |               |                  |\n\n## Hodnotenie\n\nZadanie je hodnotené **20 bodmi**. Vypracovanie je nutné odovzdať **do 11.05.2022 23:59**.\n\nZadanie si naklonujte z repozitára zadania. Svoje vypracovanie nahrajte do vášho repozitára pre toto zadanie pomocou\nprogramu Git (git commit + git push). Vypracovanie môžete \"pusho-vať\" priebežne. Do vytvoreného projektu nakopírujte\nriešenie z 1. semestrálneho projektu.\n\nNakoľko v 1. zadaní boli update metódy nepovinné, rovnaké pravidlo bodovania (bonus body zo spoločného \"poolu\") platí aj\npre PUT služby uvedené v špecifikácií, nakoľko nie každý má update metódy implementované.\n\nHodnotiť sa bude iba master/main branch. Hodnotenie bude automatizované pomocou nástroja pre testovanie REST API (\nPostman a pod.) Kvôli testom a zrýchleniu opravovania je nutné dodržať pokyny a štruktúru projektu, ako je stanovené v\nzadaní! Iba kód poslednej verzie vypracovania (t.j. z posledného commitu) do termínu odovzdania sa berie do úvahy. Okrem\ntestov sa bude kód a funkcionalita kontrolovať aj manuálne. Hodnotiť sa bude len kód, ktorý je predmetom tohto zadania,\ntakže aj v prípadné chyby v JPA implementácií nebudú brané do úvahy. Hodnotiť sa budú iba skompilovateľné a spustiteľné\nriešenia.\n\n## Objekty\n\nV tejto sekcii sú uvedené minimálne štruktúry objektov použité vo vyššie definovaných službách. Dátový typ **'int64'** reprezentuje typ\n**Java Long**. Dátový typ 'number' môže byť akýkoľvek číselný typ. Atribút s priradením pomocou symbolu **'?:' je dobrovoľný**.\nAtribút s hodnotou **'$ref: …' označuje**, že hodnota je **typu iného objektu**, na ktorý ukazuje referencia. Všetky **dátumy** sú vo\nformáte **yyyy-MM-dd**, t.j. podľa štandardu ISO-8601.\n\n### Parkovací dom\n\n```\n{\n    \"id\" ?: int64,\n    \"name\": \"string\",\n    \"address\": \"string\",\n    \"prices\": number\n    \"floors\" ?: [\n        $ref: \"Poschodie\"\n    ]\n}\n```\n\n### Poschodie\n\n```\n{\n    \"id\" ?: int64,\n    \"identifier\": \"string\",\n    \"carPark\" ?: int64,\n    \"spots\" ?: [\n        $ref: \"Parkovacie miesto\"\n    ]\n}\n```\n\n### Parkovacie miesto\n\n```\n{\n    \"id\" ?: int64,\n    \"identifier\": \"string\",\n    \"carParkFloor\": \"string\",\n    \"carPark\" ?: int64,\n    \"type\": $ref: \"Typ auta\",\n    \"free\" ?: boolean,\n    \"reservations\" ?: [\n        $ref: \"Rezervácia\"\n    ]\n}\n```\n\n### Auto\n\n```\n{\n    \"id\" ?: int64,\n    \"brand\": \"string\",\n    \"model\": \"string\",\n    \"vrp\": \"string\",\n    \"colour\": \"string\",\n    \"type\": $ref: \"Typ auta\",\n    \"owner\": $ref: \"Zákazník\",\n    \"reservations\" ?: [\n        $ref: \"Rezervácia\"\n    ]\n}\n```\n\n### Zákazník\n\n```\n{\n    \"id\" ?: int64,\n    \"firstName\": \"string\",\n    \"lastName\": \"string\",\n    \"email\": \"string\",\n    \"cars\" ?: [\n        $ref: \"Auto\"\n    ],\n    \"coupons\" ?: [\n        $ref: \"Zľavový kupón\"\n    ]\n}\n```\n\n### Rezervácia\n\n```\n{\n    \"id\" ?: int64,\n    \"start\": Date(yyyy-MM-dd),\n    \"end\" ?: Date(yyyy-MM-dd),\n    \"prices\" ?: number,\n    \"car\": $ref: \"Auto\",\n    \"spot\": $ref: \"Parkovacie miesto\",\n    \"coupon\" ?: $ref: \"Zľavový kupón\"\n}\n```\n\n### Skupina A - Zľavová kupón\n\n```\n{\n    \"id\" ?: int64,\n    \"name\": \"string\",\n    \"discount\": number\n}\n```\n\n### Skupina B - Typ auta\n\n```\n{\n    \"id\" ?: int64,\n    \"name\": \"string\"\n}\n```\n\n### Skupina C - Sviatok\n\n```\n{\n    \"id\" ?: int64,\n    \"name\": \"string\",\n    \"date\": Date(yyyy-MM-dd)\n}\n```","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finteres-group%2Fb-vsa-ls22-project2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Finteres-group%2Fb-vsa-ls22-project2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Finteres-group%2Fb-vsa-ls22-project2/lists"}