From a54de07260c3555d0230492970448604ffb9d586 Mon Sep 17 00:00:00 2001 From: syuilo Date: Tue, 18 Feb 2020 08:41:32 +0900 Subject: Resolve #5963 --- src/server/api/common/inject-promo.ts | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 src/server/api/common/inject-promo.ts (limited to 'src/server/api/common') diff --git a/src/server/api/common/inject-promo.ts b/src/server/api/common/inject-promo.ts new file mode 100644 index 0000000000..785d7af085 --- /dev/null +++ b/src/server/api/common/inject-promo.ts @@ -0,0 +1,36 @@ +import rndstr from 'rndstr'; +import { Note } from '../../../models/entities/note'; +import { User } from '../../../models/entities/user'; +import { PromoReads, PromoNotes, Notes, Users } from '../../../models'; +import { ensure } from '../../../prelude/ensure'; + +export async function injectPromo(user: User, timeline: Note[]) { + if (timeline.length < 5) return; + + // TODO: readやexpireフィルタはクエリ側でやる + + const reads = await PromoReads.find({ + userId: user.id + }); + + let promos = await PromoNotes.find(); + + promos = promos.filter(n => n.expiresAt.getTime() > Date.now()); + promos = promos.filter(n => !reads.map(r => r.noteId).includes(n.noteId)); + + if (promos.length === 0) return; + + const promo = promos[Math.floor(Math.random() * promos.length)]; + + // Pick random promo + const note = await Notes.findOne(promo.noteId).then(ensure); + + // Join + note.user = await Users.findOne(note.userId).then(ensure); + + (note as any)._prInjectionId_ = rndstr('a-z0-9', 8); + + // Inject promo + timeline.splice(3, 0, note); + timeline.pop(); +} -- cgit v1.2.3-freya