1- import {
2- User ,
3- Org ,
4- OrgMembership ,
5- Team ,
6- TeamMembership ,
7- Role ,
8- IRole ,
9- } from "@/db/models/index.js" ;
101import ApiError from "@/utils/ApiError.js" ;
112import type { IEntitlementsProvider } from "@/services/system/EntitlementsService.js" ;
123import type { Entitlements } from "@/types/entitlements.js" ;
134import type { UserReturnable } from "@/types/domain/index.js" ;
5+ import type {
6+ IUserRepository ,
7+ IOrgRepository ,
8+ IOrgMembershipRepository ,
9+ ITeamRepository ,
10+ ITeamMembershipRepository ,
11+ IRoleRepository ,
12+ } from "@/repositories/index.js" ;
1413
1514export interface IMeService {
1615 me ( userId : string ) : Promise < UserReturnable > ;
@@ -26,73 +25,95 @@ const SERVICE_NAME = "MeService";
2625class MeService implements IMeService {
2726 public SERVICE_NAME = SERVICE_NAME ;
2827 private entitlementsProvider : IEntitlementsProvider ;
29-
30- constructor ( entitlementsProvider : IEntitlementsProvider ) {
28+ private userRepository : IUserRepository ;
29+ private orgRepository : IOrgRepository ;
30+ private orgMembershipRepository : IOrgMembershipRepository ;
31+ private teamRepository : ITeamRepository ;
32+ private teamMembershipRepository : ITeamMembershipRepository ;
33+ private roleRepository : IRoleRepository ;
34+
35+ constructor (
36+ entitlementsProvider : IEntitlementsProvider ,
37+ userRepository : IUserRepository ,
38+ orgRepository : IOrgRepository ,
39+ orgMembershipRepository : IOrgMembershipRepository ,
40+ teamRepository : ITeamRepository ,
41+ teamMembershipRepository : ITeamMembershipRepository ,
42+ roleRepository : IRoleRepository
43+ ) {
3144 this . entitlementsProvider = entitlementsProvider ;
45+ this . userRepository = userRepository ;
46+ this . orgRepository = orgRepository ;
47+ this . orgMembershipRepository = orgMembershipRepository ;
48+ this . teamRepository = teamRepository ;
49+ this . teamMembershipRepository = teamMembershipRepository ;
50+ this . roleRepository = roleRepository ;
3251 }
3352
3453 me = async ( userId : string ) : Promise < UserReturnable > => {
3554 // Need to get teamIds
36- const user = await User . findById ( userId ) ;
55+ const user = await this . userRepository . findByUserId ( userId ) ;
3756 if ( ! user ) {
3857 throw new ApiError ( "User not found" , 404 ) ;
3958 }
4059
4160 // Find OrgMembership
42- const orgMembership = await OrgMembership . findOne ( {
43- userId : user . _id ,
44- } ) . lean ( ) ;
61+ const orgMembership = await this . orgMembershipRepository . findByUserId (
62+ user . id
63+ ) ;
4564 if ( ! orgMembership ) {
4665 throw new ApiError ( "User is not part of any organization" ) ;
4766 }
4867
4968 // Find org and roles
50- const org = await Org . findById ( orgMembership . orgId ) . lean ( ) ;
69+ const org = await this . orgRepository . findById ( orgMembership . orgId ) ;
5170
5271 if ( ! org ) {
5372 throw new ApiError ( "Organization not found" ) ;
5473 }
5574
56- const orgRoles = await Role . findById ( orgMembership . roleId ) . lean ( ) ;
75+ const orgRole = await this . roleRepository . findById (
76+ orgMembership . roleId || "" ,
77+ org . id
78+ ) ;
5779
5880 // Get teams
59- const teamMembershipWithRoles = await TeamMembership . find ( {
60- userId : user . _id ,
61- } )
62- . populate < { roleId : IRole } > ( "roleId" )
63- . lean ( ) ;
81+ const teamMembershipsWithRole =
82+ await this . teamMembershipRepository . findByUserIdWithRole ( user . id ) ;
6483
65- const teamIds = teamMembershipWithRoles . map ( ( tm ) => tm . teamId . toString ( ) ) ;
84+ if ( ! teamMembershipsWithRole ) {
85+ throw new ApiError ( "Team memberships not found for user" ) ;
86+ }
6687
67- const teams = await Team . find ( { _id : { $in : teamIds } } ) . select (
68- "_id, name"
69- ) ;
88+ const teamIds = teamMembershipsWithRole . map ( ( tm ) => tm . teamId ) ;
89+
90+ const teams = await this . teamRepository . findManyById ( teamIds ) ;
7091
71- const teamMap = new Map ( teams . map ( ( t ) => [ t . _id . toString ( ) , t ] ) ) ;
72- const returnableTeams = teamMembershipWithRoles . map ( ( tm ) => {
73- const team = teamMap . get ( tm . teamId . toString ( ) ) ;
92+ const teamMap = new Map ( teams . map ( ( t ) => [ t . id , t ] ) ) ;
93+ const returnableTeams = teamMembershipsWithRole . map ( ( tm ) => {
94+ const team = teamMap . get ( tm . teamId ) ;
7495 if ( ! team ) {
7596 throw new ApiError ( "Team not found for membership" ) ;
7697 }
7798 return {
78- id : team . _id . toString ( ) ,
99+ id : team . id ,
79100 name : team . name ,
80- permissions : tm . roleId ?. permissions ?? [ ] ,
101+ permissions : tm . role ?. permissions ?? [ ] ,
81102 } ;
82103 } ) ;
83104
84105 const entitlements : Entitlements =
85- await this . entitlementsProvider . getForOrg ( org . _id . toString ( ) ) ;
106+ await this . entitlementsProvider . getForOrg ( org . id ) ;
86107
87108 const returnableUser : UserReturnable = {
88- id : user . _id . toString ( ) ,
109+ id : user . id ,
89110 email : user . email ,
90111 firstName : user . firstName ,
91112 lastName : user . lastName ,
92113 org : {
93114 name : org . name ,
94115 planKey : org . planKey ,
95- permissions : orgRoles ?. permissions || [ ] ,
116+ permissions : orgRole ?. permissions || [ ] ,
96117 } ,
97118 teams : returnableTeams ,
98119 entitlements,
0 commit comments