ITX Meeting Proxy Service

April 6, 2026 ยท View on GitHub

The ITX Meeting Proxy Service is a lightweight stateless proxy that forwards meeting-related requests to the ITX Zoom API service. It provides a thin authentication and authorization layer for the Linux Foundation's LFX platform.

๐Ÿš€ Quick Start

For Deployment (Helm)

# Install the proxy service
helm upgrade --install lfx-v2-meeting-service ./charts/lfx-v2-meeting-service \
  --namespace lfx \
  --create-namespace \
  --set image.tag=latest \
  --set app.environment.ITX_BASE_URL.value="https://api.itx.linuxfoundation.org" \
  --set app.environment.ITX_CLIENT_ID.value="your-client-id" \
  --set-file app.environment.ITX_CLIENT_PRIVATE_KEY.value=path/to/private.key

For Local Development

  1. Prerequisites

    • Go 1.24+ installed
    • Make installed
  2. Clone and Setup

    git clone https://github.com/linuxfoundation/lfx-v2-meeting-service.git
    cd lfx-v2-meeting-service
    
    # Install dependencies
    make deps
    
  3. Configure Environment

    # Copy the example environment file and configure it
    cp .env.example .env
    # Edit .env with ITX credentials
    

    Required environment variables:

    ITX_ENABLED=true
    ITX_BASE_URL=https://api.dev.itx.linuxfoundation.org
    ITX_CLIENT_ID=your-client-id
    ITX_CLIENT_PRIVATE_KEY="$(cat path/to/private.key)"
    ITX_AUTH0_DOMAIN=linuxfoundation-dev.auth0.com
    ITX_AUDIENCE=https://api.dev.itx.linuxfoundation.org/
    
  4. Run the Service

    # Run with default settings
    make run
    
    # Or run with debug logging
    make debug
    

๐Ÿ—๏ธ Architecture

The service is a stateless HTTP proxy built using a clean architecture pattern:

  • API Layer: Goa-generated HTTP handlers and OpenAPI specifications
  • Service Layer: Request validation and ITX client orchestration
  • Domain Layer: Core request/response models
  • Infrastructure Layer: ITX HTTP client with OAuth2 authentication

Key Features

  • Stateless Proxy: No data persistence, all state managed by ITX service
  • ITX Meeting Operations: Create, read, update, delete meetings via ITX
  • ITX Registrant Operations: Manage meeting registrants via ITX
  • ITX Past Meeting Operations: Full CRUD operations for past meeting records via ITX
  • ITX Past Meeting Summary Operations: Retrieve and update AI-generated meeting summaries
  • ITX Meeting Attachment Operations: Full CRUD operations for meeting attachments with presigned URL support
  • ITX Past Meeting Attachment Operations: Full CRUD operations for past meeting attachments with presigned URL support
  • JWT Authentication: Secure API access via Heimdall integration
  • ID Mapping: Optional v1/v2 ID translation via NATS (can be disabled)
  • OpenAPI Documentation: Auto-generated API specifications

๐Ÿ“ Project Structure

