Align backend with frontend, make clips end-to-end, polish admin
Backend - Add ClipSubmission entity + table (runtime bootstrapper) and POST /api/public/clips (server-derives platform from the link) - Surface clip submissions in the admin season detail - Add DELETE candidate/category/clip endpoints with audit entries Frontend - Clips admin: real moderation view (list, open link, delete) instead of placeholder; wired clipSubmissions through types/api/store - Categories admin: add delete with confirm modal (matches Candidates) - Voting ranking bar uses the unified purple gradient - Fix ASCII transliterations to proper German umlauts across admin - Remove orphan AdminView 2.vue Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -179,6 +179,19 @@ const fallbackAdminSeasonDetail: AdminSeasonDetailResponse = {
|
||||
createdAt: '2026-06-17T08:00:00Z',
|
||||
},
|
||||
],
|
||||
clipSubmissions: [
|
||||
{
|
||||
id: 1,
|
||||
categoryId: 1,
|
||||
submittedByTwitchId: 'demo_user',
|
||||
clipUrl: 'https://clips.twitch.tv/DemoClip',
|
||||
title: 'Epischer Clutch im Finale',
|
||||
creator: 'Hoshimi Miyu',
|
||||
platform: 'Twitch',
|
||||
status: 'pending',
|
||||
createdAt: '2026-06-17T09:10:00Z',
|
||||
},
|
||||
],
|
||||
}
|
||||
|
||||
const emptyAdmin: AdminDashboardResponse = {
|
||||
@@ -200,6 +213,7 @@ const emptyAdminSeasonDetail: AdminSeasonDetailResponse = {
|
||||
categories: [],
|
||||
candidates: [],
|
||||
pendingNominations: [],
|
||||
clipSubmissions: [],
|
||||
}
|
||||
|
||||
export const useAwardsStore = defineStore('awards', {
|
||||
@@ -317,6 +331,11 @@ export const useAwardsStore = defineStore('awards', {
|
||||
await this.loadAdminSeasonDetail(seasonId)
|
||||
return result
|
||||
},
|
||||
async deleteAdminClip(clipId: number, seasonId: number) {
|
||||
const result = await api.deleteAdminClip(clipId)
|
||||
await this.loadAdminSeasonDetail(seasonId)
|
||||
return result
|
||||
},
|
||||
async approveAdminNomination(nominationId: number, seasonId: number, payload: ApproveNominationPayload) {
|
||||
const result = await api.approveAdminNomination(nominationId, payload)
|
||||
await this.loadAdminSeasonDetail(seasonId)
|
||||
|
||||
Reference in New Issue
Block a user