feat: align with upstream 1.5.9.9
This commit is contained in:
@@ -0,0 +1,104 @@
|
||||
import { maskStudentName } from './siteUtils'
|
||||
|
||||
/**
|
||||
* 可脱敏的用户/参与者接口
|
||||
*/
|
||||
export interface MaskableUser {
|
||||
id?: number | string
|
||||
name?: string
|
||||
displayName?: string
|
||||
grade?: string | null
|
||||
class?: string | null
|
||||
[key: string]: any
|
||||
}
|
||||
|
||||
/**
|
||||
* 可脱敏的歌曲信息接口
|
||||
*/
|
||||
export interface MaskableSong {
|
||||
requester?: string
|
||||
requesterGrade?: string | null
|
||||
requesterClass?: string | null
|
||||
collaborators?: MaskableUser[]
|
||||
replayRequesters?: MaskableUser[]
|
||||
[key: string]: any
|
||||
}
|
||||
|
||||
/**
|
||||
* 对单个参与者(联合投稿人、重播申请人)进行脱敏
|
||||
* @param user 参与者对象
|
||||
*/
|
||||
export function maskUserInfo(user: MaskableUser) {
|
||||
if (user.name) user.name = maskStudentName(user.name)
|
||||
if (user.displayName) user.displayName = maskStudentName(user.displayName)
|
||||
user.grade = null
|
||||
user.class = null
|
||||
}
|
||||
|
||||
/**
|
||||
* 对单首歌曲的投稿相关信息进行脱敏
|
||||
* @param song 歌曲对象
|
||||
*/
|
||||
export function maskSongInfo(song: MaskableSong) {
|
||||
// 脱敏主投稿人姓名
|
||||
if (song.requester) {
|
||||
song.requester = maskStudentName(song.requester)
|
||||
}
|
||||
|
||||
// 隐藏主投稿人年级和班级
|
||||
if (song.requesterGrade !== undefined) song.requesterGrade = null
|
||||
if (song.requesterClass !== undefined) song.requesterClass = null
|
||||
|
||||
// 批量脱敏联合投稿人
|
||||
if (song.collaborators && Array.isArray(song.collaborators)) {
|
||||
song.collaborators.forEach(maskUserInfo)
|
||||
}
|
||||
|
||||
// 批量脱敏重播申请人
|
||||
if (song.replayRequesters && Array.isArray(song.replayRequesters)) {
|
||||
song.replayRequesters.forEach(maskUserInfo)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量脱敏歌曲列表(通常用于 index.get.ts)
|
||||
* @param songs 歌曲列表
|
||||
*/
|
||||
export function maskSongsInfo(songs: MaskableSong[]) {
|
||||
songs.forEach(maskSongInfo)
|
||||
}
|
||||
|
||||
/**
|
||||
* 公共排期项接口
|
||||
*/
|
||||
export interface PublicScheduleItem {
|
||||
song?: MaskableSong
|
||||
[key: string]: any
|
||||
}
|
||||
|
||||
/**
|
||||
* 批量脱敏公共排期数据(通常用于 public.get.ts)
|
||||
* @param data 排期数据列表
|
||||
*/
|
||||
export function maskPublicScheduleData(data: PublicScheduleItem[]) {
|
||||
data.forEach((item) => {
|
||||
if (item.song) {
|
||||
maskSongInfo(item.song)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
/** 移除匿名响应中的内部用户和点歌券标识,避免通过 ID 关联被脱敏的数据。 */
|
||||
export function stripAnonymousSongIdentifiers(song: MaskableSong) {
|
||||
delete song.requesterId
|
||||
delete song.cardCodeId
|
||||
|
||||
song.collaborators?.forEach((user) => delete user.id)
|
||||
song.replayRequesters?.forEach((user) => delete user.id)
|
||||
}
|
||||
|
||||
export function stripAnonymousSongIdentifiersFromSchedules(data: PublicScheduleItem[]) {
|
||||
data.forEach((item) => {
|
||||
if (item.song) stripAnonymousSongIdentifiers(item.song)
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user