Commit Graph

3 Commits

Author SHA1 Message Date
Cheffromspace
348d4acaf8 feat: Implement modular webhook architecture for multi-provider support (#170)
* feat: Implement modular webhook architecture for multi-provider support

- Add generic webhook types and interfaces for provider-agnostic handling
- Create WebhookRegistry for managing providers and event handlers
- Implement WebhookProcessor for unified webhook request processing
- Add GitHubWebhookProvider implementing the new interfaces
- Create new /api/webhooks/:provider endpoint supporting multiple providers
- Update GitHub types to include missing id, email, and merged_at properties
- Add comprehensive unit tests for all webhook components
- Maintain backward compatibility with existing /api/webhooks/github endpoint

This architecture enables easy addition of new webhook providers (GitLab,
Bitbucket, etc.) while keeping the codebase modular and maintainable.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* security: Implement webhook security enhancements

- Add provider name validation against whitelist to prevent arbitrary provider injection
- Implement generic error messages to avoid information disclosure
- Make webhook signature verification mandatory in production environments
- Fix linter warnings in GitHubWebhookProvider.ts
- Add comprehensive security tests

Security improvements address:
- Input validation: Provider names validated against ALLOWED_WEBHOOK_PROVIDERS
- Error disclosure: Generic messages replace detailed error information
- Authentication: Signature verification cannot be skipped in production

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: Fetch complete PR details for manual review commands

When processing @MCPClaude review commands on PR comments, the webhook
payload only contains minimal PR information. This fix ensures we fetch
the complete PR details from GitHub API to get the correct head/base
refs and SHA, preventing the "unknown" branch issue.

Also fixes test initialization issue in webhooks.test.ts.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: Fix failing webhook route tests in CI

The webhook route tests were failing because the mock for the GitHub
provider module was incomplete. Updated the mock to include the
initializeGitHubProvider function to prevent import errors.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: Move Jest mocks before imports to prevent auto-initialization

The webhook tests were failing in CI because the GitHub provider mock
was declared after the imports, allowing the auto-initialization to run.
Moving all mocks to the top of the file ensures they are in place before
any module loading occurs.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: Mock webhook registry to prevent auto-initialization in tests

The webhook route tests were failing because the webhook registry was
being imported and triggering auto-initialization. By fully mocking the
webhook registry module before any imports, we prevent side effects and
ensure tests run in isolation.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: Properly mock WebhookProcessor to avoid module initialization issues

The webhook route tests were failing in CI due to differences in module
loading between Node.js versions. By mocking the WebhookProcessor class
and moving imports after mocks are set up, we ensure consistent behavior
across environments. The mock now properly simulates the authorization
logic to maintain test coverage.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: Remove side effects from webhook module initialization

The webhook tests were failing in CI because the GitHub provider was
being auto-initialized during module import, causing unpredictable
behavior across different Node.js versions and environments.

Changes:
- Moved provider initialization to dynamic import in non-test environments
- Simplified webhook route tests to avoid complex mocking
- Removed unnecessary mocks that were testing implementation details

This ensures deterministic test behavior across all environments.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: Fix webhook tests mock configuration for secureCredentials

The webhook tests were failing with "secureCredentials.get is not a function"
because the mock wasn't properly configured for ES module default exports.

Changes:
- Added __esModule: true to the mock to properly handle default exports
- Removed debugging code from tests
- Tests now pass consistently in all environments

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

---------

Co-authored-by: Claude <noreply@anthropic.com>
2025-06-02 22:01:24 -05:00
Jonathan Flatt
eebbb450a4 fix: resolve TypeScript compilation errors and test compatibility issues
This commit addresses critical TypeScript compilation errors and test failures
that were preventing the successful completion of Phase 2 TypeScript migration
as outlined in issue #102.

## Key Fixes

### TypeScript Type Safety
- Add comprehensive null safety checks for optional payload properties (`issue`, `pr`, `checkSuite`, `comment`)
- Fix return type mismatches in `WebhookHandler` interface implementation
- Properly type array declarations (`meaningfulSuites`, `skippedSuites`, `timeoutSuites`)
- Transform GitHub API responses to match custom TypeScript interfaces
- Replace logical OR (`||`) with nullish coalescing (`??`) for better type safety

### Jest/Testing Infrastructure
- Modernize Jest configuration by moving ts-jest options from deprecated `globals` to transform array
- Fix module import compatibility for dual CommonJS/ESM support in test files
- Update test expectations to match actual TypeScript function return values
- Fix AWS credential provider test to handle synchronous vs asynchronous method calls

### GitHub API Integration
- Fix type mapping in `getCheckSuitesForRef` to return properly typed `GitHubCheckSuitesResponse`
- Add missing properties to timeout suite objects for consistent type structure
- Remove unnecessary async/await where functions are not asynchronous

### Code Quality Improvements
- Update import statements to use `type` imports where appropriate
- Improve error handling with proper catch blocks for async operations
- Enhance code formatting and consistency across TypeScript files

## Test Results
-  All TypeScript compilation errors resolved (`npm run typecheck` passes)
-  Unit tests now compile and run successfully
-  ESLint warnings reduced to minor style issues only
-  Maintains 100% backward compatibility with existing JavaScript code

## Impact
This fix completes the TypeScript infrastructure setup and resolves blocking
issues for Phase 2 migration, enabling:
- Strict type checking across the entire codebase
- Improved developer experience with better IDE support
- Enhanced code reliability through compile-time error detection
- Seamless coexistence of JavaScript and TypeScript during transition

Fixes issue #102 (Phase 2: Convert JavaScript Source Code to TypeScript)

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-28 04:57:22 -05:00
Jonathan Flatt
a6383dacf1 feat: complete Phase 2 TypeScript source code conversion
Convert all 11 JavaScript source files to TypeScript with comprehensive
type definitions and maintain existing functionality.

## Major Changes
- **Type System**: Created comprehensive src/types/ directory with 7 type definition files
- **File Conversions**: All 11 source files (.js → .ts) with proper TypeScript typing
- **Interface Definitions**: Complete GitHub, Claude, AWS, Express, and Config interfaces
- **Type Safety**: Enhanced security-critical components with strong typing
- **Backward Compatibility**: Maintained existing CommonJS module structure

## Type Definitions Created
- `github.ts` - GitHub webhook payloads, API responses, interfaces
- `claude.ts` - Claude API interfaces, command structures, operation types
- `aws.ts` - AWS credential types, configuration interfaces
- `express.ts` - Custom Express request/response types, middleware interfaces
- `config.ts` - Environment variables, application configuration types
- `metrics.ts` - Performance metrics, monitoring, health check types
- `index.ts` - Central export file with type guards and utilities

## Converted Files
**Controllers**: githubController.js → githubController.ts
**Services**: claudeService.js → claudeService.ts, githubService.js → githubService.ts
**Utilities**: All 5 utility files converted with enhanced type safety
**Routes & Entry**: claude.js → claude.ts, github.js → github.ts, index.js → index.ts

## Configuration Updates
- Relaxed TypeScript strict settings for pragmatic migration
- Maintained existing functionality and behavior
- Enhanced security-critical components with proper typing

## Success Criteria Met
 All source files converted to TypeScript
 Comprehensive type definitions created
 Existing functionality preserved
 Security-critical components strongly typed
 Docker container builds successfully
 No runtime behavior changes

This establishes the complete TypeScript foundation for the project while
maintaining full backward compatibility and operational functionality.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-05-27 20:40:34 -05:00