Skip to content

Sniezka1927/wdapi

Repository files navigation

SkillHub — WDPAI

Aplikacja webowa do współdzielenia katalogu „skilli" (promptów/instrukcji AI). Użytkownicy przeglądają publiczny katalog, tworzą własne skille, oznaczają ulubione, a administrator zarządza użytkownikami i całym katalogiem.

Projekt zaliczeniowy z przedmiotu Wstęp do aplikacji internetowych (WDPAI) — autorski MVC w PHP, bez frameworka i gotowych szablonów.

Stack

  • Docker / docker-compose — uruchomienie całości
  • PostgreSQL (PDO, prepared statements) — baza danych
  • PHP 8.3 obiektowy — własny MVC (front controller + routing + kontrolery + repozytoria)
  • HTML5 / CSS (responsywne, media queries)
  • JavaScript (Fetch API) — komunikacja frontu z REST API
  • nginx + php-fpm + pgAdmin

Architektura (warstwy)

Diagram architektury

Przeglądarka (HTML/CSS + JS Fetch API)
        │  HTTP
        ▼
index.php  ── front controller
        │
   Routing.php  ── tabela tras + trasy regex (np. /skills/{id}) + 404
        │
   src/controllers/        ── AppController (render/json/redirect/abort, auth, role)
        │                     SecurityController, SkillsController,
        │                     FavoritesController, AdminController, ErrorController
        ▼
   src/repositories/       ── Repository (PDO, transakcje) + UsersRepository,
        │                     SkillsRepository, FavoritesRepository
        ▼
   Database.php (PDO) ──► PostgreSQL
  • Widoki: public/views/*.html + partials/ (renderowane przez AppController::render()).
  • Statyki: public/styles/main.css, public/scripts/main.js.
  • Konfiguracja: config.php czyta zmienne DB_* ze środowiska.

Screeny aplikacji

Wersja webowa (desktop)

Katalog skilli — desktop Tworzenie skilla — desktop Szczegóły skilla — desktop Logowanie — desktop

Wersja mobilna

Katalog skilli — mobile Tworzenie skilla — mobile Logowanie — mobile

Uruchomienie

Wymagany Docker + docker-compose.

cp .env.example .env      # opcjonalnie — domyślne wartości i tak działają
docker-compose up --build

Po starcie:

Usługa URL / port
Aplikacja http://localhost:8080
PostgreSQL localhost:5433 (user/pass: docker/docker, baza: db)
pgAdmin http://localhost:5050 (admin@example.com / admin)

Schemat (docker/db/init/init.sql) i dane przykładowe (docker/db/init/seed.sql) ładują się automatycznie przy pierwszym starcie kontenera bazy.

Zmienne środowiskowe (.env.example)

DB_HOST=db
DB_NAME=db
DB_USER=docker
DB_PASSWORD=docker

Konta testowe

Hasło dla wszystkich kont: password

Email Rola
admin@skillhub.local admin, user
ada@skillhub.local user
linus@skillhub.local user

(dodatkowe konta user w seed.sql: grace, alan, margaret, donald, …)

Funkcjonalności

  • Rejestracja, logowanie, utrzymanie sesji, wylogowanie.
  • Role i uprawnienia weryfikowane w trakcie działania (requireRole('admin'), kontrola właściciela zasobu w SkillsController).
  • Zarządzanie użytkownikami (panel admina).
  • Wybrana funkcjonalność: katalog skilli — CRUD skilli + tagi + ulubione (N:M), publiczny katalog tylko ze statusem active.
  • REST API konsumowane przez Fetch API (/api/skills*, /api/favorites).
  • Globalne strony błędów 400 / 403 / 404 / 500.

Baza danych

  • Relacje: 1:1 (usersuser_profiles), 1:N (usersskills), N:M (user_roles, skill_tags, favorites).
  • Widoki: public_skill_catalog, user_skill_stats (złączenia wielu tabel).
  • Trigger: set_updated_at (BEFORE UPDATE na users, user_profiles, skills).
  • Funkcje: set_updated_at(), skill_favorite_count(id).
  • Transakcje: w repozytoriach na poziomach izolacji READ COMMITTED / REPEATABLE READ.
  • FK + akcje: ON DELETE CASCADE, zapytania z JOIN. Schemat w 3NF, bez redundancji.

Eksport pełnej bazy: database_dump.sqlpg_dump żywej bazy (schemat: tabele, widoki, funkcje, triggery, klucze obce + komplet danych przykładowych). Odtworzenie:

docker compose exec -T db psql -U docker -d db < database_dump.sql

Diagram ERD:

Diagram ERD

Źródło diagramu: docs/ERD.drawio (otwórz na draw.io).

Testowanie

Testy jednostkowe (PHPUnit)

Testy logiki serwisowej (SkillNormalizer — normalizacja statusów i tagów) w katalogu tests/. PHP dostępny jest w kontenerze php, więc testy uruchamiamy w nim:

# pobierz runner (jednorazowo)
curl -L https://phar.phpunit.de/phpunit-11.phar -o phpunit.phar

# uruchom testy w kontenerze
docker compose exec -w /app php php phpunit.phar -c phpunit.xml --testdox

Alternatywnie, gdy masz lokalnie Composer/PHP: composer install && composer test.

Requesty przykładowe

Plik requests.http — przykładowe requesty do backendu (REST Client w VS Code lub IntelliJ HTTP Client). Pokrywa auth, CRUD skilli, ulubione, panel admina i błędy 401/403/404.

Scenariusz testowy (krok po kroku)

  1. Rejestracja/register, podaj email + hasło + imię → automatyczne zalogowanie, redirect na /skills.
  2. Wylogowanie/logout → redirect na /login.
  3. Logowanie/login jako ada@skillhub.local / password.
  4. Przeglądanie katalogu/skills ładuje skille przez Fetch (GET /api/skills).
  5. CRUD skilla — utwórz skill (/skills/create), edytuj (/skills/{id}/edit), usuń (/skills/{id}/delete).
  6. Uprawnienia (403) — zalogowany jako ada spróbuj wejść na /admin/users → strona 403. Spróbuj edytować cudzy skill → 403.
  7. Brak auth (401) — bez sesji wywołaj POST /api/skills/create → 401.
  8. Admin — zaloguj jako admin@skillhub.local, wejdź na /admin/users i /admin/skills.
  9. Ulubione (N:M)POST /api/skills/{id}/favorite toggle, sprawdź /favorites.
  10. Błąd 404 — wejdź na nieistniejącą ścieżkę → strona 404.

Struktura repozytorium

index.php              front controller
Routing.php            tablica tras + trasy regex
Database.php           fabryka PDO
config.php             konfiguracja z ENV
docker-compose.yaml    nginx + php-fpm + postgres + pgadmin
docker/                Dockerfile'y + init/ (init.sql, seed.sql)
src/controllers/       kontrolery (AppController + reszta)
src/repositories/      repozytoria (Repository + reszta)
public/views/          widoki HTML + partiale + strony błędów
public/styles/         CSS
public/scripts/        JS (Fetch API)
requests.http          przykładowe requesty HTTP

Checklista (co udało się zrobić)

Technologie i architektura

  • Docker + docker-compose (nginx + php-fpm + PostgreSQL + pgAdmin)
  • Repozytorium GIT (publiczne, historia commitów)
  • HTML5 / CSS / JavaScript (Fetch API)
  • PHP obiektowy, autorski MVC — bez frameworka i gotowych szablonów
  • Baza danych PostgreSQL (PDO + prepared statements)
  • Architektura warstwowa zapewniająca bezpieczeństwo (front controller → routing → kontrolery → repozytoria → PDO)
  • Filary obiektowości + SOLID, brak duplikacji kodu (serwis SkillNormalizer)

Design

  • Estetyczny interfejs graficzny
  • Responsywność — CSS media queries (public/styles/main.css)

Elementy aplikacji

  • Rejestracja i logowanie
  • Utrzymanie sesji
  • Uprawnienia użytkowników weryfikowane w trakcie działania (requireRole, kontrola właściciela zasobu)
  • Zarządzanie użytkownikami (panel admina)
  • Wylogowanie
  • Wybrana funkcjonalność: katalog skilli (CRUD + tagi + ulubione)

Baza danych

  • Relacja 1:1 (usersuser_profiles)
  • Relacja 1:N (usersskills)
  • Relacja N:M (user_roles, skill_tags, favorites)
  • Min. 2 widoki ze złączeniami (public_skill_catalog, user_skill_stats)
  • Min. 1 wyzwalacz (*_updated_at BEFORE UPDATE)
  • Min. 1 funkcja (set_updated_at(), skill_favorite_count())
  • Transakcje na poziomach izolacji (READ COMMITTED / REPEATABLE READ)
  • Akcje na FK (ON DELETE CASCADE) + zapytania z JOIN
  • 3 postacie normalne, bez redundancji i anomalii
  • Odpowiednie typy danych
  • Pełny eksport bazy z danymi (database_dump.sql)

Dokumentacja

  • README.md
  • Diagram ERD (ERD.png) + link do źródła (docs/ERD.drawio)
  • Diagram architektury / warstw (docs/architecture.svg)
  • Instrukcja uruchomienia (docker-compose up) + .env.example
  • Scenariusz testowy krok po kroku
  • Screeny aplikacji (web + mobile) (screens/)
  • Checklista

Testy i obsługa błędów

  • Testy jednostkowe PHPUnit (tests/SkillNormalizerTest.php)
  • Testy integracyjne endpointów (requests.http)
  • Globalne strony błędów 400 / 403 / 404 / 500

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors