{"id":18274426,"url":"https://github.com/mateusznakodach/ddd.eventsourcing.eventmodeling.kotlin.nodejs.dotnet.githubclone","last_synced_at":"2026-04-15T15:40:22.655Z","repository":{"id":43086457,"uuid":"349392992","full_name":"MateuszNaKodach/DDD.EventSourcing.EventModeling.Kotlin.NodeJS.DotNet.GitHubClone","owner":"MateuszNaKodach","description":"Source code for my workshop about DDD, EventModeling, Event Sourcing and polyglot development (Kotlin / .NET / TypeScript).","archived":false,"fork":false,"pushed_at":"2022-03-19T13:06:43.000Z","size":522,"stargazers_count":0,"open_issues_count":3,"forks_count":0,"subscribers_count":0,"default_branch":"workshop/start","last_synced_at":"2025-02-14T22:19:38.594Z","etag":null,"topics":["cqrs","ddd","domain-driven-design","dotnet","event-sourcing","eventmodeling","eventsourcing","eventstore","eventstoredb","kotlin","polyglot","polyglot-dev","polyglot-microservices","polyglot-programming","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MateuszNaKodach.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-03-19T11:02:11.000Z","updated_at":"2022-03-28T10:13:19.000Z","dependencies_parsed_at":"2022-09-15T06:12:27.455Z","dependency_job_id":null,"html_url":"https://github.com/MateuszNaKodach/DDD.EventSourcing.EventModeling.Kotlin.NodeJS.DotNet.GitHubClone","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MateuszNaKodach%2FDDD.EventSourcing.EventModeling.Kotlin.NodeJS.DotNet.GitHubClone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MateuszNaKodach%2FDDD.EventSourcing.EventModeling.Kotlin.NodeJS.DotNet.GitHubClone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MateuszNaKodach%2FDDD.EventSourcing.EventModeling.Kotlin.NodeJS.DotNet.GitHubClone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MateuszNaKodach%2FDDD.EventSourcing.EventModeling.Kotlin.NodeJS.DotNet.GitHubClone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MateuszNaKodach","download_url":"https://codeload.github.com/MateuszNaKodach/DDD.EventSourcing.EventModeling.Kotlin.NodeJS.DotNet.GitHubClone/tar.gz/refs/heads/workshop/start","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247974595,"owners_count":21026742,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cqrs","ddd","domain-driven-design","dotnet","event-sourcing","eventmodeling","eventsourcing","eventstore","eventstoredb","kotlin","polyglot","polyglot-dev","polyglot-microservices","polyglot-programming","typescript"],"created_at":"2024-11-05T12:09:30.745Z","updated_at":"2026-04-15T15:40:17.627Z","avatar_url":"https://github.com/MateuszNaKodach.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# EventModelingWorkshopPL | GitHubClone\nOpracowanie: Mateusz Nowak (ZycieNaKodach.pl)\n\nSzkolenie głównie skupione na technikach takich jak Event Storming, Event Modeling i Domain-Driven Design.\nSam brałem nie raz udział w takich szkoleniach, ale żadne nie było jeszcze tak kompleksowe, aby prowadziło od fazy designu i karteczek na ścianie (teraz Miro) aż do działającego kodu.\nKod startowy będzie dostępny w C# (.NET Core) / Kotlin (Spring) / TypeScript (Express). Wszystko zintegrowane poprzez EventStoreDB.\n\nUWAGA! \nKod ma najmniej abstrakcji jak tylko to możliwe, co nie jest najlepszą praktyką programistczyną w kontekście rozszerzalności.\nJednakże ułatwi to zrozumienie co się dzieje, już w trakcie warsztatów.\n\n\nW trakcie szkolenia dowiesz się wielu rzeczy i zastosujesz je w praktyce:\n- Zobaczysz co to Bounded Context i jak stosować zasady SOLID na poziomie architektury\n- Odkryjesz działanie omawianej domeny za pomocą Event Stormingu\n- Wykonasz design systemu z użyciem Event Modelingu (na jakiej zasadzie wyznaczać mikroserwisy czy modularny monolit)\n- Zobaczysz jak te praktyki pomagają zaplanować pracę i podzielić zadania\n- Zaplanujesz rozszerzalną architekturę systemu i zobaczysz zależności między komponentami\n- Wykonasz części systemu z wykorzystaniem Event Sourcingu i zastosujesz EventStore (zobaczysz jakie to proste z Event Modelingiem)\n- Otrzymasz materiały do dalszego własnego rozwoju poznanych umiejętności\n\nTechniki Domain-Driven Design naturalnie wpasowują się w EventModeling.\nNie będziemy się skupiać na DDD, które przyjdzie naturalnie.\n\n\n## Pobranie repozytorium\n\n`git clone https://github.com/nowakprojects/EventModelingGitHubClone.git`\n\n## Uruchomienie serwisów\n\n###Lokalnie\n**UWAGA! Dużo osób zgłaszało problemy z uruchominiem poprzez docker-compose, więc zalecana jest ta instrukcja z uruchomieniem lokalnym.**\n\nDo wykonania ćwiczeń praktycznych, jeśli dysponujesz odpowiednim środowiskiem - najlepiej uruchomić:\n- (WYMAGANE) EventStore (Docker). W głównym katalogu wykonaj:\n  `docker-compose -f docker-compose.eventstore.yaml up`\n- (WYMAGANE) Frontend. \n  - W katalogu `frontend` na początek zależnie od tego, w jakim środowisku chcesz wykonywać zadania zmień nazwę pliku env z odpowiednim postfixem na `env.local`.\n  - W katalogu `frontend` wykonaj kolejno:\n    - `npm install`\n    - `npm run start`\n- (WYMAGANE) Backend NodeJS.\n  - Uruchom wg. swojego ulubionego sposobu LUB:\n  - W katalogu`backend-nodejs` wykonaj kolejno:\n    - `npm install`\n    - `npm run start:dev`\n- (OPCJONALNE - wybierz jedno) Backend .NET Core.\n  - Uruchom wg. swojego ulubionego sposobu LUB:\n  - W katalogu `backend-dotnet/EventModelingGitHubCloneDotNet/EventModelingGitHubCloneDotNet` wykonaj kolejno:\n    - `dotnet restore`\n    - `dotnet run`\n- (OPCJONALNE - wybierz jedno) Backend Kotlin\n  - Uruchom wg. swojego ulubionego sposobu LUB:\n    - W katalogu `backend-kotlin` wykonaj kolejno:\n      - `./gradlew build`\n      - `./gradlew bootRun`\n  \n\n### W trybie reagowania na zmiany (developerski)\nRepozytorium zostało przygotowane w taki sposób, \nabyś mógł uruchomić projekty i wprowadzać zmiany bez posiadania zainstalowanych środowisk dla wszystkich języków programowania.\n\nTo, co jest wymagane to Docker Compose.\nJedynie zmiany bibliotek niosą za sobą potrzebę przebudowania aplikacji:\n\n`docker-compose -f docker-compose.dev.yaml build`\n\nPóźniej już wystarczy uruchamiać tylko poprzez:\n\n`docker-compose -f docker-compose.dev.yaml up`\n\n\n### W trybie builda (bez reagowania na zmiany)\nW tym przypadku wszelkie zmiany kodu czy nawet zmiennych środowiskowych wymagają przebudowania docker-compose.\nOdkomentuj z pliku docker-compose.build.yaml serwisy, na których będziesz chciał pracować i uruchom je lokalnie.\n\n`docker-compose -f docker-compose.build.yaml build`\n\nPóźniej już wystarczy uruchamiać tylko poprzez:\n\n`docker-compose -f docker-compose.build.yaml up`\n\n\n### Uruchomione aplikacje\n\nAplikacje uruchomione poprzez docker-compose, nie różnią się niczym od uruchomienia poszczególnych serwisów lokalnie.\nWięc jeśli chcesz uruchomić coś lokalnie dla lepszego developer experience, to po prostu zakomentuj odpowiedni serwis w `docker-compose.yaml`\nPo uruchomieniu będą dostępne następujące serwisy:\n\n- Frontend:     http://localhost:3000/ZycieNaKodach/EventModelingRepo/pulls\n- Backend NodeJS:       http://localhost:4000/swagger/\n- Backend .NET:         http://localhost:5000/swagger/index.html\n- Backend Kotlin:       http://localhost:7000/swagger-ui/\n- EventStore:   http://localhost:2113/  (user: admin   password: changeit)\n\nUpewnij się, że każdy z tych adresów odpowiada. Zależnie od tego czy wybrałeś .NET czy Kotlina. \nJeśli chcesz pisać w NodeJS wystarczy Ci sam Node.\nNajdłużej trwa uruchomienie serwisu w Koltinie. W logach docker-compose powinieneś zobaczyć:\n`eventmodeling-backend-kotlin    | 2021-04-01 09:29:39.922  INFO 447 --- [  restartedMain] p.z.e.g.GitHubCloneApplicationKt         : Started GitHubCloneApplicationKt in 12.168 seconds (JVM running for 12.987)`\n\nKod poszczególnych wersji backendu nie realizuje dokładnie tego samego, dlaczego tak jest, dowiesz się w trakcie szkolenia.\n\n## Przygotowanie | Wymagania\nAby skorzystać jak najwięcej ze szkolenia, musimy zbudować wspólne zrozumienie niektórych koncepcji.\nPrzed szkoleniem dobrze zapoznać się z linkami poniżej.\n\n- I część - projektowanie / modelowanie (3 godziny)\n  - What is Event Modeling | https://eventmodeling.org/posts/what-is-event-modeling/\n  - EVENTSTORMING i 4 poziomy zdarzeń | https://www.youtube.com/watch?v=31PNdWaUrTY\u0026feature=youtu.be\n  \n- II część - implementacja (kolejne 3 godziny)\n  - A Functional Foundation for CQRS/ES | https://verraes.net/2014/05/functional-foundation-for-cqrs-event-sourcing/\n  - Zobacz co to EventSourcing:\n    - https://www.eventstore.com/blog/what-is-event-sourcing\n    - https://www.eventstore.com/blog/convincing-your-cto\n  - Zapoznaj się krótko z EventStoreDB:\n    - https://developers.eventstore.com/clients/grpc/getting-started/#connection-details\n\n-----------\n\n## Agenda\n\nKomunikacja w trakcie warsztatów:\n- Wszyscy: Kanał Slack\n- Głównie spotkanie: VBC\n- Zespół 1: Google Meet\n- Zespół 2: Google Meet\n\n### Część I - Projektowanie i modelowanie\n  \n\n#### Rozpoczęcie (30 min.)\n- 5 min.    |   Przywitanie i zapoznanie z MIRO Board\n- 15 min.   |   Wstęp do Bounded Contextu i EventStormingu.\n  - Przykłady kodu\n  - Porównania przedstawiające sens stosowania BC\n  - Inne metody modelowania jak UML\n  - Szybkie ćwiczenie na EventStorming.\n  \n#### Event Storming — Praktyka w zespołach (60 min.)\n- 15 min. | EventStorming w MIRO - wprowadzenie\n  - Omówienie notacji\n  - Przykład modelowania\n- 5 min.  | Podział na zespoły\n- 20 min. | Praca w zespołach nad domeną GitHub (cz. 1)\n- 10 min. | Spotkanie wszystkich - pytania / wątpliwości\n- 20 min. | Praca w zespołach nad domeną GitHub (cz. 2 - kontynuacja)\n\n#### PRZERWA - 15 minut\n\n#### Event Modeling - praktyka w zespołach (90 min.)\n- 20 min. | EventModeling - wprowadzenie do praktyki\n  - Różnica między EventStormingiem\n  - Przykład modelowania na MIRO\n  - Przejście z ES do EM\n  - Wyznaczanie SLICE - dlaczego to takie ważne\n  \n- 5 min. | Rozejście się do zespołów\n- 20 min. | Praca w zespołach nad EventModelingiem\n- 15 min. | Spotkanie wszystkich - pytania / wątpliwości\n- 30 min. | Kontynuacja pracy nad EventModelingiem\n\n---\n\n### KONIEC CZ. 1 - PRZERWA DO 13.00 - ok godziny (OBIAD) - Czas na luźne Q\u0026A\nDobrze w tym czasie upewnić się, że każdemu działa środowisko do implementacji.\n\n---\n\n### Część II - Implementacja modelu\n\n#### Programowanie - wprowadzenie (~ 1 godz.)\n- 45 min. | Od karteczek do implementacji - EventModeling\n  - Przejście przez przygotowany kod\n    - Dopisanie nowego kawałka\n  - Jak dzielić na slice i zadania\n  - Co to jest EventSourcing. Dlaczego to pomaga?\n  - Jak działa EventStore i dlaczego właśnie ta technologia?\n  \n#### Programowanie w parach / zespołach (~ 2 godz.)\n- 45 min. | Programowanie w zespołach\n- 15 min. | CatchUp - problemy / pytania\n- 45 min. | Programowanie w zespołach\n- 15 min. | Zakończenie i materiały do dalszego rozwoju\n\n\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e\u003e KONIEC\n\n\n##### Kilka przydatnych linków\n- EventModeling a Bakery\n  https://www.youtube.com/watch?v=DhZBQWO34Pw\n  \n- EventModelingTimeTrackingSystemMeetUp\n  https://www.youtube.com/watch?v=DwC0rRzSVww\u0026t=705s\n\n- EventModeling Slack:\n  https://join.slack.com/t/eventmodeling/shared_invite/zt-94a7pu2e-ZWg~uPFGxB5I0GB~be664w\n\n- Event Modeling with Adam Dymitruk\n  https://www.youtube.com/watch?v=jhybUa0_2eI\n\n- Event Modeling Deep Dive with Vaughn Vernon and Adam Dymitruk\n  https://www.youtube.com/watch?v=ufKgwjsD1l8\n\n- EventDriven Podcast (Episode 5 - Vaughn Vernon on DDD/CQRS/ES)\n  https://www.youtube.com/watch?v=PCgbeb8qPys\n\nExamples:\n- https://github.com/fraktalio/restaurant-demo\n- https://github.com/fraktalio/order-demo\n- https://github.com/fraktalio/courier-demo\n\nMIRO BOARDS:\nhttps://miro.com/app/board/o9J_ktrevAQ=/\nhttps://miro.com/app/board/o9J_kwc8qR0=/\n\nWorkshop - Cinema:\nhttps://miro.com/app/board/o9J_ktTXNi0=/\nhttps://miro.com/app/board/o9J_krOfkGM=/\nhttps://miro.com/app/board/o9J_krimJVY=/\n\nExamples:\nhttps://github.com/eventmodeling/eventdriventhinking\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmateusznakodach%2Fddd.eventsourcing.eventmodeling.kotlin.nodejs.dotnet.githubclone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmateusznakodach%2Fddd.eventsourcing.eventmodeling.kotlin.nodejs.dotnet.githubclone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmateusznakodach%2Fddd.eventsourcing.eventmodeling.kotlin.nodejs.dotnet.githubclone/lists"}