From 00d256b43b23484bb4df3ac02e31399765342d9d Mon Sep 17 00:00:00 2001 From: Arjun Patel Date: Fri, 14 Jan 2022 12:17:59 -0800 Subject: [PATCH] team creation clean done --- models/team.ts | 4 +++- models/teamMember.ts | 5 ++++ pages/teams/create.tsx | 52 +++++++++++++++++++++++++++++++++------- services/IService.tsx | 5 ++++ services/collections.tsx | 8 +++++++ services/teamService.tsx | 33 +++++++++++++++++++++++++ services/userService.tsx | 10 ++++---- 7 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 services/IService.tsx create mode 100644 services/collections.tsx create mode 100644 services/teamService.tsx diff --git a/models/team.ts b/models/team.ts index 94f654d..ae9b5a5 100644 --- a/models/team.ts +++ b/models/team.ts @@ -8,7 +8,9 @@ export class Team { allowedUserCount:number; - createdBy: string; + companySite: string; + + createdByUserId: string; createdDate: Timestamp; lastUpdatedDate: Timestamp; diff --git a/models/teamMember.ts b/models/teamMember.ts index 6cd23d4..106a4d7 100644 --- a/models/teamMember.ts +++ b/models/teamMember.ts @@ -1,3 +1,5 @@ +import { Timestamp } from "firebase/firestore"; + export class TeamMember { id: string; userId: string; @@ -8,6 +10,9 @@ export class TeamMember { role: TeamMemberRole status: TeamMemberStatus + + createdDate: Timestamp + lastUpdatedDate: Timestamp } export enum TeamMemberRole { diff --git a/pages/teams/create.tsx b/pages/teams/create.tsx index fbf8ce0..5351385 100644 --- a/pages/teams/create.tsx +++ b/pages/teams/create.tsx @@ -2,12 +2,18 @@ import { Divider } from "antd"; import { useRouter } from "next/router"; import { useEffect, useState } from "react"; import { useAuth } from "../../contexts/authContext"; +import { Team, TeamStatus } from "../../models/team"; import { User, UserStatus } from "../../models/user"; +import TeamService from "../../services/teamService"; const initialSite: string = 'https://' + +const teamService = new TeamService() + export default function CreateTeam() { - const { currUser, logOut } = useAuth() + const { currUser } = useAuth() const [error, setError] = useState('') + const [loading, setLoading] = useState(true) const router = useRouter() useEffect(() => { @@ -19,25 +25,47 @@ export default function CreateTeam() { // router.push('/teams/login') } + // todo if user is in a team already, notify them to make sure + // buttt most likely will already be routed to the correct place from the router...don't do the router's job + } catch(error) { console.log(error) router.push('/teams/login') } })(); + + setLoading(false) }, []) - function handleSubmit(e) { + async function handleSubmit(e) { e.preventDefault() + setLoading(true) + if (!teamName) { setError('You must input a team name!') + return } - if (companySite == initialSite) { - // make sure to put null in database for the team + try { + const team = new Team() + team.name = teamName + team.createdByUserId = currUser.uid + team.status = TeamStatus.created + + if (companySite != initialSite) { + // make sure to put null in database for the team + team.companySite = companySite + } + + // provision a team with state of initiated + const createdTeamId = await teamService.createTeam(team) + router.push('/teams/' + createdTeamId) + } catch(error) { + setError(error.message) } - // provision a team with state of initiated + setLoading(false) } const [teamName, setTeamName] = useState('') @@ -73,9 +101,17 @@ export default function CreateTeam() { - + { + loading ? +
+ Loading... +
+ : + + } +
) diff --git a/services/IService.tsx b/services/IService.tsx new file mode 100644 index 0000000..e8d7ef2 --- /dev/null +++ b/services/IService.tsx @@ -0,0 +1,5 @@ +import { Firestore } from "firebase/firestore"; + +export default interface IService { + db: Firestore; +} \ No newline at end of file diff --git a/services/collections.tsx b/services/collections.tsx new file mode 100644 index 0000000..a8167c6 --- /dev/null +++ b/services/collections.tsx @@ -0,0 +1,8 @@ + + +export enum Collections { + users = "users", + teams = "teams", + teamMembers = "teamMembers", + teamSubscriptions = "teamSubscriptions" +} \ No newline at end of file diff --git a/services/teamService.tsx b/services/teamService.tsx new file mode 100644 index 0000000..ec7df5a --- /dev/null +++ b/services/teamService.tsx @@ -0,0 +1,33 @@ +import { addDoc, collection, doc, DocumentReference, Firestore, getFirestore, serverTimestamp } from 'firebase/firestore' +import { Team } from '../models/team' +import { TeamMember, TeamMemberRole, TeamMemberStatus } from '../models/teamMember' +import { Collections } from './collections' +import IService from './IService' + +export default class TeamService implements IService { + db : Firestore = getFirestore() + + async createTeam(team: Team): Promise { + // create team + const teamDocRef = await addDoc(collection(this.db, Collections.teams), { + ...team, + createdDate: serverTimestamp() + }) + + const teamMember = new TeamMember() + teamMember.role = TeamMemberRole.admin + teamMember.teamId = teamDocRef.id + teamMember.userId = team.createdByUserId + teamMember.status = TeamMemberStatus.activated + + // create team member as admin who created the team + const teamMemberRef = await addDoc(collection(this.db, Collections.teamMembers), { + ...teamMember, + createdDate: serverTimestamp() + }) + + console.log('created team') + + return teamDocRef.id + } +} \ No newline at end of file diff --git a/services/userService.tsx b/services/userService.tsx index edc4a3a..ce2214f 100644 --- a/services/userService.tsx +++ b/services/userService.tsx @@ -1,18 +1,18 @@ import { User as FirUser } from "firebase/auth"; import { Firestore, getFirestore, doc, getDoc, setDoc, Timestamp, serverTimestamp } from "firebase/firestore"; import { User } from '../models/user' +import { Collections } from "./collections"; export default class UserService { private db : Firestore = getFirestore() - private static collectionName: string = "users" - + // give back the avatar based on the person's google account avatar getUserAvatar(displayName: string) { return `https://ui-avatars.com/api/?name=${displayName}` } async getUser(userId: string) : Promise { - const docRef = doc(this.db, UserService.collectionName, userId); + const docRef = doc(this.db, Collections.users, userId); const docSnap = await getDoc(docRef); if (docSnap.exists()) { @@ -28,12 +28,12 @@ export default class UserService { } async createUser(userId: string, emailAddress: string, avatarUrl: string) { - const docRef = doc(this.db, UserService.collectionName, userId); + const docRef = doc(this.db, Collections.users, userId); await setDoc(docRef, { emailAddress, avatarUrl, createdDate: serverTimestamp() }, { merge: true }) } async updateUser(user: User) { - const docRef = doc(this.db, UserService.collectionName, user.id); + const docRef = doc(this.db, Collections.users, user.id); await setDoc(docRef, { ...user, lastUpdatedDate: serverTimestamp() }, { merge: true }) } } \ No newline at end of file