# mfe-user - Pipeline Multi-Cloud

## Visão Geral

O repositório `mfe-user` possui uma pipeline unificada que suporta deploy para **AWS** e **OCI** (Oracle Cloud Infrastructure).

**Localização**: `C:\dev\C:devrepos_mfe\mfe-user\azure-pipelines.yml`

**Branch**: `devops`

---

## Como Executar a Pipeline

### Opção 1: Push na branch devops

```bash
cd mfe-user
git checkout devops
# fazer alterações
git add .
git commit -m "sua mensagem"
git push origin devops
```

A pipeline dispara automaticamente.

### Opção 2: Executar manualmente

1. Acesse Azure DevOps → Pipelines
2. Selecione `mfe-user`
3. Clique em **Run pipeline**
4. Selecione branch `devops`
5. Escolha `cloudProvider`:
   - `aws` → Deploy AWS S3
   - `oci` → Deploy OCI Object Storage + API Gateway
   - `both` → Ambos

---

## Fluxo da Pipeline

### Diagrama Completo

```
┌──────────────────────────────────────────────────────────────┐
│  TRIGGER: Push na branch 'devops'                            │
└──────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌──────────────────────────────────────────────────────────────┐
│  PARÂMETRO: cloudProvider                                     │
│  ├── aws (padrão)                                            │
│  ├── oci                                                     │
│  └── both                                                    │
└──────────────────────────────────────────────────────────────┘
                              │
                              ▼
┌──────────────────────────────────────────────────────────────┐
│  STAGE 1: BUILD (sempre executa)                             │
│  ├── Node.js 20.x                                            │
│  ├── npm ci                                                  │
│  ├── npm run build:dev                                       │
│  └── Publica artefato 'dist'                                 │
└──────────────────────────────────────────────────────────────┘
                              │
              ┌───────────────┴───────────────┐
              ▼                               ▼
┌─────────────────────────┐     ┌─────────────────────────────┐
│  DEPLOY_AWS             │     │  UPLOADTOOCI                │
│  (se aws ou both)       │     │  (se oci ou both)           │
│  ├── Download artefato  │     │  ├── Instala OCI CLI        │
│  ├── Sync S3            │     │  ├── Cria bucket            │
│  └── Purge Cloudflare   │     │  └── Upload arquivos        │
└─────────────────────────┘     └─────────────────────────────┘
                                              │
                                              ▼
                                ┌─────────────────────────────┐
                                │  CREATEPAR                  │
                                │  ├── Deleta PAR antigo      │
                                │  └── Cria novo PAR (1 ano)  │
                                └─────────────────────────────┘
                                              │
                                              ▼
                                ┌─────────────────────────────┐
                                │  DEPLOYTOAPIGATEWAY         │
                                │  ├── Cria gateway           │
                                │  └── Cria deployment        │
                                └─────────────────────────────┘
```

---

## O que é Criado na OCI

### 1. Bucket (Object Storage)

| Propriedade | Valor |
|-------------|-------|
| Nome | `mfe-user-dev` |
| Namespace | `grbb7qzeuoag` |
| Compartment | Dev (`ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a`) |
| Storage Tier | Standard |

### 2. Pre-Authenticated Request (PAR)

| Propriedade | Valor |
|-------------|-------|
| Nome | `mfe-user-dev-par` |
| Access Type | ObjectRead |
| Validade | 1 ano (31536000 segundos) |

O PAR permite que o API Gateway acesse os arquivos do bucket sem autenticação.

### 3. API Gateway

| Propriedade | Valor |
|-------------|-------|
| Nome | `mfe-user-gateway` |
| Endpoint Type | PUBLIC |
| Subnet | `sbn-lb-1` (`ocid1.subnet.oc1.sa-saopaulo-1.aaaaaaaa2ezw57uocis6s2eioypdsnt2p4pwm4fwnjz5jdaqigrm6jaqexeq`) |
| Compartment | Dev |

### 4. API Gateway Deployment

| Propriedade | Valor |
|-------------|-------|
| Nome | `mfe-user-deployment` |
| Path Prefix | `/` |
| Authentication | Anonymous |
| Rota | `/{req.*}` → GET → PAR URL |

