# Karta ćwiczenia laboratoryjnego

[![Java](https://img.shields.io/badge/Java-ED8B00?style=for-the-badge&logo=openjdk&logoColor=white)](https://www.java.com/)
[![Spring Boot](https://img.shields.io/badge/Spring_Boot-6DB33F?style=for-the-badge&logo=springboot&logoColor=white)](https://spring.io/projects/spring-boot)
[![Spring Data JPA](https://img.shields.io/badge/Spring_Data_JPA-6DB33F?style=for-the-badge&logo=spring&logoColor=white)](https://spring.io/projects/spring-data-jpa)
[![H2 Database](https://img.shields.io/badge/H2_Database-1A237E?style=for-the-badge&logo=databricks&logoColor=white)](https://www.h2database.com/html/main.html)
[![Thymeleaf](https://img.shields.io/badge/Thymeleaf-005F0F?style=for-the-badge&logo=thymeleaf&logoColor=white)](https://www.thymeleaf.org/)
[![Maven](https://img.shields.io/badge/Maven-C71A36?style=for-the-badge&logo=apachemaven&logoColor=white)](https://maven.apache.org/guides/index.html)


## 📋 Informacje podstawowe

| Pole | Wartość |
| --- | --- |
| Przedmiot | Spring |
| Forma zajęć | laboratorium |
| Ćwiczenie | Lab. 4 / Spring Boot Web + JPA + H2 |
| Data | 09.05.2026 |
| Nazwisko i imię studenta | ...................................................... |
| Rok/semestr | Rok 3, semestr 6 [studia niestacjonarne] |
| Ocena | ocena cząstkowa |
| Uwagi do ćwiczenia | **brak** |

## 📝 Opis zadania laboratoryjnego
Zaprojektuj system umożliwiający rejestrację pacjentów na badanie. Strona WEB powinna wyświetlać formularz (prosty), który umożliwia umówienie wizyty – wprowadzenie danych. Dane gromadzimy w bazie H2 (lub inna relacyjna = wymagany plik struktury bazy w formacie SQL). Strona powinna posiadać endpoint wyświetlający aktualny stan bazy, oraz wyświetlający pacjentów zapisanych na wybrany termin (można z poziomu kodu w Java wprowadzić od razu do bazy 2 pacjentów z pominięciem WEB UI). Rozwiązanie powinno być zrealizowane w oparciu o JPA.

## 📦 Wymagania

Kod programu należy umieścić w polu **Kod programu** tego pliku.
Plik `.md` należy dodać do projektu.

Całość należy spakować do formatu `.zip`:

`WSZIB_R3IN_NazwiskoImie_Spring_Lab4.zip`

W miejscu `NazwiskoImie` należy wpisać swoje nazwisko i imię (uwaga na kolejność).
Wynik pracy w formie archiwum `zip` powinien zawierać:
 - folder `Program` z projektem Spring Boot
 - plik `schema.sql` (struktura bazy danych w formacie SQL)
 - uzupełniony ten plik tj. `.md`.

Archiwum `WSZIB_R3IN_NazwiskoImie_Spring_Lab4.zip` należy uzupełnić o swoje dane w nazwie i przesłać poprzez:

[![Upload](https://img.shields.io/badge/Upload-upload.pelo.com.pl-blue?style=for-the-badge&logo=upload&logoColor=white)](https://upload.pelo.com.pl)

## 🎯 Ogólny opis zadania

Celem zadania jest przygotowanie aplikacji Spring Boot realizującej rejestrację pacjentów na badanie. Aplikacja udostępnia stronę WWW z formularzem rejestracyjnym, przechowuje dane w bazie H2 za pomocą JPA oraz oferuje endpointy REST/Web do przeglądania wszystkich rejestracji i pacjentów zapisanych na wybrany termin. Baza danych powinna być zainicjalizowana dwoma przykładowymi pacjentami z poziomu kodu Java.

## ✅ Wymagania funkcjonalne

| Kod wymagania | Wymaganie | Poziom |
| --- | --- | --- |
| WF-01 | Aplikacja udostępnia stronę WWW z formularzem umożliwiającym rejestrację pacjenta na badanie (imię, nazwisko, PESEL, termin, rodzaj badania). | wysoki |
| WF-02 | Po wypełnieniu i wysłaniu formularza dane pacjenta są zapisywane do bazy danych H2 (lub innej relacyjnej) za pomocą JPA. | wysoki |
| WF-03 | Aplikacja udostępnia endpoint wyświetlający wszystkich pacjentów aktualnie zarejestrowanych w bazie danych. | wysoki |
| WF-04 | Aplikacja udostępnia endpoint wyświetlający pacjentów zapisanych na wybrany termin (parametr daty w URL). | wysoki |
| WF-05 | Przy starcie aplikacji do bazy danych wprowadzanych jest co najmniej 2 pacjentów z poziomu kodu Java. | wysoki |
| WF-06 | Konsola H2 (`/h2-console`) jest dostępna i umożliwia podgląd bazy danych. | średni |
| WF-07 | Encja `Pacjent` jest poprawnie odwzorowana na tabelę w bazie danych za pomocą adnotacji JPA (`@Entity`, `@Id`, `@GeneratedValue`). | wysoki |

## 🔧 Wymagania niefunkcjonalne

| Kod wymagania | Wymaganie | Poziom |
| --- | --- | --- |
| WNF-01 | Aplikacja powinna wykorzystywać Spring Boot z zależnościami: `spring-boot-starter-web`, `spring-boot-starter-data-jpa`, `h2`. | wysoki |
| WNF-02 | Warstwa dostępu do danych powinna być realizowana przez `JpaRepository` (Spring Data JPA). | wysoki |
| WNF-03 | W archiwum należy umieścić plik `schema.sql` zawierający strukturę bazy danych w formacie SQL. | wysoki |
| WNF-04 | Struktura projektu powinna być zgodna z konwencją Spring Boot (Maven lub Gradle). | średni |
| WNF-05 | Kod Java powinien być czytelny, poprawnie sformatowany i podzielony na osobne klasy/pliki (encja, repozytorium, serwis, kontroler). | średni |
| WNF-06 | Rozwiązanie powinno być przygotowane bez wykorzystania wsparcia AI. | niski |
| WNF-07 | Archiwum `.zip` powinno zawierać folder `Program` z projektem, plik `schema.sql` oraz uzupełniony (ten) plik `.md`. | wysoki |

## 🧩 Diagram klas

```mermaid
classDiagram
    class Pacjent {
        -Long id
        -String imie
        -String nazwisko
        -String pesel
        -LocalDate termin
        -String rodzajBadania
    }
    class PacjentRepository {
        +findAll() List~Pacjent~
        +findByTermin(LocalDate termin) List~Pacjent~
        +save(Pacjent p) Pacjent
    }
    class PacjentService {
        +zapiszPacjenta(Pacjent p)
        +wszyscyPacjenci() List~Pacjent~
        +pacjenciNaTermin(LocalDate termin) List~Pacjent~
    }
    class RejestracjaController {
        +formularz() String
        +zarejestruj(Pacjent p) String
        +wszyscy() String
        +naTermin(String data) String
    }
    class DataInitializer {
        +run(String... args)
    }

    PacjentRepository ..> Pacjent : JPA
    PacjentService --> PacjentRepository : @Autowired
    RejestracjaController --> PacjentService : @Autowired
    DataInitializer --> PacjentService : @Autowired
```

**Legenda diagramu:**

| Symbol | Opis |
| --- | --- |
| `──>` (linia ciągła) | Zależność przez wstrzykiwanie `@Autowired` |
| `..>` (linia przerywana) | Relacja JPA — repozytorium zarządza encją `Pacjent` |


## <span style="color:red">💻 KOD PROGRAMU - REALIZACJA</span>

### JAVA (RejestracjaApplication.java)
```java
// Wklej tutaj kod Java
```

### JAVA (Pacjent.java)
```java
// Wklej tutaj kod Java
```

### JAVA (PacjentRepository.java)
```java
// Wklej tutaj kod Java
```

### JAVA (PacjentService.java)
```java
// Wklej tutaj kod Java
```

### JAVA (RejestracjaController.java)
```java
// Wklej tutaj kod Java
```

### JAVA (DataInitializer.java)
```java
// Wklej tutaj kod Java
```

### SQL (schema.sql)
```sql
-- Wklej tutaj strukturę bazy danych
```

### HTML / Thymeleaf (formularz.html)
```html
<!-- Wklej tutaj kod szablonu formularza -->

```

## 🏆 Ocena [wypełnia prowadzący]

### Ocena kodu

| Kryterium | Opis | Punkty (max) | Punkty uzyskane |
| --- | --- | --- | --- |
| K-01 | Poprawna struktura projektu Spring Boot (JPA, H2, Web) | 1 | |
| K-02 | Encja `Pacjent` z adnotacjami JPA | 2 | |
| K-03 | Repozytorium `PacjentRepository` (JpaRepository) z metodą wyszukiwania po terminie | 2 | |
| K-04 | Formularz WWW i endpoint rejestracji pacjenta | 2 | |
| K-05 | Endpoint listy wszystkich pacjentów i endpoint filtrowania po terminie | 2 | |
| K-06 | Inicjalizacja bazy 2 pacjentami z poziomu kodu Java oraz plik `schema.sql` | 1 | |
| **Suma** | | **10** | |

### Ocena końcowa

| Pole | Wartość |
| --- | --- |
| Ocena (2–5) | |
| Uwagi prowadzącego | |
| Data wystawienia oceny | |
| Podpis prowadzącego | |

