51cb05f418
Project CI / AI game creator shell Rust crates (push) Successful in 5m56s
Project CI / AI game creator shell Rust lane 2/2 (push) Successful in 6m36s
Project CI / AI game creator shell Rust lane 1/2 (push) Successful in 7m37s
Project CI / Backend tests (push) Successful in 9m22s
Project CI / Frontend tests (push) Successful in 4m40s
Project CI / AI game creator shell web tests (push) Successful in 3m50s
Project CI / Repository checks (push) Successful in 6m30s
Project CI / Native shell tests (push) Successful in 8m32s
本 PR 补齐创作者主页与关注粉丝功能的产品合同和工程设计,供后续按里程碑实施;本次只修改文档。 桌面导航第四项进入自己的创作者主页,“我的”移到第五项。游戏详情可进入作者主页并关注/取消关注;自己或他人的关注、粉丝列表均公开可查看,点击用户头像或昵称可进入其主页。本人支持取消/重新关注、回关和移除粉丝,并明确两个关注方向独立。 工程设计包含关系表与 DTO、认证和事务边界、跨页状态同步、共享组件、深链及验收要求,拆分关系查询和页面交互两个里程碑。按用户要求,游戏列表沿用最多 48 项的现有限制,不增加游戏目录分页改造。 验证: - 已合入最新 origin/master(21c79f54a);共享决策记录冲突保留双方新增内容。 - npm run check:encoding 通过。 - npm run check:doc-index 通过。 - git diff --check 与暂存差异检查通过。 - 相对 master 仅六份文档发生变化;没有业务代码或 schema 修改,未执行业务测试或部署。 Reviewed-on: #638 Co-authored-by: Linghong <ink29535@proton.me> Co-committed-by: Linghong <ink29535@proton.me>
62 lines
2.0 KiB
TypeScript
62 lines
2.0 KiB
TypeScript
import type {
|
|
CreatorConnections,
|
|
CreatorProfile,
|
|
CreatorRelationshipResponse,
|
|
} from '../../packages/shared/src/contracts/creator';
|
|
import { requestJson as requestApiJson } from './apiClient';
|
|
|
|
export type CreatorConnectionKind = 'following' | 'followers';
|
|
export type CreatorAction = 'follow' | 'unfollow' | 'remove-follower';
|
|
export const creatorPath = (id: string) =>
|
|
`/creators?id=${encodeURIComponent(id)}`;
|
|
export const connectionsPath = (id: string, tab: CreatorConnectionKind) =>
|
|
`/creators/connections?id=${encodeURIComponent(id)}&tab=${tab}`;
|
|
const userPath = (id: string) => `/api/creators/${encodeURIComponent(id)}`;
|
|
|
|
export function getCreator(id: string) {
|
|
return requestApiJson<CreatorProfile>(
|
|
userPath(id),
|
|
{ method: 'GET' },
|
|
'读取创作者资料失败',
|
|
{ skipAuth: true, skipRefresh: true },
|
|
);
|
|
}
|
|
export function getCreatorRelationship(id: string) {
|
|
return requestApiJson<CreatorRelationshipResponse>(
|
|
`${userPath(id)}/relationship`,
|
|
{ method: 'GET' },
|
|
'读取关注状态失败',
|
|
);
|
|
}
|
|
export function getCreatorConnections(
|
|
id: string,
|
|
kind: CreatorConnectionKind,
|
|
cursor: string | null,
|
|
authenticated: boolean,
|
|
) {
|
|
const query = new URLSearchParams({ limit: '20' });
|
|
if (cursor) query.set('cursor', cursor);
|
|
return requestApiJson<CreatorConnections>(
|
|
`${userPath(id)}/${kind}?${query}`,
|
|
{ method: 'GET' },
|
|
'读取用户列表失败',
|
|
authenticated ? undefined : { skipAuth: true, skipRefresh: true },
|
|
);
|
|
}
|
|
export function changeCreatorRelationship(id: string, action: CreatorAction) {
|
|
const path =
|
|
action === 'remove-follower'
|
|
? `/api/creators/me/followers/${encodeURIComponent(id)}`
|
|
: `${userPath(id)}/follow`;
|
|
return requestApiJson<CreatorRelationshipResponse>(
|
|
path,
|
|
{ method: action === 'follow' ? 'PUT' : 'DELETE' },
|
|
'关注操作失败',
|
|
{
|
|
// 写入不自动重放,包括鉴权刷新后的重放;失败由业务层回读确认。
|
|
skipRefresh: true,
|
|
retry: { maxRetries: 0 },
|
|
},
|
|
);
|
|
}
|