# PSMinIO

A comprehensive PowerShell module for MinIO object storage operations, built on the official [Minio .NET SDK](https://www.nuget.org/packages/Minio). Provides full-featured object storage management with enterprise-grade capabilities.

## Features

- **🚀 High Performance**: Built for .NET Standard 2.0, compatible with PowerShell 5.1+ and PowerShell 7+
- **📦 Complete Object Management**: Upload, download, list, and delete objects with advanced filtering and sorting
- **🗂️ Flexible Directory Support**: Create nested folder structures with automatic directory creation
- **⚡ Chunked Operations**: Large file uploads and downloads with resume capability and progress tracking
- **🔒 Security & Policy Management**: Comprehensive bucket policy and access control management
- **📊 Advanced Object Listing**: Filter by prefix, sort by multiple criteria, limit results, and exclude directories
- **⏱️ Timing & Performance Metrics**: Detailed timing information and transfer speed reporting
- **🔄 Progress Reporting**: Multi-layer progress tracking for file collections and chunked operations
- **📝 Professional Logging**: Clean, timestamped logging with configurable verbosity levels
- **🛡️ Robust Error Handling**: Graceful handling of network issues and edge cases

## Installation

### From PowerShell Gallery
```powershell
# Install from PowerShell Gallery
Install-Module -Name PSMinIO -Scope CurrentUser

# Import the module
Import-Module PSMinIO
```

### From Source
```powershell
# Clone the repository
git clone https://github.com/Grace-Solutions/PSMinIO.git
cd PSMinIO

# Build the module (automatically updates version)
.\scripts\Build.ps1

# Import the module
Import-Module .\Module\PSMinIO\PSMinIO.psd1
```

### Direct Import
```powershell
# Import from local path
Import-Module .\Module\PSMinIO\PSMinIO.psd1
```

## Quick Start

```powershell
# Connect to MinIO server
$connection = Connect-MinIO -Endpoint "https://minio.example.com" -AccessKey "your-access-key" -SecretKey "your-secret-key"

# Create a bucket
New-MinIOBucket -BucketName 'my-data-bucket' -Verbose

# Upload files with automatic directory creation
New-MinIOObject -BucketName 'my-data-bucket' -Files "document.pdf" -BucketDirectory "documents/2025/january"

# List objects with advanced filtering
Get-MinIOObject -BucketName 'my-data-bucket' -Prefix "documents/" -SortBy "Size" -Descending -MaxObjects 10

# Download with timing information
Get-MinIOObjectContent -BucketName 'my-data-bucket' -ObjectName 'documents/2025/january/document.pdf' -FilePath 'C:\Downloads\document.pdf'

# Chunked upload for large files
New-MinIOObjectChunked -BucketName 'my-data-bucket' -Files "large-video.mp4" -ChunkSize 10MB -BucketDirectory "media/videos"
```

## Available Cmdlets

### Connection Management
- **`Connect-MinIO`** - Establish connection to MinIO server with SSL support and certificate validation options

### Bucket Operations
- **`Get-MinIOBucket`** - List all buckets with optional statistics
- **`New-MinIOBucket`** - Create new buckets with region support
- **`Remove-MinIOBucket`** - Delete buckets with safety confirmations
- **`Test-MinIOBucketExists`** - Check bucket existence

### Object Operations
- **`Get-MinIOObject`** - Advanced object listing with filtering, sorting, and pagination
  - Filter by prefix or exact object name
  - Sort by Name, Size, LastModified, or ETag (ascending/descending)
  - Limit results with MaxObjects
  - Exclude directories with ObjectsOnly
- **`New-MinIOObject`** - Upload files with directory support
  - Single file or multiple file uploads
  - Automatic nested directory creation
  - Progress tracking and timing information
- **`New-MinIOObjectChunked`** - Chunked uploads for large files
  - Configurable chunk sizes (1MB minimum)
  - Resume capability and multi-layer progress tracking
  - Automatic directory creation
- **`Get-MinIOObjectContent`** - Download objects with progress tracking
- **`Get-MinIOObjectContentChunked`** - Chunked downloads for large files
- **`Remove-MinIOObject`** - Delete objects with confirmation prompts
- **`New-MinIOFolder`** - Create folder structures in buckets

### Security & Policy Management
- **`Get-MinIOBucketPolicy`** - Retrieve bucket access policies
- **`Set-MinIOBucketPolicy`** - Configure bucket access policies

### Monitoring & Statistics
- **`Get-MinIOStats`** - Comprehensive server and bucket statistics with object counting limits

## Key Features in Detail

### 🗂️ Advanced Directory Support
- **Nested Folder Creation**: Automatically create multi-level directory structures (e.g., `documents/2025/january/reports`)
- **BucketDirectory Parameter**: Specify target directories for uploads without manual folder creation
- **Clean Directory Handling**: Non-critical directory creation attempts with graceful fallback

### ⚡ Chunked Operations
- **Large File Support**: Handle files of any size with configurable chunk sizes
- **Resume Capability**: Interrupted transfers can be resumed (future enhancement)
- **Multi-Layer Progress**: Track collection progress, file progress, and chunk progress simultaneously
- **Performance Optimization**: Optimal chunk sizes for different network conditions

### 📊 Enhanced Object Listing
```powershell
# Advanced filtering and sorting examples
Get-MinIOObject -BucketName "data" -Prefix "logs/" -SortBy "LastModified" -Descending -MaxObjects 50
Get-MinIOObject -BucketName "media" -ObjectsOnly -SortBy "Size" -Descending
Get-MinIOObject -BucketName "docs" -ObjectName "specific-file.pdf"
```

### ⏱️ Performance Metrics
All operations provide detailed timing information:
- **Duration**: Precise operation timing
- **Transfer Speed**: Formatted speed reporting (B/s, KB/s, MB/s, GB/s, TB/s)
- **Progress Tracking**: Real-time progress updates during transfers

## Examples

See the [scripts/examples](./scripts/examples/) directory for comprehensive usage examples:
- **Basic Operations**: Connection, bucket management, simple uploads/downloads
- **Advanced Scenarios**: Chunked transfers, directory management, bulk operations
- **Enterprise Patterns**: Policy management, monitoring, and automation scripts

## Requirements

- **PowerShell**: 5.1+ or PowerShell 7+
- **.NET Framework**: 4.7.2+ (for PowerShell 5.1) or .NET Core/.NET 5+ (for PowerShell 7+)
- **MinIO Server**: Compatible with MinIO and Amazon S3 APIs

## Contributing

1. Fork the repository
2. Create a feature branch (`git checkout -b feature/amazing-feature`)
3. Commit your changes (`git commit -m 'Add amazing feature'`)
4. Push to the branch (`git push origin feature/amazing-feature`)
5. Open a Pull Request

## License

This project is licensed under the GNU General Public License v3.0 - see the [LICENSE](LICENSE) file for details.

## Support

- 📖 **Documentation**: See [docs/USAGE.md](docs/USAGE.md) for detailed usage instructions
- 🐛 **Issues**: Report bugs and request features via GitHub Issues
- 💬 **Discussions**: Join the community discussions for questions and tips