Přeskočit obsah

S3 Backup & Sync — Specifikace aplikace

Aplikace dostupná v záložce Software launcheru. Navazuje na: user-data-sharing.md, sync-backup.md, auth-organization.md


1. Multi-firma uživatelský model

1.1 Jeden uživatel, více firem

Uživatel má jeden účet (e-mail + heslo) a může být členem více firem. V každé firmě může mít jinou roli. Inspirace: Slack workspace switching.

Příklad: Jan Novák
  Firma A: Novák s.r.o.       → role: company_owner (majitel)
  Firma B: ABC Účetnictví      → role: user (zaměstnanec)
  Firma C: XYZ Trade           → role: company_admin (IT správce)

1.2 Databázový model — multi-firma

-- Stávající users.company_id zůstane jako "primární firma" pro zpětnou
-- kompatibilitu, ale přístup ke firmám jde výhradně přes memberships.

user_company_memberships (
  id           UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id      UUID REFERENCES users(id) NOT NULL,
  company_id   UUID REFERENCES companies(id) NOT NULL,
  role         VARCHAR(50) NOT NULL,
  -- 'company_owner' | 'company_admin' | 'user'
  is_active    BOOLEAN DEFAULT true,
  invited_by   UUID REFERENCES users(id),
  joined_at    TIMESTAMPTZ DEFAULT now(),
  UNIQUE (user_id, company_id)
)

Migrace: Stávající users.company_id + users.system_role se přemigrují do user_company_memberships jako jeden záznam per uživatel.

1.3 Role v rámci firmy

Role Kdo Co může
company_owner Majitel / jednatel Vše jako admin + schvaluje mazání dat, přidává/odebírá adminy, vidí billing
company_admin IT admin, ředitel Spravuje uživatele, role, sdílení, zálohy, přiděluje aplikace
user Zaměstnanec Přidělené aplikace, vlastní zálohy, sdílené adresáře dle ACL

Jeden company_owner per firma. Při registraci firmy je zakladatel automaticky owner. Owner může jmenovat dalšího ownera (přenesení) nebo přidat adminy.

1.4 Context switcher v launcheru

Menu lišta [vlevo]:
  ▼  Novák s.r.o.          ← aktuální firma (kliknutelný dropdown)
     ────────────────
     Novák s.r.o.    ●     ← aktivní
     ABC Účetnictví
     XYZ Trade
     ────────────────
     + Přidat firmu

Po přepnutí firmy se změní: - Knihovna — software přidělený v dané firmě - Chat — kanály a konverzace dané firmy - Zálohy — data a adresáře dané firmy - Nastavení — role, uživatelé dané firmy

Volitelné nastavení — sloučená knihovna:

Nastavení → Zobrazení → Knihovna
  ☑ Zobrazovat software ze všech firem v jedné knihovně
    (každá aplikace bude označena názvem firmy)

Výsledek v Knihovně:
  [A] Fakturace Pro         Novák s.r.o.     v2.1.4
  [M] Mzdový systém         Novák s.r.o.     v1.5.0
  [C] CRM Lite              ABC Účetnictví   v3.0.0
  [S] Sklad Manager         XYZ Trade        v2.2.1

2. Evidence zařízení (Device Registry)

2.1 Model

user_devices (
  id            UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  user_id       UUID REFERENCES users(id) NOT NULL,
  device_name   VARCHAR(255) NOT NULL,     -- "Notebook doma", "PC kancelář"
  device_type   VARCHAR(20) NOT NULL,      -- 'windows' | 'linux' | 'mac'
  device_uid    VARCHAR(255) NOT NULL UNIQUE,  -- hw fingerprint (MAC + hostname hash)
  last_seen_at  TIMESTAMPTZ,
  last_ip       VARCHAR(45),               -- pro audit
  is_active     BOOLEAN DEFAULT true,
  registered_at TIMESTAMPTZ DEFAULT now()
)

