network/examples/advanced-database.ts
2025-04-07 12:58:23 +03:00

266 lines
6.9 KiB
TypeScript

import {
initDB,
create,
get,
update,
remove,
list,
query,
uploadFile,
getFile,
createTransaction,
commitTransaction,
subscribe,
defineSchema,
getMetrics,
createIndex,
ErrorCode,
StoreType,
logger
} from '../src';
// Define a user schema
const userSchema = {
properties: {
username: {
type: 'string',
required: true,
min: 3,
max: 20,
},
email: {
type: 'string',
pattern: '^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$',
},
age: {
type: 'number',
min: 18,
max: 120,
},
roles: {
type: 'array',
items: {
type: 'string',
},
},
isActive: {
type: 'boolean',
},
},
required: ['username'],
};
async function advancedDatabaseExample() {
try {
logger.info('Starting advanced database example...');
// Initialize the database service with a specific connection ID
const connectionId = await initDB('example-connection');
logger.info(`Database service initialized with connection ID: ${connectionId}`);
// Define schema for validation
defineSchema('users', userSchema);
logger.info('User schema defined');
// Create index for faster queries (works with docstore)
await createIndex('users', 'username', { storeType: StoreType.DOCSTORE });
logger.info('Created index on username field');
// Set up subscription for real-time updates
const unsubscribe = subscribe('document:created', (data) => {
logger.info('Document created:', data.collection, data.id);
});
// Create multiple users using a transaction
const transaction = createTransaction(connectionId);
transaction
.create('users', 'user1', {
username: 'alice',
email: 'alice@example.com',
age: 28,
roles: ['admin', 'user'],
isActive: true,
})
.create('users', 'user2', {
username: 'bob',
email: 'bob@example.com',
age: 34,
roles: ['user'],
isActive: true,
})
.create('users', 'user3', {
username: 'charlie',
email: 'charlie@example.com',
age: 45,
roles: ['moderator', 'user'],
isActive: false,
});
const txResult = await commitTransaction(transaction);
logger.info(`Transaction committed with ${txResult.results.length} operations`);
// Get a specific user with type safety
interface User {
username: string;
email: string;
age: number;
roles: string[];
isActive: boolean;
createdAt: number;
updatedAt: number;
}
// Using KeyValue store (default)
const user = await get<User>('users', 'user1');
logger.info('Retrieved user from KeyValue store:', user?.username, user?.email);
// Using DocStore
await create<User>(
'users_docstore',
'user1',
{
username: 'alice_doc',
email: 'alice_doc@example.com',
age: 28,
roles: ['admin', 'user'],
isActive: true,
},
{ storeType: StoreType.DOCSTORE }
);
const docStoreUser = await get<User>('users_docstore', 'user1', { storeType: StoreType.DOCSTORE });
logger.info('Retrieved user from DocStore:', docStoreUser?.username, docStoreUser?.email);
// Using Feed/EventLog store
await create<User>(
'users_feed',
'user1',
{
username: 'alice_feed',
email: 'alice_feed@example.com',
age: 28,
roles: ['admin', 'user'],
isActive: true,
},
{ storeType: StoreType.FEED }
);
// Update the feed entry (creates a new entry with the same ID)
await update<User>(
'users_feed',
'user1',
{
roles: ['admin', 'user', 'tester'],
},
{ storeType: StoreType.FEED }
);
// List all entries in the feed
const feedUsers = await list<User>('users_feed', { storeType: StoreType.FEED });
logger.info(`Found ${feedUsers.total} feed entries:`);
feedUsers.documents.forEach(user => {
logger.info(`- ${user.username} (${user.email})`);
});
// Using Counter store
await create(
'counters',
'visitors',
{ value: 100 },
{ storeType: StoreType.COUNTER }
);
// Increment the counter
await update(
'counters',
'visitors',
{ increment: 5 },
{ storeType: StoreType.COUNTER }
);
// Get the counter value
const counter = await get('counters', 'visitors', { storeType: StoreType.COUNTER });
logger.info(`Counter value: ${counter?.value}`);
// Update a user in KeyValue store
await update<User>('users', 'user1', {
roles: ['admin', 'user', 'tester'],
});
// Query users from KeyValue store
const result = await query<User>(
'users',
(user) => user.isActive === true,
{
limit: 10,
offset: 0,
sort: { field: 'username', order: 'asc' },
}
);
logger.info(`Found ${result.total} active users:`);
result.documents.forEach(user => {
logger.info(`- ${user.username} (${user.email})`);
});
// List all users from KeyValue store with pagination
const allUsers = await list<User>('users', {
limit: 10,
offset: 0,
sort: { field: 'age', order: 'desc' },
});
logger.info(`Listed ${allUsers.total} users sorted by age (desc):`);
allUsers.documents.forEach(user => {
logger.info(`- ${user.username}: ${user.age} years old`);
});
// Upload a file with metadata
const fileData = Buffer.from('This is a test file with advanced features.');
const fileUpload = await uploadFile(fileData, {
filename: 'advanced-test.txt',
metadata: {
contentType: 'text/plain',
tags: ['example', 'test'],
owner: 'user1',
}
});
logger.info(`Uploaded file with CID: ${fileUpload.cid}`);
// Retrieve the file
const file = await getFile(fileUpload.cid);
logger.info('Retrieved file content:', file.data.toString());
logger.info('File metadata:', file.metadata);
// Get performance metrics
const metrics = getMetrics();
logger.info('Database metrics:', {
operations: metrics.operations,
performance: {
averageOperationTime: `${metrics.performance.averageOperationTime?.toFixed(2)}ms`,
},
cache: metrics.cacheStats,
});
// Unsubscribe from events
unsubscribe();
logger.info('Unsubscribed from events');
// Delete a user
await remove('users', 'user3');
logger.info('Deleted user user3');
return true;
} catch (error) {
if (error && typeof error === 'object' && 'code' in error) {
logger.error(`Database error (${error.code}):`, error.message);
} else {
logger.error('Error in advanced database example:', error);
}
return false;
}
}
advancedDatabaseExample();