-
Notifications
You must be signed in to change notification settings - Fork 23
Expand file tree
/
Copy pathindex.ts
More file actions
66 lines (52 loc) · 2.09 KB
/
Copy pathindex.ts
File metadata and controls
66 lines (52 loc) · 2.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
/**
* Redis example: persistent users projection backed by Redis.
*
* Prerequisites:
* docker run -d -p 6379:6379 redis:7-alpine
*
* Run (Node 24+):
* node examples/redis/index.ts
*/
import { Redis } from 'ioredis';
import { type IContainer, ContainerBuilder, EventIdAugmentor, InMemoryEventStorage } from '../../src/index.ts'; // 'node-cqrs'
import { AbstractRedisProjection, type RedisView } from '../../src/redis/index.ts'; // 'node-cqrs/redis'
import { UserAggregate } from '../user-domain-ts/UserAggregate.ts';
import type { CreateUserCommandPayload, UserCreatedEvent, UserRecord, UserRenamedEvent } from '../user-domain-ts/messages.ts';
class UsersProjection extends AbstractRedisProjection<UserRecord> {
static override get tableName() {
return 'users';
}
static override get schemaVersion() {
return '1';
}
userCreated(event: UserCreatedEvent) {
this.view.updateEnforcingNew(event.aggregateId as string, () => ({
username: event.payload!.username
}));
}
userRenamed(event: UserRenamedEvent) {
this.view.updateEnforcingNew(event.aggregateId as string, r => ({
username: event.payload!.username ?? r!.username
}));
}
}
// --- Wire up ---
interface MyContainer extends IContainer {
viewModelRedis: Redis;
usersView: RedisView<UserRecord>;
}
const builder = new ContainerBuilder<MyContainer>();
builder.register(() => new Redis({ host: 'localhost', port: 6379 })).as('viewModelRedis');
builder.register(InMemoryEventStorage);
builder.register(EventIdAugmentor).as('eventIdAugmenter'); // stamps event.id — required for IEventLocker checkpoints
builder.registerAggregate(UserAggregate);
builder.registerProjection(UsersProjection, 'usersView');
const container = builder.container();
const { commandBus, usersView } = container;
// --- Run ---
const [userCreated] = await commandBus.send('createUser', undefined, {
payload: { username: 'alice', password: 'magic' } satisfies CreateUserCommandPayload
});
const user = await usersView.get(userCreated.aggregateId as string);
console.log('User stored in Redis:', user); // { username: 'alice' }
await container.viewModelRedis.quit();