2022-05-03 21:20:58 +00:00
|
|
|
import AppError from "../../errors/AppError";
|
|
|
|
import UserOnlineTime from "../../models/UserOnlineTime";
|
|
|
|
import { splitDateTime } from "../../helpers/SplitDateTime";
|
|
|
|
import { Op, Sequelize } from "sequelize";
|
|
|
|
import { addHours, addMinutes, addSeconds, intervalToDuration, add } from "date-fns";
|
|
|
|
import format from 'date-fns/format';
|
2022-05-16 02:48:06 +00:00
|
|
|
import ptBR from 'date-fns/locale/pt-BR';
|
2022-05-03 21:20:58 +00:00
|
|
|
import { stat } from "fs";
|
2022-05-16 02:48:06 +00:00
|
|
|
import { getIO } from "../../libs/socket";
|
2022-05-03 21:20:58 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
import User from '../../models/User'
|
|
|
|
|
|
|
|
interface Request {
|
2022-05-03 21:20:58 +00:00
|
|
|
userId: string | number,
|
2022-05-16 02:48:06 +00:00
|
|
|
status: string,
|
|
|
|
}
|
|
|
|
|
|
|
|
const formatDateTimeString = (date: Date) => {
|
|
|
|
|
|
|
|
let newDate = new Date()
|
|
|
|
newDate.setUTCHours(date.getHours())
|
|
|
|
newDate.setUTCMinutes(date.getMinutes())
|
|
|
|
newDate.setUTCSeconds(date.getSeconds())
|
|
|
|
|
|
|
|
const newD = new Date(newDate);
|
|
|
|
const newDateString = newD.toJSON().slice(0, 19).replace('T', ' ');
|
|
|
|
|
|
|
|
return newDateString
|
2022-05-03 21:20:58 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
const CreateOrUpdateUserOnlineTime = async ({
|
|
|
|
userId,
|
|
|
|
status,
|
|
|
|
}: Request): Promise<UserOnlineTime> => {
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
const io = getIO();
|
2022-10-25 14:16:36 +00:00
|
|
|
let userOnlineTime: any = null;
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
const user = await User.findOne({ where: { id: userId } });
|
|
|
|
|
|
|
|
if (!user) {
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
return userOnlineTime
|
|
|
|
}
|
2022-05-03 21:20:58 +00:00
|
|
|
|
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
let dateTime = splitDateTime(new Date(format(new Date(), 'yyyy-MM-dd HH:mm:ss', { locale: ptBR })))
|
2022-05-03 21:20:58 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
userOnlineTime = await UserOnlineTime.findOne({
|
|
|
|
where: {
|
2022-05-03 21:20:58 +00:00
|
|
|
[Op.and]: [
|
|
|
|
{
|
2022-05-16 02:48:06 +00:00
|
|
|
userId: userId
|
2022-05-03 21:20:58 +00:00
|
|
|
},
|
2022-05-16 02:48:06 +00:00
|
|
|
{
|
2022-05-03 21:20:58 +00:00
|
|
|
"$createdAt$": Sequelize.where(Sequelize.fn("date", Sequelize.col("createdAt")), `${dateTime.fullDate}`)
|
2022-05-16 02:48:06 +00:00
|
|
|
},
|
|
|
|
]
|
|
|
|
}
|
|
|
|
});
|
2022-05-03 21:20:58 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
if (userOnlineTime) {
|
|
|
|
try {
|
2022-05-06 22:49:45 +00:00
|
|
|
|
|
|
|
let oldStatus = userOnlineTime.status
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
if (oldStatus == 'online' && status === 'offline') {
|
|
|
|
//updatedAt
|
|
|
|
let newtTime = intervalToDuration({ start: userOnlineTime.updatedAt, end: new Date() })
|
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
|
2022-05-03 21:20:58 +00:00
|
|
|
let onlineTime = new Date()
|
2022-05-16 02:48:06 +00:00
|
|
|
|
2022-05-03 21:20:58 +00:00
|
|
|
onlineTime.setUTCHours(userOnlineTime.onlineTime.getHours())
|
|
|
|
onlineTime.setUTCMinutes(userOnlineTime.onlineTime.getMinutes())
|
2022-10-25 14:16:36 +00:00
|
|
|
onlineTime.setUTCSeconds(userOnlineTime.onlineTime.getSeconds())
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (newtTime.hours && +newtTime.hours > 0) {
|
|
|
|
onlineTime = addHours(onlineTime, newtTime.hours)
|
2022-05-03 21:20:58 +00:00
|
|
|
}
|
2022-05-16 02:48:06 +00:00
|
|
|
if (newtTime.minutes && +newtTime.minutes > 0) {
|
|
|
|
onlineTime = addMinutes(onlineTime, newtTime.minutes)
|
2022-05-03 21:20:58 +00:00
|
|
|
}
|
2022-05-16 02:48:06 +00:00
|
|
|
if (newtTime.seconds && +newtTime.seconds > 0) {
|
2022-05-03 21:20:58 +00:00
|
|
|
onlineTime = addSeconds(onlineTime, newtTime.seconds)
|
2022-05-16 02:48:06 +00:00
|
|
|
}
|
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
|
2022-05-03 21:20:58 +00:00
|
|
|
const isoDate = new Date(onlineTime);
|
|
|
|
const mySQLDateString = isoDate.toJSON().slice(0, 19).replace('T', ' ');
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
|
2022-05-03 21:20:58 +00:00
|
|
|
await userOnlineTime.update({ status, onlineTime: mySQLDateString })
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
//test del
|
|
|
|
|
|
|
|
const updatedAtString = formatDateTimeString(userOnlineTime.updatedAt)
|
|
|
|
const createdAtString = formatDateTimeString(userOnlineTime.createdAt)
|
|
|
|
|
2022-10-25 14:16:36 +00:00
|
|
|
|
|
|
|
|
2022-08-08 16:47:28 +00:00
|
|
|
//
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
io.emit("onlineStatus", {
|
|
|
|
action: "update",
|
|
|
|
userOnlineTime: {
|
|
|
|
userId: userOnlineTime.userId,
|
|
|
|
status: userOnlineTime.status,
|
|
|
|
onlineTime: mySQLDateString,
|
|
|
|
createdAt: createdAtString,
|
|
|
|
updatedAt: updatedAtString
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
2022-05-03 21:20:58 +00:00
|
|
|
}
|
2022-05-16 02:48:06 +00:00
|
|
|
else if (oldStatus == 'offline' && status === 'online') {
|
2022-05-03 21:20:58 +00:00
|
|
|
await userOnlineTime.update({ status })
|
2022-10-25 14:16:36 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
io.emit("onlineStatus", {
|
|
|
|
action: "update",
|
|
|
|
userOnlineTime: {
|
|
|
|
userId: userOnlineTime.userId,
|
|
|
|
status: userOnlineTime.status,
|
|
|
|
createdAt: formatDateTimeString(userOnlineTime.createdAt),
|
|
|
|
updatedAt: formatDateTimeString(userOnlineTime.updatedAt)
|
|
|
|
}
|
|
|
|
});
|
2022-05-03 21:20:58 +00:00
|
|
|
}
|
2022-05-16 02:48:06 +00:00
|
|
|
else {
|
2022-05-06 22:49:45 +00:00
|
|
|
console.log('NOT UPDATED THE USER: ', userOnlineTime.userId)
|
|
|
|
}
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
} catch (err) {
|
2022-05-03 21:20:58 +00:00
|
|
|
|
|
|
|
throw new AppError("ERR_NO_USER_ONLINE_FOUND", 404);
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
}
|
2022-05-03 21:20:58 +00:00
|
|
|
}
|
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
if (!userOnlineTime) {
|
2022-05-03 21:20:58 +00:00
|
|
|
|
|
|
|
userOnlineTime = await UserOnlineTime.create(
|
2022-05-16 02:48:06 +00:00
|
|
|
{
|
2022-05-03 21:20:58 +00:00
|
|
|
userId,
|
|
|
|
status,
|
|
|
|
onlineTime: `${dateTime.fullDate} 00:00:00`
|
|
|
|
})
|
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
io.emit("onlineStatus", {
|
|
|
|
action: "update",
|
|
|
|
userOnlineTime: {
|
|
|
|
userId: userOnlineTime.userId,
|
|
|
|
status: userOnlineTime.status,
|
|
|
|
createdAt: formatDateTimeString(userOnlineTime.createdAt),
|
|
|
|
updatedAt: formatDateTimeString(userOnlineTime.updatedAt)
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
2022-05-03 21:20:58 +00:00
|
|
|
}
|
2022-05-16 02:48:06 +00:00
|
|
|
|
2022-05-03 21:20:58 +00:00
|
|
|
|
|
|
|
return userOnlineTime
|
2022-05-16 02:48:06 +00:00
|
|
|
}
|
2022-05-03 21:20:58 +00:00
|
|
|
|
2022-05-16 02:48:06 +00:00
|
|
|
|
|
|
|
|
|
|
|
export default CreateOrUpdateUserOnlineTime
|