Add project plan document for Fuzzel Android client

Introduces plan.md outlining current implementation status, missing features, API requirements, UI parity tasks, technical details, key files for modification, and testing/verification steps for the Fuzzel Android client project.
This commit is contained in:
Paweł Orzech 2026-01-23 02:32:15 +01:00
parent 6c0b502630
commit 37c2061457
No known key found for this signature in database

293
plan.md Normal file
View file

@ -0,0 +1,293 @@
# Plan Projektu Fuzzel - Klient Android dla Fizzy
## 1. Aktualny Stan Projektu
### Architektura
- **Platforma**: Android Native (Kotlin + Jetpack Compose)
- **Wzorzec**: Clean Architecture (Domain, Data, Presentation)
- **DI**: Hilt
- **Networking**: Retrofit 2.9.0 + Moshi + OkHttp 4.12.0
- **UI**: Material Design 3, Jetpack Compose
- **Min SDK**: 26, Target SDK: 34
### Zaimplementowane Funkcjonalności
| Obszar | Status | Uwagi |
|--------|--------|-------|
| Autentykacja Magic Link | ✅ Gotowe | Pełny flow email → kod → token |
| Personal Access Token | ✅ Gotowe | Bezpośrednie logowanie tokenem |
| Multi-account | ✅ Gotowe | Encrypted storage, przełączanie kont |
| Lista boardów | ✅ Gotowe | CRUD, wyszukiwanie |
| Widok Kanban | ✅ Gotowe | Kolumny, karty, drag&drop |
| Swimlanes (Triage/Not Now/Done) | ✅ Gotowe | Wirtualne kolumny |
| Karty CRUD | ✅ Gotowe | Tworzenie, edycja, usuwanie |
| Akcje na kartach | ✅ Gotowe | Close/reopen, priority, watch, triage, defer |
| Kolumny CRUD | ✅ Gotowe | Dodawanie, edycja, usuwanie |
| Steps | ✅ Gotowe | CRUD + toggle completion |
| Comments | ✅ Gotowe | CRUD |
| Reactions | ⚠️ Częściowe | Add działa, remove ma bug (emoji vs reactionId) |
| Tags | ⚠️ Częściowe | Wyświetlanie OK, add/remove wymaga poprawy |
| Assignees | ⚠️ Częściowe | Add działa, remove niekompletne |
| Notifications | ✅ Gotowe | Lista, mark read/unread, bulk |
| Settings | ✅ Gotowe | Theme mode |
---
## 2. Brakujące Funkcjonalności vs API
### 2.1 Nieimplementowane Endpointy API
| Endpoint | Opis | Priorytet |
|----------|------|-----------|
| `GET /cards?tag_ids[]=...` | Filtrowanie kart po tagach | Wysoki |
| `GET /cards?assignee_ids[]=...` | Filtrowanie kart po assignees | Wysoki |
| `GET /cards?terms[]=...` | Wyszukiwanie kart tekstowe | Wysoki |
| `GET /cards?creation=...` | Filtrowanie po dacie utworzenia | Średni |
| `GET /cards?closure=...` | Filtrowanie po dacie zamknięcia | Średni |
| `DELETE /cards/{n}/image` | Usuwanie obrazka nagłówkowego karty | Niski |
| `GET /:account/users` | Lista użytkowników konta | Wysoki |
| `GET /:account/users/{id}` | Szczegóły użytkownika | Średni |
| `PUT /:account/users/{id}` | Aktualizacja profilu użytkownika | Niski |
| Paginacja (`Link` header) | Obsługa dużych zbiorów danych | Wysoki |
| ETag caching | Optymalizacja requestów (304 Not Modified) | Średni |
| File uploads (multipart) | Załączniki, avatary, obrazki | Wysoki |
| Rich text (HTML + ActionText) | Formatowany opis karty/komentarza | Średni |
### 2.2 Bugi i Niekompletne Implementacje
| Problem | Lokalizacja | Opis |
|---------|-------------|------|
| Reakcje - usuwanie | `CardDetailViewModel` | Używa emoji zamiast reactionId |
| Tagi - dodawanie | `CardDetailViewModel` | Używa tagId zamiast prawidłowego lookup |
| Assignees - usuwanie | `CardRepository` | Endpoint niejasny w dokumentacji, stub |
| Reakcje - GET | `FizzyApiService` | Brak endpointu do pobierania listy reakcji |
---
## 3. Wymagania dla Parytetu z Wersją Webową (1:1)
### 3.1 UI - Widok Kanban
| Element | Status | Do zrobienia |
|---------|--------|--------------|
| Kolumny z kartami | ✅ | - |
| Drag & drop kart | ✅ | - |
| Triage swimlane | ✅ | - |
| Not Now swimlane | ✅ | - |
| Done swimlane | ✅ | - |
| Kolory kolumn (user-defined) | ⚠️ | Dodać obsługę `color` z API |
| Limity kart w kolumnie (WIP) | ❌ | API może to wspierać |
| Reordering kolumn | ❌ | Brak w API (sprawdzić) |
| Bulk card actions | ❌ | Zaznaczanie wielu kart |
### 3.2 UI - Szczegóły Karty
| Element | Status | Do zrobienia |
|---------|--------|--------------|
| Tytuł + opis | ✅ | - |
| Status badge | ✅ | - |
| Priority (golden) | ✅ | - |
| Watch | ✅ | - |
| Tags | ⚠️ | Poprawić add/remove |
| Assignees + avatary | ⚠️ | Poprawić remove, dodać prawdziwe avatary |
| Steps z progress | ✅ | - |
| Comments | ✅ | - |
| Reactions na comments | ⚠️ | Naprawić usuwanie |
| Activity log | ❌ | Placeholder w UI |
| Obrazek nagłówkowy | ❌ | Brak obsługi |
| Załączniki | ❌ | Brak obsługi |
| Rich text rendering | ❌ | Tylko plain text |
| Due date | ❌ | Sprawdzić czy API wspiera |
| Triage date display | ⚠️ | API bierze column_id, nie date |
### 3.3 UI - Board List
| Element | Status | Do zrobienia |
|---------|--------|--------------|
| Lista boardów | ✅ | - |
| Wyszukiwanie | ✅ | - |
| Tworzenie/edycja/usuwanie | ✅ | - |
| Board stats | ⚠️ | Pokazuje tylko podstawowe info |
| Board members | ❌ | Nie wyświetla użytkowników |
| Sortowanie | ❌ | Brak opcji sortowania |
### 3.4 UI - Notifications
| Element | Status | Do zrobienia |
|---------|--------|--------------|
| Lista powiadomień | ✅ | - |
| Mark read/unread | ✅ | - |
| Mark all read | ✅ | - |
| Notification grouping | ❌ | Brak grupowania |
| Deep link do karty | ⚠️ | Podstawowa nawigacja |
---
## 4. Plan Implementacji - Priorytety
### Faza 1: Naprawy Krytyczne (Wysoki Priorytet)
1. **Naprawa reakcji**
- Dodać `GET /comments/{id}/reactions` do pobierania listy z ID
- Użyć `reaction.id` zamiast `emoji` przy usuwaniu
- Pliki: `FizzyApiService.kt`, `CommentDto.kt`, `CardDetailViewModel.kt`
2. **Naprawa tagów**
- Poprawić flow add/remove tag
- Użyć prawidłowego `tagging_id` przy usuwaniu
- Pliki: `CardRepository.kt`, `CardDetailViewModel.kt`
3. **Naprawa assignees**
- Zbadać API dla remove assignment (toggle?)
- Implementować prawidłowe usuwanie
- Pliki: `FizzyApiService.kt`, `CardRepository.kt`
### Faza 2: Filtrowanie i Wyszukiwanie
4. **Zaawansowane filtrowanie kart**
- Dodać parametry query: `tag_ids[]`, `assignee_ids[]`, `terms[]`
- UI: FilterChips w Kanban toolbar
- Pliki: `FizzyApiService.kt`, `CardRepository.kt`, `KanbanViewModel.kt`
5. **Wyszukiwanie globalne**
- Wyszukiwanie po wszystkich boardach
- UI: SearchBar w głównym ekranie
- Nowy feature: `feature/search/`
### Faza 3: Paginacja i Caching
6. **Paginacja**
- Parser dla `Link` header z `rel="next"`
- Infinite scroll w listach
- Pliki: `NetworkModule.kt`, wszystkie repozytoria
7. **ETag Caching**
- OkHttp interceptor dla `If-None-Match`
- Cache storage
- Pliki: `NetworkModule.kt`, `AuthInterceptor.kt`
### Faza 4: Rich Content
8. **File Uploads**
- Multipart request handling
- Avatary użytkowników (zamiast inicjałów)
- Obrazki nagłówkowe kart
- Pliki: `FizzyApiService.kt`, nowy `FileUploadRepository.kt`
9. **Rich Text**
- HTML rendering w opisach i komentarzach
- Compose HTML renderer lub WebView
- Pliki: `CardDetailScreen.kt`, nowy `RichTextContent.kt`
### Faza 5: Parytet UI
10. **Activity Log**
- Nowy endpoint (jeśli dostępny w API)
- Timeline UI w CardDetailScreen
- Pliki: `CardDetailScreen.kt`, `CardDetailViewModel.kt`
11. **Board Members**
- Wyświetlanie użytkowników boarda
- Zarządzanie dostępem
- Pliki: `BoardDetailScreen.kt` (nowy), `UserRepository.kt`
12. **Offline Support**
- Room database dla cache
- Sync queue dla operacji offline
- Nowy moduł: `data/local/database/`
---
## 5. Szczegóły Techniczne API
### Struktura URL
```
{base_url}/{account_slug}/{resource}.json
```
### Autentykacja
- Header: `Authorization: Bearer {token}`
- Session token lub Personal Access Token
### Parametry Listowania Kart
```
GET /cards.json?
board_ids[]=uuid1&board_ids[]=uuid2 # filtr boardów
tag_ids[]=uuid1&tag_ids[]=uuid2 # filtr tagów
assignee_ids[]=uuid1 # filtr assignees
indexed_by=all|closed|not_now # status kart
creation=today|this_week|last_week # data utworzenia
closure=today|this_week|last_week # data zamknięcia
terms[]=word1&terms[]=word2 # wyszukiwanie tekstowe
```
### Paginacja
- Response header: `Link: <url>; rel="next"`
- Parsować URL i fetchować następną stronę
### Caching
- Response header: `ETag: "abc123"`
- Request header: `If-None-Match: "abc123"`
- Response 304 = dane niezmienione
### Wrapping Request/Response
```json
// Create request
{ "card": { "title": "...", "description": "..." } }
// Response
{ "card": { "id": "...", "number": 123, ... } }
```
---
## 6. Pliki Kluczowe do Modyfikacji
| Plik | Zmiany |
|------|--------|
| `FizzyApiService.kt` | Nowe endpointy, parametry query |
| `CardDto.kt` | Pola dla attachments, obrazki |
| `CardRepository.kt` | Filtrowanie, paginacja |
| `KanbanViewModel.kt` | Filtry UI, bulk actions |
| `CardDetailViewModel.kt` | Naprawy reakcji/tagów |
| `NetworkModule.kt` | ETag interceptor, cache |
| `BoardListScreen.kt` | Sortowanie, search |
---
## 7. Weryfikacja Zmian
### Testy Manualne
1. Zaloguj się przez Magic Link
2. Utwórz board, dodaj kolumny i karty
3. Przetestuj drag & drop między kolumnami
4. Otwórz szczegóły karty - dodaj/usuń tagi, assignees
5. Dodaj komentarz, dodaj/usuń reakcję
6. Zamknij i otwórz ponownie kartę
7. Sprawdź powiadomienia
### Testy API
1. Porównaj response API z DTO mapping
2. Zweryfikuj error handling (401, 403, 404, 422)
3. Sprawdź paginację na dużych zbiorach
### Porównanie z Web
1. Otwórz tę samą tablicę w web i w aplikacji
2. Porównaj wyświetlanie kart 1:1
3. Sprawdź wszystkie akcje dostępne w web
---
## 8. Podsumowanie Priorytetów
| Priorytet | Zadanie | Effort |
|-----------|---------|--------|
| 🔴 Krytyczny | Naprawa reakcji, tagów, assignees | Mały |
| 🟠 Wysoki | Filtrowanie kart, paginacja | Średni |
| 🟡 Średni | ETag caching, rich text | Średni |
| 🟢 Niski | File uploads, activity log, offline | Duży |
---
*Plan utworzony: 2026-01-19*
*Wersja: 1.0*