npm package: @omodaka/pinatinodb-adapter-typeorm
Description: TypeORM adapter for PinatinoDB - automatic IPFS sync for TypeORM
Author: Branislav Đalić
Latest version: 0.1.0

# @pinatinodb/typeorm-adapter

TypeORM adapter for PinatinoDB - automatically sync your TypeORM entities to IPFS!

## Installation

```bash
pnpm add @pinatinodb/typeorm-adapter @pinatinodb/core
```

## Usage

```typescript
import { DataSource } from 'typeorm';
import { setupPinatinoWithTypeORM } from '@pinatinodb/typeorm-adapter';
import { PinatinoDB } from '@pinatinodb/core';
import { User, Post } from './entities';

// Create TypeORM DataSource
const dataSource = new DataSource({
  type: 'postgres',
  host: 'localhost',
  port: 5432,
  username: 'user',
  password: 'password',
  database: 'mydb',
  entities: [User, Post],
  synchronize: true
});

await dataSource.initialize();

// Create PinatinoDB instance
const pinatino = new PinatinoDB({
  pinata: {
    apiKey: process.env.PINATA_JWT!
  }
});

// Setup automatic sync
await setupPinatinoWithTypeORM(dataSource, pinatino, {
  logging: true
});

// Use TypeORM normally - data automatically syncs to IPFS!
const userRepo = dataSource.getRepository(User);

const user = await userRepo.save({
  name: 'Alice',
  email: 'alice@example.com'
});
// ✅ Data is now in both TypeORM DB and IPFS!
```

## How It Works

The adapter uses TypeORM's Entity Subscriber pattern to listen for database events:

1. **Entity operation occurs** (insert, update, delete)
2. **Subscriber catches event**
3. **Data synced to IPFS** via PinatinoDB
4. **Operation completes**

All TypeORM operations work normally - the IPFS sync happens automatically in the background!

## Selective Sync

```typescript
// Only sync specific entities
await setupPinatinoWithTypeORM(dataSource, pinatino, {
  entities: [User, Post], // Only sync these entities
  logging: true
});

// Or exclude entities
await setupPinatinoWithTypeORM(dataSource, pinatino, {
  excludeEntities: [Log, Session], // Don't sync these
  logging: true
});
```

## Manual Subscriber Registration

For more control, you can register the subscriber manually:

```typescript
import { PinatinoSubscriber } from '@pinatinodb/typeorm-adapter';

const subscriber = new PinatinoSubscriber(pinatino, {
  logging: true,
  entities: [User]
});

const dataSource = new DataSource({
  // ... config
  subscribers: [subscriber]
});
```

## Supported Operations

- ✅ **Insert** (`afterInsert`) - Synced to IPFS
- ✅ **Update** (`afterUpdate`) - Updates in IPFS
- ✅ **Delete** (`afterRemove`) - Removes from IPFS

## Benefits

- 📦 **Automatic IPFS backup** of your TypeORM data
- 🌍 **Decentralized storage** alongside traditional DB
- ⏱️ **Time-travel queries** (IPFS immutability)
- 🔄 **Zero code changes** to existing TypeORM code
- 🎯 **Selective sync** - choose what goes to IPFS
- 🎨 **Event-driven** - uses TypeORM's built-in subscriber pattern

## Example Entity

```typescript
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity()
export class User {
  @PrimaryGeneratedColumn('uuid')
  id!: string;

  @Column()
  name!: string;

  @Column()
  email!: string;

  @Column({ type: 'timestamp', default: () => 'CURRENT_TIMESTAMP' })
  createdAt!: Date;
}
```

When you save a User entity, it's automatically synced to IPFS with its CID stored!

## License

MIT