Skip to content

Commit

Permalink
Add club membership synchronization logic to auth service
Browse files Browse the repository at this point in the history
Implemented logic to update or remove club membership information based on user profiles from AuthSch. Extended `.env.example` with new environment variables to support membership status checks.
  • Loading branch information
balintking committed Dec 24, 2024
1 parent 43780b4 commit d32d3dc
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 1 deletion.
5 changes: 5 additions & 0 deletions apps/backend/.env.example
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,8 @@ AUTHSCH_CLIENT_SECRET="5KhIlDHGhxzLx3FK7L81FJ5CQSuyJTLVrW0hZnbzv4jbdOHU255HuOtBg
JWT_SECRET="this is a secret"
FRONTEND_URL="http://localhost:3000"
BACKEND_PORT=3030

PEK_GROUP_NAME="Muzsika mívelő mérnökök klubja"
PEK_MEMBER_TITLE="tag"
PEK_NEWBIE_TITLE="újonc"
PEK_GATEKEEPER_TITLE="beengedő"
83 changes: 83 additions & 0 deletions apps/backend/src/auth/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,4 +33,87 @@ export class AuthService {
},
});
}

async syncClubMembership(user: User, userProfile: AuthSchProfile): Promise<User> {
// Skip if the user's PEK profile has not been updated since the last check
if (user.clubMembershipUpdatedAt && userProfile.pek.updatedAt < user.clubMembershipUpdatedAt.valueOf() / 1000) {
return this.prisma.user.update({ where: { id: user.id }, data: { clubMembershipUpdatedAt: new Date() } });
}

// If the user is not a member of MMMK
if (
!(
userProfile.pek.activeMemberAt.some((membership) => membership.groupName === process.env.PEK_GROUP_NAME) ||
userProfile.pek.alumniMemberAt.some((membership) => membership.groupName === process.env.MMMK_GROUP_NAME) ||
userProfile.pek.executiveAt.some((membership) => membership.groupName === process.env.MMMK_GROUP_NAME)
)
) {
// If the user's membership has been terminated, remove their club membership record
this.prisma.clubMembership.delete({ where: { userId: user.id } });

return this.prisma.user.update({ where: { id: user.id }, data: { clubMembershipUpdatedAt: new Date() } });
}

// Active member at MMMK
for (const membership of userProfile.pek.activeMemberAt) {
if (membership.groupName === process.env.PEK_GROUP_NAME) {
const clubMembership = await this.prisma.clubMembership.upsert({
where: { userId: user.id },
update: {
status: membership.titles.includes(process.env.PEK_NEWBIE_TITLE) ? 'NEWBIE' : 'ACTIVE',
titles: membership.titles.filter(
(title) => title !== process.env.PEK_NEWBIE_TITLE && title !== process.env.PEK_MEMBER_TITLE
),
isGateKeeper: membership.titles.includes(process.env.PEK_GATEKEEPER_TITLE),
},
create: {
user: { connect: { id: user.id } },
status: membership.titles.includes(process.env.PEK_NEWBIE_TITLE) ? 'NEWBIE' : 'ACTIVE',
titles: membership.titles.filter(
(title) => title !== process.env.PEK_NEWBIE_TITLE && title !== process.env.PEK_MEMBER_TITLE
),
isGateKeeper: membership.titles.includes(process.env.PEK_GATEKEEPER_TITLE),
hasRoomAccess: false,
isLeadershipMember: false,
},
});

return this.prisma.user.update({
where: { id: user.id },
data: {
clubMembership: { connect: { id: clubMembership.id } },
clubMembershipUpdatedAt: new Date(),
},
});
}
}

// Senior member at MMMK
for (const membership of userProfile.pek.alumniMemberAt) {
if (membership.groupName === process.env.MMMK_GROUP_NAME) {
const clubMembership = await this.prisma.clubMembership.upsert({
where: { userId: user.id },
update: {
status: 'SENIOR',
isGateKeeper: false,
},
create: {
user: { connect: { id: user.id } },
status: 'SENIOR',
isGateKeeper: false,
hasRoomAccess: false,
isLeadershipMember: false,
},
});

return this.prisma.user.update({
where: { id: user.id },
data: {
clubMembership: { connect: { id: clubMembership.id } },
clubMembershipUpdatedAt: new Date(),
},
});
}
}
}
}
3 changes: 2 additions & 1 deletion apps/backend/src/auth/authsch.strategy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export class AuthSchStrategy extends PassportStrategy(Strategy) {
}

async validate(userProfile: AuthSchProfile): Promise<any> {
return await this.authService.findOrCreateUser(userProfile);
const user = await this.authService.findOrCreateUser(userProfile);
return await this.authService.syncClubMembership(user, userProfile);
}
}

0 comments on commit d32d3dc

Please sign in to comment.