projeto-hit/backend/src/services/UserServices/CreateOrUpdateOnlineUserSer...

116 lines
4.1 KiB
TypeScript

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';
import ptBR from 'date-fns/locale/pt-BR';
import { stat } from "fs";
interface Request {
userId: string | number,
status: string,
}
const CreateOrUpdateUserOnlineTime = async ({
userId,
status,
}: Request): Promise<UserOnlineTime> => {
let userOnlineTime = null;
// let dateTime = splitDateTime(new Date(new Date() + 'UTC'))
let dateTime = splitDateTime(new Date(format(new Date(), 'yyyy-MM-dd HH:mm:ss', { locale: ptBR }) ))
userOnlineTime = await UserOnlineTime.findOne({
where: {
[Op.and]: [
{
userId: userId
},
{
"$createdAt$": Sequelize.where(Sequelize.fn("date", Sequelize.col("createdAt")), `${dateTime.fullDate}`)
},
]
}
});
if(userOnlineTime){
try{
let oldStatus = userOnlineTime.status
if(oldStatus=='online' && status === 'offline'){
//updatedAt
let newtTime = intervalToDuration({ start: userOnlineTime.updatedAt, end: new Date()})
console.log('TESTANDO INTERVAL DURATION: ', newtTime)
console.log('hours: ', newtTime.hours, ' | minutes: ', newtTime.minutes, ' | seconds: ', newtTime.seconds)
let onlineTime = new Date()
onlineTime.setUTCHours(userOnlineTime.onlineTime.getHours())
onlineTime.setUTCMinutes(userOnlineTime.onlineTime.getMinutes())
onlineTime.setUTCSeconds(userOnlineTime.onlineTime.getSeconds())
console.log('userOnlineTime.onlineTime: ',userOnlineTime.onlineTime)
console.log('userOnlineTime.onlineTime.getHours(): ',userOnlineTime.onlineTime.getHours())
console.log('userOnlineTime.onlineTime.getMinutes(): ',userOnlineTime.onlineTime.getMinutes())
console.log('userOnlineTime.onlineTime.getSeconds(): ',userOnlineTime.onlineTime.getSeconds())
console.log('online time 3: ', onlineTime)
if(newtTime.hours && +newtTime.hours > 0){
onlineTime = addHours(onlineTime, newtTime.hours)
}
if(newtTime.minutes && +newtTime.minutes > 0){
onlineTime = addMinutes(onlineTime,newtTime.minutes)
}
if(newtTime.seconds && +newtTime.seconds > 0){
onlineTime = addSeconds(onlineTime, newtTime.seconds)
}
console.log('online time 4: ', onlineTime)
const isoDate = new Date(onlineTime);
const mySQLDateString = isoDate.toJSON().slice(0, 19).replace('T', ' ');
console.log('mySQLDateString: ', mySQLDateString)
await userOnlineTime.update({ status, onlineTime: mySQLDateString })
}
else if(oldStatus=='offline' && status === 'online'){
await userOnlineTime.update({ status })
}
else{
console.log('NOT UPDATED THE USER: ', userOnlineTime.userId)
}
}catch(err){
throw new AppError("ERR_NO_USER_ONLINE_FOUND", 404);
}
}
if(!userOnlineTime){
userOnlineTime = await UserOnlineTime.create(
{
userId,
status,
onlineTime: `${dateTime.fullDate} 00:00:00`
})
}
return userOnlineTime
}
export default CreateOrUpdateUserOnlineTime