lfx-v2-meeting-service/
โ”œโ”€โ”€ cmd/                           # Application entry points
โ”‚   โ””โ”€โ”€ meeting-api/               # Main API server
โ”œโ”€โ”€ charts/                        # Helm chart for Kubernetes deployment
โ”‚   โ””โ”€โ”€ lfx-v2-meeting-service/
โ”œโ”€โ”€ design/                        # Goa API design files
โ”‚   โ”œโ”€โ”€ meeting-svc.go             # Service definition
โ”‚   โ””โ”€โ”€ itx_types.go               # ITX type definitions
โ”œโ”€โ”€ gen/                           # Generated code (DO NOT EDIT)
โ”‚   โ”œโ”€โ”€ http/                      # HTTP transport layer
โ”‚   โ””โ”€โ”€ meeting_service/           # Service interfaces
โ”œโ”€โ”€ internal/                      # Private application code
โ”‚   โ”œโ”€โ”€ domain/                    # Business domain layer
โ”‚   โ”‚   โ”œโ”€โ”€ models/                # Domain models
โ”‚   โ”‚   โ”œโ”€โ”€ errors.go              # Domain-specific errors
โ”‚   โ”‚   โ”œโ”€โ”€ itx_proxy.go           # ITX proxy interface
โ”‚   โ”‚   โ””โ”€โ”€ id_mapper.go           # ID mapper interface
โ”‚   โ”œโ”€โ”€ infrastructure/            # Infrastructure layer
โ”‚   โ”‚   โ”œโ”€โ”€ auth/                  # JWT authentication
โ”‚   โ”‚   โ”œโ”€โ”€ proxy/                 # ITX HTTP client
โ”‚   โ”‚   โ””โ”€โ”€ idmapper/              # NATS-based ID mapping
โ”‚   โ”œโ”€โ”€ middleware/                # HTTP middleware
โ”‚   โ””โ”€โ”€ service/                   # Service layer implementation
โ”‚       โ”œโ”€โ”€ auth_service.go        # Auth service
โ”‚       โ””โ”€โ”€ itx/                   # ITX services
โ”œโ”€โ”€ pkg/                           # Public packages
โ”‚   โ”œโ”€โ”€ models/itx/                # ITX request/response models
โ”‚   โ””โ”€โ”€ utils/                     # Utility functions
โ”œโ”€โ”€ Dockerfile                     # Container build configuration
โ”œโ”€โ”€ Makefile                       # Build and development commands
โ””โ”€โ”€ go.mod                         # Go module definition

๐Ÿ“ก Event Processing

The service includes a comprehensive event processing system for v1โ†’v2 data synchronization. It watches NATS JetStream KV buckets for meeting-related data changes and publishes events to both indexer and FGA-sync services.

Features:

  • 10 meeting-related event types (meetings, registrants, RSVPs, past meetings, participants, recordings, summaries)
  • RRULE occurrence calculation for recurring meetings
  • v1 user enrichment and Auth0 mapping
  • Dual publishing architecture (indexer + FGA-sync)
  • Parent-child dependency handling with retry logic

For complete details, see Event Processing Documentation.

For the data schemas, tags, access control values, and parent references for all indexed resource types โ€” see Indexer Contract.

๐Ÿ› ๏ธ Development

Prerequisites

  • Go 1.24+
  • Make
  • Git

Getting Started

  1. Install Dependencies

    make deps
    
  2. Generate API Code

    make apigen
    

    Generates HTTP transport, client, and OpenAPI documentation from design files.

  3. Build the Application

    make build
    

    Creates the binary in bin/meeting-api.

Development Workflow

Running the Service

# Run with default settings
make run

# Run with debug logging
make debug

# Build and run binary
make build
./bin/meeting-api

Code Quality

Always run these before committing:

# Format code
make fmt

# Run linter
make lint

# Run all tests
make test

# Check everything (format + lint + tests)
make check

API Development

When modifying the API:

  1. Update Design Files in design/ directory

  2. Regenerate Code:

    make apigen
    
  3. Verify Generation:

    make verify
    
  4. Run Tests to ensure nothing breaks:

    make test
    

Available Make Targets

TargetDescription
make allComplete build pipeline (clean, deps, apigen, fmt, lint, test, build)
make depsInstall dependencies, tools, and git hooks
make install-hooksInstall git hooks (pre-commit gofmt check)
make apigenGenerate API code from design files
make buildBuild the binary
make runRun the service locally
make debugRun with debug logging
make testRun unit tests
make test-verboseRun tests with verbose output
make test-coverageGenerate HTML coverage report
make lintRun code linter
make fmtFormat code
make checkVerify formatting and run linter
make verifyEnsure generated code is up to date
make cleanRemove build artifacts
make docker-buildBuild Docker image
make helm-installInstall Helm chart
make helm-uninstallUninstall Helm chart

๐Ÿงช Testing

Running Tests

# Run all tests
make test

# Run with verbose output
make test-verbose

# Generate coverage report
make test-coverage

๐Ÿš€ Deployment

Helm Chart

The service includes a Helm chart for Kubernetes deployment.

Prerequisites: Kubernetes Secret