-- Adresáře synchronizované na daném zařízení
device_sync_dirs (
  id            UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  device_id     UUID REFERENCES user_devices(id) ON DELETE CASCADE,
  user_id       UUID REFERENCES users(id) NOT NULL,
  company_id    UUID REFERENCES companies(id) NOT NULL,
  local_path    VARCHAR(1000) NOT NULL,    -- C:\Users\jan\Dokumenty\Faktury
  s3_prefix     VARCHAR(500) NOT NULL,     -- users/{uid}/sync/faktury/
  label         VARCHAR(255),             -- "Faktury 2025"
  sync_enabled  BOOLEAN DEFAULT true,
  sync_mode     VARCHAR(20) DEFAULT 'sync',-- 'sync' | 'backup_only' | 'readonly'
  last_sync_at  TIMESTAMPTZ,
  created_at    TIMESTAMPTZ DEFAULT now()
)

2.2 Limity zařízení dle tarifu

Tarif Zařízení per uživatel
Basic 2
Standard 5
Premium neomezeno

2.3 Správa zařízení v launcheru

Nastavení → Moje zařízení:

  💻  PC kancelář          Windows  •  naposledy viděno: dnes 14:23  [aktivní]
  💻  Notebook doma        Windows  •  naposledy viděno: včera 22:10 [aktivní]
  💻  Starý laptop         Windows  •  naposledy viděno: před 3 měs. [neaktivní]
      [Odebrat zařízení]

  [+ Přidat zařízení]   (limit: 5/5 u Standard tarifu)

3. Sync protokol — Smart Sync

3.1 Režimy synchronizace

Režim Popis Kdy použít
sync Obousměrná synchronizace Práce na více počítačích
backup_only Jen nahrávat nahoru, nestahovat Záloha archivních dat
readonly Jen stahovat dolů Sdílená data jen ke čtení

3.2 Sync algoritmus — Smart Sync

Hlavní bezpečnostní pravidlo: před přepisem vždy záloha starší verze.

Sync cyklus pro adresář (spouštěn při startu, každých N minut, nebo manuálně):

PRO KAŽDÝ SOUBOR v lokálním adresáři:

  1. Načti lokální metadata: path, size, mtime, checksum (SHA-256)

  2. Načti remote metadata z S3 manifestu: path, size, mtime, checksum

  3. Porovnej:
     ┌─────────────────────────────────────────────────────────────────┐
     │ Scénář             │ Akce                                       │
     ├─────────────────────────────────────────────────────────────────┤
     │ Lokál = Remote     │ Nic — soubor je synchronizovaný            │
     │ (checksum shodný)  │                                            │
     ├─────────────────────────────────────────────────────────────────┤
     │ Lokál novější      │ Upload lokálního souboru → Remote         │
     │ Remote neexistuje  │ (nový soubor)                              │
     ├─────────────────────────────────────────────────────────────────┤
     │ Remote novější     │ a) Záloha lokálního souboru do history/   │
     │                    │ b) Download remote → přepis lokálního      │
     ├─────────────────────────────────────────────────────────────────┤
     │ KONFLIKT:          │ a) Záloha OBOU verzí do history/          │
     │ obě strany změněny │ b) Lokální přejmenovat: file.conflict.NNN  │
     │ od posledního sync │ c) Stáhnout remote jako hlavní verzi       │
     │                    │ d) Uživatel dostane notifikaci             │
     └─────────────────────────────────────────────────────────────────┘

  4. Aktualizuj lokální manifest (path, checksum, mtime, sync_at)

  5. Aktualizuj remote manifest v S3

3.3 Záloha před přepisem (Pre-overwrite Backup)

Před každým přepisem lokálního souboru:

  S3 target: users/{uid}/sync/{dir_label}/history/{YYYY-MM-DD}/{HH-MM-SS}_{filename}

  Příklad:
    Původní:  users/abc/sync/faktury/faktura-001.pdf
    Záloha:   users/abc/sync/faktury/history/2026-04-26/14-23-05_faktura-001.pdf

  Rotace history:
    Uchovávat posledních N verzí (nastavitelné, default 30)
    Starší verze → označit jako expired → GC po retention_years

3.4 Full Restore (obnova zničeného zařízení)

1. Uživatel se přihlásí na novém počítači
2. Launcher → Zálohy → [Obnovit zařízení]
3. Vybere:
     Obnovit z zařízení: "PC kancelář"  ▾
     Stav k datu:        [Nejnovější ▾]  nebo [vybrat datum]
4. Launcher:
   a. Stáhne manifest — seznam všech souborů a cest
   b. Zobrazí přehled: "celkem 2 450 souborů, 12,4 GB"
   c. Uživatel potvrdí cílovou složku
   d. Launcher stáhne vše ze S3 → lokální adresářová struktura
   e. Zapíše nové zařízení do device_sync_dirs
5. Po dokončení: normální sync provoz

4. Monetizace — Tarify per firma

4.1 Plány

Plán Úložiště Uživatelé Zařízení/uživatel Zálohy Cena/měsíc
Free 1 GB 1 1 30 dní zdarma
Basic 20 GB 5 2 90 dní 299 Kč
Standard 100 GB 20 5 365 dní 990 Kč
Premium 1 TB neomezeno neomezeno 10 let 2 990 Kč
Business vlastní vlastní neomezeno vlastní na dotaz

Doplňkové úložiště: +10 GB / 49 Kč / měsíc (Standard+)

Fair-use princip: - Firma platí za celý tým dohromady (ne per uživatel) - Pokud účetní pracuje pro 3 firmy → každá firma platí svůj vlastní tarif - Sdílená data se počítají do kvóty firmy, ne uživatele

4.2 Přehled využití v launcheru (company_owner / company_admin)

Správa → Tarif a úložiště:

  Aktuální plán:  Standard  (100 GB / 20 uživatelů)
  Cena:           990 Kč / měsíc  •  Obnovení: 1.5.2026
                                             [Změnit plán]

  Využití úložiště:
  ████████████░░░░░░░  62 GB / 100 GB  (62 %)
                                             [Dokoupit +10 GB]

  Rozpad dle uživatelů:
    Jan Novák         18,4 GB   ████░░░
    Jana Krásná       14,1 GB   ███░░░░
    Petr Mlynář        9,8 GB   ██░░░░░
    Sdílené adresáře  12,5 GB   ██░░░░░
    AVAX aplikace      7,2 GB   █░░░░░░

4.3 Upozornění při překročení

70 % kvóty  → info banner v launcheru, e-mail adminovi
90 % kvóty  → varování v launcheru, e-mail adminovi + ownerovi
100 % kvóty → zálohy nových dat zastaveny (existující čitelné)
              červený banner v launcheru, opakovaný e-mail
> 100 %     → pouze po ručním navýšení super adminem (přechodný stav)

5. Bezpečnostní model mazání dat

5.1 Zásady

PRAVIDLO: Nikdo nemůže data fyzicky smazat okamžitě.
Každé smazání prochází schválením a 30denní lhůtou.

5.2 Kdo může označit soubory ke smazání

Kdo Co může označit
user Vlastní soukromé soubory (ve svém adresáři)
company_admin Jakékoliv soubory v rámci firmy
company_owner Jakékoliv soubory + schvaluje mazání
super_admin (Avaxis) Vše (technická nutnost, audit log povinný)

5.3 Flow mazání

KROK 1 — Označení ke smazání:
  Uživatel / admin označí soubory v UI
  → Stav: pending_approval
  → Systém zapíše: {označil: user_id, kdy: now(), soubory: [...]}

KROK 2 — Notifikace ownera:
  company_owner dostane e-mail + in-app notifikaci:
  "Jan Novák označil 24 souborů (1,2 GB) ke smazání. Vyžaduje vaše schválení."
  → Odkaz na přehled označených souborů

KROK 3 — Review ownera:
  Owner vidí:
    📁 Označené ke smazání — Jan Novák — 2026-04-26
    ┌─────────────────────────────────────────────────┐
    │ faktura-2024-001.pdf    234 KB    Fakturace Pro  │
    │ faktura-2024-002.pdf    189 KB    Fakturace Pro  │
    │ priloha-smlouva.docx    456 KB    Obecné         │
    │ ... (21 dalších)                                  │
    └─────────────────────────────────────────────────┘
    [Zobrazit vše]  [Stáhnout přehled PDF]
    [✓ Schválit smazání]   [✗ Zamítnout]

