package course_management import ( "Yimaru-Backend/internal/domain" "context" ) // --- Prerequisites (admin) --- func (s *Service) AddSubCoursePrerequisite(ctx context.Context, subCourseID, prerequisiteSubCourseID int64) error { if subCourseID == prerequisiteSubCourseID { return domain.ErrSelfPrerequisite } return s.progressionStore.AddSubCoursePrerequisite(ctx, subCourseID, prerequisiteSubCourseID) } func (s *Service) RemoveSubCoursePrerequisite(ctx context.Context, subCourseID, prerequisiteSubCourseID int64) error { return s.progressionStore.RemoveSubCoursePrerequisite(ctx, subCourseID, prerequisiteSubCourseID) } func (s *Service) GetSubCoursePrerequisites(ctx context.Context, subCourseID int64) ([]domain.SubCoursePrerequisite, error) { return s.progressionStore.GetSubCoursePrerequisites(ctx, subCourseID) } func (s *Service) GetSubCourseDependents(ctx context.Context, prerequisiteSubCourseID int64) ([]domain.SubCourseDependent, error) { return s.progressionStore.GetSubCourseDependents(ctx, prerequisiteSubCourseID) } // --- User progress --- func (s *Service) CheckSubCourseAccess(ctx context.Context, userID, subCourseID int64) (bool, error) { unmet, err := s.progressionStore.CountUnmetPrerequisites(ctx, subCourseID, userID) if err != nil { return false, err } return unmet == 0, nil } func (s *Service) StartSubCourse(ctx context.Context, userID, subCourseID int64) (domain.UserSubCourseProgress, error) { accessible, err := s.CheckSubCourseAccess(ctx, userID, subCourseID) if err != nil { return domain.UserSubCourseProgress{}, err } if !accessible { return domain.UserSubCourseProgress{}, domain.ErrPrerequisiteNotMet } return s.progressionStore.StartSubCourseProgress(ctx, userID, subCourseID) } func (s *Service) UpdateSubCourseProgress(ctx context.Context, userID, subCourseID int64, percentage int16) error { return s.progressionStore.UpdateSubCourseProgress(ctx, userID, subCourseID, percentage) } func (s *Service) CompleteSubCourse(ctx context.Context, userID, subCourseID int64) error { return s.progressionStore.CompleteSubCourse(ctx, userID, subCourseID) } func (s *Service) RecalculateSubCourseProgress(ctx context.Context, userID, subCourseID int64) error { return s.progressionStore.RecalculateSubCourseProgress(ctx, userID, subCourseID) } func (s *Service) GetUserSubCourseProgress(ctx context.Context, userID, subCourseID int64) (domain.UserSubCourseProgress, error) { return s.progressionStore.GetUserSubCourseProgress(ctx, userID, subCourseID) } func (s *Service) GetUserCourseProgress(ctx context.Context, userID, courseID int64) ([]domain.UserCourseProgressItem, error) { return s.progressionStore.GetUserCourseProgress(ctx, userID, courseID) } func (s *Service) GetSubCoursesWithProgress(ctx context.Context, userID, courseID int64) ([]domain.SubCourseWithProgress, error) { return s.progressionStore.GetSubCoursesWithProgressByCourse(ctx, userID, courseID) }