72 lines
2.7 KiB
TypeScript
72 lines
2.7 KiB
TypeScript
import type { Song as ApiSong } from "./types"
|
||
import type { Song as ComponentSong } from "@/components/songs/song-detail-dialog"
|
||
|
||
/**
|
||
* 将API歌曲类型转换为组件歌曲类型
|
||
*/
|
||
export function apiSongToComponentSong(apiSong: ApiSong): ComponentSong {
|
||
// 优先使用rawData中的数据,这样可以确保编辑时加载所有原始数据
|
||
const rawData = apiSong.rawData;
|
||
const attributes = rawData?.attributes || {};
|
||
|
||
return {
|
||
id: apiSong.id,
|
||
name: apiSong.name,
|
||
composer: apiSong.composer || attributes.composer || "",
|
||
lyricist: apiSong.lyricist || attributes.lyricist || "",
|
||
duration: apiSong.duration || attributes.duration || "",
|
||
releaseDate: apiSong.releaseDate,
|
||
status: apiSong.status || rawData?.status_display || "",
|
||
image: apiSong.image || rawData?.image_url || undefined,
|
||
audioUrl: apiSong.audioUrl || attributes.audio_file || "",
|
||
description: apiSong.description || rawData?.description || "",
|
||
rarity: apiSong.rarity || rawData?.rarity_display || "",
|
||
cardType: apiSong.cardType || rawData?.card_type_display || "",
|
||
genre: apiSong.genre || attributes.genre || "",
|
||
lyrics: apiSong.lyrics || attributes.lyrics || "",
|
||
bpm: apiSong.bpm || attributes.bpm || 0
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 将组件歌曲类型转换为API歌曲类型,保留原始数据
|
||
*/
|
||
export function componentSongToApiSong(componentSong: ComponentSong, originalApiSong?: ApiSong): ApiSong {
|
||
// 获取原始数据
|
||
const rawData = originalApiSong?.rawData;
|
||
|
||
return {
|
||
id: componentSong.id,
|
||
name: componentSong.name,
|
||
composer: componentSong.composer,
|
||
lyricist: componentSong.lyricist,
|
||
duration: componentSong.duration,
|
||
releaseDate: componentSong.releaseDate,
|
||
status: componentSong.status,
|
||
image: componentSong.image,
|
||
audioUrl: componentSong.audioUrl,
|
||
description: componentSong.description,
|
||
rarity: componentSong.rarity,
|
||
cardType: componentSong.cardType,
|
||
genre: componentSong.genre,
|
||
lyrics: componentSong.lyrics,
|
||
bpm: typeof componentSong.bpm === 'string' ? parseInt(componentSong.bpm, 10) : componentSong.bpm,
|
||
// 保留原始数据
|
||
rawData: rawData ? {
|
||
...rawData,
|
||
// 更新原始数据中的相关字段
|
||
name: componentSong.name,
|
||
description: componentSong.description || rawData.description,
|
||
attributes: {
|
||
...rawData.attributes,
|
||
composer: componentSong.composer,
|
||
lyricist: componentSong.lyricist,
|
||
duration: componentSong.duration,
|
||
genre: componentSong.genre,
|
||
lyrics: componentSong.lyrics,
|
||
bpm: typeof componentSong.bpm === 'string' ? parseInt(componentSong.bpm, 10) : componentSong.bpm,
|
||
audio_file: componentSong.audioUrl
|
||
}
|
||
} : undefined
|
||
}
|
||
}
|