KROK 4 — Schválení:
  → Stav: approved_for_deletion
  → Lhůta: 30 dní od schválení
  → Banner v launcheru: "Soubory budou smazány za 30 dní. [Zrušit]"

KROK 5 — Grace period (30 dní):
  Owner nebo admin může mazání ZRUŠIT do konce lhůty
  → Stav zpět: active

KROK 6 — Garbage Collector:
  Po uplynutí 30 dní → GC fyzicky smaže ze S3
  → Stav: deleted (s3_key = NULL, deleted_at = timestamp)
  → Aktualizace kvóty firmy
  → Audit log: {gc_deleted, soubory, bytes_freed, schválil: owner_id}
  → Shrnutí e-mail ownerovi

5.4 Databázové rozšíření

-- Rozšíření backup_snapshots / obecný deletion request
storage_deletion_requests (
  id               UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  company_id       UUID REFERENCES companies(id),
  requested_by     UUID REFERENCES users(id),
  approved_by      UUID REFERENCES users(id),    -- company_owner
  rejected_by      UUID REFERENCES users(id),
  status           VARCHAR(30) DEFAULT 'pending_approval',
  -- 'pending_approval' | 'approved' | 'rejected' | 'cancelled' | 'completed'
  approve_deadline TIMESTAMPTZ,      -- owner musí reagovat do N dní (default 14)
  delete_after     TIMESTAMPTZ,      -- 30 dní od schválení
  reason           TEXT,             -- volitelný komentář
  file_count       INTEGER,
  total_bytes      BIGINT,
  s3_keys          JSONB,            -- seznam S3 klíčů ke smazání
  created_at       TIMESTAMPTZ DEFAULT now(),
  completed_at     TIMESTAMPTZ
)

6. Sdílení souborů a adresářů

6.1 Model sdílení

Uživatel sdílí vlastní podadresáře (granularita: složka). Admin sdílí adresáře v rootu firemního bucketu. Soubor lze sdílet přes shareable link (veřejná URL s TTL).

Adresářová struktura z pohledu uživatele Jana:

  Moje soubory/
  ├── Faktury/              [jen já]
  │   ├── 2024/
  │   └── 2025/             [sdíleno s rolí Účetní — čtení+zápis]
  ├── Smlouvy/              [sdíleno s Jana Krásná — jen čtení]
  ├── Osobní/               [jen já]
  └── Projekt XYZ/          [sdíleno s firmou B (cross-firma) — čtení]

Firemní adresáře (admin spravuje v rootu):
  Firma/
  ├── HR dokumenty/         [role Mzdový účetní — čtení+zápis]
  ├── Celopodnikové/        [všichni — jen čtení]
  └── Vedení/               [role Ředitel — čtení+zápis]

6.2 ACL datový model

-- Sdílení adresáře (platí pro celou složku včetně podadresářů)
storage_shares (
  id             UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  company_id     UUID REFERENCES companies(id) NOT NULL,
  owner_user_id  UUID REFERENCES users(id),     -- NULL = firemní adresář (admin)
  s3_prefix      VARCHAR(500) NOT NULL,          -- cesta v S3
  label          VARCHAR(255) NOT NULL,          -- "Faktury 2025"
  is_company_dir BOOLEAN DEFAULT false,          -- firemní vs. uživatelský
  created_at     TIMESTAMPTZ DEFAULT now()
)

-- ACL záznamy per sdílení
storage_share_access (
  id           UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  share_id     UUID REFERENCES storage_shares(id) ON DELETE CASCADE,
  -- JEDEN z těchto čtyř:
  grantee_user_id    UUID REFERENCES users(id),
  grantee_role_id    UUID REFERENCES company_roles(id),
  grantee_company_id UUID REFERENCES companies(id),  -- cross-firma sdílení
  all_company        BOOLEAN DEFAULT false,

  can_read     BOOLEAN NOT NULL DEFAULT true,
  can_write    BOOLEAN NOT NULL DEFAULT false,

  granted_by   UUID REFERENCES users(id),
  granted_at   TIMESTAMPTZ DEFAULT now(),
  expires_at   TIMESTAMPTZ,  -- volitelná expirace přístupu

  CONSTRAINT one_grantee CHECK (
    (grantee_user_id IS NOT NULL)::int +
    (grantee_role_id IS NOT NULL)::int +
    (grantee_company_id IS NOT NULL)::int +
    (all_company = true)::int = 1
  )
)

