diff --git a/directus-cms/extensions/directus-extension-programmierbar-bundle/src/member-matching/index.ts b/directus-cms/extensions/directus-extension-programmierbar-bundle/src/member-matching/index.ts index fc628b3..5c55973 100644 --- a/directus-cms/extensions/directus-extension-programmierbar-bundle/src/member-matching/index.ts +++ b/directus-cms/extensions/directus-extension-programmierbar-bundle/src/member-matching/index.ts @@ -1,5 +1,6 @@ import { defineHook } from '@directus/extensions-sdk' import { matchMembersFromTranscript } from './matchMembers.js' +import { postSlackMessage } from '../shared/postSlackMessage.ts' const HOOK_NAME = 'member-matching' @@ -8,18 +9,17 @@ export default defineHook(({ action }, hookContext) => { const ItemsService = hookContext.services.ItemsService const getSchema = hookContext.getSchema - // Trigger on podcast update when transcript_text is added - action('podcasts.items.update', async function (metadata, eventContext) { - const { payload, keys } = metadata + function handlePodcastAction(metadata: any, eventContext: any) { + const { payload } = metadata + const podcastId = metadata.key || metadata.keys[0] - // Check if transcript_text was updated + // Check if transcript_text was included const hasTranscriptText = payload.transcript_text && payload.transcript_text.trim().length > 0 if (!hasTranscriptText) { return } - const podcastId = keys[0] logger.info(`${HOOK_NAME} hook: Transcript detected for podcast ${podcastId}, attempting to match members`) // Run member matching (don't await - let it run alongside other hooks) @@ -28,8 +28,19 @@ export default defineHook(({ action }, hookContext) => { ItemsService, getSchema, eventContext, - }).catch((err) => { + }).catch(async (err) => { logger.error(`${HOOK_NAME} hook: Member matching failed for podcast ${podcastId}:`, err) + try { + await postSlackMessage( + `:warning: *${HOOK_NAME} hook*: Member-Matching für Podcast ${podcastId} fehlgeschlagen. Error: ${err?.message || err}` + ) + } catch (slackError: any) { + logger.error(`${HOOK_NAME} hook: Could not post to Slack: ${slackError.message}`) + } }) - }) + } + + // Trigger on podcast creation or update when transcript_text is present + action('podcasts.items.create', handlePodcastAction) + action('podcasts.items.update', handlePodcastAction) }) diff --git a/directus-cms/extensions/directus-extension-programmierbar-bundle/src/member-matching/matchMembers.ts b/directus-cms/extensions/directus-extension-programmierbar-bundle/src/member-matching/matchMembers.ts index bfcaec7..36f7c1d 100644 --- a/directus-cms/extensions/directus-extension-programmierbar-bundle/src/member-matching/matchMembers.ts +++ b/directus-cms/extensions/directus-extension-programmierbar-bundle/src/member-matching/matchMembers.ts @@ -1,4 +1,5 @@ import type { Logger } from 'pino' +import { postSlackMessage } from '../shared/postSlackMessage.ts' interface HookServices { logger: Logger @@ -148,7 +149,14 @@ export async function matchMembersFromTranscript( logger.info(`${hookName}: First 500 chars of transcript: ${transcriptText.substring(0, 500)}`) if (speakerNames.length === 0) { - logger.info(`${hookName}: No speaker names found in transcript, skipping member matching`) + logger.warn(`${hookName}: No speaker names found in transcript for podcast ${podcastId}`) + try { + await postSlackMessage( + `:warning: *${hookName} hook*: Keine Sprecher im Transkript von Podcast ${podcastId} erkannt. Bitte Members manuell zuweisen: https://admin.programmier.bar/admin/content/podcasts/${podcastId}` + ) + } catch (slackError: any) { + logger.error(`${hookName}: Could not post to Slack: ${slackError.message}`) + } return } @@ -159,7 +167,14 @@ export async function matchMembersFromTranscript( ) if (matchedMembers.length === 0) { - logger.info(`${hookName}: No members matched, skipping update`) + logger.warn(`${hookName}: No members matched for podcast ${podcastId} (speakers: [${speakerNames.join(', ')}])`) + try { + await postSlackMessage( + `:warning: *${hookName} hook*: Keine Members für Podcast ${podcastId} zugeordnet (Sprecher: ${speakerNames.join(', ')}). Bitte manuell zuweisen: https://admin.programmier.bar/admin/content/podcasts/${podcastId}` + ) + } catch (slackError: any) { + logger.error(`${hookName}: Could not post to Slack: ${slackError.message}`) + } return } @@ -190,6 +205,13 @@ export async function matchMembersFromTranscript( if (err?.stack) { logger.error(`${hookName}: Stack trace: ${err.stack}`) } + try { + await postSlackMessage( + `:warning: *${hookName} hook*: Member-Matching für Podcast ${podcastId} fehlgeschlagen. Error: ${err?.message || err}` + ) + } catch (slackError: any) { + logger.error(`${hookName}: Could not post to Slack: ${slackError.message}`) + } // Don't throw - member matching failure shouldn't block other operations } }