{"id":45015902,"url":"https://github.com/linuxfoundation/lfx-v2-meeting-service","last_synced_at":"2026-04-20T00:11:20.329Z","repository":{"id":308430247,"uuid":"1016239389","full_name":"linuxfoundation/lfx-v2-meeting-service","owner":"linuxfoundation","description":"LFX v2 Platform Meeting Service","archived":false,"fork":false,"pushed_at":"2026-04-08T23:14:48.000Z","size":4466,"stargazers_count":0,"open_issues_count":2,"forks_count":1,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-08T23:32:33.019Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/linuxfoundation.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":"CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-07-08T17:42:53.000Z","updated_at":"2026-04-08T23:03:13.000Z","dependencies_parsed_at":"2025-08-20T23:21:39.756Z","dependency_job_id":"f17f91f0-f25e-47a4-8a9b-5f1193a9c80f","html_url":"https://github.com/linuxfoundation/lfx-v2-meeting-service","commit_stats":null,"previous_names":["linuxfoundation/lfx-v2-meeting-service"],"tags_count":67,"template":false,"template_full_name":null,"purl":"pkg:github/linuxfoundation/lfx-v2-meeting-service","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxfoundation%2Flfx-v2-meeting-service","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxfoundation%2Flfx-v2-meeting-service/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxfoundation%2Flfx-v2-meeting-service/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxfoundation%2Flfx-v2-meeting-service/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/linuxfoundation","download_url":"https://codeload.github.com/linuxfoundation/lfx-v2-meeting-service/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/linuxfoundation%2Flfx-v2-meeting-service/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31861708,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T15:24:51.572Z","status":"ssl_error","status_checked_at":"2026-04-15T15:24:39.138Z","response_time":63,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-02-19T01:14:55.788Z","updated_at":"2026-04-15T22:01:09.830Z","avatar_url":"https://github.com/linuxfoundation.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ITX Meeting Proxy Service\n\nThe 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.\n\n## 🚀 Quick Start\n\n### For Deployment (Helm)\n\n```bash\n# Install the proxy service\nhelm upgrade --install lfx-v2-meeting-service ./charts/lfx-v2-meeting-service \\\n  --namespace lfx \\\n  --create-namespace \\\n  --set image.tag=latest \\\n  --set app.environment.ITX_BASE_URL.value=\"https://api.itx.linuxfoundation.org\" \\\n  --set app.environment.ITX_CLIENT_ID.value=\"your-client-id\" \\\n  --set-file app.environment.ITX_CLIENT_PRIVATE_KEY.value=path/to/private.key\n```\n\n### For Local Development\n\n1. **Prerequisites**\n   - Go 1.24+ installed\n   - Make installed\n\n2. **Clone and Setup**\n\n   ```bash\n   git clone https://github.com/linuxfoundation/lfx-v2-meeting-service.git\n   cd lfx-v2-meeting-service\n\n   # Install dependencies\n   make deps\n   ```\n\n3. **Configure Environment**\n\n   ```bash\n   # Copy the example environment file and configure it\n   cp .env.example .env\n   # Edit .env with ITX credentials\n   ```\n\n   Required environment variables:\n\n   ```bash\n   ITX_ENABLED=true\n   ITX_BASE_URL=https://api.dev.itx.linuxfoundation.org\n   ITX_CLIENT_ID=your-client-id\n   ITX_CLIENT_PRIVATE_KEY=\"$(cat path/to/private.key)\"\n   ITX_AUTH0_DOMAIN=linuxfoundation-dev.auth0.com\n   ITX_AUDIENCE=https://api.dev.itx.linuxfoundation.org/\n   ```\n\n4. **Run the Service**\n\n   ```bash\n   # Run with default settings\n   make run\n\n   # Or run with debug logging\n   make debug\n   ```\n\n## 🏗️ Architecture\n\nThe service is a stateless HTTP proxy built using a clean architecture pattern:\n\n- **API Layer**: Goa-generated HTTP handlers and OpenAPI specifications\n- **Service Layer**: Request validation and ITX client orchestration\n- **Domain Layer**: Core request/response models\n- **Infrastructure Layer**: ITX HTTP client with OAuth2 authentication\n\n### Key Features\n\n- **Stateless Proxy**: No data persistence, all state managed by ITX service\n- **ITX Meeting Operations**: Create, read, update, delete meetings via ITX\n- **ITX Registrant Operations**: Manage meeting registrants via ITX\n- **ITX Past Meeting Operations**: Full CRUD operations for past meeting records via ITX\n- **ITX Past Meeting Summary Operations**: Retrieve and update AI-generated meeting summaries\n- **ITX Meeting Attachment Operations**: Full CRUD operations for meeting attachments with presigned URL support\n- **ITX Past Meeting Attachment Operations**: Full CRUD operations for past meeting attachments with presigned URL support\n- **JWT Authentication**: Secure API access via Heimdall integration\n- **ID Mapping**: Optional v1/v2 ID translation via NATS (can be disabled)\n- **OpenAPI Documentation**: Auto-generated API specifications\n\n## 📁 Project Structure\n\n```bash\nlfx-v2-meeting-service/\n├── cmd/                           # Application entry points\n│   └── meeting-api/               # Main API server\n├── charts/                        # Helm chart for Kubernetes deployment\n│   └── lfx-v2-meeting-service/\n├── design/                        # Goa API design files\n│   ├── meeting-svc.go             # Service definition\n│   └── itx_types.go               # ITX type definitions\n├── gen/                           # Generated code (DO NOT EDIT)\n│   ├── http/                      # HTTP transport layer\n│   └── meeting_service/           # Service interfaces\n├── internal/                      # Private application code\n│   ├── domain/                    # Business domain layer\n│   │   ├── models/                # Domain models\n│   │   ├── errors.go              # Domain-specific errors\n│   │   ├── itx_proxy.go           # ITX proxy interface\n│   │   └── id_mapper.go           # ID mapper interface\n│   ├── infrastructure/            # Infrastructure layer\n│   │   ├── auth/                  # JWT authentication\n│   │   ├── proxy/                 # ITX HTTP client\n│   │   └── idmapper/              # NATS-based ID mapping\n│   ├── middleware/                # HTTP middleware\n│   └── service/                   # Service layer implementation\n│       ├── auth_service.go        # Auth service\n│       └── itx/                   # ITX services\n├── pkg/                           # Public packages\n│   ├── models/itx/                # ITX request/response models\n│   └── utils/                     # Utility functions\n├── Dockerfile                     # Container build configuration\n├── Makefile                       # Build and development commands\n└── go.mod                         # Go module definition\n```\n\n## 📡 Event Processing\n\nThe 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.\n\n**Features:**\n\n- 10 meeting-related event types (meetings, registrants, RSVPs, past meetings, participants, recordings, summaries)\n- RRULE occurrence calculation for recurring meetings\n- v1 user enrichment and Auth0 mapping\n- Dual publishing architecture (indexer + FGA-sync)\n- Parent-child dependency handling with retry logic\n\nFor complete details, see **[Event Processing Documentation](docs/event-processing.md)**.\n\n## 🛠️ Development\n\n### Prerequisites\n\n- Go 1.24+\n- Make\n- Git\n\n### Getting Started\n\n1. **Install Dependencies**\n\n   ```bash\n   make deps\n   ```\n\n2. **Generate API Code**\n\n   ```bash\n   make apigen\n   ```\n\n   Generates HTTP transport, client, and OpenAPI documentation from design files.\n\n3. **Build the Application**\n\n   ```bash\n   make build\n   ```\n\n   Creates the binary in `bin/meeting-api`.\n\n### Development Workflow\n\n#### Running the Service\n\n```bash\n# Run with default settings\nmake run\n\n# Run with debug logging\nmake debug\n\n# Build and run binary\nmake build\n./bin/meeting-api\n```\n\n#### Code Quality\n\n**Always run these before committing:**\n\n```bash\n# Format code\nmake fmt\n\n# Run linter\nmake lint\n\n# Run all tests\nmake test\n\n# Check everything (format + lint + tests)\nmake check\n```\n\n#### API Development\n\nWhen modifying the API:\n\n1. **Update Design Files** in `design/` directory\n2. **Regenerate Code**:\n\n   ```bash\n   make apigen\n   ```\n\n3. **Verify Generation**:\n\n   ```bash\n   make verify\n   ```\n\n4. **Run Tests** to ensure nothing breaks:\n\n   ```bash\n   make test\n   ```\n\n### Available Make Targets\n\n| Target | Description |\n|--------|-------------|\n| `make all` | Complete build pipeline (clean, deps, apigen, fmt, lint, test, build) |\n| `make deps` | Install dependencies, tools, and git hooks |\n| `make install-hooks` | Install git hooks (pre-commit gofmt check) |\n| `make apigen` | Generate API code from design files |\n| `make build` | Build the binary |\n| `make run` | Run the service locally |\n| `make debug` | Run with debug logging |\n| `make test` | Run unit tests |\n| `make test-verbose` | Run tests with verbose output |\n| `make test-coverage` | Generate HTML coverage report |\n| `make lint` | Run code linter |\n| `make fmt` | Format code |\n| `make check` | Verify formatting and run linter |\n| `make verify` | Ensure generated code is up to date |\n| `make clean` | Remove build artifacts |\n| `make docker-build` | Build Docker image |\n| `make helm-install` | Install Helm chart |\n| `make helm-uninstall` | Uninstall Helm chart |\n\n## 🧪 Testing\n\n### Running Tests\n\n```bash\n# Run all tests\nmake test\n\n# Run with verbose output\nmake test-verbose\n\n# Generate coverage report\nmake test-coverage\n```\n\n## 🚀 Deployment\n\n### Helm Chart\n\nThe service includes a Helm chart for Kubernetes deployment.\n\n#### Prerequisites: Kubernetes Secret\n\nBefore 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**.\n\n```bash\nkubectl create secret generic meeting-secrets -n lfx \\\n  --from-literal=auth0_client_id=\"\u003cclient-id-from-1password\u003e\" \\\n  --from-file=auth0_client_private_key=./path/to/private.key\n```\n\n#### Option 1: Install from GHCR (no local code changes)\n\nUse this if you just want to run the service without modifying its code. The image is pulled directly from the container registry:\n\n```bash\nmake helm-install\n\n# Or using Helm directly\nhelm upgrade --install lfx-v2-meeting-service ./charts/lfx-v2-meeting-service \\\n  --namespace lfx \\\n  --create-namespace\n```\n\n#### Option 2: Install from a Local Build (active development)\n\nUse this if you are making changes to the service code. First, copy the example local values file (it is gitignored):\n\n```bash\ncp charts/lfx-v2-meeting-service/values.local.example.yaml \\\n   charts/lfx-v2-meeting-service/values.local.yaml\n```\n\nThen, whenever you make a code change and want to apply it:\n\n```bash\n# Rebuild the local image\nmake docker-build\n\n# Install/upgrade the chart using the local image\nmake helm-install-local\n\n# Or using Helm directly\nhelm upgrade --install lfx-v2-meeting-service ./charts/lfx-v2-meeting-service \\\n  --namespace lfx \\\n  --create-namespace \\\n  --values ./charts/lfx-v2-meeting-service/values.local.yaml\n```\n\n### Docker\n\n```bash\n# Build Docker image\nmake docker-build\n\n# Run with Docker\ndocker run -p 8080:8080 \\\n  -e ITX_ENABLED=true \\\n  -e ITX_BASE_URL=https://api.itx.linuxfoundation.org \\\n  -e ITX_CLIENT_ID=your-client-id \\\n  -e ITX_CLIENT_PRIVATE_KEY=\"$(cat path/to/private.key)\" \\\n  linuxfoundation/lfx-v2-meeting-service:latest\n```\n\n## 📖 API Documentation\n\nThe service automatically generates OpenAPI documentation:\n\n- **OpenAPI 2.0**: `gen/http/openapi.yaml`\n- **OpenAPI 3.0**: `gen/http/openapi3.yaml`\n- **JSON formats**: Also available in `gen/http/`\n\nAccess the documentation at: `http://localhost:8080/openapi.json`\n\n### Available Endpoints\n\n#### Health Checks\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/livez` | GET | Liveness check |\n| `/readyz` | GET | Readiness check |\n\n#### ITX Meeting Operations\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/itx/meetings` | POST | Create meeting via ITX |\n| `/itx/meetings/{meeting_id}` | GET | Get meeting details |\n| `/itx/meetings/{meeting_id}` | PUT | Update meeting |\n| `/itx/meetings/{meeting_id}` | DELETE | Delete meeting |\n| `/itx/meetings/{meeting_id}/join_link` | GET | Get join link for user |\n| `/itx/meetings/{meeting_id}/responses` | POST | Submit meeting RSVP (accepted/declined/maybe) |\n| `/itx/meetings/{meeting_id}/occurrences/{occurrence_id}` | PATCH | Update occurrence |\n| `/itx/meetings/{meeting_id}/occurrences/{occurrence_id}` | DELETE | Delete occurrence |\n| `/itx/meeting_count` | GET | Get meeting count |\n\n#### ITX Registrant Operations\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/itx/meetings/{meeting_id}/registrants` | POST | Add registrant |\n| `/itx/meetings/{meeting_id}/registrants` | GET | List registrants |\n| `/itx/meetings/{meeting_id}/registrants/{registrant_uid}` | GET | Get registrant |\n| `/itx/meetings/{meeting_id}/registrants/{registrant_uid}` | PATCH | Update registrant |\n| `/itx/meetings/{meeting_id}/registrants/{registrant_uid}` | PUT | Update registrant status |\n| `/itx/meetings/{meeting_id}/registrants/{registrant_uid}` | DELETE | Delete registrant |\n\n#### ITX Past Meeting Operations\n\n| Endpoint                                 | Method | Description          |\n|------------------------------------------|--------|----------------------|\n| `/itx/past_meetings`                     | POST   | Create past meeting  |\n| `/itx/past_meetings/{past_meeting_id}`   | GET    | Get past meeting     |\n| `/itx/past_meetings/{past_meeting_id}`   | PUT    | Update past meeting  |\n| `/itx/past_meetings/{past_meeting_id}`   | DELETE | Delete past meeting  |\n\n#### ITX Meeting Attachment Operations\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/itx/meetings/{meeting_id}/attachments` | POST | Create meeting attachment |\n| `/itx/meetings/{meeting_id}/attachments/{attachment_id}` | GET | Get attachment metadata |\n| `/itx/meetings/{meeting_id}/attachments/{attachment_id}` | PUT | Update attachment |\n| `/itx/meetings/{meeting_id}/attachments/{attachment_id}` | DELETE | Delete attachment |\n| `/itx/meetings/{meeting_id}/attachments/presign` | POST | Generate presigned upload URL |\n| `/itx/meetings/{meeting_id}/attachments/{attachment_id}/download` | GET | Get download URL |\n\n#### ITX Past Meeting Attachment Operations\n\n| Endpoint | Method | Description |\n|----------|--------|-------------|\n| `/itx/past_meetings/{meeting_and_occurrence_id}/attachments` | POST | Create past meeting attachment |\n| `/itx/past_meetings/{meeting_and_occurrence_id}/attachments/{attachment_id}` | GET | Get attachment metadata |\n| `/itx/past_meetings/{meeting_and_occurrence_id}/attachments/{attachment_id}` | PUT | Update attachment |\n| `/itx/past_meetings/{meeting_and_occurrence_id}/attachments/{attachment_id}` | DELETE | Delete attachment |\n| `/itx/past_meetings/{meeting_and_occurrence_id}/attachments/presign` | POST | Generate presigned upload URL |\n| `/itx/past_meetings/{meeting_and_occurrence_id}/attachments/{attachment_id}/download` | GET | Get download URL |\n\n## 🔧 Configuration\n\nThe service can be configured via environment variables:\n\n### Required Configuration\n\n| Variable | Description | Example |\n|----------|-------------|---------|\n| `ITX_BASE_URL` | Base URL for ITX service | `https://api.itx.linuxfoundation.org` |\n| `ITX_CLIENT_ID` | OAuth2 client ID for ITX | `your-client-id` |\n| `ITX_CLIENT_PRIVATE_KEY` | RSA private key in PEM format for ITX OAuth2 M2M authentication | `\"$(cat path/to/private.key)\"` |\n| `ITX_AUTH0_DOMAIN` | Auth0 domain for ITX OAuth2 | `linuxfoundation.auth0.com` |\n| `ITX_AUDIENCE` | OAuth2 audience for ITX | `https://api.itx.linuxfoundation.org/` |\n\n### Authentication Configuration\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `JWKS_URL` | JWKS URL for JWT verification | `http://lfx-platform-heimdall.lfx.svc.cluster.local:4457/.well-known/jwks` |\n| `JWT_AUDIENCE` | JWT token audience | `lfx-v2-meeting-service` |\n| `JWT_AUTH_DISABLED_MOCK_LOCAL_PRINCIPAL` | Mock principal for local dev | `\"\"` |\n\n### Optional Configuration\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `LOG_LEVEL` | Log level (debug, info, warn, error) | `info` |\n| `LOG_ADD_SOURCE` | Add source location to logs | `true` |\n| `LFX_ENVIRONMENT` | LFX environment (dev, staging, prod) | `prod` |\n| `ID_MAPPING_DISABLED` | Disable v1/v2 ID mapping | `false` |\n| `NATS_URL` | NATS server URL (for ID mapping) | `nats://lfx-platform-nats.lfx.svc.cluster.local:4222` |\n\n### ID Mapping\n\nThe service supports optional ID mapping between v1 and v2 systems via NATS:\n\n- **Enabled** (default): Set `ID_MAPPING_DISABLED=false` and provide `NATS_URL`\n- **Disabled**: Set `ID_MAPPING_DISABLED=true` to pass IDs through unchanged\n\n### Tracing Configuration\n\nThe service supports distributed tracing via OpenTelemetry:\n\n| Variable | Description | Default |\n|----------|-------------|---------|\n| `OTEL_SERVICE_NAME` | Service name for traces | `lfx-v2-meeting-service` |\n| `OTEL_EXPORTER_OTLP_ENDPOINT` | OTLP collector endpoint | `\"\"` |\n| `OTEL_TRACES_EXPORTER` | Traces exporter (otlp/none) | `none` |\n| `OTEL_TRACES_SAMPLE_RATIO` | Sampling ratio (0.0-1.0) | `1.0` |\n\n## 🤝 Contributing\n\n1. **Fork** the repository\n2. **Create** a feature branch (`git checkout -b feature/amazing-feature`)\n3. **Make changes** and ensure tests pass (`make test`)\n4. **Run quality checks** (`make check`)\n5. **Commit** changes (`git commit -m 'Add amazing feature'`)\n6. **Push** to branch (`git push origin feature/amazing-feature`)\n7. **Create** a Pull Request\n\n### Code Standards\n\n- Follow Go conventions and best practices\n- Maintain test coverage\n- Write clear, self-documenting code\n- Update documentation for API changes\n- Run `make check` before committing\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxfoundation%2Flfx-v2-meeting-service","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flinuxfoundation%2Flfx-v2-meeting-service","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flinuxfoundation%2Flfx-v2-meeting-service/lists"}