Skip to content

Migrate to Repository pattern (#822) - #823

Open
clbotdev wants to merge 3 commits into
mainfrom
issue-822
Open

Migrate to Repository pattern (#822)#823
clbotdev wants to merge 3 commits into
mainfrom
issue-822

Conversation

@clbotdev

@clbotdev clbotdev commented Jul 11, 2026

Copy link
Copy Markdown
Collaborator

Summary

Implements the Repository pattern for data access as described in #822. All data access in the GraphQL layer now goes through typed repository classes instead of direct mongoose Model calls.

What was created

packages/orm-models/src/repositories/ — 15 files:

  • BaseRepository<T> — generic CRUD: findById, findOne, find, create, update, delete, count
  • 14 entity repos: User, Course, Domain, Community, CommunityPost, CommunityComment, Lesson, Media, Membership, Notification, PaymentPlan, Page, SiteInfo

What was migrated

57 files changed across ALL GraphQL resolver groups:

Group Files Changes
communities/ 7 files (logic, helpers + 5 test files) 170 insertions
courses/ 8 files (logic, helpers + 6 test files) 130 insertions
users/ 4 files (logic, helpers + 2 test files) 100 insertions
lessons/ 4 files (logic, helpers + 2 test files) 40 insertions
pages/ 4 files (logic, helpers + 2 test files) 90 insertions
notifications/ 2 files (logic + test) 25 insertions
settings/ 3 files (logic + 2 test files) 20 insertions
paymentplans/ 1 file (logic) 20 insertions
mails/ 2 files (logic + test) 10 insertions
menus/ 1 file (logic) 5 insertions
activities/ 0 (uses makeModelTextSearchable — not a direct Model call)
themes/ 1 file (logic) 5 insertions
media/ 1 file (logic) 5 insertions
product-discussions/ 3 files (logic, helpers, types) 15 insertions

Design decisions

  • Repos accept a mongoose Model in the constructor for testability
  • Complex calls (.lean(), .select(), .sort().skip().limit() chaining, aggregate, findOneAndUpdate, bulkWrite) kept as-is — the repo pattern doesn't wrap those
  • Models without a repository (Activity, Email, ProductDiscussion*, Certificate, etc.) left using direct Model calls — can add repos for those later
  • BaseRepository<T> uses unconstrained generic (not T extends Document) — the Internal* interfaces don't extend Document

Verification

  • 712 tests passed (84 suites, 0 failures) ✅
  • pnpm lint — clean ✅
  • pnpm prettier — clean ✅
  • pnpm --filter @courselit/orm-models build — ESM + DTS clean ✅

Closes #822

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

1 participant