-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathevents.ts
89 lines (73 loc) · 2.21 KB
/
events.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
// Copyright 2023 the .NET Foundation
// An event is a bit of telemetry that we record for analytics.
//
// See `SCHEMA.md` for more information about the schema used here.
import { Request as JwtRequest } from "express-jwt";
import { ObjectId } from "mongodb";
import { State } from "./globals";
import { SceneShareType } from "./scenes";
export interface MongoEvent {
kind: string;
sid: string;
date: Date;
}
export interface MongoClickEvent extends MongoEvent {
kind: "click";
scene_id: ObjectId;
}
export async function logClickEvent(state: State, req: JwtRequest, scene_id: ObjectId) {
const evt: MongoClickEvent = {
kind: "click",
sid: req.session.id,
date: new Date(),
scene_id
};
await state.events.insertOne(evt);
await state.scenes.findOneAndUpdate({ "_id": scene_id }, { $inc: { clicks: 1 } })
}
export interface MongoImpressionEvent extends MongoEvent {
kind: "impression";
scene_id: ObjectId;
}
export async function logImpressionEvent(state: State, req: JwtRequest, scene_id: ObjectId) {
const evt: MongoImpressionEvent = {
kind: "impression",
sid: req.session.id,
date: new Date(),
scene_id
};
await state.events.insertOne(evt);
await state.scenes.findOneAndUpdate({ "_id": scene_id }, { $inc: { impressions: 1 } })
}
export interface MongoLikeEvent extends MongoEvent {
kind: "like";
scene_id: ObjectId;
delta: number;
}
export async function logLikeEvent(state: State, req: JwtRequest, scene_id: ObjectId, delta: number) {
const evt: MongoLikeEvent = {
kind: "like",
sid: req.session.id,
date: new Date(),
scene_id,
delta,
};
await state.events.insertOne(evt);
await state.scenes.findOneAndUpdate({ "_id": scene_id }, { $inc: { likes: delta } })
}
export interface MongoShareEvent extends MongoEvent {
kind: "share";
scene_id: ObjectId;
type: SceneShareType;
}
export async function logShareEvent(state: State, req: JwtRequest, scene_id: ObjectId, type: SceneShareType) {
const evt: MongoShareEvent = {
kind: "share",
sid: req.session.id,
date: new Date(),
scene_id,
type
};
await state.events.insertOne(evt);
await state.scenes.findOneAndUpdate({ "_id": scene_id }, { $inc: { shares: 1 } });
}