diff --git a/src/main/frontend/admin/main.ts b/src/main/frontend/admin/main.ts index 60cfdd0..8e5dc98 100644 --- a/src/main/frontend/admin/main.ts +++ b/src/main/frontend/admin/main.ts @@ -2,11 +2,20 @@ import { changePassphrase } from "./pages/user/ChangePassphrase"; import { EncryptionServiceFactory } from "../common/service/EncryptionServiceFactory"; import log from "loglevel"; import { AlertifyNotificationService } from "../common/service/AlertifyNotificationService"; +import { stats } from "./pages/Home"; +import { Credentials } from "../common/global/Credentials"; log.setLevel("TRACE"); const es = EncryptionServiceFactory.getEncryptionService(); const ns = new AlertifyNotificationService(); +const authToken = Credentials.authToken $("#changePassphraseForm").on("submit", (event) => { event.preventDefault(); - changePassphrase(es, ns); + changePassphrase(es, ns, authToken); }); + +const pathMatcher = (path: string) => window.location.pathname == path + +if(pathMatcher("/admin")) { + stats() +} \ No newline at end of file diff --git a/src/main/frontend/admin/pages/Home.ts b/src/main/frontend/admin/pages/Home.ts new file mode 100644 index 0000000..9c8e578 --- /dev/null +++ b/src/main/frontend/admin/pages/Home.ts @@ -0,0 +1,21 @@ +import { getStats } from "../../common/ajax/Messages"; + +import { Credentials } from "../../common/global/Credentials"; +import log from "loglevel"; + +export async function stats(): Promise { + const stats = await getStats(Credentials.authToken); + $("#totalMessages").each((i, el) => { + el.textContent = stats.totalMessages.toString(); + }); + $("#totalUsers").each((i, el) => { + el.textContent = stats.totalUsers.toString(); + }); + $("#totalOnlineUsers").each((i, el) => { + el.textContent = stats.totalOnlineUsers.toString(); + }); + $("#numMessagesToday").each((i, el) => { + el.textContent = stats.numMessagesToday.toString(); + }); + log.debug(stats); +} diff --git a/src/main/frontend/admin/pages/user/ChangePassphrase.ts b/src/main/frontend/admin/pages/user/ChangePassphrase.ts index f98a0c7..20b0012 100644 --- a/src/main/frontend/admin/pages/user/ChangePassphrase.ts +++ b/src/main/frontend/admin/pages/user/ChangePassphrase.ts @@ -7,15 +7,16 @@ import { Credentials } from "../../../common/global/Credentials"; import { MessageCipher } from "../../../common/entity/MessageCipher"; import log from "loglevel"; import { NotificationService } from "../../../common/service/NotificationService"; -import { isPassphraseValid } from "../../../common/util/passphrase"; +import { isPassphraseValid } from "../../../common/util/Passphrase"; import { getAllMessages, sendReencryptedMessages, -} from "../../../common/ajax/messages"; +} from "../../../common/ajax/Messages"; export async function changePassphrase( es: EncryptionService, - ns: NotificationService + ns: NotificationService, + authToken: string ): Promise { // $("#changePassphraseForm").val(); @@ -26,7 +27,7 @@ export async function changePassphrase( const passphraseOld: string = $("#passphraseOld").val() as string; const passphraseNew: string = $("#passphraseNew").val() as string; - const valid = await isPassphraseValid(passphraseOld, user, es); + const valid = await isPassphraseValid(passphraseOld, user, es, authToken); if (!valid) { log.error("Please check your passphrase"); diff --git a/src/main/frontend/common/ajax/messages.ts b/src/main/frontend/common/ajax/Messages.ts similarity index 75% rename from src/main/frontend/common/ajax/messages.ts rename to src/main/frontend/common/ajax/Messages.ts index b8d3b2c..8173746 100644 --- a/src/main/frontend/common/ajax/messages.ts +++ b/src/main/frontend/common/ajax/Messages.ts @@ -4,27 +4,21 @@ import { ReencryptionDTO } from "../dto/ReencryptionDTO"; import { ChatMessageDTO } from "../dto/ChatMessageDTO"; import { JsonAPI } from "../../chat/singleton/JsonAPI"; import * as log from "loglevel"; +import { StatsDTO } from "../dto/StatsDTO"; +import { createApiHeaders } from "./util"; export async function getAllMessages(user: string, authToken: string) { - let headers = new Headers(); - // headers.append('Accept','application/json') - // headers.append('Content-Type', 'application/json'); - headers.append("X-AUTH-TOKEN", authToken); let response = await fetch(`${Routes.Admin.getAllMessagesURL}${user}`, { method: "GET", - headers: headers, + headers: createApiHeaders(authToken), }); return response.json() as Promise; } async function getAllRegularUsers(authToken: string) { - let headers = new Headers(); - // headers.append('Accept','application/json') - // headers.append('Content-Type', 'application/json'); - headers.append("X-AUTH-TOKEN", authToken); let response = await fetch(`${Routes.Admin.getAllRegularUsersURL}`, { method: "GET", - headers: headers, + headers: createApiHeaders(authToken), }); let data = (await response.json()) as string[]; return data; @@ -49,19 +43,14 @@ export async function sendReencryptedMessages( export async function getOneMessage( toUser: string, - page: number + page: number, + authToken: string ): Promise { - const headers = new Headers(); - if (JsonAPI.authToken == null) { - log.error("authToken null"); - return []; - } - headers.append("X-AUTH-TOKEN", JsonAPI.authToken); const url = Sprintf(JsonAPI.CHAT_MESSAGE_PAGE_GET, toUser, page, 1); log.debug(url); const response = await fetch(url, { method: "GET", - headers: headers, + headers: createApiHeaders(authToken), }); log.debug(response.clone()); // if (fetchErrorHandler(response.clone(), this._notificationService)) { @@ -80,3 +69,11 @@ export async function getOneMessage( const data2 = func(data); return data2; } + +export async function getStats(authToken: string) { + const response = await fetch("/api/stats/", { + headers: createApiHeaders(authToken), + method: "GET", + }) + return (await response.json()) as StatsDTO; +} \ No newline at end of file diff --git a/src/main/frontend/common/ajax/util.ts b/src/main/frontend/common/ajax/util.ts new file mode 100644 index 0000000..095ef6f --- /dev/null +++ b/src/main/frontend/common/ajax/util.ts @@ -0,0 +1,9 @@ + +export function createApiHeaders(authToken: string): Headers { + const headers = new Headers(); + // headers.append("Content-Type", "application/json"); + headers.append("X-AUTH-TOKEN", authToken); + return headers; + } + + \ No newline at end of file diff --git a/src/main/frontend/common/dto/StatsDTO.ts b/src/main/frontend/common/dto/StatsDTO.ts new file mode 100644 index 0000000..b596da8 --- /dev/null +++ b/src/main/frontend/common/dto/StatsDTO.ts @@ -0,0 +1,6 @@ +export interface StatsDTO { + totalMessages: number; + totalOnlineUsers: number; + totalUsers: number; + numMessagesToday: number; +} \ No newline at end of file diff --git a/src/main/frontend/common/routes/Stats.ts b/src/main/frontend/common/routes/Stats.ts new file mode 100644 index 0000000..34a7c11 --- /dev/null +++ b/src/main/frontend/common/routes/Stats.ts @@ -0,0 +1,3 @@ +export namespace Stats { + export const rootStats = "/api/stats/" +} \ No newline at end of file diff --git a/src/main/frontend/common/util/passphrase.ts b/src/main/frontend/common/util/Passphrase.ts similarity index 81% rename from src/main/frontend/common/util/passphrase.ts rename to src/main/frontend/common/util/Passphrase.ts index 6246324..dfd5f29 100644 --- a/src/main/frontend/common/util/passphrase.ts +++ b/src/main/frontend/common/util/Passphrase.ts @@ -1,14 +1,15 @@ import { EncryptionService } from "../service/EncryptionService"; import { ChatMessageDTO } from "../dto/ChatMessageDTO"; import * as log from "loglevel"; -import { getOneMessage } from "../ajax/messages"; +import { getOneMessage } from "../ajax/Messages"; export async function isPassphraseValid( passphrase: string, userName: string, - es: EncryptionService + es: EncryptionService, + authToken: string ): Promise { - const messages: ChatMessageDTO[] = await getOneMessage(userName, 0); + const messages: ChatMessageDTO[] = await getOneMessage(userName, 0, authToken); if (messages.length === 0) return true; try { es.decrypt(passphrase, messages[0].messageCipher); diff --git a/src/main/resources/templates/admin/change-passphrase.html b/src/main/resources/templates/admin/change-passphrase.html index af89dfb..3384b22 100644 --- a/src/main/resources/templates/admin/change-passphrase.html +++ b/src/main/resources/templates/admin/change-passphrase.html @@ -8,14 +8,9 @@ - - - - - - - - + + + - +
- + @@ -36,7 +32,7 @@
- +
@@ -45,7 +41,8 @@ @@ -53,15 +50,18 @@
-
+
-
Earnings (Monthly)
-
$40,000
+
+ Total Users
+
0
- +
@@ -70,15 +70,17 @@
-
+
-
Earnings (Annual)
-
$215,000
+
+ Total Messages
+
0
- +
@@ -91,20 +93,23 @@
-
Tasks
+
Users Online +
-
50%
+
0
-
+
- +
@@ -113,15 +118,17 @@
-
+
-
Pending Requests
-
18
+
+ Messages Today
+
0
- +
@@ -137,13 +144,16 @@
-
+
Earnings Overview