https://github.com/exponentially/extreme_system_example
Example umbrella project that demonstrates how Extreme.System should be used
https://github.com/exponentially/extreme_system_example
Last synced: 9 months ago
JSON representation
Example umbrella project that demonstrates how Extreme.System should be used
- Host: GitHub
- URL: https://github.com/exponentially/extreme_system_example
- Owner: exponentially
- Created: 2017-06-05T09:07:36.000Z (about 9 years ago)
- Default Branch: master
- Last Pushed: 2018-09-07T13:15:16.000Z (almost 8 years ago)
- Last Synced: 2025-01-17T23:31:04.923Z (over 1 year ago)
- Language: Elixir
- Size: 93.8 KB
- Stars: 3
- Watchers: 3
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# ExtremeSystem.Example
This is example project for using Extreme.System. It is set of building block usefull for CQRS+ES systems.
## Dependencies
### EventStore
## Running system
### Get the example
$ git clone https://github.com/exponentially/extreme_system_example.git
$ cd extreme_system_example
$ mix deps.get
### Run local event store
First time pull docker image:
$ docker run --name eventstore4.1 -it -p 2113:2113 -p 1113:1113 -e EVENTSTORE_RUN_PROJECTIONS=all -e EVENTSTORE_START_STANDARD_PROJECTIONS=true eventstore/eventstore
Docker container can be stopped as follows
$ docker stop eventstore4.1
Next time you want to start it, just start container:
$ docker start eventstore4.1
### Run beam nodes (api and users)
- From new terminal go to api folder and run it:
$ cd apps/api
$ ./run.sh
You should have opened iex with something like:
```
Erlang/OTP 21 [erts-10.0.5] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
2018-09-07 14:24:16.278 [info] pid=<0.295.0> Starting ExtremeSystem.Example.Api in :normal mode
2018-09-07 14:24:16.282 [info] pid=<0.295.0> Trying to connect node :example_api@mystique to: ["ExSysApi", "ExSysUsers"]
2018-09-07 14:24:16.285 [error] pid=<0.58.0>
** Cannot get connection id for node :example_api@mystique
2018-09-07 14:24:16.353 [info] pid=<0.312.0> Running ExtremeSystem.Example.Api.Endpoint with Cowboy using http://0.0.0.0:4000
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(example_api@mystique)1> 2018-09-07 14:24:17.305 [info] pid=<0.300.0> Connected nodes: []
```
- From the other terminal, go to users folder and run it:
$ cd apps/users
$ ./run.sh
Nodes should connect to cluster as you may see in iex:
```
Erlang/OTP 21 [erts-10.0.5] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:1] [hipe]
2018-09-07 14:25:43.259 [info] pid=<0.266.0> Starting ExtremeSystem.Example.Users in :normal mode
2018-09-07 14:25:43.262 [info] pid=<0.266.0> Trying to connect node :es_users@mystique to: ["ExSysApi", "ExSysUsers"]
2018-09-07 14:25:43.282 [error] pid=<0.58.0>
** Cannot get connection id for node :es_users@mystique
2018-09-07 14:25:43.315 [info] pid=<0.286.0> Connecting Extreme to 127.0.0.1:1113
2018-09-07 14:25:43.316 [info] pid=<0.286.0> Successfully connected to EventStore using protocol version 3
Interactive Elixir (1.7.3) - press Ctrl+C to exit (type h() ENTER for help)
iex(es_users@mystique)1> 2018-09-07 14:25:44.283 [info] pid=<0.272.0> Connected nodes: [:example_api@mystique]
```
### Calling API
There is Postman collection in `apps/api/doc/ExtremeSystem.Example.postman_collection.json`
You can try it using curl as well:
- Register new user:
```
curl -X POST \
http://localhost:4000/users \
-v \
-H 'Accept: application/json' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{
"email": "user.1@example.com",
"name": "Milan"
}'
```
Last line of output should be:
```
{"id":"05c03d0c-b29a-11e8-aff9-acbc32d4fe0b"}
```
If so, that is ID of your new User. You can confirm that in EventStore as well @ http://localhost:2113/web/index.html#/streams/ex_users-05c03d0c-b29a-11e8-aff9-acbc32d4fe0b
- Once you have registered user, you can change it's name:
```
curl -X PUT \
http://localhost:4000/users/05c03d0c-b29a-11e8-aff9-acbc32d4fe0b \
-v \
-H 'Accept: application/json' \
-H 'Cache-Control: no-cache' \
-H 'Content-Type: application/json' \
-d '{
"version": 2,
"name": "Milan II"
}'
```
You should get 204 back and new aggregate version in header:
```
< x-aggregate-version: 2
```
You should also notice new event in that users stream.