{"configuration":{},"description":"Sistema administrativo para gestión de dinámicas y promociones usando IA","documentation":{},"id":7,"lastModifiedAgent":"structurizr-cli/","lastModifiedDate":"2025-06-04T02:22:03Z","lastModifiedUser":"vsts@fv-az2952-50","model":{"people":[{"description":"Personal estratégico y operativo de Zigi","id":"1","location":"Unspecified","name":"Ziglers","properties":{"structurizr.dsl.identifier":"ziglers"},"relationships":[{"description":"Usa para gestionar dinámicas","destinationId":"9","id":"25","sourceId":"1","tags":"Relationship"},{"description":"Usa para gestionar dinámicas","destinationId":"8","id":"26","linkedRelationshipId":"25","sourceId":"1"}],"tags":"Element,Person"},{"description":"Clientes que usan la app Zigi, no interactúan directamente con el backoffice","id":"2","location":"Unspecified","name":"Usuarios de App Zigi","properties":{"structurizr.dsl.identifier":"usuarios_app"},"relationships":[{"description":"Interactúan con dinámicas","destinationId":"3","id":"27","sourceId":"2","tags":"Relationship"}],"tags":"Element,Person"}],"softwareSystems":[{"description":"App móvil principal para usuarios","documentation":{},"id":"3","location":"Unspecified","name":"Zigi Mobile App","properties":{"structurizr.dsl.identifier":"zigi_app"},"relationships":[{"description":"Recibe configuraciones de desafíos","destinationId":"4","id":"28","sourceId":"3","tags":"Relationship"}],"tags":"Element,Software System"},{"description":"Servicio que ejecuta la lógica de gamificación","documentation":{},"id":"4","location":"Unspecified","name":"Zigi Gamification Service","properties":{"structurizr.dsl.identifier":"gamification_service"},"relationships":[{"description":"Recibe definiciones desde","destinationId":"10","id":"29","sourceId":"4","tags":"Relationship"},{"description":"Recibe definiciones desde","destinationId":"8","id":"30","linkedRelationshipId":"29","sourceId":"4"}],"tags":"Element,Software System"},{"description":"Servicio para consultas SQL sobre data warehouse","documentation":{},"id":"5","location":"Unspecified","name":"AWS Athena","properties":{"structurizr.dsl.identifier":"aws_athena"},"tags":"Element,Software System"},{"description":"Servicio de autenticación y autorización","documentation":{},"id":"6","location":"Unspecified","name":"AWS Cognito","properties":{"structurizr.dsl.identifier":"aws_cognito"},"tags":"Element,Software System"},{"description":"Base de datos principal del sistema","documentation":{},"id":"7","location":"Unspecified","name":"PostgreSQL Database","properties":{"structurizr.dsl.identifier":"postgres_db"},"tags":"Element,Software System"},{"containers":[{"description":"Interfaz para Ziglers","documentation":{},"id":"9","name":"Frontend Web App","properties":{"structurizr.dsl.identifier":"frontend"},"relationships":[{"description":"Usa","destinationId":"10","id":"14","sourceId":"9","tags":"Relationship","technology":"HTTPS"},{"description":"Autenticación","destinationId":"6","id":"15","sourceId":"9","tags":"Relationship","technology":"OAuth2/JWT"}],"tags":"Element,Container","technology":"React, TypeScript"},{"description":"API principal con lógica de negocio","documentation":{},"id":"10","name":"Backend API","properties":{"structurizr.dsl.identifier":"backend"},"relationships":[{"description":"Lee/Escribe","destinationId":"11","id":"17","sourceId":"10","tags":"Relationship","technology":"SQL"},{"description":"Carga archivos estáticos","destinationId":"12","id":"18","sourceId":"10","tags":"Relationship","technology":"S3 SDK"},{"description":"Carga whitelists CSV","destinationId":"13","id":"19","sourceId":"10","tags":"Relationship","technology":"S3 SDK"},{"description":"Ejecuta consultas","destinationId":"5","id":"20","sourceId":"10","tags":"Relationship","technology":"Athena SDK"},{"description":"Crea desafíos","destinationId":"4","id":"22","sourceId":"10","tags":"Relationship","technology":"HTTP REST"},{"description":"Valida identidad de Ziglers","destinationId":"6","id":"24","sourceId":"10","tags":"Relationship","technology":"JWT"},{"description":"Lee/Escribe datos persistentes","destinationId":"7","id":"31","sourceId":"10","tags":"Relationship","technology":"JDBC"},{"description":"Ejecuta consultas para segmentación","destinationId":"5","id":"33","sourceId":"10","tags":"Relationship","technology":"AWS SDK"}],"tags":"Element,Container","technology":"NestJS, Node.js"},{"description":"Base de datos principal","documentation":{},"id":"11","name":"PostgreSQL Database","properties":{"structurizr.dsl.identifier":"db"},"tags":"Element,Container","technology":"PostgreSQL"},{"description":"Almacén de archivos estáticos","documentation":{},"id":"12","name":"AWS S3 Static Bucket","properties":{"structurizr.dsl.identifier":"s3_static"},"tags":"Element,Container","technology":"AWS S3"},{"description":"Archivos CSV generados","documentation":{},"id":"13","name":"AWS S3 Whitelist Bucket","properties":{"structurizr.dsl.identifier":"s3_whitelist"},"tags":"Element,Container","technology":"AWS S3"}],"description":"Sistema para gestión de gamificación, promociones y audiencias con IA","documentation":{},"id":"8","location":"Unspecified","name":"Zigi Loyalty Backoffice","properties":{"structurizr.dsl.identifier":"loyalty_backoffice"},"relationships":[{"description":"Autenticación","destinationId":"6","id":"16","linkedRelationshipId":"15","sourceId":"8","technology":"OAuth2/JWT"},{"description":"Ejecuta consultas","destinationId":"5","id":"21","linkedRelationshipId":"20","sourceId":"8","technology":"Athena SDK"},{"description":"Crea desafíos","destinationId":"4","id":"23","linkedRelationshipId":"22","sourceId":"8","technology":"HTTP REST"},{"description":"Lee/Escribe datos persistentes","destinationId":"7","id":"32","linkedRelationshipId":"31","sourceId":"8","technology":"JDBC"}],"tags":"Element,Software System"}]},"name":"Zigi Loyalty Backoffice Service","properties":{"structurizr.dsl":"d29ya3NwYWNlICJaaWdpIExveWFsdHkgQmFja29mZmljZSBTZXJ2aWNlIiAiU2lzdGVtYSBhZG1pbmlzdHJhdGl2byBwYXJhIGdlc3Rpw7NuIGRlIGRpbsOhbWljYXMgeSBwcm9tb2Npb25lcyB1c2FuZG8gSUEiIHsKICBtb2RlbCB7CiAgICAvLyBQZXJzb25hcwogICAgemlnbGVycyA9IHBlcnNvbiAiWmlnbGVycyIgIlBlcnNvbmFsIGVzdHJhdMOpZ2ljbyB5IG9wZXJhdGl2byBkZSBaaWdpIgogICAgdXN1YXJpb3NfYXBwID0gcGVyc29uICJVc3VhcmlvcyBkZSBBcHAgWmlnaSIgIkNsaWVudGVzIHF1ZSB1c2FuIGxhIGFwcCBaaWdpLCBubyBpbnRlcmFjdMO6YW4gZGlyZWN0YW1lbnRlIGNvbiBlbCBiYWNrb2ZmaWNlIgoKICAgIC8vIFNpc3RlbWFzIGV4dGVybm9zCiAgICB6aWdpX2FwcCA9IHNvZnR3YXJlU3lzdGVtICJaaWdpIE1vYmlsZSBBcHAiICJBcHAgbcOzdmlsIHByaW5jaXBhbCBwYXJhIHVzdWFyaW9zIiAKICAgIGdhbWlmaWNhdGlvbl9zZXJ2aWNlID0gc29mdHdhcmVTeXN0ZW0gIlppZ2kgR2FtaWZpY2F0aW9uIFNlcnZpY2UiICJTZXJ2aWNpbyBxdWUgZWplY3V0YSBsYSBsw7NnaWNhIGRlIGdhbWlmaWNhY2nDs24iCiAgICBhd3NfYXRoZW5hID0gc29mdHdhcmVTeXN0ZW0gIkFXUyBBdGhlbmEiICJTZXJ2aWNpbyBwYXJhIGNvbnN1bHRhcyBTUUwgc29icmUgZGF0YSB3YXJlaG91c2UiCiAgICBhd3NfY29nbml0byA9IHNvZnR3YXJlU3lzdGVtICJBV1MgQ29nbml0byIgIlNlcnZpY2lvIGRlIGF1dGVudGljYWNpw7NuIHkgYXV0b3JpemFjacOzbiIKICAgIHBvc3RncmVzX2RiID0gc29mdHdhcmVTeXN0ZW0gIlBvc3RncmVTUUwgRGF0YWJhc2UiICJCYXNlIGRlIGRhdG9zIHByaW5jaXBhbCBkZWwgc2lzdGVtYSIKCiAgICAvLyBTaXN0ZW1hIHByaW5jaXBhbAogICAgbG95YWx0eV9iYWNrb2ZmaWNlID0gc29mdHdhcmVTeXN0ZW0gIlppZ2kgTG95YWx0eSBCYWNrb2ZmaWNlIiAiU2lzdGVtYSBwYXJhIGdlc3Rpw7NuIGRlIGdhbWlmaWNhY2nDs24sIHByb21vY2lvbmVzIHkgYXVkaWVuY2lhcyBjb24gSUEiIHsKICAgICAgZnJvbnRlbmQgPSBjb250YWluZXIgIkZyb250ZW5kIFdlYiBBcHAiICJJbnRlcmZheiBwYXJhIFppZ2xlcnMiICJSZWFjdCwgVHlwZVNjcmlwdCIKICAgICAgYmFja2VuZCA9IGNvbnRhaW5lciAiQmFja2VuZCBBUEkiICJBUEkgcHJpbmNpcGFsIGNvbiBsw7NnaWNhIGRlIG5lZ29jaW8iICJOZXN0SlMsIE5vZGUuanMiCiAgICAgIGRiID0gY29udGFpbmVyICJQb3N0Z3JlU1FMIERhdGFiYXNlIiAiQmFzZSBkZSBkYXRvcyBwcmluY2lwYWwiICJQb3N0Z3JlU1FMIgogICAgICBzM19zdGF0aWMgPSBjb250YWluZXIgIkFXUyBTMyBTdGF0aWMgQnVja2V0IiAiQWxtYWPDqW4gZGUgYXJjaGl2b3MgZXN0w6F0aWNvcyIgIkFXUyBTMyIKICAgICAgczNfd2hpdGVsaXN0ID0gY29udGFpbmVyICJBV1MgUzMgV2hpdGVsaXN0IEJ1Y2tldCIgIkFyY2hpdm9zIENTViBnZW5lcmFkb3MiICJBV1MgUzMiCgogICAgICBmcm9udGVuZCAtPiBiYWNrZW5kICJVc2EiICJIVFRQUyIKICAgICAgZnJvbnRlbmQgLT4gYXdzX2NvZ25pdG8gIkF1dGVudGljYWNpw7NuIiAiT0F1dGgyL0pXVCIKICAgICAgYmFja2VuZCAtPiBkYiAiTGVlL0VzY3JpYmUiICJTUUwiCiAgICAgIGJhY2tlbmQgLT4gczNfc3RhdGljICJDYXJnYSBhcmNoaXZvcyBlc3TDoXRpY29zIiAiUzMgU0RLIgogICAgICBiYWNrZW5kIC0+IHMzX3doaXRlbGlzdCAiQ2FyZ2Egd2hpdGVsaXN0cyBDU1YiICJTMyBTREsiCiAgICAgIGJhY2tlbmQgLT4gYXdzX2F0aGVuYSAiRWplY3V0YSBjb25zdWx0YXMiICJBdGhlbmEgU0RLIgogICAgICBiYWNrZW5kIC0+IGdhbWlmaWNhdGlvbl9zZXJ2aWNlICJDcmVhIGRlc2Fmw61vcyIgIkhUVFAgUkVTVCIKICAgICAgYmFja2VuZCAtPiBhd3NfY29nbml0byAiVmFsaWRhIGlkZW50aWRhZCBkZSBaaWdsZXJzIiAiSldUIgogICAgfQoKICAgIC8vIFJlbGFjaW9uZXMgZ2xvYmFsZXMKICAgIHppZ2xlcnMgLT4gZnJvbnRlbmQgIlVzYSBwYXJhIGdlc3Rpb25hciBkaW7DoW1pY2FzIgogICAgdXN1YXJpb3NfYXBwIC0+IHppZ2lfYXBwICJJbnRlcmFjdMO6YW4gY29uIGRpbsOhbWljYXMiCiAgICB6aWdpX2FwcCAtPiBnYW1pZmljYXRpb25fc2VydmljZSAiUmVjaWJlIGNvbmZpZ3VyYWNpb25lcyBkZSBkZXNhZsOtb3MiCiAgICBnYW1pZmljYXRpb25fc2VydmljZSAtPiBiYWNrZW5kICJSZWNpYmUgZGVmaW5pY2lvbmVzIGRlc2RlIgogICAgYmFja2VuZCAtPiBwb3N0Z3Jlc19kYiAiTGVlL0VzY3JpYmUgZGF0b3MgcGVyc2lzdGVudGVzIiAiSkRCQyIKICAgIGJhY2tlbmQgLT4gYXdzX2F0aGVuYSAiRWplY3V0YSBjb25zdWx0YXMgcGFyYSBzZWdtZW50YWNpw7NuIiAiQVdTIFNESyIKICB9CgogIHZpZXdzIHsKICAgIHN5c3RlbUNvbnRleHQgbG95YWx0eV9iYWNrb2ZmaWNlIHsKICAgICAgaW5jbHVkZSAqCiAgICAgIGF1dG9sYXlvdXQgbHIKICAgICAgdGl0bGUgIlppZ2kgTG95YWx0eSBCYWNrb2ZmaWNlIC0gU3lzdGVtIENvbnRleHQiCiAgICB9CgogICAgY29udGFpbmVyIGxveWFsdHlfYmFja29mZmljZSB7CiAgICAgIGluY2x1ZGUgKgogICAgICBhdXRvbGF5b3V0IGxyCiAgICAgIHRpdGxlICJaaWdpIExveWFsdHkgQmFja29mZmljZSAtIENvbnRhaW5lcnMiCiAgICB9CgogICAgc3R5bGVzIHsKICAgICAgZWxlbWVudCAiUGVyc29uIiB7CiAgICAgICAgYmFja2dyb3VuZCAiIzExNjhiZCIKICAgICAgICBjb2xvciAiI2ZmZmZmZiIKICAgICAgICBzaGFwZSAiUGVyc29uIgogICAgICB9CiAgICAgIGVsZW1lbnQgIlNvZnR3YXJlIFN5c3RlbSIgewogICAgICAgIGJhY2tncm91bmQgIiM5OTk5OTkiCiAgICAgICAgY29sb3IgIiNmZmZmZmYiCiAgICAgIH0KICAgICAgZWxlbWVudCAiQ29udGFpbmVyIiB7CiAgICAgICAgYmFja2dyb3VuZCAiIzVkOWNlYyIKICAgICAgICBjb2xvciAiI2ZmZmZmZiIKICAgICAgfQogICAgICBlbGVtZW50ICJEYXRhYmFzZSIgewogICAgICAgIHNoYXBlICJDeWxpbmRlciIKICAgICAgICBiYWNrZ3JvdW5kICIjMjNhMmQ5IgogICAgICAgIGNvbG9yICIjZmZmZmZmIgogICAgICB9CiAgICAgIGVsZW1lbnQgIkZpbGUgU3RvcmFnZSIgewogICAgICAgIHNoYXBlICJGb2xkZXIiCiAgICAgICAgYmFja2dyb3VuZCAiI2ZmOTkwMCIKICAgICAgICBjb2xvciAiIzAwMDAwMCIKICAgICAgfQogICAgICBlbGVtZW50ICJGcm9udGVuZCBXZWIgQXBwIiB7CiAgICAgICAgc2hhcGUgIldlYkJyb3dzZXIiCiAgICAgICAgYmFja2dyb3VuZCAiIzg1YmJmMCIKICAgICAgfQogICAgfQoKICAgIHRoZW1lIGRlZmF1bHQKICB9Cn0="},"views":{"configuration":{"branding":{},"styles":{"elements":[{"background":"#1168bd","color":"#ffffff","shape":"Person","tag":"Person"},{"background":"#999999","color":"#ffffff","tag":"Software System"},{"background":"#5d9cec","color":"#ffffff","tag":"Container"},{"background":"#23a2d9","color":"#ffffff","shape":"Cylinder","tag":"Database"},{"background":"#ff9900","color":"#000000","shape":"Folder","tag":"File Storage"},{"background":"#85bbf0","shape":"WebBrowser","tag":"Frontend Web App"}]},"terminology":{},"themes":["https://static.structurizr.com/themes/default/theme.json"]},"containerViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"LeftRight","rankSeparation":300,"vertices":false},"elements":[{"id":"1","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":"10","x":0,"y":0},{"id":"11","x":0,"y":0},{"id":"12","x":0,"y":0},{"id":"13","x":0,"y":0}],"externalSoftwareSystemBoundariesVisible":false,"generatedKey":true,"key":"Container-001","order":2,"relationships":[{"id":"14"},{"id":"15"},{"id":"17"},{"id":"18"},{"id":"19"},{"id":"20"},{"id":"22"},{"id":"24"},{"id":"25"},{"id":"29"},{"id":"31"},{"id":"33"}],"softwareSystemId":"8","title":"Zigi Loyalty Backoffice - Containers"}],"systemContextViews":[{"automaticLayout":{"applied":false,"edgeSeparation":0,"implementation":"Graphviz","nodeSeparation":300,"rankDirection":"LeftRight","rankSeparation":300,"vertices":false},"elements":[{"id":"1","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":"8","x":0,"y":0}],"enterpriseBoundaryVisible":true,"generatedKey":true,"key":"SystemContext-001","order":1,"relationships":[{"id":"16"},{"id":"21"},{"id":"23"},{"id":"26"},{"id":"30"},{"id":"32"}],"softwareSystemId":"8","title":"Zigi Loyalty Backoffice - System Context"}]}}