This repository has been archived on 2025-08-03. You can view files and clone it, but cannot push or open issues or pull requests.
network-orbit/docs/docs/getting-started.md
anonpenguin 64ed9e82a7 Add integration tests for blog workflow and supporting infrastructure
- Implemented comprehensive integration tests for user management, category management, content publishing, comment system, performance, scalability, and network resilience.
- Created DockerNodeManager to manage Docker containers for testing.
- Developed ApiClient for API interactions and health checks.
- Introduced SyncWaiter for synchronizing node states and ensuring data consistency.
- Enhanced test reliability with increased timeouts and detailed logging.
2025-06-21 11:15:33 +03:00

9.9 KiB

sidebar_position
sidebar_position
2

Getting Started

This guide will help you set up DebrosFramework and create your first decentralized application in just a few minutes.

Prerequisites

Before you begin, make sure you have:

  • Node.js (version 18.0 or above)
  • npm or pnpm package manager
  • Basic knowledge of TypeScript and decorators
  • Familiarity with async/await patterns

Installation

1. Create a New Project

mkdir my-debros-app
cd my-debros-app
npm init -y

2. Install @debros/network

npm install @debros/network
npm install --save-dev typescript @types/node

3. Set Up TypeScript Configuration

Create a tsconfig.json file:

{
  "compilerOptions": {
    "target": "ES2020",
    "module": "commonjs",
    "lib": ["ES2020"],
    "experimentalDecorators": true,
    "emitDecoratorMetadata": true,
    "strict": true,
    "esModuleInterop": true,
    "skipLibCheck": true,
    "forceConsistentCasingInFileNames": true,
    "resolveJsonModule": true,
    "declaration": true,
    "outDir": "./dist",
    "rootDir": "./src"
  },
  "include": ["src/**/*"],
  "exclude": ["node_modules", "dist"]
}

4. Install OrbitDB and IPFS Dependencies

DebrosFramework requires OrbitDB and IPFS services:

npm install @orbitdb/core @helia/helia @helia/unixfs @libp2p/peer-id

Your First Application

Let's create a simple social media application to demonstrate DebrosFramework's capabilities.

1. Create the Project Structure

src/
├── models/
│   ├── User.ts
│   ├── Post.ts
│   └── index.ts
├── services/
│   ├── orbitdb.ts
│   └── ipfs.ts
└── index.ts

2. Set Up IPFS Service

Create src/services/ipfs.ts:

import { createHelia } from '@helia/helia';
import { createLibp2p } from 'libp2p';
// Add other necessary imports based on your setup

export class IPFSService {
  private helia: any;
  private libp2p: any;

  async init(): Promise<void> {
    // Initialize your IPFS/Helia instance
    // This is a simplified example - customize based on your needs
    this.libp2p = await createLibp2p({
      // Your libp2p configuration
    });

    this.helia = await createHelia({
      libp2p: this.libp2p,
    });
  }

  getHelia() {
    return this.helia;
  }

  getLibp2pInstance() {
    return this.libp2p;
  }

  async stop(): Promise<void> {
    if (this.helia) {
      await this.helia.stop();
    }
  }
}

3. Set Up OrbitDB Service

Create src/services/orbitdb.ts:

import { createOrbitDB } from '@orbitdb/core';

export class OrbitDBService {
  private orbitdb: any;
  private ipfs: any;

  constructor(ipfsService: any) {
    this.ipfs = ipfsService;
  }

  async init(): Promise<void> {
    this.orbitdb = await createOrbitDB({
      ipfs: this.ipfs.getHelia(),
      // Add other OrbitDB configuration options
    });
  }

  async openDB(name: string, type: string): Promise<any> {
    return await this.orbitdb.open(name, { type });
  }

  getOrbitDB() {
    return this.orbitdb;
  }

  async stop(): Promise<void> {
    if (this.orbitdb) {
      await this.orbitdb.stop();
    }
  }
}

4. Define Your First Model

Create src/models/User.ts:

import { BaseModel, Model, Field, HasMany } from 'debros-framework';
import { Post } from './Post';

@Model({
  scope: 'global', // Global model - shared across all users
  type: 'docstore',
  sharding: {
    strategy: 'hash',
    count: 4,
    key: 'id',
  },
})
export class User extends BaseModel {
  @Field({
    type: 'string',
    required: true,
    unique: true,
    validate: (value: string) => value.length >= 3 && value.length <= 20,
  })
  username: string;

  @Field({
    type: 'string',
    required: true,
    unique: true,
    validate: (value: string) => /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value),
  })
  email: string;

  @Field({ type: 'string', required: false })
  bio?: string;

  @Field({ type: 'string', required: false })
  profilePicture?: string;

  @Field({ type: 'boolean', required: false, default: true })
  isActive: boolean;

  @Field({ type: 'number', required: false, default: () => Date.now() })
  registeredAt: number;

  // Relationship: One user has many posts
  @HasMany(() => Post, 'userId')
  posts: Post[];
}

