sa2kit 1.6.91 → 1.6.92

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.
Files changed (65) hide show
  1. package/dist/client-BlkUL2To.d.ts +26 -0
  2. package/dist/client-DpMIhrlS.d.mts +26 -0
  3. package/dist/index-C7yh6b5Q.d.mts +17 -0
  4. package/dist/index-CDapUIT5.d.mts +51 -0
  5. package/dist/index-Cv9jlnNz.d.ts +17 -0
  6. package/dist/index-D3UbkUai.d.ts +51 -0
  7. package/dist/index.d.mts +11 -0
  8. package/dist/index.d.ts +11 -0
  9. package/dist/index.js +1337 -58
  10. package/dist/index.js.map +1 -1
  11. package/dist/index.mjs +1306 -61
  12. package/dist/index.mjs.map +1 -1
  13. package/dist/mikuContest/index.d.mts +13 -0
  14. package/dist/mikuContest/index.d.ts +13 -0
  15. package/dist/mikuContest/index.js +1310 -0
  16. package/dist/mikuContest/index.js.map +1 -0
  17. package/dist/mikuContest/index.mjs +1253 -0
  18. package/dist/mikuContest/index.mjs.map +1 -0
  19. package/dist/mikuContest/logic/index.d.mts +32 -0
  20. package/dist/mikuContest/logic/index.d.ts +32 -0
  21. package/dist/mikuContest/logic/index.js +511 -0
  22. package/dist/mikuContest/logic/index.js.map +1 -0
  23. package/dist/mikuContest/logic/index.mjs +483 -0
  24. package/dist/mikuContest/logic/index.mjs.map +1 -0
  25. package/dist/mikuContest/routes/index.d.mts +80 -0
  26. package/dist/mikuContest/routes/index.d.ts +80 -0
  27. package/dist/mikuContest/routes/index.js +821 -0
  28. package/dist/mikuContest/routes/index.js.map +1 -0
  29. package/dist/mikuContest/routes/index.mjs +791 -0
  30. package/dist/mikuContest/routes/index.mjs.map +1 -0
  31. package/dist/mikuContest/server/index.d.mts +766 -0
  32. package/dist/mikuContest/server/index.d.ts +766 -0
  33. package/dist/mikuContest/server/index.js +705 -0
  34. package/dist/mikuContest/server/index.js.map +1 -0
  35. package/dist/mikuContest/server/index.mjs +672 -0
  36. package/dist/mikuContest/server/index.mjs.map +1 -0
  37. package/dist/mikuContest/service/index.d.mts +30 -0
  38. package/dist/mikuContest/service/index.d.ts +30 -0
  39. package/dist/mikuContest/service/index.js +139 -0
  40. package/dist/mikuContest/service/index.js.map +1 -0
  41. package/dist/mikuContest/service/index.mjs +135 -0
  42. package/dist/mikuContest/service/index.mjs.map +1 -0
  43. package/dist/mikuContest/types/index.d.mts +179 -0
  44. package/dist/mikuContest/types/index.d.ts +179 -0
  45. package/dist/mikuContest/types/index.js +4 -0
  46. package/dist/mikuContest/types/index.js.map +1 -0
  47. package/dist/mikuContest/types/index.mjs +3 -0
  48. package/dist/mikuContest/types/index.mjs.map +1 -0
  49. package/dist/mikuContest/ui/miniapp/index.d.mts +3 -0
  50. package/dist/mikuContest/ui/miniapp/index.d.ts +3 -0
  51. package/dist/mikuContest/ui/miniapp/index.js +566 -0
  52. package/dist/mikuContest/ui/miniapp/index.js.map +1 -0
  53. package/dist/mikuContest/ui/miniapp/index.mjs +540 -0
  54. package/dist/mikuContest/ui/miniapp/index.mjs.map +1 -0
  55. package/dist/mikuContest/ui/web/index.d.mts +4 -0
  56. package/dist/mikuContest/ui/web/index.d.ts +4 -0
  57. package/dist/mikuContest/ui/web/index.js +353 -0
  58. package/dist/mikuContest/ui/web/index.js.map +1 -0
  59. package/dist/mikuContest/ui/web/index.mjs +343 -0
  60. package/dist/mikuContest/ui/web/index.mjs.map +1 -0
  61. package/dist/service-D7DM1wW-.d.ts +38 -0
  62. package/dist/service-DPr2rlvH.d.mts +38 -0
  63. package/dist/types-BS7Xz09b.d.mts +14 -0
  64. package/dist/types-k4koMp4m.d.ts +14 -0
  65. package/package.json +41 -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/server/db.ts"],"names":["text","XLSX","pgTable","jsonb","timestamp","integer","eq"],"mappings":"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","file":"index.js","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 type { DrizzleLikeDb } from './persistence';\n\nclass MikuContestDbService {\n private _db: DrizzleLikeDb | null = null;\n\n setDb(db: DrizzleLikeDb): void {\n this._db = db;\n }\n\n isConfigured(): boolean {\n return Boolean(this._db);\n }\n\n get db(): DrizzleLikeDb {\n if (!this._db) {\n throw new Error('MikuContestDbService: Database instance not set. Call setDb(db) first.');\n }\n return this._db;\n }\n}\n\nexport const mikuContestDbService = new MikuContestDbService();\n"]}