node.js: cómo limitar el límite de publicaciones diarias de los usuarios (MERN)

CorePress2024-01-25  10

Actualmente estoy usando Passport para autenticación y mongodb para almacenar información del usuario.

Sin embargo, estoy atascado al intentar limitar el límite de publicaciones diarias del usuario. Estaba pensando en tener un campo como límite de publicaciones diarias en el esquema de usuario y cada vez que el usuario publica algo, deduzco el recuento.

const user = new mongoose.Schema({


githubId: {
    required: true,
    type: String,
  },

  username: {
    required: true,
    type: String,
  },

  dailyPostLimit: {
    type: Number,
    default: 3,
  },
});

Sin embargo, no estoy seguro de si hay una manera de restablecer ese recuento al valor predeterminado(3) todos los días. ¿La tarea CRON es adecuada aquí o existe una forma más sencilla de lograrlo?



------------------------------------

Una tarea cron funciona bien para restablecer un valor como este, y almacenar en caché un valor como este es un enfoque razonable para resolver este problema. BSin embargo, tenga en cuenta que está almacenando en caché este valor y que la invalidación de la caché es un problema difícil que a menudo puede provocar errores y errores. complejidad adicional.

contando publicaciones

En lugar de almacenar en caché, mi primer instinto sería contar el número de publicaciones cada vez. Aquí hay un pseudocódigo:

const count = await posts.count({userId, createdAt: {$gte: startOfDay}});
// alternative: const count = await posts.count({userId, _id: {$gte: startofDayConvertedToMongoId});
if (count > 3) throw new Error("no more posts for you");
await posts.create(newPost)

(nota: si le preocupan las condiciones de la carrera, cualquier solución que elija deberá verificar el recuento en una transacción)

Si tiene un índice que comienza con {userId: 1, createAt: 1}, o si usa _id en lugar de {userId: 1, _id: 1} (asumiendo que no permite la creación de _id del cliente), Estas consultas serán bastante económicas y les resultará difícil desincronizarse.

colección de caché separada

Incluso si decide almacenar en caché estos valores de creación, le recomiendo que los guarde lejos dela colección de su usuario para mantener sus colecciones más enfocadas. Puede crear una colección post_count y luego actualizar solo la colección de caché para estos recuentos: post_count.updateOne({userId, day}, {$incr: {count: 1}, $setOnInsert: {day, userId, count: 0}} , {upsert: verdadero});. Un buen beneficio de este enfoque es que puedes usar un índice ttl el día para que mongo elimine automáticamente los documentos antiguos de esta colección una vez que hayan expirado.



------------------------------------

Ya que estás usando MongoDB, te sugeriría:

Utilice la agenda y cree un trabajo que se ejecute a las 00:00 UTC (si tiene diversos usuarios de diferenteszona horaria de alquiler) o zona horaria específica del país de su usuario. En esta llamada de trabajo, updateMany funciona en su modelo de usuario para restablecer el campo dailyPostLimit.

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare