hide templates and template results from banned users

This commit is contained in:
Brandon Thomas committed 2021-09-03 06:35:07 -04:00
1 parent 5c2b17dcee
commit 91a552b83a
4 files changed
+89 -40

No files matched your search

+42 -13
View File
@@ -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<W2lResult | undefined> {
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<GetW2lResultResponse> {
const endpoint = new ApiConfig().viewW2lInferenceResult(resultToken);
return await fetch(endpoint, {
@@ -53,13 +72,23 @@ export async function GetW2lResult(resultToken: string) : Promise<W2lResult | un
})
.then(res => 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;
});
}
+14 -14
View File
@@ -54,22 +54,22 @@ interface W2lTemplateViewResponsePayload {
}
export async function GetW2lTemplate(templateToken: string) : Promise<GetW2lTemplateResponse> {
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")) {
@@ -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 (
@@ -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<W2lResult|undefined>(undefined);
const [notFoundState, setNotFoundState] = useState<boolean>(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 <div />;
if (notFoundState) {
return (
<h1 className="title is-1">Template result not found</h1>
);
}
if (!w2lInferenceResult) {
return <div />
}
let videoLink = new BucketConfig().getGcsUrl(w2lInferenceResult?.public_bucket_video_path);
@@ -59,16 +72,24 @@ function W2lResultViewFc(props: Props) {
</td>
</tr>
<tr>
<th>Creator IP address</th>
<td>{w2lInferenceResult?.maybe_moderator_fields?.creator_ip_address || "server error"}</td>
<th>Template creator is banned</th>
<td>{w2lInferenceResult?.maybe_moderator_fields?.template_creator_is_banned ? "banned" : "good standing" }</td>
</tr>
<tr>
<th>Result creator is banned (if user)</th>
<td>{w2lInferenceResult?.maybe_moderator_fields?.result_creator_is_banned_if_user ? "banned" : "good standing" }</td>
</tr>
<tr>
<th>Result creator IP address</th>
<td>{w2lInferenceResult?.maybe_moderator_fields?.result_creator_ip_address || "server error"}</td>
</tr>
<tr>
<th>Mod deleted at (UTC)</th>
<td>{w2lInferenceResult?.maybe_moderator_fields?.mod_deleted_at || "not deleted"}</td>
</tr>
<tr>
<th>User deleted at (UTC)</th>
<td>{w2lInferenceResult?.maybe_moderator_fields?.user_deleted_at || "not deleted"}</td>
<th>Result creator deleted at (UTC)</th>
<td>{w2lInferenceResult?.maybe_moderator_fields?.result_creator_deleted_at || "not deleted"}</td>
</tr>
</>
);
@@ -115,7 +136,7 @@ function W2lResultViewFc(props: Props) {
<span>Public <VisibleIconFc /></span> ;
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?";