{"configuration":{},"description":"A directory of events in the city","documentation":{},"id":1,"lastModifiedAgent":"structurizr-cli/","lastModifiedDate":"2025-11-05T16:14:21Z","lastModifiedUser":"root@devserver","model":{"people":[{"id":"1","name":"User","properties":{"structurizr.dsl.identifier":"u"},"relationships":[{"description":"Search for events in the nearby area","destinationId":"2","id":"21","sourceId":"1","tags":"Relationship"},{"description":"Uses the web application to search for events","destinationId":"3","id":"22","sourceId":"1","tags":"Relationship"},{"description":"Uses the mobile application to search for events","destinationId":"4","id":"23","sourceId":"1","tags":"Relationship"}],"tags":"Element,Person,Customer"}],"softwareSystems":[{"containers":[{"documentation":{},"id":"3","name":"Web Application","properties":{"structurizr.dsl.identifier":"ss.wa"},"relationships":[{"description":"Connect to","destinationId":"6","id":"24","sourceId":"3","tags":"Relationship"},{"description":"Track user behavior with PostHog","destinationId":"15","id":"39","sourceId":"3","tags":"Relationship"},{"description":"Uses the maps to get the location of the events","destinationId":"20","id":"46","sourceId":"3","tags":"Relationship"}],"tags":"Element,Container,Web App"},{"documentation":{},"id":"4","name":"Mobile Application","properties":{"structurizr.dsl.identifier":"ss.ma"},"relationships":[{"description":"Connect to","destinationId":"6","id":"25","sourceId":"4","tags":"Relationship"},{"description":"Track user behavior with PostHog","destinationId":"15","id":"40","sourceId":"4","tags":"Relationship"},{"description":"Uses the maps to get the location of the events","destinationId":"20","id":"48","sourceId":"4","tags":"Relationship"}],"tags":"Element,Container,Mobile App"},{"documentation":{},"id":"5","name":"Envoy External","properties":{"structurizr.dsl.identifier":"ss.proxy-ext"},"relationships":[{"description":"Load balance to API","destinationId":"9","id":"28","sourceId":"5","tags":"Relationship"}],"tags":"Element,Container,Proxy"},{"documentation":{},"id":"6","name":"Envoy Internal","properties":{"structurizr.dsl.identifier":"ss.proxy-int"},"relationships":[{"description":"Load balance to API","destinationId":"7","id":"29","sourceId":"6","tags":"Relationship"}],"tags":"Element,Container,Proxy"},{"components":[{"documentation":{},"id":"8","name":"gRPC API","properties":{"structurizr.dsl.identifier":"ss.api-int.grpc"},"relationships":[{"description":"Uses the interface to search for events","destinationId":"11","id":"30","sourceId":"8","tags":"Relationship"}],"tags":"Element,Component,API Component"}],"documentation":{},"id":"7","name":"API Internal","properties":{"structurizr.dsl.identifier":"ss.api-int"},"relationships":[{"description":"Uses the interface to search for events","destinationId":"11","id":"31","linkedRelationshipId":"30","sourceId":"7"},{"description":"Visualize data with Grafana","destinationId":"16","id":"36","sourceId":"7","tags":"Relationship"},{"description":"Billing Users events","destinationId":"19","id":"45","sourceId":"7","tags":"Relationship"}],"tags":"Element,Container,API","technology":"Rust"},{"components":[{"documentation":{},"id":"10","name":"REST API","properties":{"structurizr.dsl.identifier":"ss.api-ext.rest"},"relationships":[{"description":"Uses the interface to search for events","destinationId":"11","id":"32","sourceId":"10","tags":"Relationship"}],"tags":"Element,Component,API Component"}],"documentation":{},"id":"9","name":"API External","properties":{"structurizr.dsl.identifier":"ss.api-ext"},"relationships":[{"description":"Uses the interface to search for events","destinationId":"11","id":"33","linkedRelationshipId":"32","sourceId":"9"},{"description":"Visualize data with Grafana","destinationId":"16","id":"37","sourceId":"9","tags":"Relationship"},{"description":"Billing B2B events","destinationId":"19","id":"43","sourceId":"9","tags":"Relationship"}],"tags":"Element,Container,API","technology":"Rust"},{"components":[{"documentation":{},"id":"12","name":"Interface API","properties":{"structurizr.dsl.identifier":"ss.interface.interface"},"tags":"Element,Component,API Component"}],"description":"Core code to do the dirty work","documentation":{},"id":"11","name":"Interface","properties":{"structurizr.dsl.identifier":"ss.interface"},"relationships":[{"description":"Reads from and writes to the cache","destinationId":"13","id":"34","sourceId":"11","tags":"Relationship"},{"description":"Visualize data with Grafana","destinationId":"16","id":"38","sourceId":"11","tags":"Relationship"},{"description":"Track user behavior with PostHog","destinationId":"15","id":"41","sourceId":"11","tags":"Relationship"}],"tags":"Element,Container,Interface","technology":"Rust"},{"description":"Write to cache and DB in parallel, but also update cache if a key is missed","documentation":{},"id":"13","name":"Write-Through Cache paired with Cache-Aside","properties":{"structurizr.dsl.identifier":"ss.cache"},"relationships":[{"description":"Reads from and writes to the database","destinationId":"14","id":"35","sourceId":"13","tags":"Relationship"}],"tags":"Element,Container,Cache"},{"documentation":{},"id":"14","name":"MongoDB","properties":{"structurizr.dsl.identifier":"ss.db"},"tags":"Element,Container,Database"},{"documentation":{},"group":"Observability","id":"15","name":"PostHog","properties":{"structurizr.dsl.identifier":"ss.posthog"},"tags":"Element,Container,Observability"},{"documentation":{},"group":"Observability","id":"16","name":"Grafana","properties":{"structurizr.dsl.identifier":"ss.grafana"},"tags":"Element,Container,Observability"},{"description":"This could be expanded in the future to include iceberg with spark, if needed","documentation":{},"group":"DWH","id":"17","name":"Metabase","properties":{"structurizr.dsl.identifier":"ss.metabase"},"relationships":[{"description":"Create reports from the data in the database","destinationId":"14","id":"42","sourceId":"17","tags":"Relationship"}],"tags":"Element,Container,DWH"}],"documentation":{},"id":"2","name":"Event Directory","properties":{"structurizr.dsl.identifier":"ss"},"relationships":[{"description":"Billing B2B events","destinationId":"19","id":"44","linkedRelationshipId":"43","sourceId":"2"},{"description":"Uses the maps to get the location of the events","destinationId":"20","id":"47","linkedRelationshipId":"46","sourceId":"2"}],"tags":"Element,Software System"},{"documentation":{},"id":"18","name":"B2B Systems","properties":{"structurizr.dsl.identifier":"ext"},"relationships":[{"description":"Connect to","destinationId":"5","id":"26","sourceId":"18","tags":"Relationship"},{"description":"Connect to","destinationId":"2","id":"27","linkedRelationshipId":"26","sourceId":"18"}],"tags":"Element,Software System,Customer"},{"documentation":{},"id":"19","name":"Billing (Stripe or similar)","properties":{"structurizr.dsl.identifier":"billing"},"tags":"Element,Software System,Billing"},{"documentation":{},"id":"20","name":"Maps (Google Maps or similar)","properties":{"structurizr.dsl.identifier":"maps"},"tags":"Element,Software System,Maps"}]},"name":"Event Directory","properties":{"structurizr.inspection.info":"0","structurizr.inspection.ignore":"0","structurizr.inspection.error":"64","structurizr.inspection.warning":"0","structurizr.dsl":"d29ya3NwYWNlICJFdmVudCBEaXJlY3RvcnkiICJBIGRpcmVjdG9yeSBvZiBldmVudHMgaW4gdGhlIGNpdHkiIHsKCiAgICAhaWRlbnRpZmllcnMgaGllcmFyY2hpY2FsCgogICAgbW9kZWwgewogICAgICAgIHUgPSBwZXJzb24gIlVzZXIiIHsKICAgICAgICAgICAgdGFncyAiQ3VzdG9tZXIiCiAgICAgICAgfQogICAgICAgIHNzID0gc29mdHdhcmVTeXN0ZW0gIkV2ZW50IERpcmVjdG9yeSIgewogICAgICAgICAgICB3YSA9IGNvbnRhaW5lciAiV2ViIEFwcGxpY2F0aW9uIiB7CiAgICAgICAgICAgICAgICB0YWdzICJXZWIgQXBwIgogICAgICAgICAgICB9CiAgICAgICAgICAgIG1hID0gY29udGFpbmVyICJNb2JpbGUgQXBwbGljYXRpb24iIHsKICAgICAgICAgICAgICAgIHRhZ3MgIk1vYmlsZSBBcHAiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJveHktZXh0ID0gY29udGFpbmVyICJFbnZveSBFeHRlcm5hbCIgewogICAgICAgICAgICAgICAgdGFncyAiUHJveHkiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJveHktaW50ID0gY29udGFpbmVyICJFbnZveSBJbnRlcm5hbCIgewogICAgICAgICAgICAgICAgdGFncyAiUHJveHkiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBpLWludCA9IGNvbnRhaW5lciAiQVBJIEludGVybmFsIiB7CiAgICAgICAgICAgICAgICB0YWdzICJBUEkiCiAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJSdXN0IgogICAgICAgICAgICAgICAgZ3JwYyA9IGNvbXBvbmVudCAiZ1JQQyBBUEkiIHsKICAgICAgICAgICAgICAgICAgICB0YWdzICJBUEkgQ29tcG9uZW50IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBpLWV4dCA9IGNvbnRhaW5lciAiQVBJIEV4dGVybmFsIiB7CiAgICAgICAgICAgICAgICB0YWdzICJBUEkiCiAgICAgICAgICAgICAgICB0ZWNobm9sb2d5ICJSdXN0IgogICAgICAgICAgICAgICAgcmVzdCA9IGNvbXBvbmVudCAiUkVTVCBBUEkiIHsKICAgICAgICAgICAgICAgICAgICB0YWdzICJBUEkgQ29tcG9uZW50IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW50ZXJmYWNlID0gY29udGFpbmVyICJJbnRlcmZhY2UiICJDb3JlIGNvZGUgdG8gZG8gdGhlIGRpcnR5IHdvcmsiIHsKICAgICAgICAgICAgICAgIHRhZ3MgIkludGVyZmFjZSIKICAgICAgICAgICAgICAgIHRlY2hub2xvZ3kgIlJ1c3QiCiAgICAgICAgICAgICAgICBpbnRlcmZhY2UgPSBjb21wb25lbnQgIkludGVyZmFjZSBBUEkiIHsKICAgICAgICAgICAgICAgICAgICB0YWdzICJBUEkgQ29tcG9uZW50IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhY2hlID0gY29udGFpbmVyICJXcml0ZS1UaHJvdWdoIENhY2hlIHBhaXJlZCB3aXRoIENhY2hlLUFzaWRlIiAiV3JpdGUgdG8gY2FjaGUgYW5kIERCIGluIHBhcmFsbGVsLCBidXQgYWxzbyB1cGRhdGUgY2FjaGUgaWYgYSBrZXkgaXMgbWlzc2VkIiB7CiAgICAgICAgICAgICAgICB0YWdzICJDYWNoZSIKICAgICAgICAgICAgfQogICAgICAgICAgICBkYiA9IGNvbnRhaW5lciAiTW9uZ29EQiIgewogICAgICAgICAgICAgICAgdGFncyAiRGF0YWJhc2UiCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ3JvdXAgIk9ic2VydmFiaWxpdHkiIHsKICAgICAgICAgICAgICAgIHBvc3Rob2cgPSBjb250YWluZXIgIlBvc3RIb2ciIHsKICAgICAgICAgICAgICAgICAgICB0YWdzICJPYnNlcnZhYmlsaXR5IgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ3JhZmFuYSA9IGNvbnRhaW5lciAiR3JhZmFuYSIgewogICAgICAgICAgICAgICAgICAgIHRhZ3MgIk9ic2VydmFiaWxpdHkiCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ3JvdXAgIkRXSCIgewogICAgICAgICAgICAgICAgbWV0YWJhc2UgPSBjb250YWluZXIgIk1ldGFiYXNlIiAiVGhpcyBjb3VsZCBiZSBleHBhbmRlZCBpbiB0aGUgZnV0dXJlIHRvIGluY2x1ZGUgaWNlYmVyZyB3aXRoIHNwYXJrLCBpZiBuZWVkZWQiIHsKICAgICAgICAgICAgICAgICAgICB0YWdzICJEV0giCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXh0ID0gc29mdHdhcmVTeXN0ZW0gIkIyQiBTeXN0ZW1zIiB7CiAgICAgICAgICAgIHRhZ3MgIkN1c3RvbWVyIgogICAgICAgIH0KICAgICAgICBiaWxsaW5nID0gc29mdHdhcmVTeXN0ZW0gIkJpbGxpbmcgKFN0cmlwZSBvciBzaW1pbGFyKSIgewogICAgICAgICAgICB0YWdzICJCaWxsaW5nIgogICAgICAgIH0KICAgICAgICBtYXBzID0gc29mdHdhcmVTeXN0ZW0gIk1hcHMgKEdvb2dsZSBNYXBzIG9yIHNpbWlsYXIpIiB7CiAgICAgICAgICAgIHRhZ3MgIk1hcHMiCiAgICAgICAgfQogICAgICAgIAoKCgogICAgICAgIHUgLT4gc3MgIlNlYXJjaCBmb3IgZXZlbnRzIGluIHRoZSBuZWFyYnkgYXJlYSIKICAgICAgICB1IC0+IHNzLndhICJVc2VzIHRoZSB3ZWIgYXBwbGljYXRpb24gdG8gc2VhcmNoIGZvciBldmVudHMiCiAgICAgICAgdSAtPiBzcy5tYSAiVXNlcyB0aGUgbW9iaWxlIGFwcGxpY2F0aW9uIHRvIHNlYXJjaCBmb3IgZXZlbnRzIgogICAgICAgIHNzLndhIC0+IHNzLnByb3h5LWludCAiQ29ubmVjdCB0byIKICAgICAgICBzcy5tYSAtPiBzcy5wcm94eS1pbnQgIkNvbm5lY3QgdG8iCiAgICAgICAgZXh0IC0+IHNzLnByb3h5LWV4dCAiQ29ubmVjdCB0byIKICAgICAgICBzcy5wcm94eS1leHQgLT4gc3MuYXBpLWV4dCAiTG9hZCBiYWxhbmNlIHRvIEFQSSIKICAgICAgICBzcy5wcm94eS1pbnQgLT4gc3MuYXBpLWludCAiTG9hZCBiYWxhbmNlIHRvIEFQSSIKICAgICAgICBzcy5hcGktaW50LmdycGMgLT4gc3MuaW50ZXJmYWNlICJVc2VzIHRoZSBpbnRlcmZhY2UgdG8gc2VhcmNoIGZvciBldmVudHMiCiAgICAgICAgc3MuYXBpLWV4dC5yZXN0IC0+IHNzLmludGVyZmFjZSAiVXNlcyB0aGUgaW50ZXJmYWNlIHRvIHNlYXJjaCBmb3IgZXZlbnRzIgogICAgICAgIHNzLmludGVyZmFjZSAtPiBzcy5jYWNoZSAiUmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIHRoZSBjYWNoZSIKICAgICAgICBzcy5jYWNoZSAtPiBzcy5kYiAiUmVhZHMgZnJvbSBhbmQgd3JpdGVzIHRvIHRoZSBkYXRhYmFzZSIKICAgICAgICBzcy5hcGktaW50IC0+IHNzLmdyYWZhbmEgIlZpc3VhbGl6ZSBkYXRhIHdpdGggR3JhZmFuYSIKICAgICAgICBzcy5hcGktZXh0IC0+IHNzLmdyYWZhbmEgIlZpc3VhbGl6ZSBkYXRhIHdpdGggR3JhZmFuYSIKICAgICAgICBzcy5pbnRlcmZhY2UgLT4gc3MuZ3JhZmFuYSAiVmlzdWFsaXplIGRhdGEgd2l0aCBHcmFmYW5hIgogICAgICAgIHNzLndhIC0+IHNzLnBvc3Rob2cgIlRyYWNrIHVzZXIgYmVoYXZpb3Igd2l0aCBQb3N0SG9nIgogICAgICAgIHNzLm1hIC0+IHNzLnBvc3Rob2cgIlRyYWNrIHVzZXIgYmVoYXZpb3Igd2l0aCBQb3N0SG9nIgogICAgICAgIHNzLmludGVyZmFjZSAtPiBzcy5wb3N0aG9nICJUcmFjayB1c2VyIGJlaGF2aW9yIHdpdGggUG9zdEhvZyIKICAgICAgICBzcy5tZXRhYmFzZSAtPiBzcy5kYiAiQ3JlYXRlIHJlcG9ydHMgZnJvbSB0aGUgZGF0YSBpbiB0aGUgZGF0YWJhc2UiCiAgICAgICAgc3MuYXBpLWV4dCAtPiBiaWxsaW5nICJCaWxsaW5nIEIyQiBldmVudHMiCiAgICAgICAgc3MuYXBpLWludCAtPiBiaWxsaW5nICJCaWxsaW5nIFVzZXJzIGV2ZW50cyIKICAgICAgICBzcy53YSAtPiBtYXBzICJVc2VzIHRoZSBtYXBzIHRvIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGV2ZW50cyIKICAgICAgICBzcy5tYSAtPiBtYXBzICJVc2VzIHRoZSBtYXBzIHRvIGdldCB0aGUgbG9jYXRpb24gb2YgdGhlIGV2ZW50cyIKICAgIH0KCiAgICB2aWV3cyB7CiAgICAgICAgc3lzdGVtQ29udGV4dCBzcyAiU3lzdGVtQ29udGV4dCIgewogICAgICAgICAgICBpbmNsdWRlICoKICAgICAgICAgICAgYXV0b2xheW91dCBscgogICAgICAgIH0KCiAgICAgICAgY29udGFpbmVyIHNzICJDb250YWluZXIiIHsKICAgICAgICAgICAgaW5jbHVkZSAqCiAgICAgICAgICAgIGF1dG9sYXlvdXQgbHIKICAgICAgICB9CgogICAgICAgIAogICAgICAgIHN0eWxlcyB7CiAgICAgICAgICAgIGVsZW1lbnQgIkVsZW1lbnQiIHsKICAgICAgICAgICAgICAgIGNvbG9yICMwNzczYWYKICAgICAgICAgICAgICAgIHN0cm9rZSAjMDc3M2FmCiAgICAgICAgICAgICAgICBzdHJva2VXaWR0aCA3CiAgICAgICAgICAgICAgICBzaGFwZSByb3VuZGVkYm94CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCAiUGVyc29uIiB7CiAgICAgICAgICAgICAgICBzaGFwZSBwZXJzb24KICAgICAgICAgICAgfQogICAgICAgICAgICBlbGVtZW50ICJCb3VuZGFyeSIgewogICAgICAgICAgICAgICAgc3Ryb2tlV2lkdGggNQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbGF0aW9uc2hpcCAiUmVsYXRpb25zaGlwIiB7CiAgICAgICAgICAgICAgICB0aGlja25lc3MgNAogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQgIkRhdGFiYXNlIiB7CiAgICAgICAgICAgICAgICBzaGFwZSBjeWxpbmRlcgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQgIkNvbnRhaW5lciIgewogICAgICAgICAgICAgICAgc2hhcGUgYm94CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCAiQVBJIENvbXBvbmVudCIgewogICAgICAgICAgICAgICAgc2hhcGUgYm94CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCAiV2ViIEFwcCIgewogICAgICAgICAgICAgICAgc2hhcGUgV2ViQnJvd3NlcgogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsZW1lbnQgIk1vYmlsZSBBcHAiIHsKICAgICAgICAgICAgICAgIHNoYXBlIE1vYmlsZURldmljZVBvcnRyYWl0CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxlbWVudCAiQVBJIiB7CiAgICAgICAgICAgICAgICBzaGFwZSBIZXhhZ29uCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cgp9"},"views":{"configuration":{"branding":{},"styles":{"elements":[{"shape":"Hexagon","tag":"API"},{"shape":"Box","tag":"API Component"},{"strokeWidth":5,"tag":"Boundary"},{"shape":"Box","tag":"Container"},{"shape":"Cylinder","tag":"Database"},{"color":"#0773af","shape":"RoundedBox","stroke":"#0773af","strokeWidth":7,"tag":"Element"},{"shape":"MobileDevicePortrait","tag":"Mobile App"},{"shape":"Person","tag":"Person"},{"shape":"WebBrowser","tag":"Web App"}],"relationships":[{"tag":"Relationship","thickness":4}]},"terminology":{}},"containerViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"LeftRight","rankSeparation":300,"vertices":false},"elements":[{"id":"1","x":0,"y":0},{"id":"3","x":0,"y":0},{"id":"4","x":0,"y":0},{"id":"5","x":0,"y":0},{"id":"6","x":0,"y":0},{"id":"7","x":0,"y":0},{"id":"9","x":0,"y":0},{"id":"11","x":0,"y":0},{"id":"13","x":0,"y":0},{"id":"14","x":0,"y":0},{"id":"15","x":0,"y":0},{"id":"16","x":0,"y":0},{"id":"17","x":0,"y":0},{"id":"18","x":0,"y":0},{"id":"19","x":0,"y":0},{"id":"20","x":0,"y":0}],"externalSoftwareSystemBoundariesVisible":false,"key":"Container","name":"Container View: Event Directory","order":2,"relationships":[{"id":"22"},{"id":"23"},{"id":"24"},{"id":"25"},{"id":"26"},{"id":"28"},{"id":"29"},{"id":"31"},{"id":"33"},{"id":"34"},{"id":"35"},{"id":"36"},{"id":"37"},{"id":"38"},{"id":"39"},{"id":"40"},{"id":"41"},{"id":"42"},{"id":"43"},{"id":"45"},{"id":"46"},{"id":"48"}],"softwareSystemId":"2"}],"systemContextViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"LeftRight","rankSeparation":300,"vertices":false},"elements":[{"id":"1","x":0,"y":0},{"id":"2","x":0,"y":0},{"id":"18","x":0,"y":0},{"id":"19","x":0,"y":0},{"id":"20","x":0,"y":0}],"enterpriseBoundaryVisible":true,"key":"SystemContext","name":"System Context View: Event Directory","order":1,"relationships":[{"id":"21"},{"id":"27"},{"id":"44"},{"id":"47"}],"softwareSystemId":"2"}]}}