---

## Resultado Final

### URL de Acesso

Após o deploy bem-sucedido, o MFE estará disponível em:

```
https://<gateway-ocid>.apigateway.sa-saopaulo-1.oci.customer-oci.com/
```

### Como Obter a URL

```bash
oci api-gateway gateway list \
  --compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a"
```

Ou verificar no console OCI:
1. Acesse OCI Console
2. Developer Services → API Gateway
3. Selecione `mfe-user-gateway`
4. Copie o **Hostname**

---

## Pré-requisitos (Variable Groups)

### aws-credentials-dev

| Variável | Descrição |
|----------|-----------|
| `AWS_ACCESS_KEY_ID` | Access Key AWS |
| `AWS_SECRET_ACCESS_KEY` | Secret Key AWS |
| `AWS_REGION` | Região (ex: us-east-1) |
| `CLOUDFLARE_ZONE_ID` | Zone ID Cloudflare |
| `CLOUDFLARE_API_TOKEN` | Token Cloudflare |

### oci-terraform

| Variável | Descrição | Valor Exemplo |
|----------|-----------|---------------|
| `OCI_TENANCY_OCID` | OCID da Tenancy | `ocid1.tenancy.oc1..xxx` |
| `OCI_USER_OCID` | OCID do Usuário | `ocid1.user.oc1..xxx` |
| `OCI_FINGERPRINT` | Fingerprint da chave | `xx:xx:xx:xx:...` |
| `OCI_PRIVATE_KEY_B64` | Chave privada (base64) | (secret) |
| `OCI_REGION` | Região OCI | `sa-saopaulo-1` |
| `COMPARTMENT_PARENT_OCID` | Compartment Dev | `ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a` |
| `OCI_SUBNET_OCID` | Subnet para API Gateway | `ocid1.subnet.oc1.sa-saopaulo-1.aaaaaaaa2ezw57uocis6s2eioypdsnt2p4pwm4fwnjz5jdaqigrm6jaqexeq` |

### mfe-credentials

| Variável | Descrição |
|----------|-----------|
| (variáveis específicas do MFE) | |

---

## Comparação: AWS vs OCI

| Aspecto | AWS | OCI |
|---------|-----|-----|
| Armazenamento | S3 Bucket | Object Storage Bucket |
| CDN/Proxy | CloudFront (opcional) | API Gateway |
| Cache | Cloudflare | - |
| Autenticação | AWS Access Key | OCI API Key |
| URL Final | S3 URL ou CloudFront | API Gateway URL |
| Custo | ~$0.023/GB + requests | ~$0.0255/GB + API Gateway |

---

## Troubleshooting

### O que acontece se disparar a pipeline sem infraestrutura?

#### Recursos Criados Automaticamente

| Recurso | Se não existir | Comportamento |
|---------|----------------|---------------|
| Bucket | ✅ Pipeline cria | `oci os bucket create` funciona |
| PAR | ✅ Pipeline cria | Cria automaticamente |
| API Gateway | ✅ Pipeline cria | Funciona SE subnet existir |
| Deployment | ✅ Pipeline cria | Funciona SE gateway existir |

#### Recursos que DEVEM Existir

| Recurso | Obrigatório | Motivo |
|---------|-------------|--------|
| VCN | ✅ Sim | API Gateway precisa de rede |
| Subnet | ✅ Sim | API Gateway precisa de subnet |
| Variable `OCI_SUBNET_OCID` | ✅ Sim | Pipeline precisa saber qual subnet usar |

#### Fluxo de Execução sem Infraestrutura

```
┌─────────────┐
│   BUILD     │ → ✅ Sempre funciona
└─────────────┘
      │
      ▼
┌─────────────┐
│  UPLOADTOOCI│ → ✅ Cria bucket automaticamente
│             │    (se não existir)
└─────────────┘
      │
      ▼
┌─────────────┐
│  CREATEPAR  │ → ✅ Cria PAR automaticamente
└─────────────┘
      │
      ▼
┌─────────────┐
│  DEPLOY API │ → ❌ FALHA se:
│  GATEWAY    │    • OCI_SUBNET_OCID não configurado
│             │    • Subnet não existe
│             │    • VCN não existe
└─────────────┘
```

