L9 Lotse – KI-Assistent: Gate-Fixes (EXEMPT-Auth-Prüfung, Sprachnotiz ohne Transkriptionsanbieter nicht einreihen)
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -3,6 +3,8 @@
|
|||||||
import { revalidatePath } from "next/cache";
|
import { revalidatePath } from "next/cache";
|
||||||
import { redirect } from "next/navigation";
|
import { redirect } from "next/navigation";
|
||||||
import { requireApiContext } from "@/server/api/context";
|
import { requireApiContext } from "@/server/api/context";
|
||||||
|
import { requireSession } from "@/server/auth";
|
||||||
|
import { requirePermission } from "@/server/rbac";
|
||||||
import { updateLotseSettings } from "@/server/services/lotse/settings";
|
import { updateLotseSettings } from "@/server/services/lotse/settings";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12,8 +14,10 @@ import { updateLotseSettings } from "@/server/services/lotse/settings";
|
|||||||
* Registered as EXEMPT in scripts/check-module-guards.ts.
|
* Registered as EXEMPT in scripts/check-module-guards.ts.
|
||||||
*/
|
*/
|
||||||
export async function saveLotseSettings(fd: FormData): Promise<void> {
|
export async function saveLotseSettings(fd: FormData): Promise<void> {
|
||||||
|
const session = await requireSession();
|
||||||
let target = "/settings/lotse?saved=1";
|
let target = "/settings/lotse?saved=1";
|
||||||
try {
|
try {
|
||||||
|
requirePermission(session, "tenant:manage"); // fast JWT check; requireApiContext re-checks against the DB
|
||||||
const ctx = await requireApiContext(null, "tenant:manage");
|
const ctx = await requireApiContext(null, "tenant:manage");
|
||||||
await updateLotseSettings(ctx, {
|
await updateLotseSettings(ctx, {
|
||||||
enabled: fd.get("enabled") === "on",
|
enabled: fd.get("enabled") === "on",
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import { ServiceError, type ServiceCtx } from "@/server/services/context";
|
|||||||
import { dispatchJob } from "@/server/jobs/dispatch";
|
import { dispatchJob } from "@/server/jobs/dispatch";
|
||||||
import { JOB_QUEUES } from "@/server/jobs/queues";
|
import { JOB_QUEUES } from "@/server/jobs/queues";
|
||||||
import { PROCESSORS } from "@/server/jobs/processors";
|
import { PROCESSORS } from "@/server/jobs/processors";
|
||||||
|
import { transcriptionConfig } from "@/server/ai/transcription/openai-compatible";
|
||||||
import type { ParsedOpPayload } from "@/lib/sync/ops";
|
import type { ParsedOpPayload } from "@/lib/sync/ops";
|
||||||
import { audit, isUniqueViolation, opTime, requireFieldOrder } from "./common";
|
import { audit, isUniqueViolation, opTime, requireFieldOrder } from "./common";
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ export async function attachVoiceNote(ctx: ServiceCtx, input: ParsedOpPayload<"v
|
|||||||
await audit(ctx, "create", "voice_note", voice.id, null, { workOrderId: wo.id, documentId: doc.id, durationSeconds: voice.durationSeconds });
|
await audit(ctx, "create", "voice_note", voice.id, null, { workOrderId: wo.id, documentId: doc.id, durationSeconds: voice.durationSeconds });
|
||||||
|
|
||||||
let status = voice.transcriptionStatus;
|
let status = voice.transcriptionStatus;
|
||||||
if (!PROCESSORS[JOB_QUEUES.transcription]) {
|
if (!PROCESSORS[JOB_QUEUES.transcription] || !transcriptionConfig().configured) { // L9: no provider → never queue audio
|
||||||
status = "disabled";
|
status = "disabled";
|
||||||
} else {
|
} else {
|
||||||
try {
|
try {
|
||||||
|
|||||||
Reference in New Issue
Block a user