Przejdź do głównej zawartości

Synchronizacja (Duo)

W trybie chmurowym plan należy do gospodarstwa domowego, a użytkownicy są z nim powiązani. Druga osoba dołącza kodem zaproszenia.

Model współdzielenia​

  • Jedno gospodarstwo = wspólny stan (jsonb).
  • Członkowie powiązani przez tabelę członkostwa.
  • Dostęp egzekwowany przez Row Level Security — tylko członek widzi i zmienia stan swojego gospodarstwa.
  • Stan jest szyfrowany end-to-end; klucz szyfrujący gospodarstwa jest udostępniany zaproszonemu partnerowi przez wymianę kluczy, więc ani my, ani osoby trzecie nie odczytają danych.

Dodanie partnera (jeden klik)​

Dopóki plan ma tylko jednego dorosłego, na pulpicie widnieje karta „Dodaj partnera". Jedno tapnięcie otwiera arkusz z kodem zaproszenia (i opcjonalnym zaproszeniem e-mail). Druga osoba zakłada konto i wpisuje kod — od tej chwili oboje widzą ten sam plan. Karta znika, gdy partner dołączy.

Dostęp do zaszyfrowanych danych wymaga jednego potwierdzenia po stronie osoby, która już ma klucz do planu. Gdy partner dołączy, u zapraszającego pojawia się okno „Ktoś dołączył do Twojego planu" z odciskiem klucza nowej osoby. Okno przyciemnia resztę ekranu i nie znika samo — trzeba wybrać jedną z dwóch opcji, żeby nikt nie zatwierdził dostępu przypadkiem. Partner widzi ten sam odcisk na swoim ekranie „Łączymy Was" — wystarczy je porównać (np. przez telefon) i kliknąć „Potwierdź dostęp". Od tej chwili urządzenie zapraszającego pieczętuje klucz gospodarstwa dla partnera, a odcisk zostaje zapamiętany w zaszyfrowanym planie, więc kolejne uruchomienia nie pytają ponownie. „Odmów" nie daje dostępu (na tę sesję); żeby usunąć obcą osobę, użyj „Odepnij partnera" w Ustawieniach.

Jeśli plan założono jako „Tylko ja", a partner dołączył później kodem, profil planu nie ma jeszcze drugiej osoby. Pulpit pokazuje wtedy na obu urządzeniach kartę „Do planu dołączyła druga osoba" z polem na imię. Po zapisaniu imienia plan ma dwie osoby, a wpis osobne kolumny — inaczej oboje wpisywaliby wpłaty do jednej kolumny i zapis jednej osoby zastępowałby wpłaty drugiej.

Domownicy, którzy dołączyli przed wprowadzeniem potwierdzania, mają już zapisany klucz do planu — dla nich okno się nie pojawia, bo dostęp już mają. Aplikacja nie zapisuje im jednak odcisku ani nie pieczętuje dla nich nowego klucza bez Twojego kliknięcia.

Dlaczego tak: sam kod zaproszenia (albo ktoś z dostępem do bazy, kto dopisze sobie członkostwo) nie może już otworzyć planu — potrzebna jest świadoma decyzja domownika, który plan już widzi. Jeśli kiedyś klucz znanej osoby się zmieni, zobaczysz ostrzeżenie „Klucz domownika się zmienił"; bezpieczna ścieżka to odpięcie i ponowne zaproszenie.

Zanim potwierdzenie nastąpi, partner widzi spokojny ekran „Łączymy Was" — aplikacja sprawdza dostęp automatycznie (co 5 s, potem rzadziej, najwyżej co minutę) i sama go domyka. Jeśli się przeciąga, wystarczy poprosić drugą osobę, by otworzyła GrapeVest i potwierdziła.

Gdy planu nie da się pobrać​

Jeśli plan z chmury nie daje się pobrać albo odszyfrować (brak sieci, chwilowy błąd, uszkodzony wpis), aplikacja pokazuje ekran „Nie udało się pobrać planu" z przyciskiem „Spróbuj ponownie". Nic wtedy nie jest zapisywane ani nadpisywane — lokalna kopia zostaje nietknięta, a klucz szyfrujący nie jest tworzony od nowa. To celowe: błąd połączenia nigdy nie może wyglądać dla aplikacji jak „puste gospodarstwo".

Zapis ze scalaniem​

Stan zapisywany jest w całości, z optymistyczną kontrolą współbieżności:

  1. Aplikacja zapamiętuje znacznik updated_at ostatnio pobranego stanu.
  2. Przy zapisie wysyła ten znacznik — zawsze. Jedyny zapis „na siłę" (bez znacznika) to świadome „Zacznij od nowa". Jeśli ktoś zapisał w międzyczasie, znaczniki się rozjadą → wykryty konflikt.
  3. Wtedy aplikacja pobiera świeży stan i scala: mapy kluczowane miesiącem (wpisy, snapshoty) są łączone, a pozostałe pola bierze nowsza strona wg updated_at. Dzięki temu „dwie osoby uzupełniają różne miesiące" nie gubi danych.

Pobieranie i odświeżanie​

Stan pobierany jest po wejściu do gospodarstwa, na żywo przy każdej zmianie po stronie partnera (subskrypcja Realtime na wierszu gospodarstwa) oraz przy powrocie do karty/okna jako zapas. Gdy zmiana partnera dotrze, pokazujemy krótki komunikat „Partner zaktualizował plan".

Jeśli masz w danym momencie lokalne, jeszcze niezsynchronizowane edycje, stan zdalny jest z nimi scalany (nie nadpisujemy ich po cichu) — tą samą regułą co przy konflikcie zapisu (mapy miesięczne łączone, reszta wg nowszego updated_at).

Zmiana wysyła się z krótkim opóźnieniem (seria zmian to jeden zapis). Gdy karta albo aplikacja zostanie zamknięta wcześniej, zmiana nie przepada: urządzenie zapamiętuje, że ma niewysłane zmiany, i przy następnym uruchomieniu scala je ze stanem z serwera, a potem wysyła. Przełączenie na inną aplikację (karta w tle) i wylogowanie wysyłają zmiany od razu.

Pierwszy zapis nowego konta​

Nowe gospodarstwo zasiewamy pustym planem, gdy kreator nie był jeszcze ukończony (wcześniej trafiał tam przykładowy plan „Adam + Basia"). To ważne dla scalania: „Zaczynam od zera" nie jest już usunięciem kont, więc szybkie przeładowanie zaraz po kreatorze nie przywraca przykładu przez scalanie z kopią serwera. Plan prowadzony wcześniej bez konta (ukończony kreator) przechodzi do chmury bez zmian.

Opuszczenie i usunięcie​

  • Opuść gospodarstwo — cofa dostęp temu kontu; gdy wychodzi ostatni członek, gospodarstwo (wraz ze stanem) jest usuwane, by nie zostawiać osieroconych danych.
  • Usuń konto — kasuje gospodarstwa, w których jesteś jedynym członkiem (RODO). Konto bez planu (np. odpięte przez partnera) usuwa się z ekranu „Twój plan", z tym samym potwierdzeniem hasłem.
  • Odpięcie przez partnera — urządzenie odpiętej osoby przy następnym uruchomieniu czyści swoją kopię wspólnego planu (pusty plan). Nie zostaje na nim nic z cudzych danych i nie da się nimi zasiać nowego gospodarstwa.