auron
Version:
Interact with your ATProto labeler from your terminal
120 lines (113 loc) • 4.25 kB
text/typescript
import crypto from "crypto";
import { AppBskyActorDefs, ToolsOzoneModerationDefs } from "@atproto/api";
import { SubjectRow } from "../../schemas/subject";
import { RecordRow } from "../../schemas/record";
import { RepoRow } from "../../schemas/repo";
import { ProfileRow } from "../../schemas/profile";
export const transformStatusToSubject = (
status: ToolsOzoneModerationDefs.SubjectStatusView
) => {
return {
id: status.id,
reviewState: status.reviewState,
createdAt: status.createdAt,
updatedAt: status.updatedAt,
lastReportedAt: status.lastReportedAt || null,
lastReviewedBy: status.lastReviewedBy || null,
lastReviewedAt: status.lastReviewedAt || null,
takendown: status.takendown ? 1 : 0,
subjectRepoHandle: status.subjectRepoHandle,
subjectBlobCids: (status.subjectBlobCids || []).join(","),
tags: (status.tags || []).join(","),
did: (status.subject["did"] ||
(status.subject["uri"] as string)
.split("/")
.find((p) => p.startsWith("did:")) ||
"") as string,
recordPath: status.subject["uri"]
? `${status.subject["uri"]}`.split("/").slice(-2).join("/")
: "",
lastAppealedAt: status.lastAppealedAt || null,
suspendUntil: status.suspendUntil || null,
muteUntil: status.muteUntil || null,
muteReportingUntil: status.muteReportingUntil || null,
comment: status.comment || "",
};
};
// Transform repo view to repo row
export function transformRepoViewToRepo(
repoView: ToolsOzoneModerationDefs.RepoViewDetail
) {
return {
did: repoView.did,
handle: repoView.handle,
ip: `${repoView.ip}`,
profile: JSON.stringify(repoView.relatedRecords?.[0] || {}),
indexedAt: repoView.indexedAt,
email: `${repoView.email}`,
emailConfirmedAt: repoView.emailConfirmedAt || null,
threatSignatures: JSON.stringify(repoView.threatSignatures),
labels: JSON.stringify(repoView.labels),
};
}
// Transform profile view to profile row
export function transformProfileViewToProfile(
profileView: AppBskyActorDefs.ProfileViewDetailed
): ProfileRow {
return {
did: profileView.did,
handle: profileView.handle,
displayName: profileView.displayName || "",
description: profileView.description || "",
avatar: profileView.avatar || "",
banner: profileView.banner || "",
followersCount: profileView.followersCount || 0,
followsCount: profileView.followsCount || 0,
postsCount: profileView.postsCount || 0,
associated: profileView.associated
? JSON.stringify(profileView.associated)
: undefined,
joinedViaStarterPack: profileView.joinedViaStarterPack
? JSON.stringify(profileView.joinedViaStarterPack)
: undefined,
indexedAt: profileView.indexedAt || undefined,
createdAt: profileView.createdAt || undefined,
viewer: profileView.viewer ? JSON.stringify(profileView.viewer) : undefined,
labels: profileView.labels ? JSON.stringify(profileView.labels) : undefined,
pinnedPost: profileView.pinnedPost
? JSON.stringify(profileView.pinnedPost)
: undefined,
extra: profileView.extra ? JSON.stringify(profileView.extra) : undefined,
syncedAt: new Date().toISOString(),
};
}
export function transformRecordViewToRecord(
recordView: ToolsOzoneModerationDefs.RecordViewDetail
) {
return {
uri: recordView.uri,
cid: recordView.cid,
value: JSON.stringify(recordView.value),
blobCids: JSON.stringify(recordView.blobCids),
indexedAt: recordView.indexedAt,
blobs: JSON.stringify(recordView.blobs),
labels: JSON.stringify(recordView.labels),
};
}
const hashValue = (value: string): string => {
return crypto.createHash("sha256").update(value).digest("hex");
};
export function transformFullStatusFromDatabase(
entry: SubjectRow & RecordRow & RepoRow
) {
return {
...entry,
profile: JSON.parse(entry.profile),
ip: entry.ip ? hashValue(entry.ip) : "",
// email: entry.email ? hashValue(entry.email) : "",
emailDomain: entry.email ? entry.email.split("@")[1] : "",
threatSignatures: JSON.parse(entry.threatSignatures),
blobs: entry.blobs ? JSON.parse(entry.blobs) : entry.blobs,
value: entry.value ? JSON.parse(entry.value) : entry.value,
};
}