From 10b52fbe0d878da923fb1521264d5b303b540d65 Mon Sep 17 00:00:00 2001 From: Arjun Patel Date: Fri, 14 Jan 2022 13:15:52 -0800 Subject: [PATCH] adding logic for activating user --- pages/teams/[teamid].tsx | 51 ++++++++++++++++++++++++++++------------ services/teamService.tsx | 40 +++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 17 deletions(-) diff --git a/pages/teams/[teamid].tsx b/pages/teams/[teamid].tsx index 7da697f..60a8870 100644 --- a/pages/teams/[teamid].tsx +++ b/pages/teams/[teamid].tsx @@ -27,29 +27,50 @@ export default function TeamDashboard() { return } + if (typeof teamid !== "string") { + console.log('not a proper query with teamid') + router.push('/teams') + return + } + // check if the team is a valid team and that user is in it - if (typeof teamid === "string") { - const returnedTeam = await teamService.getTeam(teamid) - const returnedTeamMember = await teamService.getTeamMember(teamid, currUser.uid) + const returnedTeam = await teamService.getTeam(teamid) + if (!returnedTeam) { + console.log('team doesnt exist') + router.push('/teams') + return + } - console.log(returnedTeam) - console.log(returnedTeamMember) + const returnedTeamMember = await teamService.getTeamMemberByUserId(teamid, currUser.uid) - // if there is no such team OR - // if you are not a member of this team, then get out of here - if (!returnedTeam || !returnedTeamMember || returnedTeamMember.status == TeamMemberStatus.deleted) { - console.log('no team exists, or am not activated in it') - // router.push('/teams') - return + console.log(returnedTeam) + console.log(returnedTeamMember) + + // if you are not a member of this team, then get out of here + // but have to check through email invite and userid + if (returnedTeamMember && returnedTeamMember.status == TeamMemberStatus.deleted) { + console.log('user was deleted from team') + router.push('/teams') + return + } + + // if there is no team member through user id, + // give him last chance and see if he was invited + if (!returnedTeamMember) { + const invitedTeamMember = await teamService.getTeamMemberByEmailInvite(teamid, currUser.email) + + if (!invitedTeamMember) { + console.log('not invited to team either') + router.push('/teams') + return } // if I am new to the team but I was invited, and this is my first time, then activate me into the team // and proceed with showing the dashboard stuff - } else { - console.log('not a proper query with teamid') - router.push('/teams') - return + invitedTeamMember.status = TeamMemberStatus.activated + invitedTeamMember.userId = currUser.uid + await teamService.updateTeamMember(invitedTeamMember) } } catch(error) { console.log(error) diff --git a/services/teamService.tsx b/services/teamService.tsx index d8b58e8..c958686 100644 --- a/services/teamService.tsx +++ b/services/teamService.tsx @@ -1,4 +1,4 @@ -import { addDoc, collection, doc, DocumentReference, Firestore, getDoc, getDocs, getFirestore, orderBy, query, serverTimestamp, where } from 'firebase/firestore' +import { addDoc, collection, doc, DocumentReference, Firestore, getDoc, getDocs, getFirestore, orderBy, query, serverTimestamp, setDoc, where } from 'firebase/firestore' import { Team } from '../models/team' import { TeamMember, TeamMemberRole, TeamMemberStatus } from '../models/teamMember' import { Collections } from './collections' @@ -38,6 +38,7 @@ export default class TeamService implements IService { if (docSnap.exists()) { console.log('got team data') let team: Team = docSnap.data() as Team + team.id = docSnap.id return team } else { // doc.data() will be undefined in this case @@ -47,7 +48,7 @@ export default class TeamService implements IService { } } - async getTeamMember(teamId: string, userId: string): Promise { + async getTeamMemberByUserId(teamId: string, userId: string): Promise { const q = query( collection(this.db, Collections.teamMembers), where("teamId", "==", teamId), @@ -68,8 +69,43 @@ export default class TeamService implements IService { // get the first one and just return...shouldn't be more console.log('got teammember data') teamMember = doc.data() as TeamMember + + teamMember.id = doc.id }); return teamMember } + + async getTeamMemberByEmailInvite(teamId: string, emailAddress: string): Promise { + const q = query( + collection(this.db, Collections.teamMembers), + where("teamId", "==", teamId), + where("inviteEmailAddress", "==", emailAddress) + ) + + const querySnapshot = await getDocs(q); + + if (querySnapshot.size > 1) { + console.log('there are multiple teammembers for this user...error in teamservice') + } + + console.log(querySnapshot) + + var teamMember: TeamMember | null = null + querySnapshot.forEach((doc) => { + // doc.data() is never undefined for query doc snapshots + // get the first one and just return...shouldn't be more + console.log('got teammember data') + teamMember = doc.data() as TeamMember + + teamMember.id = doc.id + }); + + return teamMember + } + + async updateTeamMember(teamMember: TeamMember) { + const docRef = doc(this.db, Collections.teamMembers, teamMember.id); + await setDoc(docRef, { ...teamMember, lastUpdatedDate: serverTimestamp() }, { merge: true }) + } } \ No newline at end of file