#### Erros Comuns

| Erro | Causa | Solução |
|------|-------|---------|
| `Variable OCI_SUBNET_OCID not found` | Variável não configurada | Adicionar no Variable Group `oci-terraform` |
| `Subnet not found` | OCID inválido ou subnet não existe | Verificar OCID da subnet |
| `VCN not found` | VCN não existe | Criar VCN via Terraform |
| `NotAuthorizedOrNotFound` | Permissões insuficientes | Verificar políticas OCI |

#### Cenário: Disparar sem OCI_SUBNET_OCID

**Resultado**:
- ✅ Bucket `mfe-user-dev` será criado
- ✅ PAR será criado
- ❌ API Gateway falhará
- ❌ Deployment não será criado

**Como recuperar**:
1. Adicionar `OCI_SUBNET_OCID` no Variable Group
2. Reexecutar a pipeline
3. API Gateway será criado

#### Cenário: Subnet Não Existe

**Resultado**:
- ✅ Bucket criado
- ✅ PAR criado
- ❌ API Gateway falha com erro de subnet

**Como recuperar**:
1. Criar subnet via Terraform ou Console OCI
2. Atualizar `OCI_SUBNET_OCID` com novo OCID
3. Reexecutar pipeline

### Pipeline falha no Build

| Erro | Solução |
|------|---------|
| `npm ci` falha | Verificar `package-lock.json` |
| `npm run build:dev` falha | Verificar script no `package.json` |
| Artefato vazio | Verificar se `dist/` foi gerado |

### Pipeline falha no Upload OCI

| Erro | Solução |
|------|---------|
| `OCI_PRIVATE_KEY_B64` inválido | Regenerar chave e atualizar Variable Group |
| `Authentication failed` | Verificar fingerprint e user OCID |
| `Compartment not found` | Verificar `COMPARTMENT_PARENT_OCID` |

### Pipeline falha no API Gateway

| Erro | Solução |
|------|---------|
| `OCI_SUBNET_OCID` não configurado | Adicionar variável no Variable Group |
| `Subnet not found` | Verificar se subnet existe |
| `Quota exceeded` | Verificar limites da tenancy |

### MFE não carrega no navegador

| Erro | Solução |
|------|---------|
| 403 Forbidden | PAR expirou, reexecutar pipeline |
| 404 Not Found | Verificar rotas do deployment |
| Arquivos JS não carregam | Verificar Content-Type no bucket |

---

## Comandos Úteis

### Verificar recursos OCI

```bash
# Listar buckets
oci os bucket list --compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a"

# Listar objetos no bucket
oci os object list --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev"

# Listar API Gateways
oci api-gateway gateway list --compartment-id "ocid1.compartment.oc1..aaaaaaaa76x3nykkjwvctpr6px34dysu3pbg7p62h2r65fegt7fvbrioll3a"

# Ver deployment
oci api-gateway deployment list --gateway-id "<gateway-id>"

# Listar PARs
oci os preauth-request list --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev"
```

### Deletar recursos (se necessário)

```bash
# Deletar PAR
oci os preauth-request delete --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev" --par-id "<par-id>"

# Deletar bucket (vazio)
oci os bucket delete --namespace-name "grbb7qzeuoag" --bucket-name "mfe-user-dev"

# Deletar deployment
oci api-gateway deployment delete --deployment-id "<deployment-id>"

# Deletar gateway
oci api-gateway gateway delete --gateway-id "<gateway-id>"
```

---

## Referências

- [OCI-MFE-TASKS.md](./OCI-MFE-TASKS.md) - Checklist de atividades
- [OCI-MFE-STEPBYSTEP.md](./OCI-MFE-STEPBYSTEP.md) - Passo a passo
- [OCI-API-GATEWAY.md](./OCI-API-GATEWAY.md) - Configuração API Gateway
- [Oracle Documentation](https://docs.oracle.com/en/learn/oci-api-gateway-web-hosting/index.html)