Before installing the chart, create the meeting-secrets secret in the lfx namespace. The auth0_client_id and auth0_client_private_key values are in 1Password under the LFX V2 vault, in the note LFX Platform Chart Values Secrets - Local Development.

kubectl create secret generic meeting-secrets -n lfx \
  --from-literal=auth0_client_id="<client-id-from-1password>" \
  --from-file=auth0_client_private_key=./path/to/private.key

Option 1: Install from GHCR (no local code changes)

Use this if you just want to run the service without modifying its code. The image is pulled directly from the container registry:

make helm-install

# Or using Helm directly
helm upgrade --install lfx-v2-meeting-service ./charts/lfx-v2-meeting-service \
  --namespace lfx \
  --create-namespace

Option 2: Install from a Local Build (active development)

Use this if you are making changes to the service code. First, copy the example local values file (it is gitignored):

cp charts/lfx-v2-meeting-service/values.local.example.yaml \
   charts/lfx-v2-meeting-service/values.local.yaml

Then, whenever you make a code change and want to apply it:

# Rebuild the local image
make docker-build

# Install/upgrade the chart using the local image
make helm-install-local

# Or using Helm directly
helm upgrade --install lfx-v2-meeting-service ./charts/lfx-v2-meeting-service \
  --namespace lfx \
  --create-namespace \
  --values ./charts/lfx-v2-meeting-service/values.local.yaml

Docker

# Build Docker image
make docker-build

# Run with Docker
docker run -p 8080:8080 \
  -e ITX_ENABLED=true \
  -e ITX_BASE_URL=https://api.itx.linuxfoundation.org \
  -e ITX_CLIENT_ID=your-client-id \
  -e ITX_CLIENT_PRIVATE_KEY="$(cat path/to/private.key)" \
  linuxfoundation/lfx-v2-meeting-service:latest

๐Ÿ“– API Documentation

The service automatically generates OpenAPI documentation:

  • OpenAPI 2.0: gen/http/openapi.yaml
  • OpenAPI 3.0: gen/http/openapi3.yaml
  • JSON formats: Also available in gen/http/

Access the documentation at: http://localhost:8080/openapi.json

Available Endpoints

Health Checks

EndpointMethodDescription
/livezGETLiveness check
/readyzGETReadiness check

ITX Meeting Operations

EndpointMethodDescription
/itx/meetingsPOSTCreate meeting via ITX
/itx/meetings/{meeting_id}GETGet meeting details
/itx/meetings/{meeting_id}PUTUpdate meeting
/itx/meetings/{meeting_id}DELETEDelete meeting
/itx/meetings/{meeting_id}/join_linkGETGet join link for user
/itx/meetings/{meeting_id}/responsesPOSTSubmit meeting RSVP (accepted/declined/maybe)
/itx/meetings/{meeting_id}/occurrences/{occurrence_id}PATCHUpdate occurrence
/itx/meetings/{meeting_id}/occurrences/{occurrence_id}DELETEDelete occurrence
/itx/meeting_countGETGet meeting count

ITX Registrant Operations

EndpointMethodDescription
/itx/meetings/{meeting_id}/registrantsPOSTAdd registrant
/itx/meetings/{meeting_id}/registrantsGETList registrants
/itx/meetings/{meeting_id}/registrants/{registrant_uid}GETGet registrant
/itx/meetings/{meeting_id}/registrants/{registrant_uid}PATCHUpdate registrant
/itx/meetings/{meeting_id}/registrants/{registrant_uid}PUTUpdate registrant status
/itx/meetings/{meeting_id}/registrants/{registrant_uid}DELETEDelete registrant

ITX Past Meeting Operations

EndpointMethodDescription
/itx/past_meetingsPOSTCreate past meeting
/itx/past_meetings/{past_meeting_id}GETGet past meeting
/itx/past_meetings/{past_meeting_id}PUTUpdate past meeting
/itx/past_meetings/{past_meeting_id}DELETEDelete past meeting

ITX Meeting Attachment Operations

