package ports import ( "Yimaru-Backend/internal/domain" "context" ) type CourseStore interface { // Course Categories CreateCourseCategory( ctx context.Context, name string, ) (domain.CourseCategory, error) GetCourseCategoryByID( ctx context.Context, id int64, ) (domain.CourseCategory, error) GetAllCourseCategories( ctx context.Context, limit int32, offset int32, ) ([]domain.CourseCategory, int64, error) UpdateCourseCategory( ctx context.Context, id int64, name *string, isActive *bool, ) error DeleteCourseCategory( ctx context.Context, id int64, ) error // Courses CreateCourse( ctx context.Context, categoryID int64, title string, description *string, thumbnail *string, introVideoURL *string, ) (domain.Course, error) GetCourseByID( ctx context.Context, id int64, ) (domain.Course, error) GetCoursesByCategory( ctx context.Context, categoryID int64, limit int32, offset int32, ) ([]domain.Course, int64, error) UpdateCourse( ctx context.Context, id int64, title *string, description *string, thumbnail *string, introVideoURL *string, isActive *bool, ) error DeleteCourse( ctx context.Context, id int64, ) error // Sub-courses CreateSubCourse( ctx context.Context, courseID int64, title string, description *string, thumbnail *string, displayOrder *int32, level string, subLevel string, ) (domain.SubCourse, error) GetSubCourseByID( ctx context.Context, id int64, ) (domain.SubCourse, error) GetSubCoursesByCourse( ctx context.Context, courseID int64, ) ([]domain.SubCourse, int64, error) ListSubCoursesByCourse( ctx context.Context, courseID int64, ) ([]domain.SubCourse, error) ListActiveSubCourses( ctx context.Context, ) ([]domain.SubCourse, error) UpdateSubCourse( ctx context.Context, id int64, title *string, description *string, thumbnail *string, displayOrder *int32, level *string, subLevel *string, isActive *bool, ) error DeactivateSubCourse( ctx context.Context, id int64, ) error DeleteSubCourse( ctx context.Context, id int64, ) (domain.SubCourse, error) // Sub-course Videos CreateSubCourseVideo( ctx context.Context, subCourseID int64, title string, description *string, videoURL string, duration int32, resolution *string, instructorID *string, thumbnail *string, visibility *string, displayOrder *int32, status *string, vimeoID *string, vimeoEmbedURL *string, vimeoPlayerHTML *string, vimeoStatus *string, videoHostProvider *string, ) (domain.SubCourseVideo, error) GetSubCourseVideoByID( ctx context.Context, id int64, ) (domain.SubCourseVideo, error) GetVideosBySubCourse( ctx context.Context, subCourseID int64, ) ([]domain.SubCourseVideo, int64, error) GetPublishedVideosBySubCourse( ctx context.Context, subCourseID int64, ) ([]domain.SubCourseVideo, error) GetFirstIncompletePreviousVideo( ctx context.Context, userID int64, videoID int64, ) (*domain.VideoAccessBlock, error) MarkVideoCompleted( ctx context.Context, userID int64, videoID int64, ) error PublishSubCourseVideo( ctx context.Context, videoID int64, ) error UpdateSubCourseVideo( ctx context.Context, id int64, title *string, description *string, videoURL *string, duration *int32, resolution *string, visibility *string, thumbnail *string, displayOrder *int32, status *string, ) error ArchiveSubCourseVideo( ctx context.Context, id int64, ) error DeleteSubCourseVideo( ctx context.Context, id int64, ) error // Vimeo integration UpdateVimeoStatus(ctx context.Context, videoID int64, status string) error GetVideoByVimeoID(ctx context.Context, vimeoID string) (domain.SubCourseVideo, error) // Learning Tree GetFullLearningTree(ctx context.Context) ([]domain.TreeCourse, error) // Learning Path (full nested structure for a course) GetCourseLearningPath(ctx context.Context, courseID int64) (domain.LearningPath, error) // Reorder (drag-and-drop support) ReorderCourseCategories(ctx context.Context, ids []int64, positions []int32) error ReorderCourses(ctx context.Context, ids []int64, positions []int32) error ReorderSubCourses(ctx context.Context, ids []int64, positions []int32) error ReorderSubCourseVideos(ctx context.Context, ids []int64, positions []int32) error ReorderQuestionSets(ctx context.Context, ids []int64, positions []int32) error } type ProgressionStore interface { // Prerequisites (admin) AddSubCoursePrerequisite(ctx context.Context, subCourseID, prerequisiteSubCourseID int64) error RemoveSubCoursePrerequisite(ctx context.Context, subCourseID, prerequisiteSubCourseID int64) error GetSubCoursePrerequisites(ctx context.Context, subCourseID int64) ([]domain.SubCoursePrerequisite, error) GetSubCourseDependents(ctx context.Context, prerequisiteSubCourseID int64) ([]domain.SubCourseDependent, error) CountUnmetPrerequisites(ctx context.Context, subCourseID, userID int64) (int64, error) DeleteAllPrerequisitesForSubCourse(ctx context.Context, subCourseID int64) error // User progress StartSubCourseProgress(ctx context.Context, userID, subCourseID int64) (domain.UserSubCourseProgress, error) UpdateSubCourseProgress(ctx context.Context, userID, subCourseID int64, percentage int16) error CompleteSubCourse(ctx context.Context, userID, subCourseID int64) error RecalculateSubCourseProgress(ctx context.Context, userID, subCourseID int64) error GetUserSubCourseProgress(ctx context.Context, userID, subCourseID int64) (domain.UserSubCourseProgress, error) GetUserCourseProgress(ctx context.Context, userID, courseID int64) ([]domain.UserCourseProgressItem, error) GetSubCoursesWithProgressByCourse(ctx context.Context, userID, courseID int64) ([]domain.SubCourseWithProgress, error) }