diff --git a/api/courses.go b/api/courses.go index 4b2c6c4a9..73ac8a61e 100644 --- a/api/courses.go +++ b/api/courses.go @@ -81,6 +81,7 @@ func configGinCourseRouter(router *gin.Engine, daoWrapper dao.DaoWrapper) { { stream.Use(tools.InitStream(daoWrapper)) stream.GET("/transcodingProgress", routes.getTranscodingProgress) + stream.POST("/copy", routes.copyStream) } stats := courses.Group("/stats") @@ -1557,6 +1558,62 @@ type copyCourseRequest struct { YearW string } +func (r coursesRoutes) copyStream(c *gin.Context) { + type req struct { + TargetCourse uint `json:"targetCourse"` + Move bool `json:"move"` + } + var request req + err := c.BindJSON(&request) + if err != nil { + _ = c.Error(tools.RequestError{Status: http.StatusBadRequest, CustomMessage: "Bad request", Err: err}) + return + } + tlctx := c.MustGet("TUMLiveContext").(tools.TUMLiveContext) + + isAdmin := tlctx.User.Role == model.AdminType + + if !isAdmin { + targetCourseAdmins, err := r.DaoWrapper.CoursesDao.GetCourseAdmins(request.TargetCourse) + if err != nil { + logger.Error("Error getting course admins", "err", err) + _ = c.Error(tools.RequestError{ + Status: http.StatusInternalServerError, + CustomMessage: "can't determine admins of target course", + Err: err, + }) + } + for _, admin := range targetCourseAdmins { + if admin.ID == tlctx.User.ID { + isAdmin = true + break + } + } + } + if !isAdmin { + _ = c.Error(tools.RequestError{ + Status: http.StatusForbidden, + CustomMessage: "you are not admin of the target course", + }) + return + } + + stream := tlctx.Stream + stream.Model = gorm.Model{} + stream.CourseID = request.TargetCourse + err = r.StreamsDao.CreateStream(stream) + if err != nil { + _ = c.Error(tools.RequestError{ + Status: http.StatusInternalServerError, + CustomMessage: "Can't save stream", + Err: err, + }) + } + if request.Move { + r.StreamsDao.DeleteStream(strconv.Itoa(int(tlctx.Stream.ID))) + } +} + func (r coursesRoutes) copyCourse(c *gin.Context) { var request copyCourseRequest err := c.BindJSON(&request) diff --git a/model/stream.go b/model/stream.go index 4231a17af..ab44a7a6c 100755 --- a/model/stream.go +++ b/model/stream.go @@ -359,6 +359,7 @@ func (s Stream) GetJson(lhs []LectureHall, course Course) gin.H { "courseSlug": course.Slug, "private": s.Private, "downloadableVods": s.GetVodFiles(), + "isCopying": false, "videoSections": videoSections, } } diff --git a/web/admin.go b/web/admin.go index e963fd659..a645ec620 100644 --- a/web/admin.go +++ b/web/admin.go @@ -276,6 +276,7 @@ func (r mainRoutes) EditCoursePage(c *gin.Context) { CurT: tumLiveContext.Course.TeachingTerm, EditCourseData: EditCourseData{ IndexData: indexData, + Courses: courses, IngestBase: tools.Cfg.IngestBase, LectureHalls: lectureHalls, }, @@ -368,6 +369,7 @@ type EditCourseData struct { IndexData IndexData IngestBase string LectureHalls []model.LectureHall + Courses []model.Course // administered courses of user } type LectureUnitsPageData struct { diff --git a/web/template/partial/course/manage/lecture-management-card.gohtml b/web/template/partial/course/manage/lecture-management-card.gohtml index 626dcd344..2b66b8865 100644 --- a/web/template/partial/course/manage/lecture-management-card.gohtml +++ b/web/template/partial/course/manage/lecture-management-card.gohtml @@ -2,6 +2,7 @@ {{- /*gotype: github.com/TUM-Dev/gocast/web.AdminPageData*/ -}} {{$course := .IndexData.TUMLiveContext.Course}} + {{$courses := .Courses}} {{$user := .IndexData.TUMLiveContext.User}} {{$ingestBase := .IngestBase}} {{$lectureHalls := .LectureHalls}} @@ -200,6 +201,10 @@ :class="lectureData.private?'text-gray-400 dark:hover:text-gray-500 hover:text-gray-300':'text-red-400 dark:hover:text-red-500 hover:text-red-300'"> Make private +