feat: Introduce announcements service, integrate MinIO for lesson media with presigned URLs, and restrict editing of pending courses.

This commit is contained in:
JakkrapartXD 2026-01-26 15:15:46 +07:00
parent 5f8e0a3687
commit bbfb62093e
5 changed files with 145 additions and 4 deletions

View file

@ -19,9 +19,10 @@ export interface LessonAttachmentData {
file_path: string;
file_size: number;
mime_type: string;
description: MultiLanguageText | null;
description?: MultiLanguageText | null;
sort_order: number;
created_at: Date;
presigned_url?: string | null;
}
export interface QuizData {
@ -68,6 +69,7 @@ export interface LessonData {
is_published: boolean;
created_at: Date;
updated_at: Date | null;
video_url?: string | null;
attachments?: LessonAttachmentData[];
quiz?: QuizData | null;
progress?: LessonProgressData[];

View file

@ -0,0 +1,56 @@
import { MultiLanguageText } from './index';
// Use MultiLanguageText from index.ts for consistency
export type MultiLangText = MultiLanguageText;
export interface Announcement {
id: number;
title: MultiLangText;
content: MultiLangText;
status: string;
is_pinned: boolean;
created_at: Date;
updated_at: Date;
attachments: AnnouncementAttachment[];
}
export interface AnnouncementAttachment {
id: number;
announcement_id: number;
file_name: string;
file_path: string;
created_at: Date;
updated_at: Date;
}
export interface ListAnnouncementResponse{
code: number;
message: string;
data: Announcement[];
total: number;
page: number;
limit: number;
}
export interface ListAnnouncementInput{
token: string;
course_id: number;
page?: number;
limit?: number;
}
export interface CreateAnnouncementInput{
token: string;
course_id: number;
title: MultiLangText;
content: MultiLangText;
status: string;
is_pinned: boolean;
attachments?: AnnouncementAttachment[];
}
export interface CreateAnnouncementResponse{
code: number;
message: string;
data: Announcement;
}