cleaning up old files breaking deployment
This commit is contained in:
@@ -1,25 +0,0 @@
|
||||
import { Timestamp } from "firebase/firestore";
|
||||
|
||||
export default class Announcement {
|
||||
id: string;
|
||||
teamId: string;
|
||||
audioDataUrl: string; // link to cloud storage file
|
||||
|
||||
state: AnnouncementState = AnnouncementState.active;
|
||||
|
||||
createdByUserId: string;
|
||||
createdDate: Timestamp;
|
||||
lastUpdatedDate: Timestamp;
|
||||
|
||||
constructor(_audioUrl: string, _teamId: string, _createdByUserId: string) {
|
||||
this.audioDataUrl = _audioUrl;
|
||||
this.createdByUserId = _createdByUserId;
|
||||
this.teamId = _teamId;
|
||||
}
|
||||
}
|
||||
|
||||
export enum AnnouncementState {
|
||||
active = "active",
|
||||
resolved = "resolved",
|
||||
deleted = "deleted",
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
export default interface IFirestoreSerializable {
|
||||
id: string;
|
||||
|
||||
serialize: () => {};
|
||||
|
||||
// deserialize: (firestoreData: {}) => {};
|
||||
}
|
||||
@@ -1,88 +0,0 @@
|
||||
import { Timestamp } from "firebase/firestore";
|
||||
|
||||
export default class Link {
|
||||
id: string;
|
||||
name: string;
|
||||
description: string;
|
||||
link: string; //url for file
|
||||
|
||||
state: LinkState = LinkState.active;
|
||||
type: LinkType;
|
||||
|
||||
teamId: string;
|
||||
// if it's not a teamAttachment, then have a list of members who it's for
|
||||
recipients: string[]; // userIds
|
||||
|
||||
createdByUserId: string;
|
||||
createdDate: Timestamp;
|
||||
|
||||
constructor(
|
||||
_name: string,
|
||||
_description: string,
|
||||
_link: string,
|
||||
_teamId: string,
|
||||
recipientsArr: string[],
|
||||
_createdByUserId: string
|
||||
) {
|
||||
this.name = _name;
|
||||
this.description = _description;
|
||||
this.link = _link;
|
||||
this.teamId = _teamId;
|
||||
this.recipients = recipientsArr;
|
||||
this.createdByUserId = _createdByUserId;
|
||||
|
||||
if (!recipientsArr || recipientsArr?.length == 0) {
|
||||
this.recipients = null;
|
||||
} else {
|
||||
this.recipients = recipientsArr;
|
||||
}
|
||||
|
||||
this.type = Link.getLinkType(_link);
|
||||
}
|
||||
|
||||
static getLinkType(url: string): LinkType {
|
||||
if (url.includes(LinkType.github)) {
|
||||
return LinkType.github;
|
||||
} else if (url.includes(LinkType.atlassian)) {
|
||||
return LinkType.atlassian;
|
||||
} else if (
|
||||
url.includes(LinkType.googleDrive) ||
|
||||
url.includes("docs.google")
|
||||
) {
|
||||
return LinkType.googleDrive;
|
||||
} else if (
|
||||
url.includes(".png") ||
|
||||
url.includes(".jpg") ||
|
||||
url.includes(".svg") ||
|
||||
url.includes(".gif") ||
|
||||
url.includes(LinkType.pastePics)
|
||||
) {
|
||||
return LinkType.image;
|
||||
} else if (url.includes(LinkType.pdf)) {
|
||||
return LinkType.pdf;
|
||||
} else if (url.includes(LinkType.codePile)) {
|
||||
return LinkType.codePile;
|
||||
} else {
|
||||
return LinkType.default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export enum LinkState {
|
||||
active = "active",
|
||||
archived = "archived",
|
||||
deleted = "deleted",
|
||||
}
|
||||
|
||||
export enum LinkType {
|
||||
default = "default",
|
||||
github = "github",
|
||||
atlassian = "atlassian",
|
||||
googleDrive = "drive.google",
|
||||
onedrive = "onedrive",
|
||||
image = "image",
|
||||
pdf = "pdf",
|
||||
codePile = "codepile",
|
||||
pastePics = "paste.pics",
|
||||
googleMeet = "googleMeet",
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
import { Timestamp } from "firebase/firestore";
|
||||
|
||||
export class Message {
|
||||
id: string;
|
||||
audioDataUrl: string;
|
||||
|
||||
senderUserId: string;
|
||||
receiverUserId: string;
|
||||
|
||||
senderReceiver: string[]; // composite to make querying easier in the future
|
||||
|
||||
createdDate: Timestamp;
|
||||
|
||||
// firstListenDate: Timestamp;
|
||||
}
|
||||
@@ -1,37 +0,0 @@
|
||||
import { Timestamp } from "firebase/firestore";
|
||||
import { v4 as uuidv4 } from "uuid";
|
||||
|
||||
export default class OfficeRoom {
|
||||
id: string = uuidv4();
|
||||
|
||||
teamId: string;
|
||||
|
||||
name: string; // entrance, kitchen, etc.
|
||||
|
||||
createdDate: Timestamp;
|
||||
createdByUserId: string;
|
||||
|
||||
lastUpdatedDate: Timestamp;
|
||||
|
||||
members: string[] = []; // id's of users in the office room
|
||||
|
||||
state: OfficeRoomState;
|
||||
|
||||
constructor(
|
||||
_name: string,
|
||||
_teamId: string,
|
||||
_createdBy: string,
|
||||
_state: OfficeRoomState = OfficeRoomState.idle
|
||||
) {
|
||||
this.name = _name;
|
||||
this.teamId = _teamId;
|
||||
this.createdByUserId = _createdBy;
|
||||
this.state = _state;
|
||||
}
|
||||
}
|
||||
|
||||
export enum OfficeRoomState {
|
||||
active = "active",
|
||||
idle = "idle",
|
||||
archived = "archived",
|
||||
}
|
||||
@@ -1,50 +0,0 @@
|
||||
import { Timestamp } from "firebase/firestore";
|
||||
|
||||
export default class Room {
|
||||
id: string;
|
||||
|
||||
name: string;
|
||||
description: string;
|
||||
|
||||
link: string; // google meet link for now
|
||||
|
||||
members: string[] = []; //userIds of "mandatory"/invited people including the person who created it
|
||||
|
||||
membersInRoom: string[] = [];
|
||||
|
||||
attachments: string[] = []; // the links themselves (NOT Ids)...there will be duplicate entries in the attachments table which will be created
|
||||
|
||||
type: RoomType;
|
||||
status: RoomStatus = RoomStatus.empty;
|
||||
|
||||
approximateDateTime: string; // vaguely say when the meeting should be...give user pointers
|
||||
scheduledDateTime: Timestamp;
|
||||
|
||||
// scheduledJsDateTime(): Date {
|
||||
// return this.scheduledDateTime.toDate();
|
||||
// }
|
||||
|
||||
createdDate: Timestamp;
|
||||
|
||||
// createdJsDate(): Date {
|
||||
// return this.createdDate.toDate();
|
||||
// }
|
||||
|
||||
createdByUserId: string;
|
||||
|
||||
teamId: string;
|
||||
|
||||
lastUpdatedDate: Timestamp;
|
||||
}
|
||||
|
||||
export enum RoomType {
|
||||
now = "now",
|
||||
scheduled = "scheduled", // one time sort of standard meeting
|
||||
recurring = "recurring", //daily standup
|
||||
}
|
||||
|
||||
export enum RoomStatus {
|
||||
live = "live",
|
||||
empty = "empty",
|
||||
archived = "archived", // user marks it over
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
import { Timestamp } from "firebase/firestore";
|
||||
|
||||
export class Team {
|
||||
id: string;
|
||||
name: string;
|
||||
|
||||
status: TeamStatus;
|
||||
|
||||
allowedUserCount: number = 2;
|
||||
// subscriptionPlan: TeamSubscriptionPlan = TeamSubscriptionPlan.basic
|
||||
|
||||
companySite: string;
|
||||
|
||||
createdByUserId: string;
|
||||
createdDate: Timestamp;
|
||||
|
||||
lastUpdatedDate: Timestamp;
|
||||
}
|
||||
|
||||
export enum TeamStatus {
|
||||
created = "created",
|
||||
deactivated = "deactivated",
|
||||
deleted = "deleted",
|
||||
}
|
||||
|
||||
export enum TeamSubscriptionPlan {
|
||||
free = "free",
|
||||
basic = "basic",
|
||||
pro = "pro",
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
import { Timestamp } from "firebase/firestore";
|
||||
|
||||
export class TeamMember {
|
||||
id: string;
|
||||
userId: string;
|
||||
teamId: string;
|
||||
|
||||
inviteEmailAddress: string;
|
||||
invitedByUserId: string;
|
||||
|
||||
role: TeamMemberRole
|
||||
status: TeamMemberStatus
|
||||
|
||||
createdDate: Timestamp
|
||||
lastUpdatedDate: Timestamp
|
||||
}
|
||||
|
||||
export enum TeamMemberRole {
|
||||
admin = "admin"
|
||||
}
|
||||
|
||||
export enum TeamMemberStatus {
|
||||
invited = "invited",
|
||||
activated = "activated",
|
||||
deleted = "deleted"
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
import {
|
||||
addDoc,
|
||||
collection,
|
||||
doc,
|
||||
Firestore,
|
||||
getFirestore,
|
||||
serverTimestamp,
|
||||
setDoc,
|
||||
} from "firebase/firestore";
|
||||
import { AnnouncementState } from "../models/announcement";
|
||||
import { Collections } from "./collections";
|
||||
|
||||
export class AnnouncementService {
|
||||
private db: Firestore = getFirestore();
|
||||
|
||||
async updateAnnouncementState(
|
||||
announcementId: string,
|
||||
newState: AnnouncementState
|
||||
) {
|
||||
const docRef = doc(this.db, Collections.announcements, announcementId);
|
||||
await setDoc(
|
||||
docRef,
|
||||
{ state: newState, lastUpdatedDate: serverTimestamp() },
|
||||
{ merge: true }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
import {
|
||||
addDoc,
|
||||
collection,
|
||||
doc,
|
||||
Firestore,
|
||||
getFirestore,
|
||||
serverTimestamp,
|
||||
setDoc,
|
||||
} from "firebase/firestore";
|
||||
import Link, { LinkState } from "../models/link";
|
||||
import { Collections } from "./collections";
|
||||
|
||||
export class LinkService {
|
||||
private db: Firestore = getFirestore();
|
||||
|
||||
async updateLinkState(linkId: string, newState: LinkState) {
|
||||
const docRef = doc(this.db, Collections.links, linkId);
|
||||
await setDoc(
|
||||
docRef,
|
||||
{ state: newState, lastUpdatedDate: serverTimestamp() },
|
||||
{ merge: true }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,93 +0,0 @@
|
||||
import {
|
||||
addDoc,
|
||||
collection,
|
||||
doc,
|
||||
FieldValue,
|
||||
Firestore,
|
||||
getFirestore,
|
||||
serverTimestamp,
|
||||
setDoc,
|
||||
writeBatch,
|
||||
} from "firebase/firestore";
|
||||
import OfficeRoom, { OfficeRoomState } from "../models/officeRoom";
|
||||
// import AgoraService from "./agoraService";
|
||||
import { Collections } from "./collections";
|
||||
|
||||
export default class OfficeRoomService {
|
||||
private db: Firestore = getFirestore();
|
||||
private batch = writeBatch(this.db);
|
||||
|
||||
// private agoraService = new AgoraService();
|
||||
|
||||
async createInitialOfficeRooms(createdByUserId: string, teamId: string) {
|
||||
const entrance = new OfficeRoom("Entrance", teamId, createdByUserId);
|
||||
const kitchen = new OfficeRoom("Kitchen", teamId, createdByUserId);
|
||||
const hallway = new OfficeRoom("Hallway", teamId, createdByUserId);
|
||||
const corner = new OfficeRoom("Corner", teamId, createdByUserId);
|
||||
const main = new OfficeRoom("Team Hub", teamId, createdByUserId);
|
||||
const handsOnDeck = new OfficeRoom(
|
||||
"All Hands On Deck",
|
||||
teamId,
|
||||
createdByUserId
|
||||
);
|
||||
|
||||
const initialORs: OfficeRoom[] = [
|
||||
entrance,
|
||||
kitchen,
|
||||
hallway,
|
||||
corner,
|
||||
main,
|
||||
handsOnDeck,
|
||||
];
|
||||
|
||||
initialORs.forEach((oR) => {
|
||||
const oRRef = doc(this.db, Collections.officeRooms, oR.id);
|
||||
this.batch.set(oRRef, { ...oR, createdDate: serverTimestamp() });
|
||||
});
|
||||
|
||||
await this.batch.commit();
|
||||
}
|
||||
|
||||
async joinOfficeRoom(officeRoom: OfficeRoom, userId: string) {
|
||||
// get agoraToken
|
||||
// const agoraToken = await this.agoraService.getAgoraToken();
|
||||
|
||||
// join channel
|
||||
// await this.agoraService.handleJoinChannel(officeRoom.id, agoraToken);
|
||||
|
||||
// update members list in firestore
|
||||
const newMembers = [...officeRoom.members, userId];
|
||||
await this.updateMembersInOfficeRoom(officeRoom.id, newMembers);
|
||||
}
|
||||
|
||||
async updateMembersInOfficeRoom(
|
||||
officeRoomId: string,
|
||||
newMembersInRoom: string[]
|
||||
) {
|
||||
// if the room is going to be empty, then change status accordingly
|
||||
var state: OfficeRoomState = OfficeRoomState.active;
|
||||
if (newMembersInRoom.length == 0) {
|
||||
state = OfficeRoomState.idle;
|
||||
}
|
||||
|
||||
const docRef = doc(this.db, Collections.officeRooms, officeRoomId);
|
||||
await setDoc(
|
||||
docRef,
|
||||
{
|
||||
state,
|
||||
members: newMembersInRoom,
|
||||
lastUpdatedDate: serverTimestamp(),
|
||||
},
|
||||
{ merge: true }
|
||||
);
|
||||
}
|
||||
|
||||
// async updateRoom(room: Room) {
|
||||
// const docRef = doc(this.db, Collections.rooms, room.id);
|
||||
// await setDoc(
|
||||
// docRef,
|
||||
// { ...room, lastUpdatedDate: serverTimestamp() },
|
||||
// { merge: true }
|
||||
// );
|
||||
// }
|
||||
}
|
||||
@@ -1,56 +0,0 @@
|
||||
import {
|
||||
addDoc,
|
||||
collection,
|
||||
doc,
|
||||
Firestore,
|
||||
getFirestore,
|
||||
serverTimestamp,
|
||||
setDoc,
|
||||
} from "firebase/firestore";
|
||||
import Room, { RoomStatus } from "../models/room";
|
||||
import { Collections } from "./collections";
|
||||
|
||||
export default class RoomService {
|
||||
private db: Firestore = getFirestore();
|
||||
|
||||
async createOrUpdateRoom(room: Room) {
|
||||
if (room.id) {
|
||||
//update
|
||||
await this.updateRoom(room);
|
||||
} else {
|
||||
//create
|
||||
const roomDocRef = await addDoc(collection(this.db, Collections.rooms), {
|
||||
...room,
|
||||
createdDate: serverTimestamp(),
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
async updateMembersInRoom(roomId: string, newMembersInRoom: string[]) {
|
||||
// if the room is going to be empty, then change status accordingly
|
||||
var status: RoomStatus = RoomStatus.live;
|
||||
if (newMembersInRoom.length == 0) {
|
||||
status = RoomStatus.empty;
|
||||
}
|
||||
|
||||
const docRef = doc(this.db, Collections.rooms, roomId);
|
||||
await setDoc(
|
||||
docRef,
|
||||
{
|
||||
status,
|
||||
membersInRoom: newMembersInRoom,
|
||||
lastUpdatedDate: serverTimestamp(),
|
||||
},
|
||||
{ merge: true }
|
||||
);
|
||||
}
|
||||
|
||||
async updateRoom(room: Room) {
|
||||
const docRef = doc(this.db, Collections.rooms, room.id);
|
||||
await setDoc(
|
||||
docRef,
|
||||
{ ...room, lastUpdatedDate: serverTimestamp() },
|
||||
{ merge: true }
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,42 +0,0 @@
|
||||
import {
|
||||
addDoc,
|
||||
collection,
|
||||
Firestore,
|
||||
getFirestore,
|
||||
serverTimestamp,
|
||||
} from "firebase/firestore";
|
||||
import Announcement from "../models/announcement";
|
||||
import Link from "../models/link";
|
||||
import { Message } from "../models/message";
|
||||
import { Collections } from "./collections";
|
||||
|
||||
export class SendService {
|
||||
private db: Firestore = getFirestore();
|
||||
|
||||
async sendMessage(message: Message) {
|
||||
// do quick stuff to create the composite for easier future querying
|
||||
message.senderReceiver = [message.senderUserId, message.receiverUserId];
|
||||
|
||||
const teamDocRef = await addDoc(
|
||||
collection(this.db, Collections.audioMessages),
|
||||
{
|
||||
...message,
|
||||
createdDate: serverTimestamp(),
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
async sendLink(link: Link) {
|
||||
await addDoc(collection(this.db, Collections.links), {
|
||||
...link,
|
||||
createdDate: serverTimestamp(),
|
||||
});
|
||||
}
|
||||
|
||||
async sendAnnouncement(announcement: Announcement) {
|
||||
await addDoc(collection(this.db, Collections.announcements), {
|
||||
...announcement,
|
||||
createdDate: serverTimestamp(),
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,297 +0,0 @@
|
||||
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";
|
||||
import IService from "./IService";
|
||||
|
||||
export default class TeamService implements IService {
|
||||
db: Firestore = getFirestore();
|
||||
|
||||
async createTeam(team: Team): Promise<string> {
|
||||
// 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;
|
||||
}
|
||||
|
||||
async updateTeam(team: Team) {
|
||||
const docRef = doc(this.db, Collections.teams, team.id);
|
||||
await setDoc(
|
||||
docRef,
|
||||
{ ...team, lastUpdatedDate: serverTimestamp() },
|
||||
{ merge: true }
|
||||
);
|
||||
}
|
||||
|
||||
async getTeam(teamId: string): Promise<Team | null> {
|
||||
const docRef = doc(this.db, Collections.teams, teamId);
|
||||
const docSnap = await getDoc(docRef);
|
||||
|
||||
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
|
||||
console.log("team not found!");
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
async getTeamMemberByUserId(
|
||||
teamId: string,
|
||||
userId: string
|
||||
): Promise<TeamMember | null> {
|
||||
const q = query(
|
||||
collection(this.db, Collections.teamMembers),
|
||||
where("teamId", "==", teamId),
|
||||
where("userId", "==", userId)
|
||||
);
|
||||
|
||||
const querySnapshot = await getDocs(q);
|
||||
|
||||
if (querySnapshot.size > 1) {
|
||||
console.log(
|
||||
"there are multiple teammembers for this user...error in teamservice"
|
||||
);
|
||||
}
|
||||
|
||||
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 getTeamMemberByEmailInvite(
|
||||
teamId: string,
|
||||
emailAddress: string
|
||||
): Promise<TeamMember | null> {
|
||||
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"
|
||||
);
|
||||
}
|
||||
|
||||
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 getTeamMembersByEmailInvite(
|
||||
emailAddress: string
|
||||
): Promise<TeamMember[]> {
|
||||
const q = query(
|
||||
collection(this.db, Collections.teamMembers),
|
||||
where("inviteEmailAddress", "==", emailAddress)
|
||||
);
|
||||
|
||||
const querySnapshot = await getDocs(q);
|
||||
|
||||
var teamMembers: TeamMember[] = [];
|
||||
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");
|
||||
let teamMember: TeamMember = doc.data() as TeamMember;
|
||||
|
||||
teamMember.id = doc.id;
|
||||
|
||||
teamMembers.push(teamMember);
|
||||
});
|
||||
|
||||
return teamMembers;
|
||||
}
|
||||
|
||||
async getTeamMembersByUserId(userId: string): Promise<TeamMember[]> {
|
||||
const q = query(
|
||||
collection(this.db, Collections.teamMembers),
|
||||
where("userId", "==", userId)
|
||||
);
|
||||
|
||||
const querySnapshot = await getDocs(q);
|
||||
|
||||
if (querySnapshot.size > 1) {
|
||||
console.log("this user is part of multiple teams");
|
||||
}
|
||||
|
||||
var teamMembers: TeamMember[] = [];
|
||||
|
||||
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");
|
||||
let teamMember: TeamMember = doc.data() as TeamMember;
|
||||
teamMember.id = doc.id;
|
||||
|
||||
teamMembers.push(teamMember);
|
||||
});
|
||||
|
||||
return teamMembers;
|
||||
}
|
||||
|
||||
async getTeamMembersByTeamId(teamId: string): Promise<TeamMember[]> {
|
||||
const q = query(
|
||||
collection(this.db, Collections.teamMembers),
|
||||
where("teamId", "==", teamId)
|
||||
);
|
||||
|
||||
const querySnapshot = await getDocs(q);
|
||||
|
||||
var teamMembers: TeamMember[] = [];
|
||||
|
||||
querySnapshot.forEach((doc) => {
|
||||
// doc.data() is never undefined for query doc snapshots
|
||||
// get the first one and just return...shouldn't be more
|
||||
let teamMember: TeamMember = doc.data() as TeamMember;
|
||||
teamMember.id = doc.id;
|
||||
|
||||
teamMembers.push(teamMember);
|
||||
});
|
||||
|
||||
return teamMembers;
|
||||
}
|
||||
|
||||
async updateTeamMember(teamMember: TeamMember) {
|
||||
const docRef = doc(this.db, Collections.teamMembers, teamMember.id);
|
||||
await setDoc(
|
||||
docRef,
|
||||
{ ...teamMember, lastUpdatedDate: serverTimestamp() },
|
||||
{ merge: true }
|
||||
);
|
||||
}
|
||||
|
||||
async createTeamInvite(teamMember: TeamMember) {
|
||||
if (teamMember.status == TeamMemberStatus.activated) {
|
||||
console.log('cannot invite this user, already active.')
|
||||
return
|
||||
}
|
||||
|
||||
// if a person was already invited, then update that record, otherwise create a new one
|
||||
const existingTeamMember = await this.getTeamMemberByEmailInvite(
|
||||
teamMember.teamId,
|
||||
teamMember.inviteEmailAddress
|
||||
);
|
||||
|
||||
if (!existingTeamMember) {
|
||||
const teamMemberRef = await addDoc(
|
||||
collection(this.db, Collections.teamMembers),
|
||||
{
|
||||
...teamMember,
|
||||
createdDate: serverTimestamp(),
|
||||
}
|
||||
);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// just update the current user to active since we are activating again
|
||||
await this.updateTeamMemberStatus(
|
||||
existingTeamMember.id,
|
||||
TeamMemberStatus.invited
|
||||
);
|
||||
}
|
||||
|
||||
async updateTeamMemberStatus(teamMemberId: string, status: TeamMemberStatus) {
|
||||
const docRef = doc(this.db, Collections.teamMembers, teamMemberId);
|
||||
await setDoc(
|
||||
docRef,
|
||||
{ status, lastUpdatedDate: serverTimestamp() },
|
||||
{ merge: true }
|
||||
);
|
||||
}
|
||||
|
||||
async getActiveOrInvitedTeamsbyUser(
|
||||
userId: string,
|
||||
email: string
|
||||
): Promise<Team[]> {
|
||||
// get all of the teammember entries for the user
|
||||
const userTeamMembers = await this.getTeamMembersByUserId(userId);
|
||||
const userTeamMembersByEmail = await this.getTeamMembersByEmailInvite(
|
||||
email
|
||||
);
|
||||
|
||||
// traverse through and get the teams for each
|
||||
var teams: Promise<Team>[];
|
||||
if (userTeamMembers) {
|
||||
teams = userTeamMembers.map(async (tm) => {
|
||||
if (tm.status != TeamMemberStatus.deleted) {
|
||||
let team = await this.getTeam(tm.teamId);
|
||||
return team;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
var invitedToTeams: Promise<Team>[] = [];
|
||||
invitedToTeams = userTeamMembersByEmail
|
||||
.filter((tm) => tm.status == TeamMemberStatus.invited)
|
||||
.map(async (tm) => {
|
||||
let team = await this.getTeam(tm.teamId);
|
||||
return team;
|
||||
});
|
||||
|
||||
return Promise.all([...teams, ...invitedToTeams]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user