5. Create a Post Model

Create src/models/Post.ts:

import { BaseModel, Model, Field, BelongsTo } from 'debros-framework';
import { User } from './User';

@Model({
  scope: 'user', // User-scoped model - each user has their own database
  type: 'docstore',
  sharding: {
    strategy: 'user',
    count: 2,
    key: 'userId',
  },
})
export class Post extends BaseModel {
  @Field({ type: 'string', required: true })
  title: string;

  @Field({
    type: 'string',
    required: true,
    validate: (value: string) => value.length <= 5000,
  })
  content: string;

  @Field({ type: 'string', required: true })
  userId: string;

  @Field({ type: 'array', required: false, default: [] })
  tags: string[];

  @Field({ type: 'boolean', required: false, default: true })
  isPublic: boolean;

  @Field({ type: 'number', required: false, default: 0 })
  likeCount: number;

  @Field({ type: 'number', required: false, default: () => Date.now() })
  createdAt: number;

  @Field({ type: 'number', required: false, default: () => Date.now() })
  updatedAt: number;

  // Relationship: Post belongs to a user
  @BelongsTo(() => User, 'userId')
  user: User;
}

6. Export Your Models

Create src/models/index.ts:

export { User } from './User';
export { Post } from './Post';

7. Create the Main Application

Create src/index.ts:

import { DebrosFramework } from 'debros-framework';
import { IPFSService } from './services/ipfs';
import { OrbitDBService } from './services/orbitdb';
import { User, Post } from './models';

async function main() {
  // Initialize services
  const ipfsService = new IPFSService();
  await ipfsService.init();

  const orbitDBService = new OrbitDBService(ipfsService);
  await orbitDBService.init();

  // Initialize DebrosFramework
  const framework = new DebrosFramework();
  await framework.initialize(orbitDBService, ipfsService);

  console.log('🚀 DebrosFramework initialized successfully!');

  // Create a user
  const user = await User.create({
    username: 'alice',
    email: 'alice@example.com',
    bio: 'Hello, I am Alice!',
    isActive: true,
  });

  console.log('✅ Created user:', user.id);

  // Create a post for the user
  const post = await Post.create({
    title: 'My First Post',
    content: 'This is my first post using DebrosFramework!',
    userId: user.id,
    tags: ['introduction', 'debros'],
    isPublic: true,
  });

  console.log('✅ Created post:', post.id);

  // Query users with their posts
  const usersWithPosts = await User.query().where('isActive', true).with(['posts']).find();

  console.log('📊 Users with posts:');
  usersWithPosts.forEach((user) => {
    console.log(`- ${user.username}: ${user.posts.length} posts`);
  });

  // Find posts by tags
  const taggedPosts = await Post.query()
    .where('tags', 'includes', 'debros')
    .with(['user'])
    .orderBy('createdAt', 'desc')
    .find();

  console.log('🏷️ Posts tagged with "debros":');
  taggedPosts.forEach((post) => {
    console.log(`- "${post.title}" by ${post.user.username}`);
  });

  // Clean up
  await framework.stop();
  console.log('👋 Framework stopped successfully');
}

main().catch(console.error);

8. Add Package.json Scripts

Update your package.json:

{
  "scripts": {
    "build": "tsc",
    "start": "node dist/index.js",
    "dev": "ts-node src/index.ts"
  }
}

9. Install Additional Development Dependencies

npm install --save-dev ts-node

Running Your Application

1. Build the Project

npm run build

2. Run the Application

npm start

Or for development with hot reloading:

npm run dev

You should see output similar to:

🚀 DebrosFramework initialized successfully!
✅ Created user: user_abc123
✅ Created post: post_def456
📊 Users with posts:
- alice: 1 posts
🏷️ Posts tagged with "debros":
- "My First Post" by alice
👋 Framework stopped successfully

What's Next?

Congratulations! You've successfully created your first DebrosFramework application. Here's what you can explore next:

Learn Core Concepts

Explore Advanced Features

Check Out Examples

Common Issues

TypeScript Decorator Errors

Make sure you have "experimentalDecorators": true and "emitDecoratorMetadata": true in your tsconfig.json.

IPFS/OrbitDB Connection Issues

Ensure your IPFS and OrbitDB services are properly configured. Check the console for connection errors and verify your network configuration.

Model Registration Issues

Models are automatically registered when imported. Make sure you're importing your models before using DebrosFramework.

Need Help?

Happy coding with DebrosFramework! 🎉