Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Meetings fix + some refactoring #130

Merged
merged 65 commits into from
Jan 14, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
e1b6481
Add notification sound
gf-rog Jan 8, 2024
688c9a8
Remove socket connection from login page
gf-rog Jan 8, 2024
6fd5735
Remove old frontend sockets
gf-rog Jan 11, 2024
2f7d7b0
Connect to socket if logged in
gf-rog Jan 8, 2024
e690152
Use UserProvider socket in video call page
gf-rog Jan 8, 2024
94031bf
Add isFriend function
gf-rog Jan 9, 2024
7cd049a
Add meeting functions
gf-rog Jan 11, 2024
70fe2be
Add meeting handling
gf-rog Jan 11, 2024
e4dcab6
Remove unused meeting buttons
gf-rog Jan 11, 2024
e118b6e
Add create meeting button
gf-rog Jan 11, 2024
e937295
Add end meeting function
gf-rog Jan 11, 2024
5042b97
Emit message after creating a meeting
gf-rog Jan 11, 2024
f95f561
Navigate to meeting page on successful create
gf-rog Jan 11, 2024
a6a4c83
Remove meeting on socket disconnect
gf-rog Jan 11, 2024
405b4da
Move meetings logic to user provider
gf-rog Jan 11, 2024
3da425c
Redirect to home page if not in meeting
gf-rog Jan 11, 2024
44b9d61
Send back joined meeting message
gf-rog Jan 11, 2024
4eb3d6b
Fix using message as friend ID
gf-rog Jan 11, 2024
c0fd05f
Add join meeting handling
gf-rog Jan 11, 2024
aba7022
Fix crash when leaving meeting with someone else in it
gf-rog Jan 11, 2024
8854b96
Store meeting as an object
gf-rog Jan 12, 2024
757708b
Fix meetings
gf-rog Jan 12, 2024
0fe4ef9
Fix meeting join redirect with no meeting
gf-rog Jan 12, 2024
eb3ae23
Improve join meeting log messages
gf-rog Jan 12, 2024
f8c4c99
Improve create meeting log messages
gf-rog Jan 12, 2024
6ed570c
Store meeting as closure
gf-rog Jan 12, 2024
5af7985
Store meeting room
gf-rog Jan 12, 2024
fb2665a
Store meetings outside of function
gf-rog Jan 12, 2024
73dcae3
Send meeting messages only to meeting rooms
gf-rog Jan 12, 2024
a6c0f0b
Remove unused event send
gf-rog Jan 12, 2024
d12f34d
Log message on client disconnect
gf-rog Jan 12, 2024
91ca4a4
Store socket connections as nodes
gf-rog Jan 13, 2024
ed52cdf
Move message functions to one file
gf-rog Jan 13, 2024
26ea84b
Add getAllSockets function
gf-rog Jan 13, 2024
c1d118d
Rename Chat to Message
gf-rog Jan 13, 2024
be7b0d9
Fix socket with no parameter
gf-rog Jan 13, 2024
bd07469
Refactor chat
gf-rog Jan 13, 2024
abfa975
Add braces for forEach
gf-rog Jan 13, 2024
553283e
Fix chat
gf-rog Jan 13, 2024
5f513e5
Use fetched profile picture
gf-rog Jan 13, 2024
9731e79
Scroll new messages into view
gf-rog Jan 13, 2024
5d813c3
Comment out messages link
gf-rog Jan 13, 2024
680661c
Redirect to login page if not logged in
gf-rog Jan 13, 2024
19118b5
Set msgRef to optional
gf-rog Jan 13, 2024
3394e5a
Remove send message log
gf-rog Jan 13, 2024
05186a6
Remove friend profile picture from props
gf-rog Jan 13, 2024
88138ff
Set default state to undefined
gf-rog Jan 13, 2024
8e1b2df
Redirect on no friendId
gf-rog Jan 13, 2024
6d752b6
Remove unused navigate
gf-rog Jan 13, 2024
fcb3862
Remove unused chats field
gf-rog Jan 13, 2024
62e4a3b
Join meeting on button click
gf-rog Jan 13, 2024
3504e03
Apply formatting
gf-rog Jan 13, 2024
0b995da
Remove bad type
gf-rog Jan 13, 2024
d03e1b9
Remove duplicate buttons
gf-rog Jan 13, 2024
d5d2c5a
Remove unused variables
gf-rog Jan 13, 2024
76c8947
Add leave meeting handling
gf-rog Jan 14, 2024
010ac3a
Add leave meeting button
gf-rog Jan 14, 2024
6ef0f30
Leave meeting on logout
gf-rog Jan 14, 2024
38acf19
Disconnect from socket on logout
gf-rog Jan 14, 2024
c04accf
Clean up leftover meetings and sockets
gf-rog Jan 14, 2024
7088d6d
Move database functions to one file
gf-rog Jan 14, 2024
517d407
Stop spying on user after leaving meeting
gf-rog Jan 14, 2024
65c43e4
Expose handleNavigate
gf-rog Jan 14, 2024
e87fcb9
Leave meeting on navbar navigate
gf-rog Jan 14, 2024
53b208d
Move create meeting button to friends page
gf-rog Jan 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 11 additions & 6 deletions backend/src/data/importData.ts → backend/src/db.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { v4 as uuidv4 } from "uuid";

