# Discord Clone

* `uv` jako główne narzędzie do zarządzania pakietami i wirtualnymi środowiskami
* workdir przygotowany przy użyciu `uv init .` i `uv venv`

---

### Cel zadania
Stworzenie webowej aplikacji komunikacyjnej inspirowanej platformą Discord. Aplikacja umożliwia komunikację w czasie rzeczywistym, zarządzanie rolami i uprawnieniami oraz udostępnia interfejs responsywny.

### Wymagania funkcjonalne
1. **System użytkowników**  
   - Rejestracja (login, email, hasło)  
   - Logowanie i wylogowanie  
   - Walidacja (unikalny login i email, siła hasła)  
   - Edycja profilu (awatar, opis)

2. **Role i uprawnienia** (minimum 3 role)  
   - *Administrator* – pełny dostęp, zarządzanie użytkownikami i kanałami  
   - *Moderator* – zarządzanie wiadomościami, blokowanie użytkowników  
   - *Użytkownik* – wysyłanie wiadomości, korzystanie z kanałów  
   - Dynamiczne przypisywanie ról, egzekwowanie uprawnień w backendzie

3. **Komunikacja**  
   - Kanały publiczne/grupowe: tworzenie, dołączanie, historia wiadomości  
   - Wiadomości prywatne (DM) między dwoma użytkownikami  
   - Obsługa czasu rzeczywistego (WebSocket, np. Django Channels + PostgreSQL)

4. **Multimedia**  
   - Wiadomości tekstowe, obrazy, nagrania audio (pliki dźwiękowe)

5. **Moderacja**  
   - Blokowanie użytkowników, usuwanie wiadomości  
   - (Opcjonalnie) zgłaszanie wiadomości/użytkowników

6. **Funkcje dodatkowe (mile widziane)**  
   - Status online/offline, powiadomienia o nowych wiadomościach  
   - Wyszukiwanie użytkowników/kanałów, emoji/reakcje

### Frontend
- Interfejs inspirowany Discordem (responsywny)
- Wykorzystanie frameworka Bootstrap
- Estetyczne formularze logowania i rejestracji (gotowe szablony CSS)
- Obsługa WebSocket po stronie klienta (np. JavaScript)

### Backend
- Framework: **Django** (zalecane rozszerzenia: Django REST Framework, Django Channels)
- WebSocket do komunikacji w czasie rzeczywistym (z użyciem PostgreSQL jako warstwy kanałów – `channels_postgres`)
- Obsługa przesyłania plików (obrazy, audio)
- Własna strona błędu 404 i 500

### Środowisko uruchomieniowe – **kontenery Docker**
Aplikacja nie wymaga hostowania na zewnętrznych platformach. Całość musi być gotowa do uruchomienia w kontenerach za pomocą **Docker** i **Docker Compose**.

Pliki wymagane w repozytorium:
- `Dockerfile` – budujący obraz aplikacji Django (wraz z zależnościami, np. z pliku `requirements.txt`)
- `docker-compose.yml` – definiujący wszystkie usługi niezbędne do działania systemu, co najmniej:
  - `web` – serwer Django (z obsługą ASGI np. Daphne/Uvicorn dla WebSocket)
  - `db` – baza danych PostgreSQL
  - `db` – baza danych PostgreSQL (używana również jako warstwa kanałów dla Django Channels via `channels_postgres`)
- Plik `.env` lub komentarze w `docker-compose.yml` wskazujące, jak skonfigurować zmienne środowiskowe (np. `SECRET_KEY`, dane dostępowe do bazy)

Uruchomienie aplikacji sprowadza się do:
```bash
docker-compose up --build
```
Po starcie wszystkie migracje powinny zostać wykonane automatycznie, a aplikacja dostępna pod `http://localhost:8000`.

### Sposób oddania pracy
- Repozytorium kodu (np. GitHub, GitLab) zawierające cały projekt, w tym `Dockerfile`, `docker-compose.yml` oraz instrukcję uruchomienia (`README.md` z komendą `docker-compose up`).
- Link do repozytorium umieszczony w pliku `.txt` na platformie Moodle.
- Nie jest wymagane żadne publiczne wdrożenie – oceniana będzie poprawność działania lokalnego po wykonaniu `docker-compose up`.

---

## 🚀 Jak uruchomić projekt

1. **Wymagania**: Upewnij się, że masz zainstalowane **Docker** oraz **Docker Compose**.
2. **Uruchomienie aplikacji**:
   Otwórz terminal w głównym katalogu projektu i uruchom:
   ```bash
   docker-compose up --build
   ```
3. **Automatyczna inicjalizacja**:
   - Uruchomi się baza danych PostgreSQL oraz serwer webowy Daphne.
   - Migracje bazy danych zostaną wygenerowane i zaaplikowane automatycznie.
   - Domyślne konto **Administratora** zostanie stworzone.
4. **Dostęp do aplikacji**:
   Otwórz przeglądarkę i wejdź na: [http://localhost:8000](http://localhost:8000)

## 👑 Przewodnik dla Administratora

**Domyślne dane logowania (Administrator):**
- **Login**: `admin`
- **Hasło**: `admin`

**Funkcje i uprawnienia:**
- **Panel Administracyjny**: Dostępny z paska nawigacji po zalogowaniu. Pozwala na przegląd użytkowników, zmianę ról (Administrator, Moderator, Użytkownik) oraz globalne blokowanie/odblokowywanie.
- **Hierarchia ról**: 
  - **Administrator** ma pełny dostęp do wszystkich kanałów, może usuwać dowolne wiadomości i kanały, a także zarządzać rolami.
  - **Moderator** może usuwać nieodpowiednie wiadomości i blokować użytkowników, ale nie może zmieniać ról.
  - **Użytkownik** może tworzyć kanały, pisać w nich, wysyłać wiadomości prywatne i usuwać własne wiadomości.

## ✅ Zgodność z wymaganiami

Projekt w pełni realizuje założenia:
1. **System użytkowników**: Wbudowana rejestracja, logowanie, walidacja unikalności oraz panel edycji profilu (awatar, opis).
2. **Role i uprawnienia**: Działają 3 wymagane role (Admin, Moderator, Użytkownik). Backend skutecznie weryfikuje uprawnienia.
3. **Komunikacja w czasie rzeczywistym**: Wiadomości w kanałach publicznych oraz DM opierają się na technologii WebSockets (Django Channels + `channels_postgres`).
4. **Multimedia**: Dodano obsługę przesyłania plików, które od razu po przesłaniu wyświetlają się innym użytkownikom jako obrazy lub odtwarzacze audio.
5. **Moderacja**: Administrator/Moderator może usuwać niepożądane wiadomości oraz całkowicie blokować dostęp wybranym użytkownikom.
6. **Środowisko Docker**: Całość działa w odseparowanych kontenerach (web, db) uruchamianych jednym poleceniem, z automatycznymi migracjami i początkowym seedowaniem bazy.