How miw-upm/goa works
1. What this repository is
- This is not the application source code itself. It is a support repository for a teaching example of the GOA legal-office platform.
- Its main purpose is to document architecture and provide deployment/database configuration artifacts for the broader system.
2. System being described
- The target system is a law-firm management application split into:
- an Angular front-end
- a microservices back-end
- The README explicitly says the back-end uses both 3-layer and hexagonal architectural styles, so different services may be structured differently but share the same overall platform.
3. Main runtime subsystems
- The back-end is composed of several independently deployed services:
- GOA User
- GOA Engagement
- GOA Billing
- GOA Document
- GOA Support
- GOA AI1 / GOA AI2
- Supporting infrastructure services include:
- GOA Gateway
- GOA Eureka
- The gateway acts as the public entry point, while Eureka provides service discovery for the microservices.
4. Request flow
- Typical traffic path is:
- browser/client → Angular front-end
- front-end → Gateway
- gateway → targeted microservice
- microservice → its database
- Service-to-service resolution is likely handled through Eureka, which fits the microservice discovery model described in the README.
5. Security boundary
- Security is based on OAuth2 and OpenID Connect.
- The README indicates both authentication flows are implemented in the API, so the back-end is not just a resource server; it also participates in identity-related responsibilities.
- This means the authentication/authorization boundary sits at the API layer rather than in the front-end.
6. Persistence layer
- Persistence uses JPA with Hibernate on top of PostgreSQL.
- The database/docker-compose-db.yml file suggests local database provisioning is containerized for development/testing.
- The architecture is therefore database-backed rather than event-driven or file-based.
7. Deployment and ingress
- The deploy/ directory shows the operational edge of the system:
- nginx-conf-miwupm.txt
- nginx-conf-ocanabogados.txt
- cd-update-nginx-config.yml
- This indicates Nginx is used as the reverse proxy / public ingress layer, with different configs for different environments or hostnames.
- deploy/instance-lightsail.md shows the system is deployed on AWS Lightsail in at least one setup.
8. Environment-specific concerns
- The presence of separate Nginx configs for miwupm and ocanabogados implies this repo supports multiple deployment targets or branding variants.
- The README’s AWS badges and system version endpoints suggest the services expose health/version endpoints used for operational visibility.
9. Operational/teaching focus
- The repo is clearly educational: it supports MDW/BETCA coursework and demonstrates microservices, layered/hexagonal design, persistence, and OAuth2/OIDC in one example.
- The architecture file architecture/rest-project-duplicate.md likely captures the design rationale for one of the REST service patterns used in the system.
10. What to draw in an architecture diagram
- Show the browser on the left, the Angular front-end, then Nginx/Gateway as the public entry path.
- Behind that, show the microservices as separate bounded contexts, each with its own PostgreSQL-backed persistence.
- Add Eureka as the discovery/control-plane service and OAuth2/OIDC as the authentication authority/integration point.
- Place the database/ and deploy/ artifacts as supporting infrastructure around the runtime system, not as application components themselves.
Main entry points: README.md README · docker-compose-db.yml DB compose · rest-project-duplicate.md Arch note · nginx-conf-miwupm.txt Nginx config
Components 20
Client & Edge
Browser, front-end, and public ingress path
- Browser · User access point
- Angular UI · Single-page client application
- Nginx · Public ingress and environment-specific routing
Microservices
Business services and platform control-plane
- Gateway · API entry point to backend services
- Eureka · Service registry and discovery control plane
- OAuth2 / OIDC · Authentication and authorization boundary
- User · User and identity-related service
- Engagement · Client engagement management
- Billing · Billing and accounting service
- Document · Document handling service
- Support · Support and case service
- AI services · AI-backed assistant services
Persistence
Database layer and local provisioning
- PostgreSQL · Relational persistence backend
- DB compose · Local database provisioning stack
database/docker-compose-db.yml
Repo Artifacts
Documentation and deployment configuration in this support repository
- Arch note · Architecture rationale for the REST service pattern
architecture/rest-project-duplicate.md - Nginx config · MiwUPM ingress configuration
deploy/nginx-conf-miwupm.txt - Nginx config · Ocanabogados ingress configuration
deploy/nginx-conf-ocanabogados.txt - CI update · Workflow to update Nginx configuration
deploy/cd-update-nginx-config.yml - Lightsail · AWS Lightsail deployment guidance
deploy/instance-lightsail.md - README · Repository overview and system context
README.md
Connections 30
- Browser → Angular UI: uses · Users access the Angular client
- Angular UI → Nginx: routes through · Client traffic reaches the public ingress
- Nginx → Gateway: proxies to · Ingress forwards API requests to the gateway
- Gateway → User: calls · Gateway routes requests to user management
- Gateway → Engagement: calls · Gateway routes requests to engagement
- Gateway → Billing: calls · Gateway routes requests to billing
- Gateway → Document: calls · Gateway routes requests to documents
- Gateway → Support: calls · Gateway routes requests to support
- Gateway → AI services: calls · Gateway routes requests to AI services
- Gateway → OAuth2 / OIDC: authenticates · API layer enforces OAuth2 and OpenID Connect flows
- User → Eureka: registers with · Services use discovery for runtime lookup
- Engagement → Eureka: registers with · Services use discovery for runtime lookup
- Billing → Eureka: registers with · Services use discovery for runtime lookup
- Document → Eureka: registers with · Services use discovery for runtime lookup
- Support → Eureka: registers with · Services use discovery for runtime lookup
- AI services → Eureka: registers with · Services use discovery for runtime lookup
- User → PostgreSQL: persists to · Each service uses relational persistence
- Engagement → PostgreSQL: persists to · Each service uses relational persistence
- Billing → PostgreSQL: persists to · Each service uses relational persistence
- Document → PostgreSQL: persists to · Each service uses relational persistence
- Support → PostgreSQL: persists to · Each service uses relational persistence
- AI services → PostgreSQL: persists to · Each service uses relational persistence
- DB compose → PostgreSQL: provisions · Local compose file provisions the database
- README → Gateway: describes · Repository documentation explains the entry path
- README → Eureka: describes · Repository documentation explains discovery
- Arch note → Gateway: documents · Architecture note captures REST service design
- Nginx config → Nginx: configures · Environment-specific ingress configuration
- Nginx config → Nginx: configures · Environment-specific ingress configuration
- CI update → Nginx: updates · CI workflow refreshes Nginx configuration
- Lightsail → Nginx: deploys · Deployment notes cover Lightsail setup