209 lines
5.7 KiB
TypeScript
209 lines
5.7 KiB
TypeScript
import {
|
|
type RuntimeRequestOptions,
|
|
requestPublicRpgRuntimeJson,
|
|
requestRpgRuntimeJson,
|
|
} from '../rpg-runtime/rpgRuntimeRequest';
|
|
import type {
|
|
CustomWorldGalleryDetailResponse,
|
|
CustomWorldGalleryResponse,
|
|
CustomWorldLibraryMutationResponse,
|
|
CustomWorldLibraryResponse,
|
|
} from '../../../packages/shared/src/contracts/runtime';
|
|
import type { CustomWorldProfile } from '../../types';
|
|
|
|
export type { RuntimeRequestOptions };
|
|
|
|
/**
|
|
* RPG 入口世界库 client 的真实实现。
|
|
* 第三批收口后,平台首页/详情页开始游戏链直接走 rpg-entry 域请求,不再反向穿旧 storageService 兼容层。
|
|
*/
|
|
export async function listRpgEntryWorldLibrary(
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<
|
|
CustomWorldLibraryResponse<CustomWorldProfile>
|
|
>(
|
|
'/custom-world-library',
|
|
{ method: 'GET' },
|
|
'读取自定义世界库失败',
|
|
options,
|
|
);
|
|
|
|
return Array.isArray(response?.entries) ? response.entries : [];
|
|
}
|
|
|
|
export async function listRpgEntryWorldGallery(
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestPublicRpgRuntimeJson<CustomWorldGalleryResponse>(
|
|
'/custom-world-gallery',
|
|
{ method: 'GET' },
|
|
'读取作品广场失败',
|
|
options,
|
|
);
|
|
|
|
return Array.isArray(response?.entries) ? response.entries : [];
|
|
}
|
|
|
|
export async function getRpgEntryWorldGalleryDetail(
|
|
ownerUserId: string,
|
|
profileId: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestPublicRpgRuntimeJson<
|
|
CustomWorldGalleryDetailResponse<CustomWorldProfile>
|
|
>(
|
|
`/custom-world-gallery/${encodeURIComponent(ownerUserId)}/${encodeURIComponent(profileId)}`,
|
|
{ method: 'GET' },
|
|
'读取作品详情失败',
|
|
options,
|
|
);
|
|
|
|
return response.entry;
|
|
}
|
|
|
|
export async function getRpgEntryWorldGalleryDetailByCode(
|
|
code: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestPublicRpgRuntimeJson<
|
|
CustomWorldGalleryDetailResponse<CustomWorldProfile>
|
|
>(
|
|
`/custom-world-gallery/by-code/${encodeURIComponent(code)}`,
|
|
{ method: 'GET' },
|
|
'读取作品详情失败',
|
|
options,
|
|
);
|
|
|
|
return response.entry;
|
|
}
|
|
|
|
export async function remixRpgEntryWorldGallery(
|
|
ownerUserId: string,
|
|
profileId: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<
|
|
CustomWorldLibraryMutationResponse<CustomWorldProfile>
|
|
>(
|
|
`/custom-world-gallery/${encodeURIComponent(ownerUserId)}/${encodeURIComponent(profileId)}/remix`,
|
|
{ method: 'POST' },
|
|
'Remix 作品失败',
|
|
options,
|
|
);
|
|
|
|
return {
|
|
entry: response.entry,
|
|
entries: Array.isArray(response?.entries) ? response.entries : [],
|
|
};
|
|
}
|
|
|
|
export async function recordRpgEntryWorldGalleryPlay(
|
|
ownerUserId: string,
|
|
profileId: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<
|
|
CustomWorldGalleryDetailResponse<CustomWorldProfile>
|
|
>(
|
|
`/custom-world-gallery/${encodeURIComponent(ownerUserId)}/${encodeURIComponent(profileId)}/play`,
|
|
{ method: 'POST' },
|
|
'记录作品游玩失败',
|
|
options,
|
|
);
|
|
|
|
return response.entry;
|
|
}
|
|
|
|
export async function upsertRpgEntryWorldProfile(
|
|
profile: CustomWorldProfile,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<
|
|
CustomWorldLibraryMutationResponse<CustomWorldProfile>
|
|
>(
|
|
`/custom-world-library/${encodeURIComponent(profile.id)}`,
|
|
{
|
|
method: 'PUT',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify({
|
|
profile,
|
|
}),
|
|
},
|
|
'保存自定义世界失败',
|
|
options,
|
|
);
|
|
|
|
return {
|
|
entry: response.entry,
|
|
entries: Array.isArray(response?.entries) ? response.entries : [],
|
|
};
|
|
}
|
|
|
|
export async function deleteRpgEntryWorldProfile(
|
|
profileId: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<
|
|
CustomWorldLibraryResponse<CustomWorldProfile>
|
|
>(
|
|
`/custom-world-library/${encodeURIComponent(profileId)}`,
|
|
{ method: 'DELETE' },
|
|
'删除自定义世界失败',
|
|
options,
|
|
);
|
|
|
|
return Array.isArray(response?.entries) ? response.entries : [];
|
|
}
|
|
|
|
export async function publishRpgEntryWorldProfile(
|
|
profileId: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<
|
|
CustomWorldLibraryMutationResponse<CustomWorldProfile>
|
|
>(
|
|
`/custom-world-library/${encodeURIComponent(profileId)}/publish`,
|
|
{ method: 'POST' },
|
|
'发布自定义世界失败',
|
|
options,
|
|
);
|
|
|
|
return {
|
|
entry: response.entry,
|
|
entries: Array.isArray(response?.entries) ? response.entries : [],
|
|
};
|
|
}
|
|
|
|
export async function unpublishRpgEntryWorldProfile(
|
|
profileId: string,
|
|
options: RuntimeRequestOptions = {},
|
|
) {
|
|
const response = await requestRpgRuntimeJson<
|
|
CustomWorldLibraryMutationResponse<CustomWorldProfile>
|
|
>(
|
|
`/custom-world-library/${encodeURIComponent(profileId)}/unpublish`,
|
|
{ method: 'POST' },
|
|
'下架自定义世界失败',
|
|
options,
|
|
);
|
|
|
|
return {
|
|
entry: response.entry,
|
|
entries: Array.isArray(response?.entries) ? response.entries : [],
|
|
};
|
|
}
|
|
|
|
export const rpgEntryLibraryClient = {
|
|
listWorldLibrary: listRpgEntryWorldLibrary,
|
|
listWorldGallery: listRpgEntryWorldGallery,
|
|
getWorldGalleryDetail: getRpgEntryWorldGalleryDetail,
|
|
getWorldGalleryDetailByCode: getRpgEntryWorldGalleryDetailByCode,
|
|
remixWorldGallery: remixRpgEntryWorldGallery,
|
|
recordWorldGalleryPlay: recordRpgEntryWorldGalleryPlay,
|
|
upsertWorldProfile: upsertRpgEntryWorldProfile,
|
|
deleteWorldProfile: deleteRpgEntryWorldProfile,
|
|
publishWorldProfile: publishRpgEntryWorldProfile,
|
|
unpublishWorldProfile: unpublishRpgEntryWorldProfile,
|
|
};
|