-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtracker-serializer.ts
More file actions
73 lines (69 loc) · 2.66 KB
/
tracker-serializer.ts
File metadata and controls
73 lines (69 loc) · 2.66 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// src/lib/tracker-serializer.ts
import "server-only"
import type { PlatformType } from "@/lib/adapters/constants"
import type { PlatformMeta } from "@/lib/adapters/types"
import { DEFAULT_TRACKER_COLOR } from "@/lib/constants"
import type { TrackerRow as FullTrackerRow, TrackerSnapshotRow } from "@/lib/db/schema"
import type { TrackerSummary } from "@/types/api"
type TrackerRow = Omit<
FullTrackerRow,
"encryptedApiToken" | "avatarData" | "avatarMimeType" | "avatarCachedAt" | "avatarRemoteUrl"
>
export function parsePlatformMeta(raw: string | null): PlatformMeta | null {
if (!raw) return null
try {
return JSON.parse(raw)
} catch {
return null
}
}
export function serializeTrackerResponse(
tracker: TrackerRow,
latest: TrackerSnapshotRow | null,
mask: (val: string | null | undefined) => string | null
): TrackerSummary {
return {
id: tracker.id,
name: tracker.name,
baseUrl: tracker.baseUrl,
platformType: tracker.platformType as PlatformType,
isActive: tracker.isActive,
lastPolledAt: tracker.lastPolledAt?.toISOString() ?? null,
lastError: tracker.lastError,
lastErrorAt: tracker.lastErrorAt?.toISOString() ?? null,
consecutiveFailures: tracker.consecutiveFailures,
pausedAt: tracker.pausedAt?.toISOString() ?? null,
userPausedAt: tracker.userPausedAt?.toISOString() ?? null,
color: tracker.color ?? DEFAULT_TRACKER_COLOR,
qbtTag: tracker.qbtTag,
mouseholeUrl: tracker.mouseholeUrl ?? null,
useProxy: tracker.useProxy,
countCrossSeedUnsatisfied: tracker.countCrossSeedUnsatisfied,
hideUnreadBadges: tracker.hideUnreadBadges,
isFavorite: tracker.isFavorite,
sortOrder: tracker.sortOrder,
joinedAt: tracker.joinedAt,
lastAccessAt: tracker.lastAccessAt ?? null,
remoteUserId: tracker.remoteUserId ?? null,
platformMeta: parsePlatformMeta(tracker.platformMeta),
createdAt: tracker.createdAt?.toISOString() ?? new Date().toISOString(),
latestStats: latest
? {
ratio: latest.ratio,
uploadedBytes: latest.uploadedBytes.toString(),
downloadedBytes: latest.downloadedBytes.toString(),
seedingCount: latest.seedingCount,
leechingCount: latest.leechingCount,
requiredRatio: latest.requiredRatio ?? null,
warned: latest.warned ?? null,
freeleechTokens: latest.freeleechTokens ?? null,
bufferBytes: latest.bufferBytes?.toString() ?? null,
hitAndRuns: latest.hitAndRuns ?? null,
seedbonus: latest.seedbonus ?? null,
shareScore: latest.shareScore ?? null,
username: mask(latest.username),
group: mask(latest.group),
}
: null,
}
}