111 lines
3.9 KiB
TypeScript
111 lines
3.9 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{
|
||
|
|
||
|
if(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(status === 'online'){
|
||
|
await userOnlineTime.update({ status })
|
||
|
}
|
||
|
|
||
|
}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
|