Actualmente estoy usando pasaporte para autenticación y mongodb para almacenar información de usuario.
Sin embargo, estoy atascado tratando de limitar el límite de publicaciones diarias del usuario. Estaba pensando en tener un campo como el límite de publicación diaria 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 conteo a su valor predeterminado (3) todos los días. ¿La tarea CRON es adecuada aquí o hay una forma más sencilla de lograr esto?
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. Pero tenga en cuenta que está almacenando en caché este valor, y la invalidación de caché es un problema difícil que a menudo puede generar errores y complejidad adicional.
En lugar de almacenar en caché, mi primer instinto sería contar el número de publicaciones cada vez. Aquí hay un pseudo có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 conteo en una transacción)
Si tiene un índice que comienza con {userId: 1, createdAt: 1} , o si usa _id en su lugar {userId: 1, _id: 1} (asumiendo que no está permitiendo la creación de _id cliente), estas consultas ser bastante barato, y será difícil que se desincronicen.
Incluso si decide almacenar en caché estos valores de creación, le recomiendo que los guarde en caché lejos de la 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: true}); . Un buen beneficio de este enfoque es que puede usar un índice ttl el day para que mongo elimine automáticamente los documentos antiguos en esta colección después de que hayan expirado.
Dado que está utilizando MongoDB, sugeriría,
user para restablecer el campo dailyPostLimit .