import driver from "../driver/driver";
import driver from "./driver/driver";
import bcrypt from "bcrypt";

import userData from "./users";
import wordToVec from "../misc/wordToVec";
import userData from "./data/users";
import wordToVec from "./misc/wordToVec";

async function isDatabaseEmpty() {
export async function isDatabaseEmpty() {
const session = driver.session();
try {
const result = await session.run(
Expand All @@ -22,7 +22,7 @@ async function isDatabaseEmpty() {
}
}

async function importInitialData() {
export async function importInitialData() {
const isEmpty = await isDatabaseEmpty();
if (!isEmpty) {
return "Database is not empty";
Expand Down Expand Up @@ -97,4 +97,9 @@ async function importInitialData() {
}
}

export default importInitialData;
export async function cleanUpData() {
const session = driver.session();
await session.run(`MATCH (m:Meeting) DETACH DELETE m`);
await session.run(`MATCH (s:Socket) DETACH DELETE s`);
session.close();
}
4 changes: 3 additions & 1 deletion backend/src/httpServer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,13 @@ import servers from "./server";
import usersRouter from "./routes/usersRoute";
import authRouter from "./routes/authRoute";
import chatRouter from "./routes/chatRoute";
import importInitialData from "./data/importData";
import { cleanUpData, importInitialData } from "./db";

const { app } = servers;

dotenv.config();

cleanUpData();
importInitialData().then((res) => console.log(res));

app.use("/users", usersRouter);
Expand Down
61 changes: 61 additions & 0 deletions backend/src/meetings.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import { Session } from "neo4j-driver";
import { v4 as uuidv4 } from "uuid";
import Meeting from "./models/Meeting";

export async function isInMeeting(session: Session, userId: string) {
const result = await session.run(
`MATCH (u:User { id: $userId })-[:IS_IN_MEETING]->(m:Meeting) RETURN m`,
{ userId },
);

if (result.records.length > 0) {
return result.records[0].get("m").properties as Meeting;
}

return null;
}

export async function createMeeting(session: Session, userId: string) {
const meetingId = uuidv4();
const createResult = await session.run(
`
MATCH (u:User { id: $userId })
MERGE (u)-[:IS_IN_MEETING]->(m:Meeting { id: $meetingId })
RETURN m
`,
{ userId, meetingId },
);

return createResult.records[0].get("m").properties as Meeting;
}

export async function joinMeeting(
session: Session,
userId: string,
friendId: string,
) {
const createResult = await session.run(
`
MATCH (u:User { id: $userId })-[:IS_FRIENDS_WITH]-(f:User { id: $friendId })
MATCH (f)-[:IS_IN_MEETING]->(m:Meeting)
MERGE (u)-[:IS_IN_MEETING]->(m)
RETURN m
`,
{ userId, friendId },
);

return createResult.records[0]?.get("m").properties as Meeting;
}

export async function leaveMeeting(session: Session, userId: string) {
await session.run(
`
MATCH (:User { id: $userId })-[r:IS_IN_MEETING]->(m:Meeting)
DELETE r
WITH m
MATCH (m) WHERE NOT ()-[]->(m)
DELETE m
`,
{ userId },
);
}
10 changes: 10 additions & 0 deletions backend/src/messages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import Message from "./models/Message";
import MessageModel from "./mongoDB/MessageModel";

export async function addMessageToDb(message: Message) {
try {
await MessageModel.create(message);
} catch (err) {
console.error(err);
}
}
12 changes: 0 additions & 12 deletions backend/src/misc/addMessageToDb.ts

This file was deleted.

30 changes: 0 additions & 30 deletions backend/src/misc/socketId.ts

This file was deleted.

6 changes: 0 additions & 6 deletions backend/src/models/Chat.ts

This file was deleted.

5 changes: 5 additions & 0 deletions backend/src/models/Meeting.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
interface Meeting {
id: string;
}

export default Meeting;
7 changes: 3 additions & 4 deletions backend/src/models/Message.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
import User from "./User";

export default interface Message {
type: "sent" | "received" | "info";
author: User;
receiverId?: string;
sentDate: Date;
fromUserId: string;
toUserId: string;
content: string;
}
3 changes: 0 additions & 3 deletions backend/src/models/User.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,3 @@
import Chat from "./Chat";

export default interface User {
id: string;
first_name: string;
Expand All @@ -9,6 +7,5 @@ export default interface User {
mail: string;
password: string;
friend_ids?: number[];
chats?: Chat[];
socketId?: string;
}
13 changes: 0 additions & 13 deletions backend/src/mongoDB/ChatModel.ts

This file was deleted.

14 changes: 14 additions & 0 deletions backend/src/mongoDB/MessageModel.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { model, Schema } from "mongoose";
import Message from "../models/Message";

const chatSchema = new Schema<Message>({
type: { type: String, required: true },
sentDate: { type: Date, required: true },
fromUserId: { type: String, required: true },
toUserId: { type: String, required: true },
content: { type: String, required: true },
});

const MessageModel = model("Chat", chatSchema, "messages");

export default MessageModel;
26 changes: 24 additions & 2 deletions backend/src/routes/authRoute.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,20 @@ import { Router, Request } from "express";
import bcrypt from "bcrypt";

import driver from "../driver/driver";
import { generateAccessToken, generateRefreshToken } from "../misc/jwt";
import {
JWTRequest,
authenticateToken,
generateAccessToken,
generateRefreshToken,
} from "../misc/jwt";

import jwt, { JwtPayload } from "jsonwebtoken";
import { TokenErrorResponse } from "../types/authResponse";
import { CustomResponse, OkResponse } from "../models/Response";
import { OkErrorResponse } from "../types/userResponse";
import User from "../models/User";
import { leaveMeeting } from "../meetings";
import { disconnectFromSocket } from "../sockets";

const authRouter = Router();

Expand Down Expand Up @@ -57,11 +66,24 @@ authRouter.post("/login", async (req: Request, res: TokenErrorResponse) => {

authRouter.post(
"/logout",
async (_req: Request, res: CustomResponse<OkResponse>) => {
authenticateToken,
async (req: JWTRequest, res: OkErrorResponse) => {
res.clearCookie("refreshToken", {
secure: true,
httpOnly: true,
});

const userId = (req.token as any).userId;

try {
const session = driver.session();
await leaveMeeting(session, userId);
await session.close();
} catch (err) {
console.log("Error:", err);
return res.status(404).json({ status: "error", errors: err as object });
}

res.json({ status: "ok" });
},
);
Expand Down
21 changes: 11 additions & 10 deletions backend/src/routes/chatRoute.ts
Original file line number Diff line number Diff line change
@@ -1,26 +1,27 @@
import { Router } from "express";
import ChatModel from "../mongoDB/ChatModel";
import Message from "../models/Message";
import MessageModel from "../mongoDB/MessageModel";

const chatRouter = Router();

chatRouter.get("/:user1Id/:user2Id", async (req, res) => {
try {
const { user1Id, user2Id } = req.params;
const messageRequest = await ChatModel.find({
const messageRequest = await MessageModel.find({
$or: [
{ authorId: user1Id, receiverId: user2Id },
{ authorId: user2Id, receiverId: user1Id },
{ fromUserId: user1Id, toUserId: user2Id },
{ fromUserId: user2Id, toUserId: user1Id },
],
}).sort({ created_date: "asc" });

const messages = messageRequest.map((m) => {
const { authorId, receiverId, content, created_date } = m;
const messages = messageRequest.map((m: Message) => {
const { sentDate, fromUserId, toUserId, content } = m;
return {
authorId,
receiverId,
type: fromUserId === user1Id ? "sent" : "received",
sentDate,
fromUserId,
toUserId,
content,
created_date,
type: authorId === user1Id ? "sent" : "received",
};
});

Expand Down
Loading