From 91a552b83aac4bc4b55b1ef53ff5bc4babf60eb5 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Fri, 3 Sep 2021 06:35:07 -0400 Subject: [PATCH] hide templates and template results from banned users --- vocodes/src/v2/api/w2l/GetW2lResult.ts | 55 ++++++++++++++----- vocodes/src/v2/api/w2l/GetW2lTemplate.ts | 28 +++++----- .../w2l_result_delete/W2lResultDeleteFc.tsx | 7 +-- .../w2l/w2l_result_view/W2lResultViewFc.tsx | 39 ++++++++++--- 4 files changed, 89 insertions(+), 40 deletions(-) diff --git a/vocodes/src/v2/api/w2l/GetW2lResult.ts b/vocodes/src/v2/api/w2l/GetW2lResult.ts index 4edb5dfd49..b86a6aaa38 100644 --- a/vocodes/src/v2/api/w2l/GetW2lResult.ts +++ b/vocodes/src/v2/api/w2l/GetW2lResult.ts @@ -1,10 +1,5 @@ import { ApiConfig } from "../../../common/ApiConfig"; -interface W2lInferenceResultResponsePayload { - success: boolean, - result: W2lResult, -} - export interface W2lResult { w2l_result_token: string, maybe_w2l_template_token?: string, @@ -36,12 +31,36 @@ export interface W2lResult { } export interface W2lInferenceResultModeratorFields { - creator_ip_address: string, + template_creator_is_banned: boolean, + result_creator_is_banned_if_user: boolean, + result_creator_ip_address: string, + result_creator_deleted_at: string | undefined | null, mod_deleted_at: string | undefined | null, - user_deleted_at: string | undefined | null, } -export async function GetW2lResult(resultToken: string) : Promise { +export enum W2lResultLookupError { + NotFound, + ServerError, + FrontendError, +} + +export type GetW2lResultResponse = W2lResult | W2lResultLookupError; + +export function GetW2lResultIsOk(response: GetW2lResultResponse): response is W2lResult { + return response.hasOwnProperty('w2l_result_token'); +} + +export function GetW2lResultIsErr(response: GetW2lResultResponse): response is W2lResultLookupError { + return !response.hasOwnProperty('w2l_result_token'); +} + +interface W2lInferenceResultResponsePayload { + success: boolean, + error_reason?: string, + result?: W2lResult, +} + +export async function GetW2lResult(resultToken: string) : Promise { const endpoint = new ApiConfig().viewW2lInferenceResult(resultToken); return await fetch(endpoint, { @@ -53,13 +72,23 @@ export async function GetW2lResult(resultToken: string) : Promise res.json()) .then(res => { - const response : W2lInferenceResultResponsePayload = res; - if (!response.success) { - return; + const response : W2lInferenceResultResponsePayload = res; + + if (response?.success) { + return response.result!; + } + + if (response?.success === false) { + if (response.error_reason?.includes("not found")) { + return W2lResultLookupError.NotFound; + } else { + return W2lResultLookupError.ServerError; + } } - return response?.result; + + return W2lResultLookupError.FrontendError; }) .catch(e => { - return undefined; + return W2lResultLookupError.FrontendError; }); } diff --git a/vocodes/src/v2/api/w2l/GetW2lTemplate.ts b/vocodes/src/v2/api/w2l/GetW2lTemplate.ts index 3a18e5ef00..5ae986f650 100644 --- a/vocodes/src/v2/api/w2l/GetW2lTemplate.ts +++ b/vocodes/src/v2/api/w2l/GetW2lTemplate.ts @@ -54,22 +54,22 @@ interface W2lTemplateViewResponsePayload { } export async function GetW2lTemplate(templateToken: string) : Promise { - const endpoint = new ApiConfig().viewW2lTemplate(templateToken); + const endpoint = new ApiConfig().viewW2lTemplate(templateToken); - return await fetch(endpoint, { - method: 'GET', - headers: { - 'Accept': 'application/json', - }, - credentials: 'include', - }) - .then(res => res.json()) - .then(res => { - const templatesResponse : W2lTemplateViewResponsePayload = res; + return await fetch(endpoint, { + method: 'GET', + headers: { + 'Accept': 'application/json', + }, + credentials: 'include', + }) + .then(res => res.json()) + .then(res => { + const templatesResponse : W2lTemplateViewResponsePayload = res; - if (templatesResponse?.success) { - return templatesResponse.template!; - } + if (templatesResponse?.success) { + return templatesResponse.template!; + } if (templatesResponse?.success === false) { if (templatesResponse.error_reason?.includes("not found")) { diff --git a/vocodes/src/v2/view/w2l/w2l_result_delete/W2lResultDeleteFc.tsx b/vocodes/src/v2/view/w2l/w2l_result_delete/W2lResultDeleteFc.tsx index becb82521f..ba2704833c 100644 --- a/vocodes/src/v2/view/w2l/w2l_result_delete/W2lResultDeleteFc.tsx +++ b/vocodes/src/v2/view/w2l/w2l_result_delete/W2lResultDeleteFc.tsx @@ -4,7 +4,7 @@ import { ApiConfig } from '../../../../common/ApiConfig'; import { FrontendUrlConfig } from '../../../../common/FrontendUrlConfig'; import { SessionWrapper } from '../../../../session/SessionWrapper'; import { useParams, Link, useHistory } from 'react-router-dom'; -import { GetW2lResult, W2lResult } from '../../../api/w2l/GetW2lResult'; +import { GetW2lResult, GetW2lResultIsOk, W2lResult } from '../../../api/w2l/GetW2lResult'; interface Props { sessionWrapper: SessionWrapper, @@ -19,7 +19,7 @@ function W2lResultDeleteFc(props: Props) { const getInferenceResult = useCallback(async (token) => { const templateResponse = await GetW2lResult(token); - if (templateResponse) { + if (GetW2lResultIsOk(templateResponse)) { setW2lInferenceResult(templateResponse) } }, []); @@ -74,7 +74,7 @@ function W2lResultDeleteFc(props: Props) { } let currentlyDeleted = !!w2lInferenceResult?.maybe_moderator_fields?.mod_deleted_at || - !!w2lInferenceResult?.maybe_moderator_fields?.user_deleted_at; + !!w2lInferenceResult?.maybe_moderator_fields?.result_creator_deleted_at; const h1Title = currentlyDeleted ? "Undelete Result?" : "Delete Result?"; @@ -88,7 +88,6 @@ function W2lResultDeleteFc(props: Props) { "Recover the W2L Result (makes it visible again)" : "Delete W2L Result (hides from everyone but mods)"; - const durationSeconds = (w2lInferenceResult?.duration_millis || 0) / 1000; return ( diff --git a/vocodes/src/v2/view/w2l/w2l_result_view/W2lResultViewFc.tsx b/vocodes/src/v2/view/w2l/w2l_result_view/W2lResultViewFc.tsx index 53339b2be0..1951d04a0b 100644 --- a/vocodes/src/v2/view/w2l/w2l_result_view/W2lResultViewFc.tsx +++ b/vocodes/src/v2/view/w2l/w2l_result_view/W2lResultViewFc.tsx @@ -8,7 +8,7 @@ import { HiddenIconFc } from '../../_icons/HiddenIcon'; import { VisibleIconFc } from '../../_icons/VisibleIcon'; import { FrontendUrlConfig } from '../../../../common/FrontendUrlConfig'; import { DownloadIcon } from '../../_icons/DownloadIcon'; -import { GetW2lResult, W2lResult } from '../../../api/w2l/GetW2lResult'; +import { GetW2lResult, GetW2lResultIsErr, GetW2lResultIsOk, W2lResult, W2lResultLookupError } from '../../../api/w2l/GetW2lResult'; import { MetaTags } from '../../../../common/MetaTags'; interface Props { @@ -19,11 +19,18 @@ function W2lResultViewFc(props: Props) { let { token } = useParams() as { token : string }; const [w2lInferenceResult, setW2lInferenceResult] = useState(undefined); + const [notFoundState, setNotFoundState] = useState(false); const getInferenceResult = useCallback(async (token) => { const templateResponse = await GetW2lResult(token); - if (templateResponse) { + if (GetW2lResultIsOk(templateResponse)) { setW2lInferenceResult(templateResponse) + } else if (GetW2lResultIsErr(templateResponse)) { + switch(templateResponse) { + case W2lResultLookupError.NotFound: + setNotFoundState(true); + break; + } } }, []); @@ -31,8 +38,14 @@ function W2lResultViewFc(props: Props) { getInferenceResult(token); }, [token, getInferenceResult]); // NB: Empty array dependency sets to run ONLY on mount - if (w2lInferenceResult === undefined) { - return
; + if (notFoundState) { + return ( +

Template result not found

+ ); + } + + if (!w2lInferenceResult) { + return
} let videoLink = new BucketConfig().getGcsUrl(w2lInferenceResult?.public_bucket_video_path); @@ -59,16 +72,24 @@ function W2lResultViewFc(props: Props) { - Creator IP address - {w2lInferenceResult?.maybe_moderator_fields?.creator_ip_address || "server error"} + Template creator is banned + {w2lInferenceResult?.maybe_moderator_fields?.template_creator_is_banned ? "banned" : "good standing" } + + + Result creator is banned (if user) + {w2lInferenceResult?.maybe_moderator_fields?.result_creator_is_banned_if_user ? "banned" : "good standing" } + + + Result creator IP address + {w2lInferenceResult?.maybe_moderator_fields?.result_creator_ip_address || "server error"} Mod deleted at (UTC) {w2lInferenceResult?.maybe_moderator_fields?.mod_deleted_at || "not deleted"} - User deleted at (UTC) - {w2lInferenceResult?.maybe_moderator_fields?.user_deleted_at || "not deleted"} + Result creator deleted at (UTC) + {w2lInferenceResult?.maybe_moderator_fields?.result_creator_deleted_at || "not deleted"} ); @@ -115,7 +136,7 @@ function W2lResultViewFc(props: Props) { Public ; const currentlyDeleted = !!w2lInferenceResult?.maybe_moderator_fields?.mod_deleted_at || - !!w2lInferenceResult?.maybe_moderator_fields?.user_deleted_at; + !!w2lInferenceResult?.maybe_moderator_fields?.result_creator_deleted_at; const deleteButtonTitle = currentlyDeleted ? "Undelete Result?" : "Delete Result?";