Files
patra_web/src/app/api/posts/heartbeat/route.js
Dimas Vindyawan 6c3af6a820 first commit
2025-12-30 14:34:03 +07:00

74 lines
2.2 KiB
JavaScript

import clientPromise, { database, objectId } from "@/db.config";
import { normalizeMongoDoc, ProcessPostLock } from "@/models/helper";
import { JWT } from "@/utils/jwt";
import { NextResponse } from "next/server";
export async function POST(request) {
try {
const jwt = new JWT();
const { searchParams } = new URL(request.url);
const post_id = searchParams.get("post_id");
const uid = searchParams.get("uid");
const session = new ProcessPostLock(post_id);
// cookies
const cookies = request.cookies.get("refreshToken")?.value;
const userData = jwt.decodeToken(cookies);
const client = await clientPromise;
const db = client.db(database);
const postslock = db.collection("posts_lock");
return await session.execute(async () => {
console.log({ post_id, userid: userData._id });
// check user
const currentLock = await postslock.findOne({
post_id: objectId(post_id),
});
if (currentLock && currentLock.uid !== uid) {
const user = await db
.collection("users")
.findOne(
{ _id: objectId(currentLock.user_id) },
{ projection: { name: 1 } }
);
return NextResponse.json(
{ status: "unauthorize", user: normalizeMongoDoc(user) },
{ status: 401 }
);
}
await postslock.updateOne(
{ uid, post_id: objectId(post_id) },
{
$set: { heartBeat: new Date() },
$setOnInsert: {
uid,
post_id: objectId(post_id),
lockedSince: new Date(),
user_id: objectId(userData._id),
},
},
{ upsert: true }
);
const indexes = await postslock.listIndexes().toArray();
if (!indexes.map((i) => i?.name).includes("heartBeat_1"))
// create ttl when not update on 10s will be deleted
await postslock.createIndex(
{ heartBeat: 1 },
{ expireAfterSeconds: 10 }
);
return NextResponse.json({ status: "success" }, { status: 200 });
});
} catch (error) {
console.log(error);
return NextResponse.json({ error: error.message }, { status: 500 });
}
}