npm package: @rodrigofroes/minio-client
Description: Uma biblioteca npm para upload de imagens usando MinIO/S3 que retorna o link de acesso
Author: Rodrigo
Latest version: 2.0.3

# MinIO Client

Uma biblioteca npm simples e eficiente para upload de imagens usando MinIO/S3 que retorna o link de acesso.

## 🚀 Recursos

- ✅ Upload de imagens para MinIO/S3
- ✅ Validação de tipos de arquivo de imagem
- ✅ Validação de tamanho máximo
- ✅ Suporte para Node.js (Buffer, caminho de arquivo) e Browser (File object)
- ✅ Geração automática de nomes únicos
- ✅ URLs assinadas com expiração configurável
- ✅ TypeScript com tipagem completa
- ✅ Metadados personalizáveis

## 📦 Instalação

```bash
npm install @rodrigofroes/minio-client
```

## 🔧 Configuração

Primeiro, configure suas credenciais do MinIO/S3:

```typescript
import { MinioConfig } from "@rodrigofroes/minio-client";

const minioConfig: MinioConfig = {
  endPoint: "localhost", // ou seu endpoint S3/MinIO
  port: 9000,
  accessKey: "your-access-key",
  secretKey: "your-secret-key",
  useSSL: false, // true para HTTPS
  region: "us-east-1", // opcional
};
```

## 📝 Uso

### Upload Simples

```typescript
import { ImageUploader, uploadImage } from "@rodrigofroes/minio-client";

// Usando a classe ImageUploader
const uploader = new ImageUploader(minioConfig);

const result = await uploader.uploadImage({
  bucketName: "my-images",
  file: "/path/to/image.jpg", // ou Buffer, ou File object
});

console.log("URL da imagem:", result.url);
console.log("Nome do objeto:", result.objectName);
console.log("Tamanho:", result.size);

// Ou usando a função de conveniência
const result2 = await uploadImage(minioConfig, {
  bucketName: "my-images",
  file: imageBuffer,
  maxSizeInMB: 5, // Tamanho máximo de 5MB
});
```

### Upload no Browser

```javascript
// HTML
<input type="file" id="imageInput" accept="image/*" />
<button onclick="uploadImage()">Upload</button>

// JavaScript
async function uploadImage() {
  const fileInput = document.getElementById('imageInput');
  const file = fileInput.files[0];

  if (!file) {
    alert('Selecione uma imagem');
    return;
  }

  try {
    const result = await uploadImage(minioConfig, {
      bucketName: 'user-images',
      file: file,
      maxSizeInMB: 10
    });

    console.log('Upload realizado com sucesso!');
    console.log('URL:', result.url);
  } catch (error) {
    console.error('Erro no upload:', error.message);
  }
}
```

### Upload com Metadados Personalizados

```typescript
const result = await uploader.uploadImage({
  bucketName: "my-images",
  file: imageBuffer,
  objectName: "profile-picture.jpg", // Nome personalizado
  contentType: "image/jpeg",
  metadata: {
    "user-id": "12345",
    "upload-source": "mobile-app",
    "image-category": "profile",
  },
  maxSizeInMB: 2,
});
```

### Gerenciamento de URLs

```typescript
// Gerar URL com expiração personalizada (padrão: 24 horas)
const url = await uploader.getImageUrl("my-images", "image.jpg", 3600); // 1 hora

// Remover imagem
await uploader.removeImage("my-images", "image.jpg");
```

## 🎯 Tipos de Arquivo Suportados

- `.jpg` / `.jpeg` - JPEG
- `.png` - PNG
- `.gif` - GIF
- `.webp` - WebP
- `.bmp` - BMP
- `.svg` - SVG

## ⚙️ Opções de Configuração

### MinioConfig

| Propriedade   | Tipo    | Obrigatório | Descrição                 |
| ------------- | ------- | ------------ | --------------------------- |
| `endPoint`  | string  | ✅           | Endpoint do MinIO/S3        |
| `port`      | number  | ✅           | Porta do serviço           |
| `accessKey` | string  | ✅           | Chave de acesso             |
| `secretKey` | string  | ✅           | Chave secreta               |
| `useSSL`    | boolean | ❌           | Usar HTTPS (padrão: false) |
| `region`    | string  | ❌           | Região do bucket           |

### UploadOptions

| Propriedade     | Tipo                    | Obrigatório | Descrição                                            |
| --------------- | ----------------------- | ------------ | ------------------------------------------------------ |
| `bucketName`  | string                  | ✅           | Nome do bucket                                         |
| `file`        | Buffer\| File \| string | ✅           | Arquivo para upload                                    |
| `objectName`  | string                  | ❌           | Nome personalizado (gerado automaticamente se omitido) |
| `contentType` | string                  | ❌           | Tipo MIME (detectado automaticamente)                  |
| `metadata`    | object                  | ❌           | Metadados personalizados                               |
| `maxSizeInMB` | number                  | ❌           | Tamanho máximo em MB (padrão: 10)                    |

## 🛠️ Desenvolvimento

```bash
# Instalar dependências
npm install

# Compilar
npm run build

# Desenvolvimento com watch
npm run dev

# Limpar arquivos compilados
npm run clean
```

## 📄 Licença

MIT

## 🤝 Contribuindo

Contribuições são bem-vindas! Abra uma issue ou envie um pull request.

## 📞 Suporte

Se você encontrar algum problema ou tiver dúvidas, abra uma issue no GitHub.