Skip to main content

Architecture Overview

A one-page tour of how connectCenter is put together — enough to find the module and package a change belongs in. For the technology stack per module, see Contributor Prerequisites; for running the stack from source, see Development Setup.

Topology​

At its core, connectCenter is a single-page Angular application (score-web) talking to a Spring Boot REST gateway (score-http), backed by a MySQL/MariaDB-compatible database and Redis. Companion services sit alongside the core for external/programmatic access.

A request flows through the system like this:

  1. The browser loads the Angular SPA served by score-web.
  2. The SPA issues REST calls under the /api prefix — proxied to the backend dev port 9000 in development, or routed via GATEWAY_HOST/GATEWAY_PORT in the packaged frontend image.
  3. score-http controllers handle the request. Most API packages split writes from reads (*CommandController vs. *QueryController).
  4. Services read and write the relational model through jOOQ; sessions and cache are served from Redis; realtime interactions use a WebSocket/STOMP channel.
  5. The response (typically JSON) returns to the SPA. Schema export operations produce downloadable artifacts (see Schema generation below).

Backend API packages​

All backend API code lives under org.oagi.score.gateway.http.api. Each package maps to a score-web feature module (under score-web/src/app) where one exists — this table is the "where does my change go" map:

API package (…http.api.*)PurposeFrontend module (score-web/src/app)
account_managementUser account CRUD, pending registrations, and system accounts.account-management
agency_id_managementAgency Identification lists and their values.agency-id-list-management
ai_managementQuery the available AI model(s) used by AI-assisted features.(used by AI-assisted features)
application_managementRead/update application-wide configuration settings.settings-management
bie_managementBusiness Information Entity (BIE) profiling: edit, generate, report, and BIE packages.bie-management
business_term_managementBusiness terms and their assignment to components.business-term-management
cc_managementCore Component management (ACC, ASCCP, BCCP, DT/BDT).cc-management
code_list_managementCode lists, their values, and code-list uplift.code-list-management
comment_managementComments attached to components and BIEs.(inline in component / BIE detail views)
context_managementBusiness context: context categories, context schemes, and business contexts.context-management
exportSchema export engine (XML / JSON Schema generation, schema diffing).(invoked by export / generate actions)
externalLookups exposing BIE and component data to other internal callers.—
graphServes component / relationship graph data for diagrams.(diagram dialogs)
info_managementDashboard "info" summaries (product info, BIE/CC counts).basis (about / landing)
integration_managementGitHub-issue integration for tracking component changes.(see GitHub Integration)
library_managementCCS libraries (the top-level container for releases and content).library-management
log_managementRevision / change logs and log comparison.log-management
mailSends outbound email (e.g. notifications).—
message_managementIn-app messages / notifications.message-management
module_managementModule sets and module-set releases.module-management
namespace_managementXML namespace definitions.namespace-management
oas_managementOpenAPI (OAS) document definition and generation.bie-management (OpenAPI doc tooling)
plantumlRenders PlantUML diagrams.common (PlantUML diagram component)
release_managementRelease lifecycle: create, assign content, and release diagrams.release-management
tag_managementTags applied to components / BIEs.tag-management
tenant_managementMulti-tenant configuration.(see Multi-Tenant Management)
xbt_managementXML built-in / expression-built-in type definitions.(referenced by DT tooling)

A few score-web directories are shared infrastructure rather than feature modules: authentication (login/auth), basis (app shell and "about"), common (shared dialogs, trees, diagram and snackbar components), and settings-management.

Schema generation​

Schema generation is a backend responsibility, implemented in two score-http packages:

  • XML and JSON Schema export — the export package. Exporters walk the assembled schema modules with a visitor pattern (XMLExportSchemaModuleVisitor, JSONExportSchemaModuleVisitor) over a model layer with pluggable naming strategies; it is invoked from higher-level services (e.g. ReleaseQueryService, ModuleSetReleaseQueryService) rather than a single dedicated controller.
  • OpenAPI document generation — the oas_management package (OpenAPIDocController / OpenAPIGenerateController and their services, with expression builders under generate_openapi_expression).

Database structure​

The schema follows the CCTS (Core Component Technical Specification) v3.0 data model, so most table and column names mirror CCTS concepts directly. The canonical schema lives in score-repo/scripts/score-schema.sql; the in-repo engineering deep dive is docs/OverviewOfScoreDatabaseStructure/OverviewOfScoreDatabaseStructure.md. Schema changes between releases are applied by Flyway on backend startup — see Database Migration.

Each Core Component type has its own table — acc, ascc, asccp, bcc, bccp, dt (holding both CDTs and BDTs), and dt_sc — with name columns that compose the immutable DEN (Dictionary Entry Name). Code lists and agency ID lists (code_list, agency_id_list, and their *_value tables) are the value-domain libraries.

The data-type subsystem maps the 11 CCTS-allowed primitives onto concrete syntax types: cdt_pri lists the primitives, dt_awd_pri / dt_sc_awd_pri hold the allowed primitives per data type / supplementary component, and xbt (with its release-scoped xbt_manifest) carries the syntax mappings — builtIn_type (note the mixed-case spelling) plus jbt_draft05_map, jbt_202012_map, openapi30_map, and openapi31_map. A BBIE carries its value-domain restriction through exactly one of xbt_manifest_id, code_list_manifest_id, or agency_id_list_manifest_id.

The manifest pattern​

The single most important schema concept: a connectCenter database tracks multiple releases of a library at once, so immutable content rows are layered under release-specific manifest tables.

  • A content table (acc, asccp, dt, code_list, …) stores one revision of a component.
  • A matching *_manifest table (acc_manifest, asccp_manifest, …) points a single release_id at a specific revision.

"Which version of which component is in release X" is a property of the manifest row, not the content row:

SELECT acc.* FROM acc
JOIN acc_manifest ON acc.acc_id = acc_manifest.acc_id
JOIN release ON acc_manifest.release_id = release.release_id
WHERE release.release_num = ?;

Manifests also point at each other (e.g. acc_manifest.based_acc_manifest_id), so inheritance and associations resolve within a single release. BIE tables and module assignments therefore link to manifest rows, never to raw content rows.

Association order within an ACC is stored as a doubly linked list in the seq_key table (prev_seq_key_id / next_seq_key_id), so inserting or removing one association does not renumber the rest. Legacy integer seq_key columns still exist on some tables but are deprecated and no longer used for ordering.

BIE tables​

A BIE is a CC specialized for a business context. The BIE tables (abie, asbiep/asbie, bbiep/bbie, bbie_sc) mirror the CC tables and hang off a single root, top_level_asbiep. Every BIE row carries owner_top_level_asbiep_id, so an entire profile loads with one predicate per table; a reused BIE is an asbie whose target asbiep belongs to a different owner_top_level_asbiep_id. Packages of BIEs are modeled by bie_package / bie_package_top_level_asbiep.

Supporting table groups follow the same shapes: business contexts (ctx_category, ctx_scheme, biz_ctx*), business terms (business_term and *_bizterm links), OpenAPI documents (the oas_* family rooted at oas_doc), modules (module, module_set, module_set_release, and module_*_manifest assignment tables), and accounts/tenancy (app_user, app_oauth2_user, oauth2_app, tenant).