sa2kit 1.6.91 → 1.6.96
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/client-BlkUL2To.d.ts +26 -0
- package/dist/client-DpMIhrlS.d.mts +26 -0
- package/dist/huarongdao/index.d.mts +8 -0
- package/dist/huarongdao/index.d.ts +8 -0
- package/dist/huarongdao/index.js +360 -0
- package/dist/huarongdao/index.js.map +1 -0
- package/dist/huarongdao/index.mjs +338 -0
- package/dist/huarongdao/index.mjs.map +1 -0
- package/dist/huarongdao/logic/index.d.mts +11 -0
- package/dist/huarongdao/logic/index.d.ts +11 -0
- package/dist/huarongdao/logic/index.js +89 -0
- package/dist/huarongdao/logic/index.js.map +1 -0
- package/dist/huarongdao/logic/index.mjs +81 -0
- package/dist/huarongdao/logic/index.mjs.map +1 -0
- package/dist/huarongdao/routes/index.d.mts +38 -0
- package/dist/huarongdao/routes/index.d.ts +38 -0
- package/dist/huarongdao/routes/index.js +114 -0
- package/dist/huarongdao/routes/index.js.map +1 -0
- package/dist/huarongdao/routes/index.mjs +108 -0
- package/dist/huarongdao/routes/index.mjs.map +1 -0
- package/dist/huarongdao/server/index.d.mts +14 -0
- package/dist/huarongdao/server/index.d.ts +14 -0
- package/dist/huarongdao/server/index.js +60 -0
- package/dist/huarongdao/server/index.js.map +1 -0
- package/dist/huarongdao/server/index.mjs +57 -0
- package/dist/huarongdao/server/index.mjs.map +1 -0
- package/dist/huarongdao/service/index.d.mts +31 -0
- package/dist/huarongdao/service/index.d.ts +31 -0
- package/dist/huarongdao/service/index.js +45 -0
- package/dist/huarongdao/service/index.js.map +1 -0
- package/dist/huarongdao/service/index.mjs +42 -0
- package/dist/huarongdao/service/index.mjs.map +1 -0
- package/dist/huarongdao/types/index.d.mts +46 -0
- package/dist/huarongdao/types/index.d.ts +46 -0
- package/dist/huarongdao/types/index.js +4 -0
- package/dist/huarongdao/types/index.js.map +1 -0
- package/dist/huarongdao/types/index.mjs +3 -0
- package/dist/huarongdao/types/index.mjs.map +1 -0
- package/dist/huarongdao/ui/web/index.d.mts +3 -0
- package/dist/huarongdao/ui/web/index.d.ts +3 -0
- package/dist/huarongdao/ui/web/index.js +237 -0
- package/dist/huarongdao/ui/web/index.js.map +1 -0
- package/dist/huarongdao/ui/web/index.mjs +229 -0
- package/dist/huarongdao/ui/web/index.mjs.map +1 -0
- package/dist/index-B48rcsqv.d.ts +27 -0
- package/dist/index-BNqJdwX4.d.ts +37 -0
- package/dist/index-C7yh6b5Q.d.mts +17 -0
- package/dist/index-CDapUIT5.d.mts +51 -0
- package/dist/index-Cv9jlnNz.d.ts +17 -0
- package/dist/index-D3UbkUai.d.ts +51 -0
- package/dist/index-DOtQI_mz.d.mts +37 -0
- package/dist/index-Da2X78GE.d.mts +27 -0
- package/dist/index.d.mts +18 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.js +1707 -79
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1675 -82
- package/dist/index.mjs.map +1 -1
- package/dist/mikuContest/index.d.mts +13 -0
- package/dist/mikuContest/index.d.ts +13 -0
- package/dist/mikuContest/index.js +1310 -0
- package/dist/mikuContest/index.js.map +1 -0
- package/dist/mikuContest/index.mjs +1253 -0
- package/dist/mikuContest/index.mjs.map +1 -0
- package/dist/mikuContest/logic/index.d.mts +32 -0
- package/dist/mikuContest/logic/index.d.ts +32 -0
- package/dist/mikuContest/logic/index.js +511 -0
- package/dist/mikuContest/logic/index.js.map +1 -0
- package/dist/mikuContest/logic/index.mjs +483 -0
- package/dist/mikuContest/logic/index.mjs.map +1 -0
- package/dist/mikuContest/routes/index.d.mts +80 -0
- package/dist/mikuContest/routes/index.d.ts +80 -0
- package/dist/mikuContest/routes/index.js +821 -0
- package/dist/mikuContest/routes/index.js.map +1 -0
- package/dist/mikuContest/routes/index.mjs +791 -0
- package/dist/mikuContest/routes/index.mjs.map +1 -0
- package/dist/mikuContest/server/index.d.mts +766 -0
- package/dist/mikuContest/server/index.d.ts +766 -0
- package/dist/mikuContest/server/index.js +705 -0
- package/dist/mikuContest/server/index.js.map +1 -0
- package/dist/mikuContest/server/index.mjs +672 -0
- package/dist/mikuContest/server/index.mjs.map +1 -0
- package/dist/mikuContest/service/index.d.mts +30 -0
- package/dist/mikuContest/service/index.d.ts +30 -0
- package/dist/mikuContest/service/index.js +139 -0
- package/dist/mikuContest/service/index.js.map +1 -0
- package/dist/mikuContest/service/index.mjs +135 -0
- package/dist/mikuContest/service/index.mjs.map +1 -0
- package/dist/mikuContest/types/index.d.mts +179 -0
- package/dist/mikuContest/types/index.d.ts +179 -0
- package/dist/mikuContest/types/index.js +4 -0
- package/dist/mikuContest/types/index.js.map +1 -0
- package/dist/mikuContest/types/index.mjs +3 -0
- package/dist/mikuContest/types/index.mjs.map +1 -0
- package/dist/mikuContest/ui/miniapp/index.d.mts +3 -0
- package/dist/mikuContest/ui/miniapp/index.d.ts +3 -0
- package/dist/mikuContest/ui/miniapp/index.js +566 -0
- package/dist/mikuContest/ui/miniapp/index.js.map +1 -0
- package/dist/mikuContest/ui/miniapp/index.mjs +540 -0
- package/dist/mikuContest/ui/miniapp/index.mjs.map +1 -0
- package/dist/mikuContest/ui/web/index.d.mts +4 -0
- package/dist/mikuContest/ui/web/index.d.ts +4 -0
- package/dist/mikuContest/ui/web/index.js +353 -0
- package/dist/mikuContest/ui/web/index.js.map +1 -0
- package/dist/mikuContest/ui/web/index.mjs +343 -0
- package/dist/mikuContest/ui/web/index.mjs.map +1 -0
- package/dist/qqbot/server/index.d.mts +126 -1
- package/dist/qqbot/server/index.d.ts +126 -1
- package/dist/qqbot/server/index.js +250 -0
- package/dist/qqbot/server/index.js.map +1 -1
- package/dist/qqbot/server/index.mjs +246 -1
- package/dist/qqbot/server/index.mjs.map +1 -1
- package/dist/service-D7DM1wW-.d.ts +38 -0
- package/dist/service-DPr2rlvH.d.mts +38 -0
- package/dist/types-BS7Xz09b.d.mts +14 -0
- package/dist/types-k4koMp4m.d.ts +14 -0
- package/package.json +76 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/mikuContest/logic/shared/defaults.ts","../../../src/mikuContest/logic/shared/validators.ts","../../../src/mikuContest/logic/shared/voting.ts","../../../src/mikuContest/server/service.ts","../../../src/mikuContest/server/persistence/drizzle-schema.ts","../../../src/mikuContest/server/persistence/drizzle-state-service.ts","../../../src/mikuContest/server/persistence/drizzle-adapter.ts","../../../src/mikuContest/server/persistence/service.ts","../../../src/mikuContest/routes/index.ts"],"names":["text"],"mappings":"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","file":"index.mjs","sourcesContent":["import type { MikuContestConfig, MikuVotingRules } from '../../types';\n\nexport const defaultMikuVotingRules: MikuVotingRules = {\n maxVotesPerDay: 3,\n forbidDuplicateVotePerWork: true,\n maxVotesPerDevicePerDay: 20,\n maxVotesPerIpPerDay: 100,\n};\n\nexport const createDefaultMikuContestConfig = (overrides?: Partial<MikuContestConfig>): MikuContestConfig => ({\n id: overrides?.id || 'miku-contest-default',\n name: overrides?.name || '初音未来社团征稿大赛',\n theme: overrides?.theme || '初音未来主题创作征稿',\n organizer: overrides?.organizer || '初音未来社团',\n awards: overrides?.awards || ['一等奖', '二等奖', '三等奖', '人气奖'],\n rules: overrides?.rules || '请确保作品原创且符合社团规范。',\n copyright: overrides?.copyright || '投稿即视为授权赛事展示与公示。',\n timeline: overrides?.timeline || {\n submissionStartAt: new Date().toISOString(),\n submissionEndAt: new Date().toISOString(),\n votingStartAt: new Date().toISOString(),\n votingEndAt: new Date().toISOString(),\n publicResultAt: new Date().toISOString(),\n },\n votingRules: {\n ...defaultMikuVotingRules,\n ...(overrides?.votingRules || {}),\n },\n toggles: {\n submissionEnabled: overrides?.toggles?.submissionEnabled ?? true,\n votingEnabled: overrides?.toggles?.votingEnabled ?? true,\n resultEnabled: overrides?.toggles?.resultEnabled ?? false,\n },\n});\n","import type { CreateMikuSubmissionInput, MikuWorkType } from '../../types';\n\nconst DESCRIPTION_LIMIT = 500;\nconst MINIAPP_DESCRIPTION_LIMIT = 200;\nconst TEXT_CONTENT_LIMIT = 2000;\nconst MAX_TAGS = 3;\n\nconst hasValue = (value: unknown): boolean => {\n return typeof value === 'string' ? value.trim().length > 0 : value !== null && value !== undefined;\n};\n\nconst validateByType = (type: MikuWorkType, input: CreateMikuSubmissionInput): string[] => {\n const errors: string[] = [];\n const { content } = input;\n\n switch (type) {\n case 'visual': {\n const imageCount = content.images?.length || 0;\n if (imageCount < 1 || imageCount > 3) {\n errors.push('视觉类作品需上传 1-3 张图片');\n }\n break;\n }\n case 'video': {\n if (!hasValue(content.videoLink)) {\n errors.push('视频类作品需提供视频链接');\n }\n if (!hasValue(content.coverImage)) {\n errors.push('视频类作品需提供封面图');\n }\n break;\n }\n case 'text': {\n const text = content.textContent || '';\n if (!text.trim()) {\n errors.push('文字类作品需填写正文');\n }\n if (text.length > TEXT_CONTENT_LIMIT) {\n errors.push(`文字正文不能超过 ${TEXT_CONTENT_LIMIT} 字`);\n }\n break;\n }\n case 'audio': {\n if (!hasValue(content.audioLink)) {\n errors.push('音频类作品需提供音频链接');\n }\n break;\n }\n default:\n break;\n }\n\n return errors;\n};\n\nexport const validateMikuSubmissionInput = (\n input: CreateMikuSubmissionInput,\n mode: 'web' | 'miniapp' = 'web',\n): string[] => {\n const errors: string[] = [];\n\n if (!input.contestId.trim()) errors.push('contestId 不能为空');\n if (!input.authorId.trim()) errors.push('authorId 不能为空');\n if (!input.authorNickname.trim()) errors.push('作者昵称不能为空');\n if (!input.title.trim()) errors.push('作品名称不能为空');\n\n const descriptionLimit = mode === 'miniapp' ? MINIAPP_DESCRIPTION_LIMIT : DESCRIPTION_LIMIT;\n if (input.description.length > descriptionLimit) {\n errors.push(`作品简介不能超过 ${descriptionLimit} 字`);\n }\n\n if ((input.tags?.length || 0) > MAX_TAGS) {\n errors.push(`标签最多 ${MAX_TAGS} 个`);\n }\n\n errors.push(...validateByType(input.type, input));\n return errors;\n};\n","import type { MikuVoteRecord, MikuVotingRules } from '../../types';\n\nexport const toVoteDayKey = (date: Date = new Date()): string => {\n const y = date.getUTCFullYear();\n const m = String(date.getUTCMonth() + 1).padStart(2, '0');\n const d = String(date.getUTCDate()).padStart(2, '0');\n return `${y}-${m}-${d}`;\n};\n\nexport interface VoteCheckContext {\n existingVotes: MikuVoteRecord[];\n submissionId: string;\n voterId: string;\n dayKey: string;\n rules: MikuVotingRules;\n}\n\nexport const checkVoteEligibility = (context: VoteCheckContext): { ok: boolean; reason?: string } => {\n const { existingVotes, submissionId, voterId, dayKey, rules } = context;\n\n const userTodayVotes = existingVotes.filter((vote) => vote.voterId === voterId && vote.dayKey === dayKey);\n\n if (userTodayVotes.length >= rules.maxVotesPerDay) {\n return { ok: false, reason: '已达到今日投票上限' };\n }\n\n if (rules.forbidDuplicateVotePerWork) {\n const duplicated = userTodayVotes.some((vote) => vote.submissionId === submissionId);\n if (duplicated) return { ok: false, reason: '不可重复投同一作品' };\n }\n\n return { ok: true };\n};\n\nexport const sortByVotesDesc = <T extends { voteCount: number; createdAt?: string }>(items: T[]): T[] => {\n return [...items].sort((a, b) => {\n if (b.voteCount === a.voteCount) {\n return (a.createdAt || '').localeCompare(b.createdAt || '');\n }\n return b.voteCount - a.voteCount;\n });\n};\n","import {\n checkVoteEligibility,\n createDefaultMikuContestConfig,\n sortByVotesDesc,\n toVoteDayKey,\n validateMikuSubmissionInput,\n} from '../logic/shared';\nimport * as XLSX from 'xlsx';\nimport type {\n CreateMikuAnnouncementInput,\n CreateMikuSubmissionInput,\n MikuAnnouncement,\n MikuContestConfig,\n MikuContestPersistedState,\n MikuContestStateSnapshot,\n MikuLeaderboardItem,\n MikuSubmissionExportRow,\n MikuSubmissionFilter,\n MikuSubmission,\n MikuVoterRestriction,\n MikuVoteRecord,\n ResetMikuVotesInput,\n ReviewMikuSubmissionInput,\n SetMikuVoterRestrictionInput,\n VoteMikuSubmissionInput,\n} from '../types';\n\nconst randomId = (prefix: string): string => {\n return `${prefix}_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 8)}`;\n};\n\nconst serialNo = (): string => {\n const now = new Date();\n const y = now.getFullYear();\n const m = String(now.getMonth() + 1).padStart(2, '0');\n const d = String(now.getDate()).padStart(2, '0');\n const seq = Math.floor(Math.random() * 9000 + 1000);\n return `MIKU-${y}${m}${d}-${seq}`;\n};\n\nexport interface MikuContestServiceOptions {\n contestConfig?: Partial<MikuContestConfig>;\n}\n\nexport class MikuContestService {\n private contest: MikuContestConfig;\n\n private readonly submissions = new Map<string, MikuSubmission>();\n\n private readonly votes: MikuVoteRecord[] = [];\n\n private readonly announcements = new Map<string, MikuAnnouncement>();\n\n private readonly voterRestrictions = new Map<string, MikuVoterRestriction>();\n\n constructor(options: MikuContestServiceOptions = {}) {\n this.contest = createDefaultMikuContestConfig(options.contestConfig);\n }\n\n getContestConfig(): MikuContestConfig {\n return this.contest;\n }\n\n updateContestConfig(patch: Partial<MikuContestConfig>): MikuContestConfig {\n this.contest = {\n ...this.contest,\n ...patch,\n votingRules: {\n ...this.contest.votingRules,\n ...(patch.votingRules || {}),\n },\n toggles: {\n ...this.contest.toggles,\n ...(patch.toggles || {}),\n },\n timeline: {\n ...this.contest.timeline,\n ...(patch.timeline || {}),\n },\n };\n\n return this.contest;\n }\n\n createSubmission(input: CreateMikuSubmissionInput, mode: 'web' | 'miniapp' = 'web'): MikuSubmission {\n if (!this.contest.toggles.submissionEnabled) {\n throw new Error('当前未开放投稿');\n }\n\n const errors = validateMikuSubmissionInput(input, mode);\n if (errors.length > 0) {\n throw new Error(errors.join(';'));\n }\n\n const now = new Date().toISOString();\n const next: MikuSubmission = {\n id: randomId('submission'),\n serialNo: serialNo(),\n contestId: input.contestId,\n authorId: input.authorId,\n authorNickname: input.authorNickname,\n title: input.title,\n type: input.type,\n description: input.description,\n tags: input.tags || [],\n content: input.content,\n voteCount: 0,\n status: 'pending',\n createdAt: now,\n updatedAt: now,\n };\n\n this.submissions.set(next.id, next);\n return next;\n }\n\n listSubmissions(filter?: MikuSubmissionFilter): MikuSubmission[] {\n const authorKeyword = filter?.authorKeyword?.trim().toLowerCase();\n const titleKeyword = filter?.titleKeyword?.trim().toLowerCase();\n\n return [...this.submissions.values()].filter((item) => {\n if (filter?.status && item.status !== filter.status) return false;\n if (filter?.type && item.type !== filter.type) return false;\n if (filter?.authorId && item.authorId !== filter.authorId) return false;\n if (authorKeyword && !item.authorNickname.toLowerCase().includes(authorKeyword)) return false;\n if (titleKeyword && !item.title.toLowerCase().includes(titleKeyword)) return false;\n return true;\n });\n }\n\n getSubmission(submissionId: string): MikuSubmission | null {\n return this.submissions.get(submissionId) || null;\n }\n\n reviewSubmission(input: ReviewMikuSubmissionInput): MikuSubmission {\n const current = this.submissions.get(input.submissionId);\n if (!current) throw new Error('投稿不存在');\n\n if (input.action === 'reject' && !input.rejectReason?.trim()) {\n throw new Error('驳回需填写原因');\n }\n\n const reviewed: MikuSubmission = {\n ...current,\n status: input.action === 'approve' ? 'approved' : 'rejected',\n rejectReason: input.action === 'reject' ? input.rejectReason?.trim() : undefined,\n reviewedAt: new Date().toISOString(),\n updatedAt: new Date().toISOString(),\n };\n\n this.submissions.set(reviewed.id, reviewed);\n return reviewed;\n }\n\n vote(input: VoteMikuSubmissionInput): MikuSubmission {\n if (!this.contest.toggles.votingEnabled) {\n throw new Error('当前未开放投票');\n }\n\n const restriction = this.voterRestrictions.get(input.voterId);\n if (restriction?.banned) {\n throw new Error('当前账号已被限制投票');\n }\n\n const target = this.submissions.get(input.submissionId);\n if (!target) throw new Error('作品不存在');\n if (target.status !== 'approved') throw new Error('仅可对已过审作品投票');\n\n const dayKey = toVoteDayKey();\n const eligible = checkVoteEligibility({\n existingVotes: this.votes,\n submissionId: input.submissionId,\n voterId: input.voterId,\n dayKey,\n rules: this.contest.votingRules,\n });\n\n if (!eligible.ok) {\n throw new Error(eligible.reason || '投票失败');\n }\n\n const vote: MikuVoteRecord = {\n id: randomId('vote'),\n contestId: input.contestId,\n submissionId: input.submissionId,\n voterId: input.voterId,\n votedAt: new Date().toISOString(),\n dayKey,\n deviceId: input.deviceId,\n ip: input.ip,\n };\n\n this.votes.push(vote);\n\n const updated: MikuSubmission = {\n ...target,\n voteCount: target.voteCount + 1,\n updatedAt: new Date().toISOString(),\n };\n this.submissions.set(updated.id, updated);\n\n return updated;\n }\n\n getVoterRestriction(voterId: string): MikuVoterRestriction | null {\n return this.voterRestrictions.get(voterId) || null;\n }\n\n setVoterRestriction(input: SetMikuVoterRestrictionInput): MikuVoterRestriction {\n const next: MikuVoterRestriction = {\n voterId: input.voterId,\n banned: input.banned,\n reason: input.reason,\n operatorId: input.operatorId,\n updatedAt: new Date().toISOString(),\n };\n\n this.voterRestrictions.set(input.voterId, next);\n return next;\n }\n\n resetVotes(input: ResetMikuVotesInput): { removedVotes: number; affectedSubmissions: string[] } {\n if (!input.submissionId && !input.voterId) {\n throw new Error('submissionId 与 voterId 至少提供一个');\n }\n\n const before = this.votes.length;\n const affected = new Set<string>();\n const remained = this.votes.filter((vote) => {\n const matchSubmission = input.submissionId ? vote.submissionId === input.submissionId : true;\n const matchVoter = input.voterId ? vote.voterId === input.voterId : true;\n const shouldRemove = matchSubmission && matchVoter;\n if (shouldRemove) affected.add(vote.submissionId);\n return !shouldRemove;\n });\n\n this.votes.length = 0;\n this.votes.push(...remained);\n this.recalculateVoteCounts();\n\n return {\n removedVotes: before - remained.length,\n affectedSubmissions: [...affected],\n };\n }\n\n listAnnouncements(contestId?: string): MikuAnnouncement[] {\n const all = [...this.announcements.values()];\n return contestId ? all.filter((item) => item.contestId === contestId) : all;\n }\n\n publishAnnouncement(input: CreateMikuAnnouncementInput): MikuAnnouncement {\n const now = new Date().toISOString();\n const announcement: MikuAnnouncement = {\n id: randomId('notice'),\n contestId: input.contestId,\n title: input.title,\n content: input.content,\n type: input.type,\n createdBy: input.createdBy,\n createdAt: now,\n updatedAt: now,\n };\n\n this.announcements.set(announcement.id, announcement);\n return announcement;\n }\n\n getLeaderboard(limit = 10): MikuLeaderboardItem[] {\n const ranked = sortByVotesDesc(this.listSubmissions({ status: 'approved' })).slice(0, limit);\n return ranked.map((item, index) => ({\n submissionId: item.id,\n title: item.title,\n authorNickname: item.authorNickname,\n voteCount: item.voteCount,\n rank: index + 1,\n }));\n }\n\n getSnapshot(): MikuContestStateSnapshot {\n return {\n contest: this.contest,\n submissions: this.listSubmissions(),\n announcements: this.listAnnouncements(),\n leaderboard: this.getLeaderboard(),\n };\n }\n\n getSubmissionExportRows(filter?: MikuSubmissionFilter): MikuSubmissionExportRow[] {\n return this.listSubmissions(filter).map((item) => ({\n 投稿编号: item.serialNo,\n 投稿ID: item.id,\n 赛事ID: item.contestId,\n 作者ID: item.authorId,\n 作者昵称: item.authorNickname,\n 作品名称: item.title,\n 作品类型: item.type,\n 简介: item.description,\n 标签: item.tags.join(','),\n 审核状态: item.status,\n 驳回原因: item.rejectReason || '',\n 票数: item.voteCount,\n 提交时间: item.createdAt,\n 更新时间: item.updatedAt,\n }));\n }\n\n exportSubmissionExcel(filter?: MikuSubmissionFilter): Uint8Array {\n const rows = this.getSubmissionExportRows(filter);\n const workbook = XLSX.utils.book_new();\n const worksheet = XLSX.utils.json_to_sheet(rows);\n XLSX.utils.book_append_sheet(workbook, worksheet, 'submissions');\n return XLSX.write(workbook, { bookType: 'xlsx', type: 'buffer' }) as Uint8Array;\n }\n\n private recalculateVoteCounts(): void {\n const counts = new Map<string, number>();\n for (const vote of this.votes) {\n counts.set(vote.submissionId, (counts.get(vote.submissionId) || 0) + 1);\n }\n\n for (const [id, submission] of this.submissions.entries()) {\n const nextCount = counts.get(id) || 0;\n if (submission.voteCount === nextCount) continue;\n this.submissions.set(id, {\n ...submission,\n voteCount: nextCount,\n updatedAt: new Date().toISOString(),\n });\n }\n }\n\n exportPersistenceState(): MikuContestPersistedState {\n return {\n contest: this.contest,\n submissions: [...this.submissions.values()],\n votes: [...this.votes],\n announcements: [...this.announcements.values()],\n voterRestrictions: [...this.voterRestrictions.values()],\n updatedAt: new Date().toISOString(),\n };\n }\n\n importPersistenceState(state: MikuContestPersistedState): void {\n this.contest = state.contest;\n this.submissions.clear();\n this.announcements.clear();\n this.voterRestrictions.clear();\n this.votes.length = 0;\n\n for (const item of state.submissions) {\n this.submissions.set(item.id, item);\n }\n for (const item of state.announcements) {\n this.announcements.set(item.id, item);\n }\n for (const item of state.voterRestrictions) {\n this.voterRestrictions.set(item.voterId, item);\n }\n this.votes.push(...state.votes);\n }\n}\n\nexport const createMikuContestService = (options?: MikuContestServiceOptions): MikuContestService => {\n return new MikuContestService(options);\n};\n","import { integer, jsonb, pgTable, text, timestamp } from 'drizzle-orm/pg-core';\nimport type {\n MikuAnnouncement,\n MikuContestConfig,\n MikuSubmissionContent,\n MikuVoterRestriction,\n MikuVoteRecord,\n} from '../../types';\n\nexport const mikuContestConfigs = pgTable('miku_contest_configs', {\n contestId: text('contest_id').primaryKey(),\n config: jsonb('config').$type<MikuContestConfig>().notNull(),\n createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).defaultNow().notNull(),\n});\n\nexport const mikuContestSubmissions = pgTable('miku_contest_submissions', {\n id: text('id').primaryKey(),\n contestId: text('contest_id').notNull(),\n serialNo: text('serial_no').notNull(),\n authorId: text('author_id').notNull(),\n authorNickname: text('author_nickname').notNull(),\n title: text('title').notNull(),\n type: text('type').notNull(),\n description: text('description').notNull(),\n tags: jsonb('tags').$type<string[]>().notNull(),\n content: jsonb('content').$type<MikuSubmissionContent>().notNull(),\n voteCount: integer('vote_count').notNull().default(0),\n status: text('status').notNull(),\n rejectReason: text('reject_reason'),\n createdAt: timestamp('created_at', { withTimezone: true }).notNull(),\n reviewedAt: timestamp('reviewed_at', { withTimezone: true }),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull(),\n});\n\nexport const mikuContestVotes = pgTable('miku_contest_votes', {\n id: text('id').primaryKey(),\n contestId: text('contest_id').notNull(),\n submissionId: text('submission_id').notNull(),\n voterId: text('voter_id').notNull(),\n votedAt: text('voted_at').notNull(),\n dayKey: text('day_key').notNull(),\n deviceId: text('device_id'),\n ip: text('ip'),\n});\n\nexport const mikuContestNotices = pgTable('miku_contest_notices', {\n id: text('id').primaryKey(),\n contestId: text('contest_id').notNull(),\n title: text('title').notNull(),\n content: text('content').notNull(),\n type: text('type').notNull(),\n createdBy: text('created_by').notNull(),\n createdAt: text('created_at').notNull(),\n updatedAt: text('updated_at').notNull(),\n});\n\nexport const mikuContestVoterRestrictions = pgTable('miku_contest_voter_restrictions', {\n id: text('id').primaryKey(),\n contestId: text('contest_id').notNull(),\n data: jsonb('data').$type<MikuVoterRestriction>().notNull(),\n});\n\nexport type MikuContestVoteRow = typeof mikuContestVotes.$inferSelect & MikuVoteRecord;\nexport type MikuContestNoticeRow = typeof mikuContestNotices.$inferSelect & MikuAnnouncement;\n","/* eslint-disable @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-call, @typescript-eslint/no-unsafe-member-access */\nimport { eq } from 'drizzle-orm';\nimport type { MikuAnnouncement, MikuContestPersistedState, MikuSubmission, MikuVoterRestriction, MikuVoteRecord } from '../../types';\nimport {\n mikuContestConfigs,\n mikuContestNotices,\n mikuContestSubmissions,\n mikuContestVotes,\n mikuContestVoterRestrictions,\n} from './drizzle-schema';\nimport type { DrizzleLikeDb } from './types';\n\nexport class MikuContestStateDbService {\n constructor(private readonly db: DrizzleLikeDb) {}\n\n async loadState(contestId: string): Promise<MikuContestPersistedState | null> {\n const configRows = await this.db\n .select({ config: mikuContestConfigs.config })\n .from(mikuContestConfigs)\n .where(eq(mikuContestConfigs.contestId, contestId))\n .limit(1);\n\n const config = configRows[0]?.config;\n if (!config) return null;\n\n const [submissions, votes, announcements, restrictions] = await Promise.all([\n this.db\n .select()\n .from(mikuContestSubmissions)\n .where(eq(mikuContestSubmissions.contestId, contestId)),\n this.db\n .select()\n .from(mikuContestVotes)\n .where(eq(mikuContestVotes.contestId, contestId)),\n this.db\n .select()\n .from(mikuContestNotices)\n .where(eq(mikuContestNotices.contestId, contestId)),\n this.db\n .select({ data: mikuContestVoterRestrictions.data })\n .from(mikuContestVoterRestrictions)\n .where(eq(mikuContestVoterRestrictions.contestId, contestId)),\n ]);\n\n return {\n contest: config,\n submissions: submissions as MikuSubmission[],\n votes: votes as MikuVoteRecord[],\n announcements: announcements as MikuAnnouncement[],\n voterRestrictions: restrictions.map((item: { data: MikuVoterRestriction }) => item.data),\n updatedAt: new Date().toISOString(),\n };\n }\n\n async saveState(state: MikuContestPersistedState): Promise<void> {\n const contestId = state.contest.id;\n\n const exists = await this.db\n .select({ contestId: mikuContestConfigs.contestId })\n .from(mikuContestConfigs)\n .where(eq(mikuContestConfigs.contestId, contestId))\n .limit(1);\n\n if (exists[0]) {\n await this.db\n .update(mikuContestConfigs)\n .set({\n config: state.contest,\n updatedAt: new Date(),\n })\n .where(eq(mikuContestConfigs.contestId, contestId));\n } else {\n await this.db.insert(mikuContestConfigs).values({\n contestId,\n config: state.contest,\n });\n }\n\n await this.db.delete(mikuContestSubmissions).where(eq(mikuContestSubmissions.contestId, contestId));\n await this.db.delete(mikuContestVotes).where(eq(mikuContestVotes.contestId, contestId));\n await this.db.delete(mikuContestNotices).where(eq(mikuContestNotices.contestId, contestId));\n await this.db\n .delete(mikuContestVoterRestrictions)\n .where(eq(mikuContestVoterRestrictions.contestId, contestId));\n\n if (state.submissions.length > 0) {\n await this.db.insert(mikuContestSubmissions).values(\n state.submissions.map((item) => ({\n ...item,\n contestId,\n createdAt: new Date(item.createdAt),\n reviewedAt: item.reviewedAt ? new Date(item.reviewedAt) : null,\n updatedAt: new Date(item.updatedAt),\n })),\n );\n }\n\n if (state.votes.length > 0) {\n await this.db.insert(mikuContestVotes).values(state.votes);\n }\n\n if (state.announcements.length > 0) {\n await this.db.insert(mikuContestNotices).values(state.announcements);\n }\n\n if (state.voterRestrictions.length > 0) {\n await this.db.insert(mikuContestVoterRestrictions).values(\n state.voterRestrictions.map((item) => ({\n id: `${contestId}:${item.voterId}`,\n contestId,\n data: item,\n })),\n );\n }\n }\n}\n","import { MikuContestStateDbService } from './drizzle-state-service';\nimport type { MikuContestPersistenceAdapter, DrizzleLikeDb } from './types';\n\nexport const createMikuContestDrizzlePersistenceAdapter = (\n db: DrizzleLikeDb,\n): MikuContestPersistenceAdapter => {\n const service = new MikuContestStateDbService(db);\n\n return {\n loadState: (contestId: string) => service.loadState(contestId),\n saveState: (state) => service.saveState(state),\n };\n};\n\nexport type { DrizzleLikeDb } from './types';\n","import { createMikuContestService, type MikuContestService, type MikuContestServiceOptions } from '../service';\nimport type {\n CreateMikuAnnouncementInput,\n CreateMikuSubmissionInput,\n MikuAnnouncement,\n MikuContestConfig,\n MikuContestStateSnapshot,\n MikuLeaderboardItem,\n MikuSubmission,\n MikuSubmissionExportRow,\n MikuSubmissionFilter,\n MikuVoterRestriction,\n ResetMikuVotesInput,\n ReviewMikuSubmissionInput,\n SetMikuVoterRestrictionInput,\n VoteMikuSubmissionInput,\n} from '../../types';\nimport type { MikuContestPersistenceAdapter } from './types';\n\nexport interface MikuContestPersistentServiceOptions extends MikuContestServiceOptions {\n persistenceAdapter: MikuContestPersistenceAdapter;\n}\n\nexport class MikuContestPersistentService {\n private readonly engine: MikuContestService;\n\n private hydrated = false;\n\n private hydrationPromise: Promise<void> | null = null;\n\n constructor(private readonly options: MikuContestPersistentServiceOptions) {\n this.engine = createMikuContestService(options);\n }\n\n private async ensureHydrated(): Promise<void> {\n if (this.hydrated) return;\n if (this.hydrationPromise) return this.hydrationPromise;\n\n this.hydrationPromise = (async () => {\n const contestId = this.engine.getContestConfig().id;\n const loaded = await this.options.persistenceAdapter.loadState(contestId);\n if (loaded) {\n this.engine.importPersistenceState(loaded);\n } else {\n await this.options.persistenceAdapter.saveState(this.engine.exportPersistenceState());\n }\n this.hydrated = true;\n })();\n\n await this.hydrationPromise;\n }\n\n private async persist(): Promise<void> {\n await this.options.persistenceAdapter.saveState(this.engine.exportPersistenceState());\n }\n\n async getContestConfig(): Promise<MikuContestConfig> {\n await this.ensureHydrated();\n return this.engine.getContestConfig();\n }\n\n async updateContestConfig(patch: Partial<MikuContestConfig>): Promise<MikuContestConfig> {\n await this.ensureHydrated();\n const data = this.engine.updateContestConfig(patch);\n await this.persist();\n return data;\n }\n\n async createSubmission(\n input: CreateMikuSubmissionInput,\n mode: 'web' | 'miniapp' = 'web',\n ): Promise<MikuSubmission> {\n await this.ensureHydrated();\n const data = this.engine.createSubmission(input, mode);\n await this.persist();\n return data;\n }\n\n async listSubmissions(filter?: MikuSubmissionFilter): Promise<MikuSubmission[]> {\n await this.ensureHydrated();\n return this.engine.listSubmissions(filter);\n }\n\n async getSubmission(submissionId: string): Promise<MikuSubmission | null> {\n await this.ensureHydrated();\n return this.engine.getSubmission(submissionId);\n }\n\n async reviewSubmission(input: ReviewMikuSubmissionInput): Promise<MikuSubmission> {\n await this.ensureHydrated();\n const data = this.engine.reviewSubmission(input);\n await this.persist();\n return data;\n }\n\n async vote(input: VoteMikuSubmissionInput): Promise<MikuSubmission> {\n await this.ensureHydrated();\n const data = this.engine.vote(input);\n await this.persist();\n return data;\n }\n\n async getVoterRestriction(voterId: string): Promise<MikuVoterRestriction | null> {\n await this.ensureHydrated();\n return this.engine.getVoterRestriction(voterId);\n }\n\n async setVoterRestriction(input: SetMikuVoterRestrictionInput): Promise<MikuVoterRestriction> {\n await this.ensureHydrated();\n const data = this.engine.setVoterRestriction(input);\n await this.persist();\n return data;\n }\n\n async resetVotes(input: ResetMikuVotesInput): Promise<{ removedVotes: number; affectedSubmissions: string[] }> {\n await this.ensureHydrated();\n const data = this.engine.resetVotes(input);\n await this.persist();\n return data;\n }\n\n async listAnnouncements(contestId?: string): Promise<MikuAnnouncement[]> {\n await this.ensureHydrated();\n return this.engine.listAnnouncements(contestId);\n }\n\n async publishAnnouncement(input: CreateMikuAnnouncementInput): Promise<MikuAnnouncement> {\n await this.ensureHydrated();\n const data = this.engine.publishAnnouncement(input);\n await this.persist();\n return data;\n }\n\n async getLeaderboard(limit = 10): Promise<MikuLeaderboardItem[]> {\n await this.ensureHydrated();\n return this.engine.getLeaderboard(limit);\n }\n\n async getSnapshot(): Promise<MikuContestStateSnapshot> {\n await this.ensureHydrated();\n return this.engine.getSnapshot();\n }\n\n async getSubmissionExportRows(filter?: MikuSubmissionFilter): Promise<MikuSubmissionExportRow[]> {\n await this.ensureHydrated();\n return this.engine.getSubmissionExportRows(filter);\n }\n\n async exportSubmissionExcel(filter?: MikuSubmissionFilter): Promise<Uint8Array> {\n await this.ensureHydrated();\n return this.engine.exportSubmissionExcel(filter);\n }\n}\n\nexport const createMikuContestPersistentService = (\n options: MikuContestPersistentServiceOptions,\n): MikuContestPersistentService => {\n return new MikuContestPersistentService(options);\n};\n","import { NextResponse } from 'next/server';\nimport { createMikuContestService } from '../server';\nimport type { MikuContestService } from '../server';\nimport {\n createMikuContestDrizzlePersistenceAdapter,\n createMikuContestPersistentService,\n type DrizzleLikeDb,\n type MikuContestPersistenceAdapter,\n} from '../server/persistence';\nimport type { NextRequest } from 'next/server';\nimport type {\n CreateMikuSubmissionInput,\n MikuContestConfig,\n MikuContestStateSnapshot,\n MikuSubmission,\n MikuSubmissionFilter,\n MikuSubmissionStatus,\n MikuWorkType,\n ResetMikuVotesInput,\n ReviewMikuSubmissionInput,\n SetMikuVoterRestrictionInput,\n VoteMikuSubmissionInput,\n MikuVoterRestriction,\n} from '../types';\n\ntype MaybePromise<T> = T | Promise<T>;\n\nexport interface MikuContestServiceLike {\n getSnapshot(): MaybePromise<MikuContestStateSnapshot>;\n createSubmission(input: CreateMikuSubmissionInput, mode?: 'web' | 'miniapp'): MaybePromise<MikuSubmission>;\n vote(input: VoteMikuSubmissionInput): MaybePromise<MikuSubmission>;\n reviewSubmission(input: ReviewMikuSubmissionInput): MaybePromise<MikuSubmission>;\n listSubmissions(filter?: MikuSubmissionFilter): MaybePromise<MikuSubmission[]>;\n setVoterRestriction(input: SetMikuVoterRestrictionInput): MaybePromise<MikuVoterRestriction>;\n resetVotes(input: ResetMikuVotesInput): MaybePromise<{ removedVotes: number; affectedSubmissions: string[] }>;\n exportSubmissionExcel(filter?: MikuSubmissionFilter): MaybePromise<Uint8Array>;\n updateContestConfig(patch: Partial<MikuContestConfig>): MaybePromise<MikuContestConfig>;\n}\n\nexport interface MikuContestRouteConfig {\n service?: MikuContestServiceLike;\n persistenceAdapter?: MikuContestPersistenceAdapter;\n db?: unknown;\n}\n\nconst isDrizzleDb = (value: unknown): value is DrizzleLikeDb => {\n if (!value || typeof value !== 'object') return false;\n const candidate = value as Record<string, unknown>;\n return (\n typeof candidate.select === 'function' &&\n typeof candidate.insert === 'function' &&\n typeof candidate.update === 'function' &&\n typeof candidate.delete === 'function'\n );\n};\n\nconst resolveService = (config?: MikuContestRouteConfig): MikuContestServiceLike => {\n if (config?.service) return config.service;\n\n const adapter =\n config?.persistenceAdapter || (isDrizzleDb(config?.db) ? createMikuContestDrizzlePersistenceAdapter(config.db) : null);\n\n if (adapter) {\n return createMikuContestPersistentService({\n persistenceAdapter: adapter,\n });\n }\n\n return createMikuContestService();\n};\n\nexport const createGetContestSnapshotHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (_request: NextRequest) => {\n const data = await service.getSnapshot();\n return NextResponse.json({ success: true, data });\n };\n};\n\nexport const createUpdateContestConfigHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Partial<MikuContestConfig>;\n const data = await service.updateContestConfig(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createCreateSubmissionHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const body = (await request.json()) as {\n mode?: 'web' | 'miniapp';\n payload?: CreateMikuSubmissionInput;\n };\n\n const mode = body.mode || 'web';\n const payload = body.payload;\n if (!payload) {\n return NextResponse.json({ success: false, error: 'payload 不能为空' }, { status: 400 });\n }\n\n const data = await service.createSubmission(payload, mode);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createVoteHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Parameters<MikuContestService['vote']>[0];\n const data = await service.vote(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createReviewSubmissionHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Parameters<MikuContestService['reviewSubmission']>[0];\n const data = await service.reviewSubmission(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nconst buildSubmissionFilterFromQuery = (request: NextRequest): MikuSubmissionFilter => {\n const search = request.nextUrl.searchParams;\n const status = search.get('status');\n const type = search.get('type');\n\n return {\n status: status ? (status as MikuSubmissionStatus) : undefined,\n type: type ? (type as MikuWorkType) : undefined,\n authorId: search.get('authorId') || undefined,\n authorKeyword: search.get('authorKeyword') || undefined,\n titleKeyword: search.get('titleKeyword') || undefined,\n };\n};\n\nexport const createListSubmissionsHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n const filter = buildSubmissionFilterFromQuery(request);\n const data = await service.listSubmissions(filter);\n return NextResponse.json({ success: true, data });\n };\n};\n\nexport const createSetVoterRestrictionHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Parameters<MikuContestService['setVoterRestriction']>[0];\n const data = await service.setVoterRestriction(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createResetVotesHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n try {\n const payload = (await request.json()) as Parameters<MikuContestService['resetVotes']>[0];\n const data = await service.resetVotes(payload);\n return NextResponse.json({ success: true, data });\n } catch (error) {\n return NextResponse.json({ success: false, error: (error as Error).message }, { status: 400 });\n }\n };\n};\n\nexport const createExportSubmissionsHandler = (config?: MikuContestRouteConfig) => {\n const service = resolveService(config);\n return async (request: NextRequest) => {\n const filter = buildSubmissionFilterFromQuery(request);\n const data = await service.exportSubmissionExcel(filter);\n const body = data.buffer.slice(data.byteOffset, data.byteOffset + data.byteLength) as ArrayBuffer;\n return new NextResponse(body, {\n status: 200,\n headers: {\n 'Content-Type': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',\n 'Content-Disposition': 'attachment; filename=\"miku-submissions.xlsx\"',\n },\n });\n };\n};\n"]}
|