-- Shareable linky (pro jednotlivé soubory)
storage_share_links (
  id           UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  company_id   UUID REFERENCES companies(id),
  created_by   UUID REFERENCES users(id),
  s3_key       VARCHAR(500) NOT NULL,     -- konkrétní soubor
  label        VARCHAR(255),
  token        VARCHAR(64) UNIQUE NOT NULL,  -- náhodný token v URL
  can_write    BOOLEAN DEFAULT false,
  max_downloads INTEGER,                  -- NULL = neomezeno
  downloads    INTEGER DEFAULT 0,
  expires_at   TIMESTAMPTZ,
  created_at   TIMESTAMPTZ DEFAULT now(),
  last_used_at TIMESTAMPTZ
)

6.3 Cross-firma sdílení

Jan z Novák s.r.o. chce sdílet složku „Projekt XYZ" s firmou ABC Účetnictví:

  1. Jan v S3 Backup → Moje soubory → Projekt XYZ → [Sdílet]
  2. Vybere: "Jiná firma na platformě AVAX"
  3. Zadá IČO nebo název firmy: "ABC Účetnictví"
  4. Nastaví: jen čtení / čtení+zápis
  5. Volitelně: expirace přístupu

  Výsledek:
    Členové ABC Účetnictví vidí „Projekt XYZ / od Novák s.r.o."
    ve svém S3 Backup pod záložkou „Sdíleno se mnou"
URL:  https://api.avaxis.cz/storage/share/{token}

Chování:
  • Bez přihlášení: stáhnout soubor (veřejný link)
  • S přihlášením: stáhnout + zobrazit v prohlížeči
  • Expirace, limit stažení, volitelné heslo

Launcher UI:
  Pravý klik na soubor → [Vytvořit sdílený link]
  → zobrazí URL + možnosti:
    Platnost: [7 dní ▾]
    Max stažení: [bez limitu ▾]
    Heslo: [nepovinné]
  → [Kopírovat link] [Odeslat e-mailem]

6.5 Sledovaná složka — Subscribed Folder Sync

Scénář: Jan zálohuje složku Faktury/2025/ na S3. Účetní Jana chce tuto složku mít automaticky synchronizovanou na svém disku — kdykoli Jan přidá novou fakturu, Jana ji dostane lokálně bez jakékoliv akce.

Jak to funguje

JAN (vlastník)                      S3                       JANA (účetní)
─────────────────                ─────────                ─────────────────
Uloží faktura-010.pdf  ──sync──► Faktury/2025/  ◄──sync── C:\Účetnictví\Novák\
                                 faktura-001.pdf           faktura-001.pdf ✓
                                 ...                       ...
                                 faktura-010.pdf  ──nová── faktura-010.pdf ↓ stahuje

Technicky jde o rozšíření device_sync_dirs — Jana si přidá cizí sdílenou složku jako sync dir na svém zařízení. Launcher ji synchronizuje stejným algoritmem jako vlastní složky, ale zdroj je Janův S3 prefix.

Rozšíření datového modelu

-- Rozšíření device_sync_dirs o volitelný odkaz na sdílenou složku
ALTER TABLE device_sync_dirs
  ADD COLUMN share_id UUID REFERENCES storage_shares(id),
  -- NULL = vlastní složka, NOT NULL = sledovaná cizí složka
  ADD COLUMN source_user_id UUID REFERENCES users(id);
  -- kdo je vlastník zdroje (pro zobrazení "Sleduje: Jan Novák")

-- Pokud share_id IS NOT NULL:
--   s3_prefix    = share.s3_prefix  (cesta Janovy složky)
--   sync_mode    = dle share ACL (readonly nebo sync)
--   source_user_id = Jan's user_id

Sync pravidla pro sledovanou složku

Readonly (Jana má jen čtení):
  sync_mode = 'readonly'
  Launcher: stahuje nové/změněné soubory od vlastníka
  Jana nemůže nahrávat zpět → lokální změny se NEODESÍLAJÍ
  Konflikt nenastane (Jana nepíše do S3)

