返回 AiToEarn
analytics.vo.ts
1 import { AccountType, createZodDto } from '@yikart/common'
2 import { z } from 'zod'
3
4 export const ChannelAccountProfileSnapshotVoSchema = z.object({
5 displayName: z.string().optional().describe('平台展示名称'),
6 username: z.string().optional().describe('平台用户名'),
7 avatarUrl: z.string().optional().describe('头像 URL'),
8 accountType: z.string().optional().describe('平台账号类型'),
9 })
10
11 export const ChannelAccountMetricsSnapshotVoSchema = z.object({
12 fansCount: z.number().optional().describe('粉丝数'),
13 followingCount: z.number().optional().describe('关注数'),
14 workCount: z.number().optional().describe('作品数'),
15 readCount: z.number().optional().describe('阅读数'),
16 viewCount: z.number().optional().describe('浏览数'),
17 impressionCount: z.number().optional().describe('曝光数'),
18 reachCount: z.number().optional().describe('触达数'),
19 likeCount: z.number().optional().describe('点赞数'),
20 collectCount: z.number().optional().describe('收藏数'),
21 forwardCount: z.number().optional().describe('转发数'),
22 commentCount: z.number().optional().describe('评论数'),
23 clickCount: z.number().optional().describe('点击数'),
24 engagementCount: z.number().optional().describe('互动数'),
25 })
26
27 export const ChannelWorkSnapshotVoSchema = z.object({
28 id: z.string().describe('平台作品 ID'),
29 url: z.string().optional().describe('作品链接'),
30 title: z.string().optional().describe('作品标题'),
31 description: z.string().optional().describe('作品描述'),
32 mediaType: z.string().optional().describe('作品媒体类型'),
33 coverUrl: z.string().optional().describe('封面 URL'),
34 publishedAt: z.coerce.date().optional().describe('发布时间'),
35 status: z.string().optional().describe('作品状态'),
36 author: z.string().optional().describe('作者'),
37 })
38
39 export const ChannelWorkMetricsSnapshotVoSchema = z.object({
40 viewCount: z.number().optional().describe('浏览数'),
41 playCount: z.number().optional().describe('播放数'),
42 impressionCount: z.number().optional().describe('曝光数'),
43 reachCount: z.number().optional().describe('触达数'),
44 likeCount: z.number().optional().describe('点赞数'),
45 collectCount: z.number().optional().describe('收藏数'),
46 commentCount: z.number().optional().describe('评论数'),
47 shareCount: z.number().optional().describe('分享数'),
48 saveCount: z.number().optional().describe('保存数'),
49 clickCount: z.number().optional().describe('点击数'),
50 engagementCount: z.number().optional().describe('互动数'),
51 watchTimeSeconds: z.number().optional().describe('观看时长秒数'),
52 })
53
54 export const ChannelAccountDataSnapshotVoSchema = z.object({
55 id: z.string().optional().describe('快照 ID'),
56 platformUid: z.string().optional().describe('平台账号 UID'),
57 snapshotAt: z.coerce.date().describe('快照对应时间'),
58 fetchedAt: z.coerce.date().describe('平台数据获取时间'),
59 periodStartAt: z.coerce.date().optional().describe('区间开始时间'),
60 periodEndAt: z.coerce.date().optional().describe('区间结束时间'),
61 profile: ChannelAccountProfileSnapshotVoSchema.optional().describe('账号资料'),
62 metrics: ChannelAccountMetricsSnapshotVoSchema.optional().describe('账号指标'),
63 extra: z.record(z.string(), z.unknown()).optional().describe('平台特殊字段'),
64 })
65
66 export const ChannelWorkDataSnapshotVoSchema = z.object({
67 id: z.string().optional().describe('快照 ID'),
68 platformWorkId: z.string().optional().describe('平台作品 ID'),
69 snapshotAt: z.coerce.date().describe('快照对应时间'),
70 fetchedAt: z.coerce.date().describe('平台数据获取时间'),
71 periodStartAt: z.coerce.date().optional().describe('区间开始时间'),
72 periodEndAt: z.coerce.date().optional().describe('区间结束时间'),
73 work: ChannelWorkSnapshotVoSchema.describe('作品资料'),
74 metrics: ChannelWorkMetricsSnapshotVoSchema.optional().describe('作品指标'),
75 extra: z.record(z.string(), z.unknown()).optional().describe('平台特殊字段'),
76 })
77
78 export const ChannelAccountAnalyticsVoSchema = z.object({
79 platform: z.enum(AccountType).describe('平台'),
80 accountId: z.string().describe('账号 ID'),
81 profile: ChannelAccountProfileSnapshotVoSchema.optional().describe('账号资料'),
82 metrics: ChannelAccountMetricsSnapshotVoSchema.optional().describe('账号指标'),
83 snapshots: z.array(ChannelAccountDataSnapshotVoSchema).default([]).describe('本次保存的账号数据快照'),
84 extra: z.record(z.string(), z.unknown()).optional().describe('平台特殊字段'),
85 snapshotId: z.string().optional().describe('本次主快照 ID'),
86 fetchedAt: z.coerce.date().optional().describe('平台数据获取时间'),
87 message: z.string().optional().describe('提示信息'),
88 })
89
90 export class ChannelAccountAnalyticsVo extends createZodDto(
91 ChannelAccountAnalyticsVoSchema,
92 'ChannelAccountAnalyticsVo',
93 ) {}
94
95 export const ChannelWorkAnalyticsVoSchema = z.object({
96 platform: z.enum(AccountType).describe('平台'),
97 accountId: z.string().optional().describe('账号 ID'),
98 platformWorkId: z.string().describe('平台作品 ID'),
99 work: ChannelWorkSnapshotVoSchema.optional().describe('作品资料'),
100 metrics: ChannelWorkMetricsSnapshotVoSchema.optional().describe('作品指标'),
101 snapshots: z.array(ChannelWorkDataSnapshotVoSchema).default([]).describe('本次保存的作品数据快照'),
102 extra: z.record(z.string(), z.unknown()).optional().describe('平台特殊字段'),
103 snapshotId: z.string().optional().describe('本次主快照 ID'),
104 fetchedAt: z.coerce.date().optional().describe('平台数据获取时间'),
105 message: z.string().optional().describe('提示信息'),
106 })
107
108 export class ChannelWorkAnalyticsVo extends createZodDto(
109 ChannelWorkAnalyticsVoSchema,
110 'ChannelWorkAnalyticsVo',
111 ) {}
112
112 lines TYPESCRIPT