Skip to content

Commit

Permalink
[bugfix/frontend] Export/import CSV correctly (#2294)
Browse files Browse the repository at this point in the history
* [bugfix/frontend] Export/import CSV correctly

* export mastodon style
  • Loading branch information
tsmethurst committed Oct 24, 2023
1 parent 1e632dc commit 5fdc005
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 14 deletions.
12 changes: 6 additions & 6 deletions web/source/settings/lib/query/admin/domain-permissions/export.ts
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,12 @@ function exportProcess(formData: ExportDomainPermsParams): _exportProcess {
if (formData.exportType == "csv") {
return {
transformEntry: (entry) => [
entry.domain, // #domain
"suspend", // #severity
false, // #reject_media
false, // #reject_reports
entry.public_comment, // #public_comment
entry.obfuscate ?? false // #obfuscate
entry.domain, // domain
"suspend", // severity
false, // reject_media
false, // reject_reports
entry.public_comment ?? "", // public_comment
entry.obfuscate ?? false // obfuscate
],
stringify: (list) => csvUnparse({
fields: [
Expand Down
35 changes: 28 additions & 7 deletions web/source/settings/lib/query/admin/domain-permissions/process.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ import { isValidDomainPermission, hasBetterScope } from "../../../util/domain-pe
import { gtsApi } from "../../gts-api";

import {
isDomainPerms,
validateDomainPerms,
type DomainPerm,
} from "../../../types/domain-permission";

Expand All @@ -43,19 +43,39 @@ function parseDomainList(list: string): DomainPerm[] {
if (list.startsWith("[")) {
// Assume JSON array.
const data = JSON.parse(list);
if (!isDomainPerms(data)) {
throw "parsed JSON was not array of DomainPermission";

const validateRes = validateDomainPerms(data);
if (!validateRes.success) {
throw `parsed JSON was not array of DomainPermission: ${JSON.stringify(validateRes.errors)}`;
}

return data;
} else if (list.startsWith("#domain") || list.startsWith("domain,severity")) {
// Assume Mastodon-style CSV.
const csvParseCfg: CSVParseConfig = {
// Key by header.
header: true,
// Remove leading '#' if present.
// Remove leading '#' from headers if present.
transformHeader: (header) => header.startsWith("#") ? header.slice(1) : header,
// Massage weird boolean values.
transform: (value, _field) => {
if (value == "False" || value == "True") {
return value.toLowerCase();
} else {
return value;
}
},
skipEmptyLines: true,
dynamicTyping: true
// Only dynamic type boolean values,
// leave the rest as strings.
dynamicTyping: {
"domain": false,
"severity": false,
"reject_media": true,
"reject_reports": true,
"public_comment": false,
"obfuscate": true,
}
};

const { data, errors } = csvParse(list, csvParseCfg);
Expand All @@ -67,8 +87,9 @@ function parseDomainList(list: string): DomainPerm[] {
throw error;
}

if (!isDomainPerms(data)) {
throw "parsed CSV was not array of DomainPermission";
const validateRes = validateDomainPerms(data);
if (!validateRes.success) {
throw `parsed CSV was not array of DomainPermission: ${JSON.stringify(validateRes.errors)}`;
}

return data;
Expand Down
2 changes: 1 addition & 1 deletion web/source/settings/lib/types/domain-permission.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@

import typia from "typia";

export const isDomainPerms = typia.createIs<DomainPerm[]>();
export const validateDomainPerms = typia.createValidate<DomainPerm[]>();

export type PermType = "block" | "allow";

Expand Down

0 comments on commit 5fdc005

Please sign in to comment.