Skip to content

Commit

Permalink
Merge branch 'main' of https://github.com/Edugaze-Inc/edugaze-be into…
Browse files Browse the repository at this point in the history
… main
  • Loading branch information
ziyadkhalil committed Jul 17, 2021
2 parents 748be2d + 8e39fcd commit 8134611
Show file tree
Hide file tree
Showing 9 changed files with 181 additions and 81 deletions.
56 changes: 34 additions & 22 deletions analysis/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,17 @@ var instructors: { [k: string]: { [k: string]: number } } = {};
io.on("connection", (socket: any) => {
socket.username = "placeholder";
console.log("a user connected");
socket.on("join", function (data: { sid: string }) {
var meeting = data.sid.split("-")[0];
var student = data.sid.split("-")[1];
socket.username = data.sid;
socket.on("join", function (data: { meeting: string; username: string }) {
var meeting = data.meeting;
var student = data.username;

if (student) {
socket.join(data.meeting + data.username);
}
socket.join(data.meeting);
socket.meeting = data.meeting;
socket.username = data.username;

socket.join(data.sid);
if (!(meeting in instructors)) {
instructors[meeting] = {
angry: 0,
Expand All @@ -37,34 +42,41 @@ io.on("connection", (socket: any) => {
out: 0,
};
}
if (student) {
instructors[meeting]["out"]++;
}

if (!(meeting in emotions)) {
emotions[meeting] = {};
}
emotions[meeting][student] = "out";

if (student && !emotions[meeting][student]) {
instructors[meeting]["out"]++;
emotions[meeting][student] = "out";
}
});

socket.on("emotion update", (data: { msg: string; id: string }) => {
var meeting = data.id.split("-")[0];
var student = data.id.split("-")[1];
socket.on(
"emotion update",
(data: { msg: string; meeting: string; username: string }) => {
var meeting = data.meeting;
var student = data.username;

var prev = emotions[meeting][student];
var cur = data.msg;
var prev = emotions[meeting][student];
var cur = data.msg;

instructors[meeting][prev]--;
instructors[meeting][cur]++;
instructors[meeting][prev]--;
instructors[meeting][cur]++;

emotions[meeting][student] = data.msg;
emotions[meeting][student] = data.msg;
console.log(emotions[meeting]);

io.to(meeting).emit("emotion update", JSON.stringify(instructors[meeting]));
});
io.to(meeting).emit(
"emotion update",
JSON.stringify(instructors[meeting])
);
}
);

socket.on("disconnect", () => {
var meeting = socket.username.split("-")[0];
var student = socket.username.split("-")[1];
var meeting = socket.meeting;
var student = socket.username;
if (student) {
var emotion = emotions[meeting][student];
instructors[meeting][emotion]--;
Expand Down
2 changes: 1 addition & 1 deletion auth/src/routes/login.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ router.post(`${baseUrl}/login`, async (req, res) => {
}
const { role, username } = user;

const userJWT = createAccessToken({ username, email, role });
const userJWT = createAccessToken({ _id: user._id, username, email, role });

return res
.status(201)
Expand Down
34 changes: 26 additions & 8 deletions meetings/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,23 +40,41 @@
400 - "User is not authorized"
- **join**
- **subscribe**
POST
- for both cases(current, incoming), same endpoint is used, no additional param is needed
http://134.209.132.81:4000/api/v1/meetings/join
http://134.209.132.81:4000/api/v1/meetings/subscribe/{id}
- Response
- A meeting scheduled for later (status=='incoming') and has not been added before
- A meeting has been added before
201 - meeting object
- The meeting doesn't exist (wrong id)
400 - "The meeting doesn't exist"
- Any other error (e.g db connection)
400 - error message
201 - "Meeting added successfully"
- Authorization error
400 - "User is not authorized"
- **join**
POST
http://134.209.132.81:4000/api/v1/meetings/join/{id}
- Response
- A meeting scheduled for later (status=='incoming') and has been added before
- A meeting scheduled for later (status=='incoming') or not part of student's meetings
201 - "Meeting already added before"
400
- A meeting currently in progress (status=='current')
Expand Down
2 changes: 2 additions & 0 deletions meetings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import { listMeetingsRouter } from "./src/routes/list";
import { startMeetingsRouter } from "./src/routes/start";
import { joinMeetingsRouter } from "./src/routes/join";
import { endMeetingsRouter } from "./src/routes/end";
import { subscribeMeetingsRouter } from "./src/routes/subscribe";

const app = express();
connectDb().then(() => {
Expand All @@ -27,6 +28,7 @@ app.use(listMeetingsRouter);
app.use(startMeetingsRouter);
app.use(joinMeetingsRouter);
app.use(endMeetingsRouter);
app.use(subscribeMeetingsRouter);

const port = 4000;

Expand Down
13 changes: 8 additions & 5 deletions meetings/src/routes/end.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ router.post(`${baseUrl}/end/:id`, async (req: Request, res: Response) => {
}

const user = resV.data._id;
const role = resV.data.role;

if (role != "instructor") {
return res.status(400).send("Only instructors can end meetings!");
}

if (!id.match(/^[0-9a-fA-F]{24}$/)) {
return res.status(400).send("Meeting is not found");
Expand All @@ -46,12 +51,10 @@ router.post(`${baseUrl}/end/:id`, async (req: Request, res: Response) => {
await meeting.save();

//end the meeting twilio
client.video
const room: { uniquename: any } = client.video
.rooms(meeting.sid)
.update({ status: "completed" })
.then((room: { uniquename: any }) => {
return res.status(201).send("Meeting ended sccessfully");
});
.update({ status: "completed" });
res.status(201).send("Meeting ended sccessfully");
} catch (error) {
return res.status(400).send(error.message);
}
Expand Down
57 changes: 21 additions & 36 deletions meetings/src/routes/join.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import express, { Request, Response } from "express";
import { createTwilioToken } from "../utils/twilioToken";
import { baseUrl } from "../config";
import { UserMeetings, newUserMeetings, Meeting } from "../models/model";
import { UserMeetings, Meeting } from "../models/model";
import axios from "axios";

const router = express.Router();
Expand Down Expand Up @@ -30,50 +30,35 @@ router.post(`${baseUrl}/join/:id`, async (req: Request, res: Response) => {
}

const user = resV.data._id;
const identity = resV.data.username;

try {
// checking if the user have meetings and creating a new entry if not
let userMeetings = await UserMeetings.findOne({ name: user });
if (!userMeetings) {
userMeetings = await newUserMeetings({
name: user,
meetings: [],
});
}

if (!id.match(/^[0-9a-fA-F]{24}$/)) {
return res.status(400).send("Meeting is not found");
}

//checking if the meeting exist
const meeting = await Meeting.findOne({ _id: id });
if (!meeting) {
return res.status(400).send("Meeting is not found");
}
if (userMeetings) {
if (!id.match(/^[0-9a-fA-F]{24}$/)) {
return res.status(400).send("Meeting is not found");
}

let message = "Meeting already added before";
//check if the meeting is already in the user meetings
if (!userMeetings.meetings.includes(id)) {
let message = "Meeting added successfully";
userMeetings.meetings.push(id);
}
//checking if the meeting exist
const meeting = await Meeting.findOne({ _id: id });
if (!meeting) {
return res.status(400).send("Meeting is not found");
}

userMeetings
.save()
.then((doc) => {})
.catch((err) => {
res.status(400).send({ error: err });
});
//check if the meeting is already in the user meetings
if (!userMeetings.meetings.includes(id)) {
res.status(400).send("You're not a part of this meeting");
}

//if meeting in progress, generate token
if (meeting.status === "current") {
const roomName = meeting.title + "-" + meeting.course;
const token = createTwilioToken(identity, roomName);
return res.status(201).send(token);
}

if (meeting.status === "current") {
const roomName = meeting.title + "-" + meeting.course;
const token = createTwilioToken(user, roomName);
return res.status(201).send(token);
return res.status(400).send("Meeting hasn't started yet");
}

return res.status(201).send(message);
} catch (error) {
return res.status(400).send(error.message);
}
Expand Down
6 changes: 6 additions & 0 deletions meetings/src/routes/new.ts
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,12 @@ router.post(
return res.status(400).send("User is not authorized");
}

const role = resV.data.role;

if (role != "instructor") {
return res.status(400).send("Only instructors can create meetings!");
}

const { title, course, startTime, endTime } = req.body;
const status = "incoming";
const host = resV.data._id;
Expand Down
21 changes: 12 additions & 9 deletions meetings/src/routes/start.ts
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,11 @@ router.post(`${baseUrl}/start/:id`, async (req: Request, res: Response) => {
return res.status(400).send("User is not authorized");
}
const user = resV.data._id;
const role = resV.data.role;

if (role != "instructor") {
return res.status(400).send("Only instructors can start meetings!");
}

if (!id.match(/^[0-9a-fA-F]{24}$/)) {
return res.status(400).send("Meeting is not found");
Expand All @@ -46,15 +51,13 @@ router.post(`${baseUrl}/start/:id`, async (req: Request, res: Response) => {

//create a room in twilio and return an access token
const roomName = meeting.title + "-" + meeting.course;
client.video.rooms
.create({
type: "group",
uniqueName: roomName,
})
.then(async (room: { sid: any }) => {
meeting.sid = room.sid;
await meeting.save();
});
const room: { sid: any } = await client.video.rooms.create({
type: "group",
uniqueName: roomName,
});

meeting.sid = room.sid;
await meeting.save();

const token = createTwilioToken(user, roomName);

Expand Down
71 changes: 71 additions & 0 deletions meetings/src/routes/subscribe.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
import express, { Request, Response } from "express";
import { baseUrl } from "../config";
import { UserMeetings, newUserMeetings, Meeting } from "../models/model";
import axios from "axios";

const router = express.Router();

router.post(`${baseUrl}/subscribe/:id`, async (req: Request, res: Response) => {
const id = req.params.id;

let resV;
//validating the user's token
try {
const token = req.header("Authorization")?.split(" ")[1];
let config = {
headers: {
Authorization: "Bearer " + token,
},
};
resV = await axios.get(
"http://auth-service:4002/api/v1/auth/verify",
config
);
} catch (err) {
return res.status(400).send("User is not authorized");
}
if (resV.status == 400) {
return res.status(400).send("User is not authorized");
}

const user = resV.data._id;

try {
// checking if the user have meetings and creating a new entry if not
let userMeetings = await UserMeetings.findOne({ name: user });
if (!userMeetings) {
userMeetings = await newUserMeetings({
name: user,
meetings: [],
});
}

if (!id.match(/^[0-9a-fA-F]{24}$/)) {
return res.status(400).send("Meeting is not found");
}

//checking if the meeting exist
const meeting = await Meeting.findOne({ _id: id });
if (!meeting) {
return res.status(400).send("Meeting is not found");
}

//check if the meeting is already in the user meetings
if (!userMeetings.meetings.includes(id)) {
userMeetings.meetings.push(id);
}

userMeetings
.save()
.then((doc) => {})
.catch((err) => {
res.status(400).send(err);
});

return res.status(201).send(meeting);
} catch (error) {
return res.status(400).send(error.message);
}
});

export { router as subscribeMeetingsRouter };

0 comments on commit 8134611

Please sign in to comment.