EndpointMethodDescription
/itx/meetings/{meeting_id}/attachmentsPOSTCreate meeting attachment
/itx/meetings/{meeting_id}/attachments/{attachment_id}GETGet attachment metadata
/itx/meetings/{meeting_id}/attachments/{attachment_id}PUTUpdate attachment
/itx/meetings/{meeting_id}/attachments/{attachment_id}DELETEDelete attachment
/itx/meetings/{meeting_id}/attachments/presignPOSTGenerate presigned upload URL
/itx/meetings/{meeting_id}/attachments/{attachment_id}/downloadGETGet download URL

ITX Past Meeting Attachment Operations

EndpointMethodDescription
/itx/past_meetings/{meeting_and_occurrence_id}/attachmentsPOSTCreate past meeting attachment
/itx/past_meetings/{meeting_and_occurrence_id}/attachments/{attachment_id}GETGet attachment metadata
/itx/past_meetings/{meeting_and_occurrence_id}/attachments/{attachment_id}PUTUpdate attachment
/itx/past_meetings/{meeting_and_occurrence_id}/attachments/{attachment_id}DELETEDelete attachment
/itx/past_meetings/{meeting_and_occurrence_id}/attachments/presignPOSTGenerate presigned upload URL
/itx/past_meetings/{meeting_and_occurrence_id}/attachments/{attachment_id}/downloadGETGet download URL

๐Ÿ”ง Configuration

The service can be configured via environment variables:

Required Configuration

VariableDescriptionExample
ITX_BASE_URLBase URL for ITX servicehttps://api.itx.linuxfoundation.org
ITX_CLIENT_IDOAuth2 client ID for ITXyour-client-id
ITX_CLIENT_PRIVATE_KEYRSA private key in PEM format for ITX OAuth2 M2M authentication"$(cat path/to/private.key)"
ITX_AUTH0_DOMAINAuth0 domain for ITX OAuth2linuxfoundation.auth0.com
ITX_AUDIENCEOAuth2 audience for ITXhttps://api.itx.linuxfoundation.org/

Authentication Configuration

VariableDescriptionDefault
JWKS_URLJWKS URL for JWT verificationhttp://lfx-platform-heimdall.lfx.svc.cluster.local:4457/.well-known/jwks
JWT_AUDIENCEJWT token audiencelfx-v2-meeting-service
JWT_AUTH_DISABLED_MOCK_LOCAL_PRINCIPALMock principal for local dev""

Optional Configuration

VariableDescriptionDefault
LOG_LEVELLog level (debug, info, warn, error)info
LOG_ADD_SOURCEAdd source location to logstrue
LFX_ENVIRONMENTLFX environment (dev, staging, prod)prod
ID_MAPPING_DISABLEDDisable v1/v2 ID mappingfalse
NATS_URLNATS server URL (for ID mapping)nats://lfx-platform-nats.lfx.svc.cluster.local:4222

ID Mapping

The service supports optional ID mapping between v1 and v2 systems via NATS:

  • Enabled (default): Set ID_MAPPING_DISABLED=false and provide NATS_URL
  • Disabled: Set ID_MAPPING_DISABLED=true to pass IDs through unchanged

Tracing Configuration

The service supports distributed tracing via OpenTelemetry:

VariableDescriptionDefault
OTEL_SERVICE_NAMEService name for traceslfx-v2-meeting-service
OTEL_EXPORTER_OTLP_ENDPOINTOTLP collector endpoint""
OTEL_TRACES_EXPORTERTraces exporter (otlp/none)none
OTEL_TRACES_SAMPLE_RATIOSampling ratio (0.0-1.0)1.0

๐Ÿค Contributing

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/amazing-feature)
  3. Make changes and ensure tests pass (make test)
  4. Run quality checks (make check)
  5. Commit changes (git commit -m 'Add amazing feature')
  6. Push to branch (git push origin feature/amazing-feature)
  7. Create a Pull Request

Code Standards

  • Follow Go conventions and best practices
  • Maintain test coverage
  • Write clear, self-documenting code
  • Update documentation for API changes
  • Run make check before committing

๐Ÿ“„ License

This project is licensed under the MIT License - see the LICENSE file for details.