11import { Prisma } from "@prisma/client" ;
22
3+ import { getAppFromSlug } from "@calcom/app-store/utils" ;
4+ import { getCalendarCredentials , getConnectedCalendars } from "@calcom/core/CalendarManager" ;
35import { getSlugOrRequestedSlug } from "@calcom/ee/organizations/lib/orgDomains" ;
46import prisma , { baseEventTypeSelect } from "@calcom/prisma" ;
5- import { SchedulingType } from "@calcom/prisma/enums" ;
7+ import { AppCategories , SchedulingType } from "@calcom/prisma/enums" ;
68import { EventTypeMetaDataSchema , teamMetadataSchema } from "@calcom/prisma/zod-utils" ;
79
810import { WEBAPP_URL } from "../../../constants" ;
@@ -22,6 +24,17 @@ export async function getTeamWithMembers(args: {
2224 name : true ,
2325 id : true ,
2426 bio : true ,
27+ destinationCalendar : {
28+ select : {
29+ externalId : true ,
30+ } ,
31+ } ,
32+ selectedCalendars : true ,
33+ credentials : {
34+ include : {
35+ app : true ,
36+ } ,
37+ } ,
2538 } ) ;
2639 const teamSelect = Prisma . validator < Prisma . TeamSelect > ( ) ( {
2740 id : true ,
@@ -111,16 +124,43 @@ export async function getTeamWithMembers(args: {
111124 } ) ;
112125
113126 if ( ! team ) return null ;
114- const members = team . members . map ( ( obj ) => {
115- return {
116- ...obj . user ,
117- role : obj . role ,
118- accepted : obj . accepted ,
119- disableImpersonation : obj . disableImpersonation ,
120- avatar : `${ WEBAPP_URL } /${ obj . user . username } /avatar.png` ,
121- } ;
122- } ) ;
127+ const members = await Promise . all (
128+ team . members . map ( async ( obj ) => {
129+ const calendarCredentials = getCalendarCredentials ( obj . user . credentials ) ;
123130
131+ const { connectedCalendars } = await getConnectedCalendars (
132+ calendarCredentials ,
133+ obj . user . selectedCalendars ,
134+ obj . user . destinationCalendar ?. externalId
135+ ) ;
136+ const connectedApps = obj . user . credentials
137+ . map ( ( { app, id } ) => {
138+ const appMetaData = getAppFromSlug ( app ?. slug ) ;
139+
140+ if ( app ?. categories . includes ( AppCategories . calendar ) ) {
141+ const externalId = connectedCalendars . find ( ( cal ) => cal . credentialId == id ) ?. primary ?. email ;
142+ return { name : appMetaData ?. name , logo : appMetaData ?. logo , slug : appMetaData ?. slug , externalId } ;
143+ }
144+ return { name : appMetaData ?. name , logo : appMetaData ?. logo , slug : appMetaData ?. slug } ;
145+ } )
146+ . sort ( ( a , b ) => ( a . slug ?? "" ) . localeCompare ( b . slug ?? "" ) ) ;
147+ // Prevent credentials from leaking to frontend
148+ const {
149+ credentials : _credentials ,
150+ destinationCalendar : _destinationCalendar ,
151+ selectedCalendars : _selectedCalendars ,
152+ ...rest
153+ } = {
154+ ...obj . user ,
155+ role : obj . role ,
156+ accepted : obj . accepted ,
157+ disableImpersonation : obj . disableImpersonation ,
158+ avatar : `${ WEBAPP_URL } /${ obj . user . username } /avatar.png` ,
159+ connectedApps,
160+ } ;
161+ return rest ;
162+ } )
163+ ) ;
124164 const eventTypes = team . eventTypes . map ( ( eventType ) => ( {
125165 ...eventType ,
126166 metadata : EventTypeMetaDataSchema . parse ( eventType . metadata ) ,
0 commit comments