npm package: @noukha-technologies/aws-store
Description: AWS Store functionality for S3, DynamoDB, and other AWS services integration
Author: Noukha
Latest version: 1.0.3

# @noukha-technologies/aws-store

A comprehensive AWS integration package for NestJS applications, providing easy-to-use services for S3 and DynamoDB operations.

## Features

- **S3 Service**: Upload, download, delete files and generate presigned URLs
- **DynamoDB Service**: Full CRUD operations with query and scan capabilities
- **TypeScript Support**: Full type safety with comprehensive interfaces
- **NestJS Integration**: Seamless integration with NestJS dependency injection
- **Configurable**: Support for different AWS regions and credentials

## Installation

```bash
npm install @noukha-technologies/aws-store
```

## Quick Start

### 1. Import the Module

```typescript
import { Module } from '@nestjs/common';
import { AwsStoreModule } from '@noukha-technologies/aws-store';

@Module({
  imports: [
    AwsStoreModule.forRoot({
      region: 'us-east-1',
      accessKeyId: 'your-access-key',
      secretAccessKey: 'your-secret-key',
      s3: {
        bucketName: 'your-bucket-name',
      },
      dynamodb: {
        tableName: 'your-table-name',
      },
    }),
  ],
})
export class AppModule {}
```

### 2. Use S3 Service

```typescript
import { Injectable } from '@nestjs/common';
import { S3Service } from '@noukha-technologies/aws-store';

@Injectable()
export class FileService {
  constructor(private readonly s3Service: S3Service) {}

  async uploadFile(key: string, file: Buffer) {
    return await this.s3Service.upload({
      key,
      body: file,
      contentType: 'image/jpeg',
    });
  }

  async downloadFile(key: string) {
    return await this.s3Service.download({ key });
  }

  async getPresignedUrl(key: string) {
    return await this.s3Service.getPresignedUrl({
      key,
      operation: 'getObject',
      expiresIn: 3600,
    });
  }
}
```

### 3. Use DynamoDB Service

```typescript
import { Injectable } from '@nestjs/common';
import { DynamoDBService } from '@noukha-technologies/aws-store';

@Injectable()
export class DataService {
  constructor(private readonly dynamoService: DynamoDBService) {}

  async createItem(item: any) {
    return await this.dynamoService.put({
      item,
    });
  }

  async getItem(key: any) {
    return await this.dynamoService.get({ key });
  }

  async queryItems(condition: string, values: any) {
    return await this.dynamoService.query({
      keyConditionExpression: condition,
      expressionAttributeValues: values,
    });
  }
}
```

## Configuration

### Environment Variables

You can also configure the module using environment variables:

```typescript
AwsStoreModule.forRootAsync({
  useFactory: () => ({
    region: process.env.AWS_REGION,
    accessKeyId: process.env.AWS_ACCESS_KEY_ID,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
    s3: {
      bucketName: process.env.S3_BUCKET_NAME,
    },
    dynamodb: {
      tableName: process.env.DYNAMODB_TABLE_NAME,
    },
  }),
}),
```

## API Reference

### S3Service

- `upload(options: S3UploadOptions): Promise<S3UploadResult>`
- `download(options: S3DownloadOptions): Promise<Buffer>`
- `delete(options: S3DeleteOptions): Promise<void>`
- `getPresignedUrl(options: S3PresignedUrlOptions): Promise<string>`

### DynamoDBService

- `put(options: DynamoDBPutOptions): Promise<DynamoDBItem>`
- `get(options: DynamoDBGetOptions): Promise<DynamoDBItem | null>`
- `query(options: DynamoDBQueryOptions): Promise<{items: DynamoDBItem[], lastEvaluatedKey?: any}>`
- `scan(options: DynamoDBScanOptions): Promise<{items: DynamoDBItem[], lastEvaluatedKey?: any}>`
- `update(options: DynamoDBUpdateOptions): Promise<DynamoDBItem | null>`
- `delete(options: DynamoDBDeleteOptions): Promise<DynamoDBItem | null>`

## License

MIT