# Redis Package

This package provides Redis client functionality for the Tender Management system, specifically designed for token blacklisting and caching operations.

## Features

- **Connection Management**: Handles Redis client connections with proper error handling
- **Interface-based Design**: Uses interfaces for easy testing and mocking
- **Configuration Support**: Supports Redis configuration from environment variables
- **Connection Testing**: Validates connections on startup
- **Resource Cleanup**: Proper connection closing and cleanup

## Usage

### Basic Setup

```go
import "tm/pkg/redis"

// Create Redis configuration
config := &redis.Config{
    Host:     "localhost",
    Port:     6379,
    Password: "password",
    DB:       0,
    PoolSize: 10,
}

// Create Redis client
client, err := redis.NewClient(config, logger)
if err != nil {
    log.Fatal(err)
}
defer client.Close()

// Use the client
err = client.Set(ctx, "key", "value", time.Hour)
```

### Token Blacklisting

The Redis client is primarily used for JWT token blacklisting:

```go
// Add token to blacklist
err = client.Set(ctx, "blacklist:token_hash", "1", tokenExpiration)

// Check if token is blacklisted
exists, err := client.Exists(ctx, "blacklist:token_hash")
if err != nil {
    // Handle error
}
if exists > 0 {
    // Token is blacklisted
}
```

## Configuration

The Redis configuration supports the following fields:

- `Host`: Redis server hostname (default: localhost)
- `Port`: Redis server port (default: 6379)
- `Password`: Redis authentication password
- `DB`: Redis database number (default: 0)
- `PoolSize`: Connection pool size (default: 10)

## Environment Variables

The configuration can be loaded from environment variables:

- `TM_CACHE_REDIS_HOST`
- `TM_CACHE_REDIS_PORT`
- `TM_CACHE_REDIS_PASSWORD`
- `TM_CACHE_REDIS_DB`
- `TM_CACHE_REDIS_POOL_SIZE`

## Error Handling

The package provides comprehensive error handling:

- Connection failures are logged with context
- All Redis operations return proper errors
- Connection timeouts are handled gracefully
- Resource cleanup is guaranteed with defer statements

## Testing

The interface-based design makes it easy to mock Redis operations in tests:

```go
type MockRedisClient struct {
    // Implement the Client interface
}

// Use in tests
client := &MockRedisClient{}
```

## Dependencies

- `github.com/redis/go-redis/v9`: Redis client library
- `tm/pkg/logger`: Logging interface 