···
+
import { AuthErrors, handleError, ValidationErrors } from "./lib/errors";
···
"/api/transcriptions/:id/stream": {
+
const user = requireAuth(req);
const transcriptionId = req.params.id;
+
.query<{ id: string; user_id: number; class_id: string | null; status: string }, [string]>(
+
"SELECT id, user_id, class_id, status FROM transcriptions WHERE id = ?",
{ error: "Transcription not found" },
+
// Check access permissions
+
const isOwner = transcription.user_id === user.id;
+
const isAdmin = user.role === "admin";
+
let isClassMember = false;
+
// If transcription belongs to a class, check enrollment
+
if (transcription.class_id) {
+
isClassMember = isUserEnrolledInClass(user.id, transcription.class_id);
+
// Allow access if: owner, admin, or enrolled in the class
+
if (!isOwner && !isAdmin && !isClassMember) {
+
{ error: "Transcription not found" },
+
// Require subscription only if accessing own transcription (not class)
+
if (isOwner && !transcription.class_id && !isAdmin && !hasActiveSubscription(user.id)) {
+
throw AuthErrors.subscriptionRequired();
// Event-driven SSE stream with reconnection support
const stream = new ReadableStream({
···
"/api/transcriptions/:id": {
+
const user = requireAuth(req);
const transcriptionId = req.params.id;
// Verify ownership or admin
···
+
class_id: string | null;
original_filename: string;
···
+
"SELECT id, user_id, class_id, filename, original_filename, status, progress, created_at FROM transcriptions WHERE id = ?",
···
+
// Check access permissions
+
const isOwner = transcription.user_id === user.id;
+
const isAdmin = user.role === "admin";
+
let isClassMember = false;
+
// If transcription belongs to a class, check enrollment
+
if (transcription.class_id) {
+
isClassMember = isUserEnrolledInClass(user.id, transcription.class_id);
+
// Allow access if: owner, admin, or enrolled in the class
+
if (!isOwner && !isAdmin && !isClassMember) {
{ error: "Transcription not found" },
+
// Require subscription only if accessing own transcription (not class)
+
if (isOwner && !transcription.class_id && !isAdmin && !hasActiveSubscription(user.id)) {
+
throw AuthErrors.subscriptionRequired();
if (transcription.status !== "completed") {
···
"/api/transcriptions/:id/audio": {
+
const user = requireAuth(req);
const transcriptionId = req.params.id;
// Verify ownership or admin
···
+
class_id: string | null;
+
"SELECT id, user_id, class_id, filename, status FROM transcriptions WHERE id = ?",
···
+
// Check access permissions
+
const isOwner = transcription.user_id === user.id;
+
const isAdmin = user.role === "admin";
+
let isClassMember = false;
+
// If transcription belongs to a class, check enrollment
+
if (transcription.class_id) {
+
isClassMember = isUserEnrolledInClass(user.id, transcription.class_id);
+
// Allow access if: owner, admin, or enrolled in the class
+
if (!isOwner && !isAdmin && !isClassMember) {
{ error: "Transcription not found" },
+
// Require subscription only if accessing own transcription (not class)
+
if (isOwner && !transcription.class_id && !isAdmin && !hasActiveSubscription(user.id)) {
+
throw AuthErrors.subscriptionRequired();
// For pending recordings, audio file exists even though transcription isn't complete