Compare commits
13 Commits
v0.3.0
...
13f4d43761
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
13f4d43761 | ||
|
|
22a549e269 | ||
|
|
25c3e16c74 | ||
|
|
86db5df813 | ||
|
|
d1e824ab77 | ||
|
|
073c61977f | ||
|
|
1301c145e8 | ||
|
|
ac6dffa129 | ||
|
|
8e4cad4c85 | ||
|
|
d1091e570b | ||
|
|
4a5041a65e | ||
|
|
8d0fadc906 | ||
|
|
6bea0428f4 |
@@ -5,6 +5,7 @@
|
|||||||
"@ijl/cli": "^5.1.0",
|
"@ijl/cli": "^5.1.0",
|
||||||
"@types/react": "^18.3.5",
|
"@types/react": "^18.3.5",
|
||||||
"@types/react-dom": "^18.3.0",
|
"@types/react-dom": "^18.3.0",
|
||||||
|
"dotenv": "^16.4.5",
|
||||||
"emoji-mart": "^5.6.0",
|
"emoji-mart": "^5.6.0",
|
||||||
"express": "^4.19.2",
|
"express": "^4.19.2",
|
||||||
"jsonwebtoken": "^9.0.2",
|
"jsonwebtoken": "^9.0.2",
|
||||||
|
|||||||
@@ -1,45 +1,60 @@
|
|||||||
import {getConfigValue} from "@brojs/cli";
|
import {getConfigValue} from "@brojs/cli";
|
||||||
|
|
||||||
export const BASE_API_URL = "http://localhost:8099" + getConfigValue("enterfront.api");
|
|
||||||
|
const LOCAL = "http://localhost:8099";
|
||||||
|
const DEV = "";
|
||||||
|
|
||||||
|
export const BASE_API_URL = LOCAL + getConfigValue("enterfront.api") + "/enterfront";
|
||||||
|
|
||||||
// fetch(`${BASE_API_URL}/books/list`)
|
// fetch(`${BASE_API_URL}/books/list`)
|
||||||
|
|
||||||
export async function post(path, body) {
|
export async function post(path, body) {
|
||||||
|
const token = localStorage.getItem('token');
|
||||||
|
|
||||||
const res = await fetch(`${BASE_API_URL}${path}`, {
|
const res = await fetch(`${BASE_API_URL}${path}`, {
|
||||||
method: "POST",
|
method: "POST",
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
|
"Authorization": token ? `Bearer ${token}` : undefined
|
||||||
},
|
},
|
||||||
body: JSON.stringify(body)
|
body: JSON.stringify(body)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
console.log("Initial data from API:", res)
|
||||||
|
const data = JSON.parse(await res.text());
|
||||||
|
console.log("Data from API:", data)
|
||||||
|
|
||||||
if (res.status === 200) {
|
if (res.status === 200) {
|
||||||
const data = await res.json();
|
|
||||||
console.log("Received post:", data);
|
console.log("Received post:", data);
|
||||||
|
|
||||||
return {ok: true, data: data};
|
return {ok: true, data: data};
|
||||||
} else {
|
} else {
|
||||||
const errorData = await res.json();
|
console.log("Error during post:", data.message);
|
||||||
console.log("Error during post:", errorData.message);
|
|
||||||
|
|
||||||
return {ok: false, data: errorData};
|
return {ok: false, data: data};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function get(path){
|
export async function get(path){
|
||||||
|
const token = localStorage.getItem('token');
|
||||||
|
|
||||||
const res = await fetch(`${BASE_API_URL}${path}`, {
|
const res = await fetch(`${BASE_API_URL}${path}`, {
|
||||||
method: "GET"
|
method: "GET",
|
||||||
|
headers: {
|
||||||
|
"Authorization": token ? `Bearer ${token}` : undefined
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if (res.status === 200) {
|
console.log("Data from API:", res)
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
|
|
||||||
|
if (res.status === 200) {
|
||||||
console.log("Received get:", data);
|
console.log("Received get:", data);
|
||||||
|
|
||||||
return {ok: true, data: data};
|
return {ok: true, data: data};
|
||||||
} else {
|
} else {
|
||||||
const errorData = await res.json();
|
console.log("Error during get:", data.message);
|
||||||
console.log("Error during get:", errorData.message);
|
|
||||||
|
|
||||||
return {ok: false, data: errorData};
|
return {ok: false, data: data};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,15 +1,46 @@
|
|||||||
import React from 'react';
|
import React, {useState} from 'react';
|
||||||
import { URLs } from "../../__data__/urls";
|
import { URLs } from "../../__data__/urls";
|
||||||
import ActionButton from "./ActionButton.jsx";
|
import ActionButton from "./ActionButton.jsx";
|
||||||
|
import InputField from "../reg/InputField.jsx";
|
||||||
|
|
||||||
const AccountButtons = (props) => {
|
const AccountButtons = (props) => {
|
||||||
|
const [chName, setChName] = useState(false);
|
||||||
|
const [chPassword, setChPassword] = useState(false);
|
||||||
|
|
||||||
|
const [nickname, setNickname] = useState("");
|
||||||
|
const [password, setPassword] = useState("");
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="account-buttons">
|
<div className="account-buttons">
|
||||||
{props.registered ? (
|
{props.registered ? (
|
||||||
<>
|
<>
|
||||||
<ActionButton title={"Exit"} action={props.exitHandler}/>
|
<ActionButton title={"Exit"} action={props.exitHandler}/>
|
||||||
<ActionButton title={"Change Name"} action={props.changeNameHandler}/>
|
<ActionButton title={"Change Name"} action={() => setChName(true)}/>
|
||||||
<ActionButton title={"Change Pass"} action={props.changePassHandler}/>
|
{chName ? (
|
||||||
|
<InputField
|
||||||
|
title={""}
|
||||||
|
value={nickname}
|
||||||
|
setValue={setNickname}
|
||||||
|
placeholder='Enter your new nickname'
|
||||||
|
|
||||||
|
submit={nickname}
|
||||||
|
enter={props.changeNameHandler}
|
||||||
|
/>
|
||||||
|
) : null}
|
||||||
|
<ActionButton title={"Change Pass"} action={() => setChPassword(true)}/>
|
||||||
|
{chPassword ? (
|
||||||
|
<div>
|
||||||
|
<InputField
|
||||||
|
title={""}
|
||||||
|
value={password}
|
||||||
|
setValue={setPassword}
|
||||||
|
placeholder='Enter your new password'
|
||||||
|
|
||||||
|
submit={password}
|
||||||
|
enter={props.changePassHandler}
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
) : null}
|
||||||
</>
|
</>
|
||||||
) : null}
|
) : null}
|
||||||
<a className="MyButton mclaren-regular" href={URLs.home.url}>Back</a>
|
<a className="MyButton mclaren-regular" href={URLs.home.url}>Back</a>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ const HelloItem = (props) => {
|
|||||||
<p className="mclaren-regular">Your ID: {props.id}</p>
|
<p className="mclaren-regular">Your ID: {props.id}</p>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
<p className="mclaren-regular">You don't have account :(</p>
|
<p className="mclaren-regular">You don't have an account :(</p>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,9 +1,44 @@
|
|||||||
import React from 'react';
|
import React, {useEffect, useState} from 'react';
|
||||||
import Card from "./Card.jsx";
|
import Card from "./Card.jsx";
|
||||||
|
import {get} from "../../backend/api";
|
||||||
|
import {displayMessage} from "../../backend/notifications/notifications";
|
||||||
|
import {MessageType} from "../../backend/notifications/message";
|
||||||
|
|
||||||
const ChatsList = (props) => {
|
const ChatsList = (props) => {
|
||||||
const { chats } = props;
|
const { chats } = props;
|
||||||
|
|
||||||
|
const [customChats, setCustomChats] = useState([]);
|
||||||
|
|
||||||
|
const updateList = async () => {
|
||||||
|
const username = localStorage.getItem("username");
|
||||||
|
if (!username) {return null;}
|
||||||
|
|
||||||
|
const updatedChats = await Promise.all(
|
||||||
|
chats.map(async (chat) => {
|
||||||
|
const interlocutorId = chat.id1 === username ? chat.id2 : chat.id1
|
||||||
|
|
||||||
|
const {ok, data} = await get('/auth/' + interlocutorId);
|
||||||
|
if (!ok) {
|
||||||
|
displayMessage(data.message, MessageType.ERROR);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
const interlocutor = data.user;
|
||||||
|
|
||||||
|
return {
|
||||||
|
id: interlocutorId,
|
||||||
|
name: interlocutor.nickname,
|
||||||
|
lastMessage: chat.messages.length > 0 ? chat.messages[chat.messages.length - 1].data : "",
|
||||||
|
}
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
setCustomChats(updatedChats.filter(chat => chat !== null));
|
||||||
|
};
|
||||||
|
|
||||||
|
useEffect(() => {updateList().then();}, [chats])
|
||||||
|
|
||||||
|
|
||||||
const colorMap = {
|
const colorMap = {
|
||||||
orange: 'FFA500FF',
|
orange: 'FFA500FF',
|
||||||
aqua: '00FFFFFF',
|
aqua: '00FFFFFF',
|
||||||
@@ -19,13 +54,14 @@ const ChatsList = (props) => {
|
|||||||
|
|
||||||
function getColor(chatId) {
|
function getColor(chatId) {
|
||||||
const keys = Object.keys(colorMap);
|
const keys = Object.keys(colorMap);
|
||||||
const index = chatId % keys.length;
|
const numericId = Array.from(chatId).reduce((sum, char) => sum + char.charCodeAt(0), 0);
|
||||||
|
const index = numericId % keys.length;
|
||||||
return colorMap[keys[index]];
|
return colorMap[keys[index]];
|
||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="ChatsList">
|
<div className="ChatsList">
|
||||||
{chats.map((item, index) => (
|
{customChats.map((item, index) => (
|
||||||
<Card
|
<Card
|
||||||
key={index}
|
key={index}
|
||||||
name={item.name}
|
name={item.name}
|
||||||
|
|||||||
11
src/components/home/Search.jsx
Normal file
11
src/components/home/Search.jsx
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
import React from 'react';
|
||||||
|
|
||||||
|
const Search = (props) => {
|
||||||
|
return (
|
||||||
|
<a className="MyButton search-class mclaren-regular" onClick={() => {
|
||||||
|
props.search(props.item);
|
||||||
|
}}>Find</a>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default Search;
|
||||||
@@ -12,11 +12,30 @@
|
|||||||
color: orange;
|
color: orange;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-class {
|
||||||
|
margin-top: 2vw;
|
||||||
|
margin-bottom: 4vw;
|
||||||
|
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-input div input {
|
||||||
|
background-color: white;
|
||||||
|
color: black;
|
||||||
|
|
||||||
|
border: 3px solid black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
@media only screen and (max-width: 800px) {
|
@media only screen and (max-width: 800px) {
|
||||||
.homeTitle {
|
.homeTitle {
|
||||||
font-size: 8vh;
|
font-size: 8vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.search-class {
|
||||||
|
margin-top: 3vh;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.chatIcon {
|
.chatIcon {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import React from 'react';
|
import React from 'react';
|
||||||
|
|
||||||
const InputField = (props) => {
|
const InputField = (props) => {
|
||||||
|
console.log('class:', props.className)
|
||||||
return (
|
return (
|
||||||
<div>
|
<div>
|
||||||
<p>{props.title}</p>
|
<p>{props.title}</p>
|
||||||
@@ -8,6 +9,14 @@ const InputField = (props) => {
|
|||||||
onChange={(e) => props.setValue(e.target.value)}
|
onChange={(e) => props.setValue(e.target.value)}
|
||||||
value={props.value}
|
value={props.value}
|
||||||
className="Input"
|
className="Input"
|
||||||
|
placeholder={(props.placeholder) ? props.placeholder : ''}
|
||||||
|
onKeyDown={(e) => {
|
||||||
|
if (e.key === 'Enter') {
|
||||||
|
if (props.submit) {
|
||||||
|
props.enter(props.submit);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
import React, {useEffect, useState} from "react";
|
import React, {useEffect, useState} from "react";
|
||||||
import AccountButtons from "../components/account/AccountButtons.jsx";
|
import AccountButtons from "../components/account/AccountButtons.jsx";
|
||||||
import userIcon from "../../images/user.svg";
|
import userIcon from "../../images/user.svg";
|
||||||
import {get} from "../backend/api";
|
import {get, post} from "../backend/api";
|
||||||
import {displayMessage} from "../backend/notifications/notifications";
|
import {displayMessage} from "../backend/notifications/notifications";
|
||||||
import {MessageType} from "../backend/notifications/message";
|
import {MessageType} from "../backend/notifications/message";
|
||||||
import HelloItem from "../components/account/HelloItem.jsx";
|
import HelloItem from "../components/account/HelloItem.jsx";
|
||||||
|
import { URLs } from "../__data__/urls";
|
||||||
|
|
||||||
const Account = () => {
|
const Account = () => {
|
||||||
const exitHandler = () => {
|
const exitHandler = () => {
|
||||||
@@ -14,12 +15,36 @@ const Account = () => {
|
|||||||
localStorage.setItem("message", "Exited successfully!");
|
localStorage.setItem("message", "Exited successfully!");
|
||||||
window.location.href = "/";
|
window.location.href = "/";
|
||||||
}
|
}
|
||||||
const changeNameHandler = () => {}
|
|
||||||
const changePassHandler = () => {}
|
|
||||||
|
|
||||||
const [nickname, setNickname] = useState("");
|
const [nickname, setNickname] = useState("");
|
||||||
const [id, setId] = useState("");
|
const [id, setId] = useState("");
|
||||||
|
|
||||||
|
async function changeNameHandler (newNickname) {
|
||||||
|
if (!newNickname) return;
|
||||||
|
|
||||||
|
const {ok, data} = await post('/change/nickname', {id: id, newNickname: newNickname});
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
displayMessage(data.message, MessageType.ERROR);
|
||||||
|
} else {
|
||||||
|
localStorage.setItem("message", "Name was changed");
|
||||||
|
window.location.href = URLs.account.url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function changePassHandler (newPass){
|
||||||
|
if (!newPass) return;
|
||||||
|
|
||||||
|
const {ok, data} = await post('/change/password', {id: id, newPassword: newPass});
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
displayMessage(data.message, MessageType.ERROR);
|
||||||
|
} else {
|
||||||
|
localStorage.setItem("message", "Password was changed");
|
||||||
|
window.location.href = URLs.account.url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function getUser() {
|
async function getUser() {
|
||||||
const username = localStorage.getItem("username");
|
const username = localStorage.getItem("username");
|
||||||
if (!username) {
|
if (!username) {
|
||||||
@@ -29,7 +54,7 @@ const Account = () => {
|
|||||||
|
|
||||||
const {ok, data} = await get('/auth/' + username);
|
const {ok, data} = await get('/auth/' + username);
|
||||||
if (!ok) {
|
if (!ok) {
|
||||||
displayMessage("Some error with auth", MessageType.ERROR);
|
displayMessage("Some error with auth:" + data.message, MessageType.ERROR);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ import React, { useEffect, useState, useRef } from "react";
|
|||||||
import { useNavigate } from "react-router-dom";
|
import { useNavigate } from "react-router-dom";
|
||||||
import "./css/Chat.css";
|
import "./css/Chat.css";
|
||||||
import { FaPaperPlane, FaSmile } from "react-icons/fa";
|
import { FaPaperPlane, FaSmile } from "react-icons/fa";
|
||||||
|
import {get, post} from "../backend/api";
|
||||||
|
import {displayMessage} from "../backend/notifications/notifications";
|
||||||
|
import {MessageType} from "../backend/notifications/message";
|
||||||
|
|
||||||
const emojis = [
|
const emojis = [
|
||||||
"😀",
|
"😀",
|
||||||
@@ -74,7 +77,7 @@ const emojis = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
const Chat = () => {
|
const Chat = () => {
|
||||||
const [interlocutorId, setInterlocutorId] = useState(0);
|
const [interlocutorId, setInterlocutorId] = useState("");
|
||||||
const [messages, setMessages] = useState([]);
|
const [messages, setMessages] = useState([]);
|
||||||
const [newMessage, setNewMessage] = useState("");
|
const [newMessage, setNewMessage] = useState("");
|
||||||
const [showEmojiPicker, setShowEmojiPicker] = useState(false);
|
const [showEmojiPicker, setShowEmojiPicker] = useState(false);
|
||||||
@@ -82,10 +85,21 @@ const Chat = () => {
|
|||||||
const chatRef = useRef(null);
|
const chatRef = useRef(null);
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
|
|
||||||
|
const [myId, setMyId] = useState("");
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const id = parseInt(localStorage.getItem("interlocutorId"), 10) || 0;
|
// const id = parseInt(localStorage.getItem("interlocutorId"), 10) || 0;
|
||||||
|
const id = localStorage.getItem("interlocutorId")
|
||||||
setInterlocutorId(id);
|
setInterlocutorId(id);
|
||||||
|
|
||||||
|
const username = localStorage.getItem("username");
|
||||||
|
setMyId(username);
|
||||||
|
|
||||||
|
if (!id || !username) {
|
||||||
|
displayMessage("You are not logged in!", MessageType.WARN);
|
||||||
|
return () => {};
|
||||||
|
}
|
||||||
|
|
||||||
socket.current = new WebSocket("ws://localhost:8080");
|
socket.current = new WebSocket("ws://localhost:8080");
|
||||||
|
|
||||||
socket.current.onopen = () => {
|
socket.current.onopen = () => {
|
||||||
@@ -113,23 +127,53 @@ const Chat = () => {
|
|||||||
};
|
};
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
retrieveMessages().then();
|
||||||
|
}, [myId, interlocutorId])
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (chatRef.current) {
|
if (chatRef.current) {
|
||||||
chatRef.current.scrollTop = chatRef.current.scrollHeight;
|
chatRef.current.scrollTop = chatRef.current.scrollHeight;
|
||||||
}
|
}
|
||||||
}, [messages]);
|
}, [messages]);
|
||||||
|
|
||||||
|
// The function for sending message to the DB
|
||||||
|
async function sendMessageToDB (messageData) {
|
||||||
|
const { ok, data } = post('/chat/message/' + myId + '/' + interlocutorId, { message: messageData });
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
displayMessage(data.message, MessageType.ERROR);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The function retrieves messages from the DB for the current chat
|
||||||
|
async function retrieveMessages () {
|
||||||
|
if (!myId || !interlocutorId) {return;}
|
||||||
|
const { ok, data } = await get('/chat/item/' + myId + '/' + interlocutorId);
|
||||||
|
|
||||||
|
if (!ok) {
|
||||||
|
displayMessage(data.message, MessageType.ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setMessages(data.chat.messages);
|
||||||
|
}
|
||||||
|
|
||||||
const sendMessage = () => {
|
const sendMessage = () => {
|
||||||
if (newMessage.trim()) {
|
if (newMessage.trim()) {
|
||||||
const messageData = {
|
const messageData = {
|
||||||
type: "message",
|
senderId: myId,
|
||||||
senderId: "yourUserId",
|
|
||||||
recipientId: interlocutorId,
|
recipientId: interlocutorId,
|
||||||
message: newMessage,
|
data: newMessage,
|
||||||
timestamp: new Date().toLocaleTimeString(),
|
timestamp: new Date().toLocaleTimeString(),
|
||||||
};
|
};
|
||||||
socket.current.send(JSON.stringify(messageData));
|
socket.current.send(JSON.stringify(messageData));
|
||||||
setMessages((prev) => [...prev, messageData]);
|
setMessages((prev) => [...prev, messageData]);
|
||||||
|
|
||||||
|
sendMessageToDB(messageData).then();
|
||||||
|
|
||||||
|
console.log('format:', messageData);
|
||||||
|
|
||||||
setNewMessage("");
|
setNewMessage("");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -162,12 +206,12 @@ const Chat = () => {
|
|||||||
<div
|
<div
|
||||||
key={index}
|
key={index}
|
||||||
className={`message-bubble ${
|
className={`message-bubble ${
|
||||||
msg.senderId === "yourUserId" ? "sent" : "received"
|
msg.senderId === myId ? "sent" : "received"
|
||||||
}`}
|
}`}
|
||||||
>
|
>
|
||||||
<div className="message-content">
|
<div className="message-content">
|
||||||
<b>{msg.senderId === "yourUserId" ? "You" : "Interlocutor"}:</b>{" "}
|
<b>{msg.senderId === myId ? "You" : "They"}:</b>{" "}
|
||||||
{msg.message}
|
{msg.data}
|
||||||
</div>
|
</div>
|
||||||
<span className="message-timestamp">{msg.timestamp}</span>
|
<span className="message-timestamp">{msg.timestamp}</span>
|
||||||
</div>
|
</div>
|
||||||
@@ -180,7 +224,7 @@ const Chat = () => {
|
|||||||
onChange={(e) => setNewMessage(e.target.value)}
|
onChange={(e) => setNewMessage(e.target.value)}
|
||||||
placeholder="Type a message..."
|
placeholder="Type a message..."
|
||||||
className="chat-input"
|
className="chat-input"
|
||||||
onKeyPress={handleKeyPress}
|
onKeyDown={handleKeyPress}
|
||||||
/>
|
/>
|
||||||
<button
|
<button
|
||||||
className="emoji-button"
|
className="emoji-button"
|
||||||
|
|||||||
@@ -1,64 +1,53 @@
|
|||||||
import React from "react";
|
import React, {useEffect, useState} from "react";
|
||||||
import HomeTitle from "../components/home/HomeTitle.jsx";
|
import HomeTitle from "../components/home/HomeTitle.jsx";
|
||||||
import ChatsList from "../components/home/ChatsList.jsx";
|
import ChatsList from "../components/home/ChatsList.jsx";
|
||||||
import Header from "../components/home/Header.jsx";
|
import Header from "../components/home/Header.jsx";
|
||||||
|
import {displayMessage} from "../backend/notifications/notifications";
|
||||||
|
import {MessageType} from "../backend/notifications/message";
|
||||||
|
import {get, post} from "../backend/api";
|
||||||
|
import InputField from "../components/reg/InputField.jsx";
|
||||||
|
import Search from "../components/home/Search.jsx";
|
||||||
|
import {URLs} from "../__data__/urls";
|
||||||
|
|
||||||
const Home = () => {
|
const Home = () => {
|
||||||
|
const [chats, setChats] = useState([])
|
||||||
|
const [interlocutor, setInterlocutor] = useState("")
|
||||||
|
|
||||||
// temp for testing
|
async function retrieveChats() {
|
||||||
const chats = [
|
const username = localStorage.getItem("username");
|
||||||
{
|
if (!username) {
|
||||||
name: "Alice Johnson",
|
displayMessage("You're not logged in!", MessageType.WARN);
|
||||||
id: 123456,
|
return;
|
||||||
lastMessage: "See you later!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Bob Smith",
|
|
||||||
id: 654321,
|
|
||||||
lastMessage: "Got it, thanks!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Charlie Brown",
|
|
||||||
id: 234567,
|
|
||||||
lastMessage: "How's the project going? How's the project going? How's the project going?" +
|
|
||||||
"How's the project going? How's the project going?"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "David Clark",
|
|
||||||
id: 765432,
|
|
||||||
lastMessage: "I'll send the files."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Eve Adams",
|
|
||||||
id: 345678,
|
|
||||||
lastMessage: "Let's meet tomorrow."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Frank Wright",
|
|
||||||
id: 876543,
|
|
||||||
lastMessage: "Can you review this?"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Grace Lee",
|
|
||||||
id: 456789,
|
|
||||||
lastMessage: "Thanks for your help!"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Hannah Scott",
|
|
||||||
id: 987654,
|
|
||||||
lastMessage: "See you at the meeting."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Ian Davis",
|
|
||||||
id: 567890,
|
|
||||||
lastMessage: "Let me know when you're free."
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: "Jill Thompson",
|
|
||||||
id: 678901,
|
|
||||||
lastMessage: "I'll catch up with you later."
|
|
||||||
}
|
}
|
||||||
];
|
|
||||||
|
const {ok, data} = await get('/chat/list/' + username);
|
||||||
|
if (!ok) {
|
||||||
|
displayMessage(data.message, MessageType.ERROR);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setChats(data.chats);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createChat(alias) {
|
||||||
|
const username = localStorage.getItem("username");
|
||||||
|
if (!username) {
|
||||||
|
displayMessage("You're not logged in!", MessageType.WARN);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
displayMessage("Sent", MessageType.INFO);
|
||||||
|
|
||||||
|
const {ok, data} = await post('/chat/item/' + username + '/' + alias);
|
||||||
|
if (!ok) {
|
||||||
|
displayMessage(data.message, MessageType.ERROR);
|
||||||
|
} else {
|
||||||
|
localStorage.setItem('message', 'Successfully opened chat!');
|
||||||
|
localStorage.setItem('interlocutorId', alias);
|
||||||
|
window.location.href = URLs.chat.url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
useEffect(() => {retrieveChats().then()}, [])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="homeWrapper">
|
<div className="homeWrapper">
|
||||||
@@ -67,6 +56,18 @@ const Home = () => {
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<HomeTitle/>
|
<HomeTitle/>
|
||||||
|
|
||||||
|
<div className="search-input">
|
||||||
|
<InputField
|
||||||
|
title="Create new chat"
|
||||||
|
value={interlocutor}
|
||||||
|
setValue={setInterlocutor}
|
||||||
|
placeholder="Enter the username (id)"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<Search search={createChat} item={interlocutor}/>
|
||||||
|
|
||||||
<p>Your chats</p>
|
<p>Your chats</p>
|
||||||
<ChatsList chats={chats} />
|
<ChatsList chats={chats} />
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,30 +1,16 @@
|
|||||||
const authRouter = require('express').Router();
|
const authRouter = require('express').Router();
|
||||||
|
|
||||||
// For cryptography
|
|
||||||
// const bcrypt = require('bcrypt');
|
|
||||||
|
|
||||||
// For creating tokens
|
// For creating tokens
|
||||||
const jwt = require('jsonwebtoken');
|
const jwt = require('jsonwebtoken');
|
||||||
const TOKEN_KEY = "5frv12e4few3r"
|
|
||||||
|
require('dotenv').config();
|
||||||
|
const TOKEN_KEY = process.env.TOKEN_KEY;
|
||||||
|
|
||||||
|
|
||||||
module.exports = authRouter;
|
module.exports = authRouter;
|
||||||
|
|
||||||
// Read already defined users (pseudo-DB)
|
const { addUserToDB, getUserFromDB } = require('../db');
|
||||||
const users = require('./users.json');
|
|
||||||
|
|
||||||
const getUserFromDB = (userID) => {
|
|
||||||
if (!userID) {return false;}
|
|
||||||
|
|
||||||
// Accessing 'DB'
|
|
||||||
const user = users.find((user) => user.id === userID);
|
|
||||||
|
|
||||||
if (user) {
|
|
||||||
return user;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get a user by its id
|
// Get a user by its id
|
||||||
authRouter.get('/:id', (req, res) => {
|
authRouter.get('/:id', (req, res) => {
|
||||||
@@ -48,11 +34,13 @@ authRouter.post('/login', (req, res) => {
|
|||||||
// Invalid identification
|
// Invalid identification
|
||||||
if (!user) {
|
if (!user) {
|
||||||
res.status(401).send({message: 'Invalid credentials (id)'});
|
res.status(401).send({message: 'Invalid credentials (id)'});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Invalid authentication
|
// Invalid authentication
|
||||||
if (!password || password !== user.password) {
|
if (!password || password !== user.password) {
|
||||||
res.status(401).send({message: 'Invalid credentials (password)'});
|
res.status(401).send({message: 'Invalid credentials (password)'});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Now, authorization
|
// Now, authorization
|
||||||
@@ -73,15 +61,17 @@ authRouter.post('/reg', (req, res) => {
|
|||||||
// Invalid identification
|
// Invalid identification
|
||||||
if (user) {
|
if (user) {
|
||||||
res.status(409).send({message: 'Such id already exists'});
|
res.status(409).send({message: 'Such id already exists'});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!name || !password || !nickname) {
|
if (!name || !password || !nickname) {
|
||||||
res.status(401).send({message: 'Empty or invalid fields'});
|
res.status(401).send({message: 'Empty or invalid fields'});
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to 'DB'
|
// Add to 'DB'
|
||||||
const newUser = {id: name, password: password, nickname: nickname};
|
const newUser = {id: name, password: password, nickname: nickname};
|
||||||
users.push(newUser);
|
addUserToDB(newUser)
|
||||||
|
|
||||||
res.status(200).send({user: newUser});
|
res.status(200).send({user: newUser});
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -1,12 +1,52 @@
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"nickname": "Nick",
|
"nickname": "Alice Johnson",
|
||||||
"password": "1234",
|
"password": "1234",
|
||||||
"id": "Nickolaus_SDR"
|
"id": "alice"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"nickname": "User",
|
"nickname": "Bob Smith",
|
||||||
"password": "1234",
|
"password": "1234",
|
||||||
"id": "id"
|
"id": "bobsm"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nickname": "Charlie Brown",
|
||||||
|
"password": "1234",
|
||||||
|
"id": "charl"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nickname": "David Clark",
|
||||||
|
"password": "1234",
|
||||||
|
"id": "david"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nickname": "Eve Adams",
|
||||||
|
"password": "1234",
|
||||||
|
"id": "evead"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nickname": "Frank Wright",
|
||||||
|
"password": "1234",
|
||||||
|
"id": "frank"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nickname": "Grace Lee",
|
||||||
|
"password": "1234",
|
||||||
|
"id": "grace"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nickname": "Hannah Scott",
|
||||||
|
"password": "1234",
|
||||||
|
"id": "hanna"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nickname": "Ian Davis",
|
||||||
|
"password": "1234",
|
||||||
|
"id": "ianda"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"nickname": "Jill Thompson",
|
||||||
|
"password": "1234",
|
||||||
|
"id": "jillt"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
{
|
|
||||||
"content": {
|
|
||||||
|
|
||||||
},
|
|
||||||
"totalElement": 0
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "1",
|
|
||||||
"name": "Book name",
|
|
||||||
"description": "Interesting book description"
|
|
||||||
}
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
const booksRouter = require('express').Router();
|
|
||||||
|
|
||||||
module.exports = booksRouter;
|
|
||||||
|
|
||||||
const books = []
|
|
||||||
|
|
||||||
booksRouter.get('/list', (req, res) => {
|
|
||||||
res.send(require('./book-list.json'))
|
|
||||||
})
|
|
||||||
|
|
||||||
booksRouter.post('/', (req, res) => {
|
|
||||||
// body() can be used because of dev server
|
|
||||||
console.log(req.body)
|
|
||||||
books.push({
|
|
||||||
name: req.body.name,
|
|
||||||
})
|
|
||||||
|
|
||||||
res.send({
|
|
||||||
status: 200
|
|
||||||
})
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
booksRouter.get('/:id', (req, res) => {
|
|
||||||
console.log(req.params);
|
|
||||||
|
|
||||||
res.send(require('./book.json'));
|
|
||||||
|
|
||||||
// res.status(404).send()
|
|
||||||
})
|
|
||||||
|
|
||||||
booksRouter.delete('/:id', (req, res) => {
|
|
||||||
res.status(201).send({
|
|
||||||
status: 'ok'
|
|
||||||
})
|
|
||||||
})
|
|
||||||
69
stubs/api/change/index.js
Normal file
69
stubs/api/change/index.js
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
const changeRouter = require('express').Router();
|
||||||
|
|
||||||
|
module.exports = changeRouter;
|
||||||
|
|
||||||
|
const { users, getUserFromDB, deleteUserFromDB, addUserToDB } = require('../db');
|
||||||
|
|
||||||
|
const jwt = require("jsonwebtoken");
|
||||||
|
|
||||||
|
|
||||||
|
changeRouter.post('/nickname', (req, res) => {
|
||||||
|
const { id, newNickname } = req.body;
|
||||||
|
console.log("Request nickname in /change:", id);
|
||||||
|
|
||||||
|
const user = getUserFromDB(id);
|
||||||
|
|
||||||
|
// Invalid identification
|
||||||
|
if (!user) {
|
||||||
|
res.status(401).send({message: 'Invalid credentials (id)'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const updatedUser = {
|
||||||
|
"nickname": newNickname,
|
||||||
|
"password": user.password,
|
||||||
|
"id": user.id
|
||||||
|
};
|
||||||
|
|
||||||
|
// Delete the old one
|
||||||
|
deleteUserFromDB(id)
|
||||||
|
|
||||||
|
// Insert updated
|
||||||
|
addUserToDB(updatedUser);
|
||||||
|
|
||||||
|
res.status(200).send({});
|
||||||
|
});
|
||||||
|
|
||||||
|
changeRouter.post('/password', (req, res) => {
|
||||||
|
const { id, newPassword } = req.body;
|
||||||
|
console.log("Request password in /change:", id);
|
||||||
|
|
||||||
|
const user = getUserFromDB(id);
|
||||||
|
|
||||||
|
// Invalid identification
|
||||||
|
if (!user) {
|
||||||
|
res.status(401).send({message: 'Invalid credentials (id)'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete the old one
|
||||||
|
deleteUserFromDB(id)
|
||||||
|
|
||||||
|
// Insert updated
|
||||||
|
const updatedUser = {
|
||||||
|
"nickname": user.nickname,
|
||||||
|
"password": newPassword,
|
||||||
|
"id": user.id
|
||||||
|
};
|
||||||
|
addUserToDB(updatedUser);
|
||||||
|
|
||||||
|
res.status(200).send({});
|
||||||
|
});
|
||||||
|
|
||||||
|
changeRouter.delete('/:id', (req, res) => {
|
||||||
|
const { id } = req.params;
|
||||||
|
console.log("Request delete in /change:", id);
|
||||||
|
|
||||||
|
deleteUserFromDB(id);
|
||||||
|
});
|
||||||
|
|
||||||
692
stubs/api/chat/chats.json
Normal file
692
stubs/api/chat/chats.json
Normal file
@@ -0,0 +1,692 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "bobsm",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Hello Bob!",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "bobsm",
|
||||||
|
"timestamp": "07:00:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Hey Alice, how are you?",
|
||||||
|
"senderId": "bobsm",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "07:05:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "I'm good, thanks for asking.",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "bobsm",
|
||||||
|
"timestamp": "07:10:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Glad to hear!",
|
||||||
|
"senderId": "bobsm",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "07:15:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "charl",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "How's the project going?",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "charl",
|
||||||
|
"timestamp": "07:20:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "It's coming along, almost done!",
|
||||||
|
"senderId": "charl",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "07:25:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "That's great to hear!",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "charl",
|
||||||
|
"timestamp": "07:30:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Thanks for checking in.",
|
||||||
|
"senderId": "charl",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "07:35:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "david",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Did you get the files?",
|
||||||
|
"senderId": "david",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "07:40:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, I did. Thank you!",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "david",
|
||||||
|
"timestamp": "07:45:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "You're welcome.",
|
||||||
|
"senderId": "david",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "07:50:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Let me know if you need anything else.",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "david",
|
||||||
|
"timestamp": "07:55:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "evead",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Eve, do you have the meeting details?",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "evead",
|
||||||
|
"timestamp": "08:00:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, I just sent them to you.",
|
||||||
|
"senderId": "evead",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "08:05:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Got it, thanks!",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "evead",
|
||||||
|
"timestamp": "08:10:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "You're welcome.",
|
||||||
|
"senderId": "evead",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "08:15:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "frank",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Can you review this document for me?",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "08:20:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Sure, I'll take a look.",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "08:25:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Thanks, much appreciated!",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "08:30:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "No problem.",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "08:35:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "grace",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Hey Grace, let's meet up for coffee!",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "08:40:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Sounds good, when are you free?",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "08:45:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "How about tomorrow afternoon?",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "08:50:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Works for me!",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "08:55:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "hanna",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Hannah, do you have a moment?",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "09:00:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Sure, what's up?",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "09:05:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Just wanted to check on the report.",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "09:10:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "I'll send it soon.",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "09:15:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "ianda",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Ian, have you completed the review?",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "ianda",
|
||||||
|
"timestamp": "09:20:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, I sent my feedback.",
|
||||||
|
"senderId": "ianda",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "09:25:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Thanks for that.",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "ianda",
|
||||||
|
"timestamp": "09:30:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Anytime!",
|
||||||
|
"senderId": "ianda",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "09:35:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "jillt",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Jill, let's schedule a catch-up meeting.",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "jillt",
|
||||||
|
"timestamp": "09:40:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Sounds good, when works for you?",
|
||||||
|
"senderId": "jillt",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "09:45:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Tomorrow afternoon?",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "jillt",
|
||||||
|
"timestamp": "09:50:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "That works for me!",
|
||||||
|
"senderId": "jillt",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "09:55:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "alice",
|
||||||
|
"id2": "evead",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Eve, did you send the schedule?",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "evead",
|
||||||
|
"timestamp": "10:00:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, just sent it.",
|
||||||
|
"senderId": "evead",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "10:05:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Thanks, much appreciated!",
|
||||||
|
"senderId": "alice",
|
||||||
|
"recipientId": "evead",
|
||||||
|
"timestamp": "10:10:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "No problem!",
|
||||||
|
"senderId": "evead",
|
||||||
|
"recipientId": "alice",
|
||||||
|
"timestamp": "10:15:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "bobsm",
|
||||||
|
"id2": "charl",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "How's everything going?",
|
||||||
|
"senderId": "bobsm",
|
||||||
|
"recipientId": "charl",
|
||||||
|
"timestamp": "10:20:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Pretty good, how about you?",
|
||||||
|
"senderId": "charl",
|
||||||
|
"recipientId": "bobsm",
|
||||||
|
"timestamp": "10:25:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Can't complain!",
|
||||||
|
"senderId": "bobsm",
|
||||||
|
"recipientId": "charl",
|
||||||
|
"timestamp": "10:30:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Glad to hear that.",
|
||||||
|
"senderId": "charl",
|
||||||
|
"recipientId": "bobsm",
|
||||||
|
"timestamp": "10:35:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "bobsm",
|
||||||
|
"id2": "david",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Can you send the report?",
|
||||||
|
"senderId": "bobsm",
|
||||||
|
"recipientId": "david",
|
||||||
|
"timestamp": "10:40:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "I'll send it in an hour.",
|
||||||
|
"senderId": "david",
|
||||||
|
"recipientId": "bobsm",
|
||||||
|
"timestamp": "10:45:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Perfect, thanks.",
|
||||||
|
"senderId": "bobsm",
|
||||||
|
"recipientId": "david",
|
||||||
|
"timestamp": "10:50:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "No problem.",
|
||||||
|
"senderId": "david",
|
||||||
|
"recipientId": "bobsm",
|
||||||
|
"timestamp": "10:55:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "charl",
|
||||||
|
"id2": "evead",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Hey Eve, how's it going?",
|
||||||
|
"senderId": "charl",
|
||||||
|
"recipientId": "evead",
|
||||||
|
"timestamp": "11:00:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Good, how about you?",
|
||||||
|
"senderId": "evead",
|
||||||
|
"recipientId": "charl",
|
||||||
|
"timestamp": "11:05:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Can't complain!",
|
||||||
|
"senderId": "charl",
|
||||||
|
"recipientId": "evead",
|
||||||
|
"timestamp": "11:10:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Glad to hear.",
|
||||||
|
"senderId": "evead",
|
||||||
|
"recipientId": "charl",
|
||||||
|
"timestamp": "11:15:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "charl",
|
||||||
|
"id2": "frank",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Do you have time to talk today?",
|
||||||
|
"senderId": "charl",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "11:20:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "I have a meeting, but I can chat afterward.",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "charl",
|
||||||
|
"timestamp": "11:25:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Sounds good.",
|
||||||
|
"senderId": "charl",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "11:30:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "I'll message you after.",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "charl",
|
||||||
|
"timestamp": "11:35:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "david",
|
||||||
|
"id2": "frank",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Did you review the document?",
|
||||||
|
"senderId": "david",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "11:40:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, it's all good.",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "david",
|
||||||
|
"timestamp": "11:45:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Great, thanks for the quick turnaround!",
|
||||||
|
"senderId": "david",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "11:50:00 AM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "No worries!",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "david",
|
||||||
|
"timestamp": "11:55:00 AM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "david",
|
||||||
|
"id2": "grace",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Grace, can you send the updated schedule?",
|
||||||
|
"senderId": "david",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "12:00:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, I'll send it in a few minutes.",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "david",
|
||||||
|
"timestamp": "12:05:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Thanks, much appreciated!",
|
||||||
|
"senderId": "david",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "12:10:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "You're welcome!",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "david",
|
||||||
|
"timestamp": "12:15:00 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "frank",
|
||||||
|
"id2": "grace",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "How are you today?",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "12:20:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "I'm doing well, thanks for asking.",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "12:25:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Glad to hear that.",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "12:30:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "How about you?",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "12:35:00 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "frank",
|
||||||
|
"id2": "hanna",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Did you attend the meeting?",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "12:40:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, it was productive.",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "12:45:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Good to hear!",
|
||||||
|
"senderId": "frank",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "12:50:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Indeed, lots to follow up on.",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "frank",
|
||||||
|
"timestamp": "12:55:00 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "grace",
|
||||||
|
"id2": "hanna",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Can we meet later today?",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "01:00:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Sure, what's a good time?",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "01:05:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "How about 3 PM?",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "01:10:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Works for me.",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "01:15:00 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "grace",
|
||||||
|
"id2": "ianda",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Ian, did you get the message I sent?",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "ianda",
|
||||||
|
"timestamp": "01:20:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, I'll respond soon.",
|
||||||
|
"senderId": "ianda",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "01:25:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Thanks, appreciate it!",
|
||||||
|
"senderId": "grace",
|
||||||
|
"recipientId": "ianda",
|
||||||
|
"timestamp": "01:30:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "You're welcome!",
|
||||||
|
"senderId": "ianda",
|
||||||
|
"recipientId": "grace",
|
||||||
|
"timestamp": "01:35:00 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "hanna",
|
||||||
|
"id2": "ianda",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Ian, do you have a minute?",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "ianda",
|
||||||
|
"timestamp": "01:40:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, what do you need?",
|
||||||
|
"senderId": "ianda",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "01:45:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Just a quick update on the project.",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "ianda",
|
||||||
|
"timestamp": "01:50:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "I'll email you the details.",
|
||||||
|
"senderId": "ianda",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "01:55:00 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "hanna",
|
||||||
|
"id2": "jillt",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Jill, can we talk tomorrow?",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "jillt",
|
||||||
|
"timestamp": "02:00:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Yes, I'm free after 2 PM.",
|
||||||
|
"senderId": "jillt",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "02:05:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Perfect, see you then.",
|
||||||
|
"senderId": "hanna",
|
||||||
|
"recipientId": "jillt",
|
||||||
|
"timestamp": "02:10:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Looking forward to it.",
|
||||||
|
"senderId": "jillt",
|
||||||
|
"recipientId": "hanna",
|
||||||
|
"timestamp": "02:15:00 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id1": "ianda",
|
||||||
|
"id2": "jillt",
|
||||||
|
"messages": [
|
||||||
|
{
|
||||||
|
"data": "Jill, I have the files you requested.",
|
||||||
|
"senderId": "ianda",
|
||||||
|
"recipientId": "jillt",
|
||||||
|
"timestamp": "02:20:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Thanks, please send them over.",
|
||||||
|
"senderId": "jillt",
|
||||||
|
"recipientId": "ianda",
|
||||||
|
"timestamp": "02:25:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "I'll send them right now.",
|
||||||
|
"senderId": "ianda",
|
||||||
|
"recipientId": "jillt",
|
||||||
|
"timestamp": "02:30:00 PM"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"data": "Great, thanks again!",
|
||||||
|
"senderId": "jillt",
|
||||||
|
"recipientId": "ianda",
|
||||||
|
"timestamp": "02:35:00 PM"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
91
stubs/api/chat/index.js
Normal file
91
stubs/api/chat/index.js
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
const chatRouter = require('express').Router();
|
||||||
|
|
||||||
|
module.exports = chatRouter;
|
||||||
|
|
||||||
|
const { getChatFromDB, getUsersChats, addChatToDB, getUserFromDB,
|
||||||
|
addMessageToChat} = require('../db');
|
||||||
|
|
||||||
|
chatRouter.get('/item/:id1/:id2', (req, res) => {
|
||||||
|
const { id1, id2 } = req.params;
|
||||||
|
console.log("Request get in /chat:", id1, id2);
|
||||||
|
|
||||||
|
if (id1 === id2) {
|
||||||
|
res.status(400).send({message: 'Ids should be different'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const chat = getChatFromDB(id1, id2);
|
||||||
|
|
||||||
|
if (chat) {
|
||||||
|
res.status(200).send({chat});
|
||||||
|
} else {
|
||||||
|
res.status(404).send({message: 'Chat was not found'});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
chatRouter.post('/item/:id1/:id2', (req, res) => {
|
||||||
|
const { id1, id2 } = req.params;
|
||||||
|
console.log("Request post in /chat:", id1, id2);
|
||||||
|
|
||||||
|
if (id1 === id2) {
|
||||||
|
res.status(400).send({message: 'Ids should be different'});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const chat = getChatFromDB(id1, id2);
|
||||||
|
|
||||||
|
if (chat) {
|
||||||
|
// Chat already exists
|
||||||
|
res.status(200).send({chat});
|
||||||
|
} else {
|
||||||
|
if (!getUserFromDB(id1) || !getUserFromDB(id2)) {
|
||||||
|
res.status(404).send({message: 'Such interlocutor does not exist'});
|
||||||
|
} else {
|
||||||
|
// Creating new chat
|
||||||
|
const newChat = {
|
||||||
|
id1: id1,
|
||||||
|
id2: id2,
|
||||||
|
messages: []
|
||||||
|
}
|
||||||
|
|
||||||
|
addChatToDB(newChat);
|
||||||
|
|
||||||
|
res.status(200).send({newChat});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
chatRouter.get('/list/:id', (req, res) => {
|
||||||
|
const { id } = req.params;
|
||||||
|
|
||||||
|
console.log("Request get /list in /chat:", id);
|
||||||
|
|
||||||
|
const userChats = getUsersChats(id);
|
||||||
|
|
||||||
|
if (!userChats) {
|
||||||
|
res.status(404).send({message: 'Error with retrieving chats'});
|
||||||
|
} else {
|
||||||
|
res.status(200).send({chats: userChats});
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
chatRouter.post('/message/:sender/:receiver', (req, res) => {
|
||||||
|
const { sender, receiver } = req.params;
|
||||||
|
const { message } = req.body;
|
||||||
|
console.log("Request post /message in /chat:", sender, receiver, message);
|
||||||
|
|
||||||
|
const chat = getChatFromDB(sender, receiver);
|
||||||
|
|
||||||
|
if (!chat) {
|
||||||
|
// Chat already exists
|
||||||
|
res.status(400).send({message: "Such chat does not exist"});
|
||||||
|
} else {
|
||||||
|
if (!getUserFromDB(sender) || !getUserFromDB(receiver)) {
|
||||||
|
res.status(404).send({message: 'Such people do not exist'});
|
||||||
|
} else {
|
||||||
|
// Add new message
|
||||||
|
addMessageToChat(chat, message);
|
||||||
|
res.status(200).send({});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
74
stubs/api/db.js
Normal file
74
stubs/api/db.js
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
// Read already defined users (pseudo-DB)
|
||||||
|
const users = require('./auth/users.json');
|
||||||
|
const chats = require('./chat/chats.json');
|
||||||
|
|
||||||
|
const getUserFromDB = (userID) => {
|
||||||
|
if (!userID) {return false;}
|
||||||
|
|
||||||
|
// Accessing 'DB'
|
||||||
|
const user = users.find((user) => user.id === userID);
|
||||||
|
|
||||||
|
if (user) {
|
||||||
|
return user;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteUserFromDB = (userID) => {
|
||||||
|
const index = users.findIndex(item => item.id === userID);
|
||||||
|
if (index !== -1) {
|
||||||
|
users.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const addUserToDB = (user) => {
|
||||||
|
users.push(user);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getChatFromDB = (firstID, secondID) => {
|
||||||
|
if (!firstID || !secondID) {return false;}
|
||||||
|
|
||||||
|
// Accessing 'DB'
|
||||||
|
const chat = chats.find((item) =>
|
||||||
|
(item.id1 === firstID && item.id2 === secondID) || (item.id1 === secondID && item.id2 === firstID));
|
||||||
|
|
||||||
|
if (chat) {
|
||||||
|
return chat;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const getUsersChats = (userID) => {
|
||||||
|
if (!userID) {return false;}
|
||||||
|
|
||||||
|
const userChats = chats.filter((chat) => (chat.id1 === userID || chat.id2 === userID));
|
||||||
|
|
||||||
|
if (userChats) {
|
||||||
|
return userChats;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const addMessageToChat = (chat, msg) => {
|
||||||
|
chat.messages.push(msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
const deleteChatFromDB = (firstID, secondID) => {
|
||||||
|
const index = chats.findIndex(item =>
|
||||||
|
(item.id1 === firstID && item.id2 === secondID) || (item.id1 === secondID && item.id2 === firstID));
|
||||||
|
|
||||||
|
if (index !== -1) {
|
||||||
|
chats.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const addChatToDB = (chat) => {
|
||||||
|
chats.push(chat);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
module.exports = {users, chats, getUserFromDB, getChatFromDB, addUserToDB,
|
||||||
|
deleteUserFromDB, addChatToDB, deleteChatFromDB, getUsersChats, addMessageToChat}
|
||||||
@@ -1,13 +1,17 @@
|
|||||||
const booksRouter = require("./books");
|
const changeRouter = require("./change");
|
||||||
const authRouter = require("./auth");
|
const authRouter = require("./auth");
|
||||||
|
const chatRouter = require("./chat");
|
||||||
|
|
||||||
const router = require('express').Router();
|
const router = require('express').Router();
|
||||||
|
|
||||||
const delay = require('./middlewares/delay');
|
const delay = require('./middlewares/delay');
|
||||||
|
const verify = require('./middlewares/verify');
|
||||||
|
|
||||||
module.exports = router;
|
module.exports = router;
|
||||||
|
|
||||||
// router.use(delay(300));
|
// router.use(delay(300));
|
||||||
// router.use('/books', delay, booksRouter);
|
// router.use('/books', delay, booksRouter);
|
||||||
|
|
||||||
router.use('/auth', authRouter);
|
router.use('/enterfront/auth', authRouter);
|
||||||
|
router.use('/enterfront/change', verify, changeRouter);
|
||||||
|
router.use('/enterfront/chat', verify, chatRouter)
|
||||||
|
|||||||
23
stubs/api/middlewares/verify.js
Normal file
23
stubs/api/middlewares/verify.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
const jwt = require('jsonwebtoken');
|
||||||
|
|
||||||
|
require('dotenv').config();
|
||||||
|
const TOKEN_KEY = process.env.TOKEN_KEY;
|
||||||
|
|
||||||
|
function verifyToken(req, res, next) {
|
||||||
|
const token = req.headers['authorization']?.split(' ')[1];
|
||||||
|
|
||||||
|
if (!token) {
|
||||||
|
return res.status(403).send({ message: 'No token provided' });
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify token
|
||||||
|
jwt.verify(token, TOKEN_KEY, (err, decoded) => {
|
||||||
|
if (err) {
|
||||||
|
return res.status(401).send({ message: 'Unauthorized' });
|
||||||
|
}
|
||||||
|
|
||||||
|
next(); // Proceed to the next middleware or route
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = verifyToken;
|
||||||
Reference in New Issue
Block a user