feat: feathers v5 migration#30
Merged
Merged
Conversation
Add comprehensive CI/CD pipeline using GitHub Actions to ensure code quality and reliability across the Amber EDC project. Workflow features: - Multi-version Node.js testing (18.x and 20.x) to ensure compatibility - MongoDB 7 service container with health checks for database operations - Automated linting using ESLint to enforce code style standards - Full test suite execution via Mocha with proper environment configuration - Build verification to catch startup issues early The workflow triggers on: - Push events to main, master, and develop branches - Pull requests targeting these branches This ensures all changes are validated before merging, maintaining code quality and preventing regressions in the codebase.
There was a problem hiding this comment.
Pull request overview
Migrates the codebase to Feathers v5 and native MongoDB, replacing Mongoose-based services and adding new validation/resolver infrastructure while updating tests, tooling, and CI to match the new runtime.
Changes:
- Replace
feathers-mongoosemodels/services with@feathersjs/mongodbservices (viaLazyMongoDBService) and add ObjectId/query resolvers. - Replace several legacy utilities (xlsx export wrapper, Joi validation hook, TOTP/OTP handling, email service) to remove deprecated/vulnerable deps.
- Update tests, ESLint setup, CI workflow, and runtime targets for the new Feathers v5 async patterns and Node version.
Reviewed changes
Copilot reviewed 172 out of 177 changed files in this pull request and generated 11 comments.
Show a summary per file
| File | Description |
|---|---|
| test/services/itws.test.js | Removes legacy service registration test. |
| test/services/interview-design-i18n.test.js | Expands unit coverage for i18n export service behavior. |
| test/services/form.test.js | Adds extensive unit coverage for MongoDB-backed form service behaviors. |
| test/services/form-revision-digest.test.js | Adds unit coverage around digest service behavior and unimplemented methods. |
| test/services/form-i18n.test.js | Updates service name and adds unit coverage for i18n export behavior and errors. |
| test/authentication.test.js | Updates auth test setup for MongoDB connection and new password policy / 2FA flags. |
| test/app.test.js | Updates server start/stop to Feathers v5 async listen()/close(). |
| src/validators.js | Adds AJV validators for Feathers schema validation with ObjectId keyword. |
| src/utils/validate-joi.js | Adds internal Joi validation hook to replace @feathers-plus/validate-joi. |
| src/utils/totp.js | Adds TOTP/OTP helpers using otplib + QR code generation. |
| src/utils/participant-validity.js | Simplifies catch blocks. |
| src/utils/itw.js | Forces “internal call” semantics by setting provider: undefined on a service call. |
| src/utils/excel.js | Adds exceljs wrapper to emulate the previous xlsx util API. |
| src/utils/auth-strategies.js | Adjusts lint comment/whitespace around a strategy method. |
| src/services/user/user.service.js | Migrates service options from Mongoose model to MongoDB adapter options. |
| src/services/user/user.hooks.js | Migrates Joi schemas out of hooks, updates CASL + adapters + validation usage. |
| src/services/user/user.class.js | Switches service base class to LazyMongoDBService. |
| src/services/user/user.abilities.js | Migrates abilities to @casl/ability createMongoAbility. |
| src/services/task/task.service.js | Migrates service options to MongoDB adapter options. |
| src/services/task/task.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/task/task.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/task/task.class.js | Switches service base class to LazyMongoDBService. |
| src/services/task/task.abilities.js | Migrates abilities to @casl/ability. |
| src/services/study/study.service.js | Migrates service options to MongoDB adapter options. |
| src/services/study/study.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/study/study.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter; removes studyCreate hook usage. |
| src/services/study/study.class.js | Switches service base class to LazyMongoDBService. |
| src/services/study/study.abilities.js | Migrates abilities to @casl/ability. |
| src/services/participant/participants-tasks-handler.class.js | Adjusts lint comment/whitespace around method. |
| src/services/participant/participant.service.js | Migrates service options to MongoDB adapter options. |
| src/services/participant/participant.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/participant/participant.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/participant/participant.class.js | Switches service base class to LazyMongoDBService. |
| src/services/participant/participant.abilities.js | Migrates abilities to @casl/ability. |
| src/services/participant-export/participant-export.service.js | Replaces xlsx usage with new exceljs wrapper and fixes async write. |
| src/services/mongodb-service.class.js | Adds LazyMongoDBService with lazy collection initialization. |
| src/services/metrics/metrics.hooks.js | Updates CASL import/adapter to MongoDB. |
| src/services/metrics/metrics.class.js | Migrates ObjectId handling and aggregation access to MongoDB driver and lazy model init. |
| src/services/metrics/metrics.abilities.js | Migrates abilities to @casl/ability. |
| src/services/itwd/itwd.class.js | Forces internal call semantics for form revision lookup. |
| src/services/itw/itw.class.js | Forces internal call semantics on interview service operations. |
| src/services/interview/interview.service.js | Migrates service options to MongoDB adapter options. |
| src/services/interview/interview.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/interview/interview.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/interview/interview.class.js | Switches service base class to LazyMongoDBService. |
| src/services/interview/interview.abilities.js | Migrates abilities to @casl/ability. |
| src/services/interview-export/interview-export.service.js | Replaces xlsx usage with new exceljs wrapper and fixes async write. |
| src/services/interview-design/interview-design.service.js | Migrates service options to MongoDB adapter options. |
| src/services/interview-design/interview-design.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/interview-design/interview-design.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/interview-design/interview-design.class.js | Switches service base class to LazyMongoDBService. |
| src/services/interview-design/interview-design.abilities.js | Migrates abilities to @casl/ability. |
| src/services/interview-design-i18n/interview-design-i18n.service.js | Replaces xlsx usage with new exceljs wrapper and fixes async write. |
| src/services/index.js | Removes unused-vars eslint directive whitespace adjustment. |
| src/services/group/group.service.js | Migrates service options to MongoDB adapter options. |
| src/services/group/group.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/group/group.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/group/group.class.js | Switches service base class to LazyMongoDBService. |
| src/services/group/group.abilities.js | Migrates abilities to @casl/ability. |
| src/services/form/form.service.js | Migrates service options to MongoDB adapter options. |
| src/services/form/form.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/form/form.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/form/form.class.js | Switches service base class to LazyMongoDBService. |
| src/services/form/form.abilities.js | Migrates abilities to @casl/ability. |
| src/services/form-revision/form-revision.service.js | Migrates service options to MongoDB adapter options. |
| src/services/form-revision/form-revision.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/form-revision/form-revision.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/form-revision/form-revision.class.js | Switches service base class to LazyMongoDBService. |
| src/services/form-revision/form-revision.abilities.js | Migrates abilities to @casl/ability. |
| src/services/form-i18n/form-i18n.service.js | Replaces xlsx usage with new exceljs wrapper and fixes async write. |
| src/services/email/email.service.js | Replaces feathers-mailer with nodemailer-based EmailService. |
| src/services/email/email.class.js | Implements nodemailer-based EmailService. |
| src/services/case-report/case-report.service.js | Migrates service options to MongoDB adapter options. |
| src/services/case-report/case-report.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/case-report/case-report.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/case-report/case-report.class.js | Switches service base class to LazyMongoDBService. |
| src/services/case-report/case-report.abilities.js | Migrates abilities to @casl/ability. |
| src/services/case-report-form/case-report-form.service.js | Fixes header comment and migrates service options to MongoDB adapter options. |
| src/services/case-report-form/case-report-form.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/case-report-form/case-report-form.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/case-report-form/case-report-form.class.js | Switches service base class to LazyMongoDBService. |
| src/services/case-report-form/case-report-form.abilities.js | Migrates abilities to @casl/ability. |
| src/services/case-report-export/case-report-export.service.js | Replaces xlsx usage with new exceljs wrapper and fixes async write. |
| src/services/campaign/campaign.service.js | Migrates service options to MongoDB adapter options. |
| src/services/campaign/campaign.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/campaign/campaign.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/campaign/campaign.class.js | Switches service base class to LazyMongoDBService. |
| src/services/campaign/campaign.abilities.js | Migrates abilities to @casl/ability. |
| src/services/audit/audit.service.js | Migrates service options away from Mongoose Model usage. |
| src/services/audit/audit.resolvers.js | Adds schema resolvers for ObjectId resolution. |
| src/services/audit/audit.hooks.js | Adds schema hooks + Joi validation + MongoDB CASL adapter. |
| src/services/audit/audit.class.js | Switches service base class to LazyMongoDBService. |
| src/services/audit/audit.abilities.js | Migrates abilities to @casl/ability. |
| src/schemas/user.schema.js | Adds isolated Joi schemas for user operations. |
| src/schemas/task.schema.js | Adds Joi schemas for task create/patch. |
| src/schemas/study.schema.js | Adds Joi schemas for study create/patch. |
| src/schemas/participant.schema.js | Adds Joi schemas for participant create/patch. |
| src/schemas/interview.schema.js | Adds Joi schemas for interview create/patch. |
| src/schemas/interview-design.schema.js | Adds Joi schemas for interview-design create/patch. |
| src/schemas/index.js | Exports all Joi schemas from a single entrypoint. |
| src/schemas/group.schema.js | Adds Joi schemas for group create/patch. |
| src/schemas/form.schema.js | Adds Joi schemas for form create/patch. |
| src/schemas/form-revision.schema.js | Adds Joi schemas for form-revision create/patch. |
| src/schemas/common.js | Adds shared Joi patterns and common enums/options. |
| src/schemas/case-report.schema.js | Adds Joi schemas for case-report create/patch. |
| src/schemas/case-report-form.schema.js | Adds Joi schemas for case-report-form create/patch. |
| src/schemas/campaign.schema.js | Adds Joi schemas for campaign create/patch. |
| src/schemas/audit.schema.js | Adds Joi schemas for audit create/patch. |
| src/resolvers/index.js | Adds shared resolver utilities for ObjectId + integer coercion. |
| src/mongoose.js | Removes Mongoose connection bootstrap. |
| src/mongodb.js | Adds MongoDB native driver connection bootstrap. |
| src/index.js | Updates to await Feathers v5 listen() and logs immediately. |
| src/hooks/user-activity.js | Changes lastSeen arithmetic logic. |
| src/hooks/totp-2fa.js | Adds custom TOTP 2FA hook implementation. |
| src/hooks/task-created.js | Removes unused-vars eslint directive whitespace adjustment. |
| src/hooks/study-create.js | Removes study-create hook that set createdBy. |
| src/hooks/set-timestamps.js | Adds global timestamp-setting hook. |
| src/hooks/search-query.js | Adds ObjectId conversion + default pagination + recursive handling. |
| src/hooks/make-abilities.js | Removes unused-vars eslint directive whitespace adjustment. |
| src/hooks/interview-participant-validity.js | Simplifies catch block. |
| src/hooks/interview-design-create.js | Removes createdBy assignment (now expected via resolver/hook). |
| src/hooks/interview-create.js | Removes createdBy assignment (now expected via resolver/hook). |
| src/hooks/form-create.js | Removes createdBy assignment (now expected via resolver/hook). |
| src/hooks/form-add-to-study.js | Ensures study.forms exists before pushing. |
| src/hooks/case-report-form-create.js | Removes createdBy assignment (now expected via resolver/hook). |
| src/hooks/case-report-create.js | Fixes caseReportForm assignment from CRF get result; removes createdBy assignment. |
| src/hooks/campaign-create.js | Removes createdBy assignment (now expected via resolver/hook). |
| src/hooks/auth-email-otp.js | Replaces otplib authenticator call with random code generator. |
| src/hooks/allow-walk-in-participant.js | Simplifies participantData creation (but keeps risky spread). |
| src/channels.js | Removes eslint-disable-line marker from console.log. |
| src/authentication.js | Updates oauth config and replaces feathers-totp-2fa hook with internal hook. |
| src/app.js | Migrates app bootstrapping to Feathers v5 patterns, MongoDB bootstrap, CASL config, and express exports. |
| src/app.hooks.js | Adds setTimestamps global hook for create/update/patch. |
| plans/objectid-migration-plan.md | Adds migration plan documentation for ObjectId resolver approach. |
| plans/joi-schema-validation-plan.md | Adds migration plan documentation for Joi validation approach. |
| plans/feathers-v5-migration-plan.md | Adds high-level migration plan documentation. |
| package.json | Updates major version, Node engine, dependencies, ESLint config usage, and CI/tooling deps. |
| eslint.config.js | Moves to ESLint flat config. |
| Dockerfile | Updates base image Node version. |
| AGENTS.md | Adds development guidelines document (currently references v4 stack). |
| .github/workflows/ci.yml | Adds CI workflow with MongoDB service and Node matrix. |
| .eslintrc.json | Removes legacy ESLint config file. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.