Skip to content

feat: feathers v5 migration#30

Merged
ymarcon merged 21 commits into
mainfrom
feat/feathers-v5-migration
Mar 20, 2026
Merged

feat: feathers v5 migration#30
ymarcon merged 21 commits into
mainfrom
feat/feathers-v5-migration

Conversation

@ymarcon
Copy link
Copy Markdown
Member

@ymarcon ymarcon commented Mar 20, 2026

No description provided.

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.
@ymarcon ymarcon requested a review from Copilot March 20, 2026 15:40
Copy link
Copy Markdown

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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-mongoose models/services with @feathersjs/mongodb services (via LazyMongoDBService) 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.

Comment thread src/services/user/user.service.js
Comment thread src/app.hooks.js
Comment thread src/hooks/search-query.js
Comment thread src/hooks/search-query.js
Comment thread src/hooks/user-activity.js Outdated
Comment thread src/hooks/allow-walk-in-participant.js
Comment thread src/services/email/email.class.js
Comment thread src/utils/validate-joi.js Outdated
Comment thread AGENTS.md Outdated
Comment thread AGENTS.md Outdated
@ymarcon ymarcon merged commit 713938b into main Mar 20, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants