Skip to content

Commit 9f3728f

Browse files
committed
fix: handle form emails being identities (#775)
1 parent bfecfe4 commit 9f3728f

File tree

1 file changed

+87
-65
lines changed

1 file changed

+87
-65
lines changed

apps/mail-bridge/queue/mail-processor.ts

Lines changed: 87 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ import {
99
convoToSpaces,
1010
convos,
1111
emailIdentities,
12+
orgMembers,
1213
orgs,
1314
postalServers,
15+
spaceMembers,
16+
teams,
1417
type ConvoEntryMetadata
1518
} from '@u22n/database/schema';
1619
import {
@@ -797,71 +800,90 @@ export const worker = createWorker<MailProcessorJobData>(
797800
// @ts-expect-error we check and define earlier up
798801
fromAddressParticipantId = contactParticipant.id;
799802
} else if (fromAddressPlatformObject.type === 'emailIdentity') {
800-
await discord.info(
801-
`🚪 Adding participants from internal email identity with messages sent from external email services not supported yet, convoId: ${convoId}, fromAddressParticipantId: ${fromAddressParticipantId}`
802-
);
803-
//! TODO: How do we handle adding the participant to the convo if we only track spaces?
804-
//! leave code below for ref and quick revert if needed
805-
// we need to get the first person/team in the routing rule and add them to the convo
806-
// const emailIdentityParticipant =
807-
// await db.query.emailIdentities.findFirst({
808-
// where: and(
809-
// eq(emailIdentities.orgId, orgId),
810-
// eq(emailIdentities.id, fromAddressPlatformObject?.id)
811-
// ),
812-
// columns: {
813-
// id: true
814-
// },
815-
// with: {
816-
// routingRules: {
817-
// columns: {
818-
// id: true
819-
// },
820-
// with: {
821-
// destinations: {
822-
// columns: {
823-
// spaceId: true,
824-
// }
825-
// }
826-
// }
827-
// }
828-
// }
829-
// });
830-
// const firstDestination =
831-
// // @ts-expect-error, taken form old code, will rewrite later
832-
// emailIdentityParticipant.routingRules.destinations[0]!;
833-
// let convoParticipantFromAddressIdentity;
834-
// if (firstDestination.orgMemberId) {
835-
// convoParticipantFromAddressIdentity =
836-
// await db.query.convoParticipants.findFirst({
837-
// where: and(
838-
// eq(convoParticipants.orgId, orgId),
839-
// eq(convoParticipants.convoId, convoId),
840-
841-
// eq(
842-
// convoParticipants.orgMemberId,
843-
// firstDestination.orgMemberId
844-
// )
845-
// ),
846-
// columns: {
847-
// id: true
848-
// }
849-
// });
850-
// } else if (firstDestination.teamId) {
851-
// convoParticipantFromAddressIdentity =
852-
// await db.query.convoParticipants.findFirst({
853-
// where: and(
854-
// eq(convoParticipants.orgId, orgId),
855-
// eq(convoParticipants.convoId, convoId || 0),
856-
// eq(convoParticipants.teamId, firstDestination.teamId)
857-
// ),
858-
// columns: {
859-
// id: true
860-
// }
861-
// });
862-
// }
863-
864-
// fromAddressParticipantId = convoParticipantFromAddressIdentity.id;
803+
const emailIdentity = await db.query.emailIdentities.findFirst({
804+
where: and(
805+
eq(emailIdentities.orgId, orgId),
806+
eq(emailIdentities.id, fromAddressPlatformObject?.id)
807+
),
808+
columns: {
809+
id: true
810+
},
811+
with: {
812+
authorizedSenders: {
813+
with: {
814+
orgMember: true,
815+
team: true,
816+
space: true
817+
}
818+
}
819+
}
820+
});
821+
822+
if (!emailIdentity) {
823+
throw new Error('No email identity participant found');
824+
}
825+
826+
const ownerMember = await db.query.orgMembers.findFirst({
827+
where: and(
828+
eq(orgMembers.orgId, orgId),
829+
eq(orgMembers.defaultEmailIdentityId, emailIdentity.id)
830+
)
831+
});
832+
833+
if (ownerMember) {
834+
fromAddressParticipantId = ownerMember.id;
835+
} else {
836+
const ownerTeam = await db.query.teams.findFirst({
837+
where: and(
838+
eq(teams.orgId, orgId),
839+
eq(teams.defaultEmailIdentityId, emailIdentity.id)
840+
)
841+
});
842+
843+
if (ownerTeam) {
844+
fromAddressParticipantId = ownerTeam.id;
845+
}
846+
}
847+
848+
// if we still don't have a participant, then we need to find the first person/team in the authorized senders or first member of the first space
849+
if (!fromAddressParticipantId) {
850+
if (emailIdentity.authorizedSenders.length) {
851+
const firstAuthorizedSender =
852+
emailIdentity.authorizedSenders[0];
853+
if (firstAuthorizedSender?.orgMember) {
854+
fromAddressParticipantId = firstAuthorizedSender.orgMember.id;
855+
}
856+
if (firstAuthorizedSender?.team) {
857+
fromAddressParticipantId = firstAuthorizedSender.team.id;
858+
}
859+
if (firstAuthorizedSender?.space) {
860+
const spaceMember = await db.query.spaceMembers.findFirst({
861+
where: and(
862+
eq(spaceMembers.spaceId, firstAuthorizedSender.space.id)
863+
),
864+
with: {
865+
orgMember: true,
866+
team: true
867+
}
868+
});
869+
if (spaceMember?.team) {
870+
fromAddressParticipantId = spaceMember.team.id;
871+
} else if (spaceMember?.orgMember) {
872+
fromAddressParticipantId = spaceMember.orgMember.id;
873+
}
874+
}
875+
} else {
876+
throw new Error(
877+
'No authorized senders found for email identity'
878+
);
879+
}
880+
}
881+
882+
if (!fromAddressParticipantId) {
883+
throw new Error(
884+
`Failed to find a from address participant for email identity ${fromAddressPlatformObject?.email}`
885+
);
886+
}
865887
}
866888
}
867889

0 commit comments

Comments
 (0)