# Desktop (Tauri) - Sincronizacao RustDesk com Backend

Este documento descreve o mecanismo de sincronizacao automatica do RustDesk com o backend apos o provisionamento no aplicativo desktop.

## Visao Geral

O fluxo de sincronizacao do RustDesk garante que as credenciais de acesso remoto (ID e senha) sejam automaticamente registradas no backend assim que o RustDesk for provisionado na maquina. Isso elimina a necessidade de cadastro manual e permite acesso remoto imediato.

## Arquitetura

### Fluxo de Provisionamento

```
1. Usuario clica "Registrar" no app desktop
2. TypeScript faz POST /api/machines/register
3. TypeScript salva token/config no store local
4. TypeScript inicia RustDesk em background (fire-and-forget)
5. TypeScript redireciona IMEDIATAMENTE para o sistema
6. [Background] Rust provisiona RustDesk (~30s)
7. [Background] Rust faz POST /api/machines/remote-access (SYNC)
8. [Background] Rust atualiza lastSyncedAt no store
```

### Por que o Sync e feito no Rust?

| Problema anterior | Solucao Rust |
|-------------------|--------------|
| CSP do Tauri bloqueava `fetch()` | Rust usa reqwest diretamente, sem CSP |
| Race conditions com React state | Fluxo sincrono no Rust |
| Fire-and-forget nao completava | Sync acontece antes do return |
| Timeout do navegador | Rust tem controle total do HTTP |

## Implementacao

### Arquivo: `apps/desktop/src-tauri/src/rustdesk.rs`

O sync e executado automaticamente apos o provisionamento bem-sucedido:

```rust
// Apos salvar dados do RustDesk no store local
sync_remote_access_with_backend(&result)?;
```

### Payload da API

```json
{
  "machineToken": "<token-da-maquina>",
  "provider": "RustDesk",
  "identifier": "<id-do-rustdesk>",
  "password": "<senha-permanente>",
  "notes": "Versao: 1.4.4. Provisionado em: 1765045637482"
}
```

### Headers

- `Content-Type: application/json`
- `Idempotency-Key: <machineId>:RustDesk:<rustdeskId>` (previne duplicatas)

### Endpoint

```
POST /api/machines/remote-access
```

## Arquivos de Configuracao

### Store Local

Caminho: `%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json`

Estrutura relevante:
```json
{
  "config": {
    "machineId": "...",
    "apiBaseUrl": "https://tickets.esdrasrenan.com.br"
  },
  "token": "...",
  "rustdesk": {
    "id": "497869711",
    "password": "...",
    "installedVersion": "1.4.4",
    "lastProvisionedAt": 1765045637482,
    "lastSyncedAt": 1765045638173,
    "lastError": null
  }
}
```

### Logs

Caminho: `%LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\logs\rustdesk.log`

Mensagens de sucesso:
```
[...] Iniciando sincronizacao com backend...
[...] Sync com backend OK: status 200 OK
[...] Acesso remoto sincronizado com backend
```

## Diagnostico

### Verificar se o Sync Funcionou

1. Abrir `machine-agent.json`:
   ```
   %LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\machine-agent.json
   ```

2. Verificar campo `rustdesk.lastSyncedAt`:
   - Se tem valor numerico: sync OK
   - Se `null`: sync falhou

3. Verificar logs:
   ```
   %LOCALAPPDATA%\br.com.esdrasrenan.sistemadechamados\logs\rustdesk.log
   ```

### Possiveis Erros

| Erro | Causa | Solucao |
|------|-------|---------|
| `400 Bad Request` | Payload incorreto | Verificar schema da API |
| `401 Unauthorized` | Token invalido/expirado | Re-registrar maquina |
| `Connection refused` | Backend indisponivel | Verificar URL da API |
| `lastSyncedAt: null` | Sync nao executou | Verificar logs do Rust |

### Fallback Manual

Se o sync automatico falhar, o sistema tenta novamente a cada 30 segundos em background. Tambem e possivel forcar o re-provisionamento via:

1. Aba "Configuracoes" no app desktop
2. Clicar "Reprovisionar RustDesk"

## Historico de Mudancas

### Dezembro 2025 - Migracao do Sync para Rust

**Problema:** O sync feito em TypeScript (`fetch()`) falhava com "Failed to fetch" devido ao CSP do Tauri v2 bloquear requisicoes externas do webview.

**Solucao:** Mover o sync para o Rust, que faz HTTP diretamente via reqwest sem restricoes de CSP.

**Arquivos modificados:**
- `apps/desktop/src-tauri/src/rustdesk.rs` - Adicionado `sync_remote_access_with_backend()`
- `apps/desktop/src/main.tsx` - Simplificado para fire-and-forget

---

Ultima atualizacao: Dezembro 2025 - Sync automatico via Rust apos provisionamento.