Read-write (Jana může i přidávat/měnit):
  sync_mode = 'sync'
  Obě strany mohou zapisovat → může nastat konflikt
  Konflikt: záloha obou verzí + přejmenování na .conflict
  "Kdo vyhraje": novější timestamp → vítěz (stejná logika jako vlastní sync)

Flow — jak Jana přihlásí sledovanou složku

KROK 1 — Jan sdílí složku (UI nebo ACL):
  Jan → S3 Backup → Faktury/2025/ → [Sdílet] → Jana Krásná (jen čtení)
  → Vznikne storage_shares záznam + storage_share_access pro Janu

KROK 2 — Jana vidí sdílenou složku:
  Jana → S3 Backup → záložka „Sdíleno se mnou"
  → Faktury 2025  (od: Jan Novák, Novák s.r.o.)  [Jen čtení]
    [Procházet]  [Synchronizovat na disk]

KROK 3 — Jana přihlásí k synchronizaci:
  [Synchronizovat na disk] → dialog:
    Lokální cesta:  C:\Účetnictví\Novák\Faktury2025  [Procházet]
    Zařízení:       ☑ PC kancelář  ☐ Notebook doma
    [Zahájit první sync]
  → Vznikne device_sync_dirs s share_id = Janův share záznam

KROK 4 — Automatická synchronizace:
  Launcher Jany synchronizuje každých N minut (dle nastavení)
  → Při detekci nového souboru u Jana: tray notifikace:
    "Jan Novák přidal 2 soubory do Faktury 2025"

Notifikace

Tray notifikace (launcher Jany):
  "📁  Faktury 2025 — 3 nové soubory od Jan Novák"
  [Zobrazit]

Nastavení notifikací per sledovaná složka:
  ○ Okamžitě při každé změně
  ○ Shrnutí jednou denně
  ○ Vypnout

UI v pohledu uživatele — rozšíření

S3 Backup — Moje zálohy

Moje synchronizované složky:
  📁 Dokumenty/Faktury      15,4 GB  Synchronizováno  [↑↓] [...]
  📁 Dokumenty/Smlouvy       3,2 GB  Synchronizováno  [↑↓] [...]

Sledované složky (od ostatních):
  📁 C:\Účetnictví\Novák\   Faktury 2025              Zdroj: Jan Novák
                             2,1 GB  ↓ Jen čtení       poslední sync: 14:25  [...]
  📁 C:\Klienti\XYZ\        Sklad dokumenty           Zdroj: XYZ Trade
                             0,8 GB  ↕ Čtení+zápis     poslední sync: včera  [...]

  [+ Sledovat sdílenou složku]

Ukončení sledování

Jana → [...] → [Přestat sledovat]
  → Odstraní device_sync_dirs záznam
  → Lokální soubory Jana zůstanou (nestáhne nic zpět na Jana)
  → Jan dostane notifikaci: "Jana Krásná přestala sledovat Faktury 2025"
    (volitelné — nastavitelné kdo dostane notifikaci)

7. S3 Backup — aplikace

7.1 Umístění a charakter

  • Dostupná v záložce Software launcheru (stejně jako Fakturace Pro atd.)
  • Poběží v launcheru (ne jako samostatný proces) — launcher2 obsahuje celou logiku, aplikace je jen UI vrstva
  • Pracuje s daty AVAX aplikací i obecnými složkami z počítače

7.2 Dva pohledy

Pohled uživatele

S3 Backup — Moje zálohy

[Zařízení: PC kancelář ▾]          [Poslední sync: dnes 14:25 ✓]

Synchronizované složky:
  📁 Dokumenty/Faktury      15,4 GB  ████░  Synchronizováno  [↑↓] [...]
  📁 Dokumenty/Smlouvy       3,2 GB  █░░░░  Synchronizováno  [↑↓] [...]
  📁 Plocha                  0,8 GB  ░░░░░  Synchronizováno  [↑↓] [...]
  ──────────────────────────────────────────────────────────────
  [+ Přidat složku]

AVAX aplikace (automatické zálohy):
  [F] Fakturace Pro    Záloha: dnes 09:01  45 MB   ✓ OK
  [M] Mzdový systém    Záloha: dnes 09:05  32 MB   ✓ OK

