Skip to content

Commit f524449

Browse files
committed
feat(messages): define messages model and factories
add models for Query, Event and Command messages and implement creators for each one of them
1 parent c768a4a commit f524449

File tree

6 files changed

+88
-18
lines changed

6 files changed

+88
-18
lines changed

src/domain/message-factory.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { MessageCreator } from './model/message-creator.model'
2+
import { Command, Query, Event } from './model/messages.model'
3+
4+
export function createCommand<T>(name: string): MessageCreator<Command<T>, T> {
5+
return (id: string, data: T) => new Command(id, name, data)
6+
}
7+
8+
export function createQuery<T>(name: string): MessageCreator<Query<T>, T> {
9+
return (id: string, data: T) => new Query(id, name, data)
10+
}
11+
12+
export function createEvent<T>(name: string): MessageCreator<Event<T>, T> {
13+
return (id: string, data: T) => new Event(id, name, data)
14+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { Message } from './messages.model'
2+
3+
export type MessageCreator<R extends Message<T>, T> = (id: string, data: T) => R

src/domain/model/messages.model.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
export class Message<T> {
2+
id: string
3+
name: string
4+
data: T
5+
6+
constructor(id: string, name: string, data: T) {
7+
this.id = id
8+
this.name = name
9+
this.data = data
10+
}
11+
}
12+
13+
export class Command<T> extends Message<T> {}
14+
15+
export class Query<T> extends Message<T> {}
16+
17+
export class Event<T> extends Message<T> {}

src/reactive-commons.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
1-
// Import here Polyfills if needed. Recommended core-js (npm i -D core-js)
2-
// import "core-js/fn/array.find"
3-
// ...
4-
export default class DummyClass {}
1+
export { Command, Query, Event } from './domain/model/messages.model'
2+
export { createCommand, createQuery, createEvent } from './domain/message-factory'

test/message-factory.test.ts

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import {
2+
Command,
3+
createCommand,
4+
Query,
5+
createQuery,
6+
Event,
7+
createEvent
8+
} from '../src/reactive-commons'
9+
10+
describe(`Message factory`, () => {
11+
it(`builds valid command instances`, () => {
12+
const expected = {
13+
id: '123',
14+
name: 'microservice.executeTask',
15+
data: 'withThisParam'
16+
}
17+
18+
const creator = createCommand('microservice.executeTask')
19+
const result = creator('123', 'withThisParam')
20+
21+
expect(result).toMatchObject(expected)
22+
expect(result).toBeInstanceOf(Command)
23+
})
24+
25+
it(`builds valid query instances`, () => {
26+
const expected = {
27+
id: '123',
28+
name: 'microservice.fetchSomething',
29+
data: 'withThisParam'
30+
}
31+
32+
const creator = createQuery('microservice.fetchSomething')
33+
const result = creator('123', 'withThisParam')
34+
35+
expect(result).toMatchObject(expected)
36+
expect(result).toBeInstanceOf(Query)
37+
})
38+
39+
it(`builds valid query instances`, () => {
40+
const expected = {
41+
id: '123',
42+
name: 'microservice.somethingHappened',
43+
data: 'withThisData'
44+
}
45+
46+
const creator = createEvent('microservice.somethingHappened')
47+
const result = creator('123', 'withThisData')
48+
49+
expect(result).toMatchObject(expected)
50+
expect(result).toBeInstanceOf(Event)
51+
})
52+
})

test/reactive-commons.test.ts

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)