aboutsummaryrefslogtreecommitdiff
path: root/src/server/ApiManagers/UserManager.ts
blob: f2ef2296168643eea574f705b6d3bcb18d2bb6ec (plain)
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
import ApiManager, { Registration } from "./ApiManager";
import { Method } from "../RouteManager";
import { Database } from "../database";
import { msToTime } from "../ActionUtilities";

export const timeMap: { [id: string]: number } = {};
interface ActivityUnit {
    user: string;
    duration: number;
}

export default class UserManager extends ApiManager {

    protected initialize(register: Registration): void {

        register({
            method: Method.GET,
            subscription: "/getUsers",
            secureHandler: async ({ res }) => {
                const cursor = await Database.Instance.query({}, { email: 1, userDocumentId: 1 }, "users");
                const results = await cursor.toArray();
                res.send(results.map(user => ({ email: user.email, userDocumentId: user.userDocumentId })));
            }
        });

        register({
            method: Method.GET,
            subscription: "/getUserDocumentId",
            secureHandler: ({ res, user }) => res.send(user.userDocumentId)
        });

        register({
            method: Method.GET,
            subscription: "/getCurrentUser",
            secureHandler: ({ res, user }) => res.send(JSON.stringify(user)),
            publicHandler: ({ res }) => res.send(JSON.stringify({ id: "__guest__", email: "" }))
        });

        register({
            method: Method.GET,
            subscription: "/activity",
            secureHandler: ({ res }) => {
                const now = Date.now();

                const activeTimes: ActivityUnit[] = [];
                const inactiveTimes: ActivityUnit[] = [];

                for (const user in timeMap) {
                    const time = timeMap[user];
                    const duration = now - time;
                    const target = (duration / 1000) < (60 * 5) ? activeTimes : inactiveTimes;
                    target.push({ user, duration });
                }

                const process = (target: { user: string, duration: number }[]) => {
                    const comparator = (first: ActivityUnit, second: ActivityUnit) => first.duration - second.duration;
                    const sorted = target.sort(comparator);
                    return sorted.map(({ user, duration }) => `${user} (${msToTime(duration)})`);
                };

                res.render("user_activity.pug", {
                    title: "User Activity",
                    active: process(activeTimes),
                    inactive: process(inactiveTimes)
                });
            }
        });

    }

}