Sdílené se mnou:
  📁 Projekt XYZ        od Novák s.r.o.  [Jen čtení]
  📁 HR dokumenty       firemní          [Čtení+zápis]

Pohled company_admin / company_owner

S3 Backup — Správa firmy

Přehled uživatelů:
  Uživatel          Zařízení  Zálohy      Úložiště   Stav
  ──────────────────────────────────────────────────────────
  Jan Novák         2         poslední: dnes   18,4 GB  ✓ OK
  Jana Krásná       3         poslední: dnes   14,1 GB  ✓ OK
  Petr Mlynář       1         poslední: včera   9,8 GB  ⚠ Upozornění

  [klik na uživatele → detail: zálohy, sdílení, zařízení, požadavky na smazání]

Čekající na schválení smazání: [2] ← badge
  → Petr Mlynář označil 24 souborů (1,2 GB)  [Zkontrolovat]
  → Jana Krásná označila 8 souborů (450 MB)   [Zkontrolovat]

Sdílené adresáře (firemní):
  📁 HR dokumenty       Účetní (čtení+zápis)  [Spravovat]
  📁 Celopodnikové      Všichni (čtení)        [Spravovat]
  [+ Nový firemní adresář]

7.3 AVAX aplikace a jejich zálohy

Každá distribuovaná AVAX aplikace zálohuje do speciální složky:

S3 klíč: companies/{cid}/users/{uid}/avax-apps/{app-slug}/
  ├── data/
  │   └── latest/     ← aktuální stav (sync target)
  │       └── db.sqlite, files/, ...
  ├── backups/
  │   └── {YYYY-MM-DD}/  ← denní snapshoty
  │       └── db.sqlite, files/, ...
  └── settings.json   ← nastavení aplikace

Aplikace neřeší zálohy sama — volá app.sync.request() přes SDK a launcher provede sync + snapshot.

7.4 Obecné složky (arbitrary backup)

Uživatel přidá libovolnou složku z počítače:

[+ Přidat složku] → dialog:

  Lokální cesta:  C:\Users\jan\Dokumenty\Faktury  [Procházet]
  Název:          Faktury
  Firma:          Novák s.r.o. ▾
  Sync mód:       ○ Sync (obousměrný)
                  ○ Backup only (jen nahrávat)
                  ○ Read-only (jen stahovat)
  Zařízení:       ☑ PC kancelář  ☑ Notebook doma
  Exkluzní:       *.tmp  *.log  (ignorovat tyto vzory)

  [Zahájit první sync]

7.5 Spuštění synchronizace

Triggery syncu:
  • Automaticky: každých N minut (nastavitelné: 5 / 15 / 30 / 60 min)
  • Při startu launcheru
  • Po spuštění AVAX aplikace (sync před spuštěním)
  • Po zavření AVAX aplikace (sync po zavření)
  • Manuálně: tlačítko [Synchronizovat nyní]
  • SDK: app.sync.request() z aplikace

Tray ikona signalizuje stav:
  Modrá (pulzující) = sync probíhá
  Zelená = vše OK
  Žlutá  = čeká se na sync (offline nebo throttle)
  Červená = chyba posledního syncu

8. API endpointy — S3 Backup

# Storage tokeny
GET  /storage/token?scope={scope}&[dir_id=]&[app_slug=]
GET  /storage/usage
GET  /storage/usage/company        → jen admin/owner

# Zařízení
GET  /storage/devices
POST /storage/devices              → registrace nového zařízení
PUT  /storage/devices/{id}         → přejmenování, deaktivace
DELETE /storage/devices/{id}

# Sync adresáře (vlastní i sledované)
GET  /storage/sync-dirs?device_id={id}
POST /storage/sync-dirs                    # own dir nebo subscribe (share_id)
PUT  /storage/sync-dirs/{id}
DELETE /storage/sync-dirs/{id}             # unsubscribe nebo odebrat vlastní

# Sledované složky
GET  /storage/shares/subscribed            # složky sdílené SE MNOU (kandidáti)
POST /storage/sync-dirs/subscribe          # přihlásit sledování: { share_id, local_path, device_id }

# Sdílení
GET  /storage/shares               → moje + sdílené se mnou
POST /storage/shares               → nové sdílení
GET  /storage/shares/{id}/access
POST /storage/shares/{id}/access
DELETE /storage/shares/{id}/access/{aid}

# Shareable linky
POST /storage/share-links          → vytvořit link
GET  /storage/share-links          → moje linky
DELETE /storage/share-links/{id}
GET  /storage/share/{token}        → veřejné stažení (bez auth)

# Mazání
GET  /storage/deletion-requests    → čekající na schválení (admin/owner)
POST /storage/deletion-requests    → označit ke smazání
POST /storage/deletion-requests/{id}/approve  → owner schválí
POST /storage/deletion-requests/{id}/reject
POST /storage/deletion-requests/{id}/cancel   → zrušit do konce lhůty

# Cross-firma (sdílení)
GET  /storage/company-search?q={name_or_ico}  → hledání firem na platformě

9. S3 bucket struktura — finální

s3://avaxis/
├── companies/
│   └── {company-id}/
│       ├── users/
│       │   └── {user-id}/
│       │       ├── identity.json              ← GDPR
│       │       ├── license.jwt
│       │       ├── avax-apps/
│       │       │   └── {app-slug}/
│       │       │       ├── data/latest/       ← sync target AVAX aplikací
│       │       │       ├── backups/           ← denní snapshoty
│       │       │       └── settings.json
│       │       └── sync/
│       │           └── {dir-label}/           ← obecné složky uživatele
│       │               ├── .manifest.json     ← sync metadata
│       │               ├── {soubory...}       ← aktuální stav
│       │               └── history/           ← verze před přepisem
│       │                   └── YYYY-MM-DD/
│       │
│       └── shared/
│           ├── company/                       ← firemní adresáře (admin)
│           │   └── {share-label}/
│           └── cross/                         ← cross-firma sdílení (read-only pro příjemce)
│               └── {share-id}/
└── apps/                                      ← katalog aplikací
    └── catalog/{app-slug}/...

10. Implementační fáze

Fáze Co Závislost
DB-01 Migrace: user_company_memberships, user_devices, device_sync_dirs F1 hotovo
DB-02 Migrace: storage_shares, storage_share_access, storage_share_links, storage_deletion_requests DB-01
BE-01 /storage/token + STS politiky (MinIO AssumeRole) DB-01
BE-02 /storage/devices CRUD DB-01
BE-03 /storage/shares + ACL + cross-firma DB-02
BE-04 /storage/deletion-requests flow DB-02
BE-05 /storage/share-links veřejné stahování DB-02
L-01 Launcher: context switcher (multi-firma) BE-01
L-02 S3 Backup obrazovka — uživatelský pohled BE-01, BE-02
L-03 S3 Backup obrazovka — admin pohled BE-01, BE-03, BE-04
L-04 Sync agent: smart sync, device sync dirs BE-01, BE-02
L-05 Full restore, conflict handling L-04
L-06 Shareable linky, cross-firma sdílení BE-03, BE-05

11. Otevřené otázky

Otázka Doporučení Stav
MinIO STS AssumeRole — funguje na našem stacku? Ověřit na avaxdev; alternativa: presigned URL s condition keys
Multi-firma login — přihlašuje se uživatel vždy do "výchozí" firmy, nebo vybírá? Doporučuji: výchozí = poslední použitá firma
Owner approval timeout — co pokud owner 14 dní nereaguje? Reminder e-mail + eskalace na super_admin, nebo auto-zamítnutí
Cross-firma sdílení — obě firmy musí být na platformě? Ano — pro anonymní přístup slouží shareable link rozhodnuto ✓
Šifrování — sdílené adresáře cross-firma šifrovat E2E? Doporučuji AES-256 SSE-S3 pro standard, E2E jen Premium
Sloučená knihovna — výchozí stav zapnuto nebo vypnuto? Doporučuji: výchozí vypnuto, uživatel zapne

Vytvořeno: 2026-04-26 | Verze: 1.0 Navazuje na: auth-organization.md, sync-backup.md, user-data-sharing.md, s3development.md