diff --git a/src/categories/unread.ts b/src/categories/unread.ts new file mode 100644 index 00000000..cb053289 --- /dev/null +++ b/src/categories/unread.ts @@ -0,0 +1,43 @@ +import db from '../database'; + +interface CategoriesModel { + markAsRead(cids: number[], uid: number): Promise; + markAsUnreadForAll(cid: number): Promise; + hasReadCategories(cids: number[], uid: number): Promise; + hasReadCategory(cid: number, uid: number): Promise; +} + +export default function setupCategoriesModel(Categories: CategoriesModel): void { + Categories.markAsRead = async function (cids: number[], uid: number): Promise { + if (!Array.isArray(cids) || !cids.length || uid <= 0) { + return; + } + let keys = cids.map(cid => `cid:${cid}:read_by_uid`); + const hasRead = await db.isMemberOfSets(keys, uid); + keys = keys.filter((key, index) => !hasRead[index]); + await db.setsAdd(keys, uid); + }; + + Categories.markAsUnreadForAll = async function (cid: number): Promise { + if (!cid) { + return; + } + await db.delete(`cid:${cid}:read_by_uid`); + }; + + Categories.hasReadCategories = async function (cids: number[], uid: number): Promise { + if (uid <= 0) { + return cids.map(() => false); + } + + const sets = cids.map(cid => `cid:${cid}:read_by_uid`); + return await db.isMemberOfSets(sets, uid); + }; + + Categories.hasReadCategory = async function (cid: number, uid: number): Promise { + if (uid <= 0) { + return false; + } + return await db.isSetMember(`cid:${cid}:read_by_uid`, uid); + }; +}