Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
7fb318d
button for personal lecture title change
karjo24 Mar 5, 2025
ae9ff7e
frontend structure
karjo24 Mar 5, 2025
bc4ffe7
removed readonly
karjo24 Mar 5, 2025
6844ab7
database base setup of new table
karjo24 Mar 5, 2025
022bd59
cleaned up dao, added updateorcreate
karjo24 Mar 5, 2025
b1f2927
extended backend to include custom lecture naem
karjo24 Mar 6, 2025
c539464
query fix
karjo24 Mar 6, 2025
b8cc26d
frontend includes customName, only api missing
karjo24 Mar 6, 2025
f28bf72
renamed function
karjo24 Mar 8, 2025
3f3c4f1
added api
karjo24 Mar 8, 2025
55ab7b2
added api call
karjo24 Mar 8, 2025
b936700
fixed wrong cache setting
karjo24 Mar 8, 2025
5c6635e
fixed eslint suggestions
karjo24 Mar 8, 2025
d6d7cc4
adapted tests to changes of this PR; Eslint fix
karjo24 Mar 8, 2025
9f9ddf3
golang lint fix
karjo24 Mar 8, 2025
4030e72
golang linter fix
karjo24 Mar 8, 2025
134ebc4
deletes personal lecture name when set to empty string
karjo24 Mar 8, 2025
365a89b
Add custom lecture title to apiv2.proto
carlobortolan Mar 9, 2025
b29498b
shorter menu entry title for conciseness
karjo24 Mar 9, 2025
3b5e4c6
refactored two getCourseBySlugYearAndTerm[User] into one
karjo24 Mar 9, 2025
c580b9d
changed tests to match new function signature
karjo24 Mar 9, 2025
a5d2661
code style changes
karjo24 Mar 14, 2025
0185dee
refactored upsert to save using clauses
karjo24 Mar 14, 2025
5e51dfb
changed file name and edited error message to reflect prior changes
karjo24 Mar 14, 2025
6170ef2
changed where lecture title gets added to stream DTO to avoid future …
karjo24 Mar 14, 2025
076e788
changed cache key to avoid collisions
karjo24 Mar 14, 2025
56f1acd
Merge branch 'dev' into 840-short-decription-for-each-video
karjo24 Mar 14, 2025
c2239a1
incorrect redirect removed
karjo24 Mar 21, 2025
c923a00
eslint fix
karjo24 Mar 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions api/courses.go
Original file line number Diff line number Diff line change
Expand Up @@ -344,7 +344,14 @@ func (r coursesRoutes) getCourseBySlug(c *gin.Context) {
Streams []model.StreamDTO
}

course, err := r.CoursesDao.GetCourseBySlugYearAndTerm(c, uri.Slug, query.Term, query.Year)
var userId uint
user := tumLiveContext.User
if user != nil {
userId = user.ID
}
var course model.Course
var err error
course, err = r.CoursesDao.GetCourseBySlugYearAndTerm(c, uri.Slug, query.Term, query.Year, userId)
if err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
_ = c.Error(tools.RequestError{
Expand All @@ -367,7 +374,6 @@ func (r coursesRoutes) getCourseBySlug(c *gin.Context) {
return
}

user := tumLiveContext.User
var streams []model.Stream
for _, stream := range course.Streams {
if !stream.Private || (user != nil && user.IsAdminOfCourse(course)) {
Expand All @@ -389,6 +395,10 @@ func (r coursesRoutes) getCourseBySlug(c *gin.Context) {
return
}
streamsDTO[i] = s.ToDTO()
// Double check that custom lecture title has the right userId and add it to the streamDTO
if len(s.CustomLectureTitles) > 0 && s.CustomLectureTitles[0].UserID == userId {
streamsDTO[i].CustomName = s.CustomLectureTitles[0].Title
}
}

isAdmin := course.UserID == query.UserID
Expand Down Expand Up @@ -1377,7 +1387,7 @@ func (r coursesRoutes) createCourse(c *gin.Context) {
} else {
semester = "S"
}
_, err = r.CoursesDao.GetCourseBySlugYearAndTerm(c, req.Slug, semester, year)
_, err = r.CoursesDao.GetCourseBySlugYearAndTerm(c, req.Slug, semester, year, 0)
if err == nil {
_ = c.Error(tools.RequestError{
Status: http.StatusConflict,
Expand Down Expand Up @@ -1420,7 +1430,7 @@ func (r coursesRoutes) createCourse(c *gin.Context) {
})
return
}
courseWithID, err := r.CoursesDao.GetCourseBySlugYearAndTerm(context.Background(), req.Slug, semester, year)
courseWithID, err := r.CoursesDao.GetCourseBySlugYearAndTerm(context.Background(), req.Slug, semester, year, 0)
if err != nil {
_ = c.Error(tools.RequestError{
Status: http.StatusInternalServerError,
Expand Down
42 changes: 21 additions & 21 deletions api/courses_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -367,7 +367,7 @@ func TestCoursesCRUD(t *testing.T) {
mock := mock_dao.NewMockCoursesDao(gomock.NewController(t))
mock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseTensNet.Slug, "S", 2023).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseTensNet.Slug, "S", 2023, testutils.TUMLiveContextStudent.User.ID).
Return(model.Course{}, gorm.ErrRecordNotFound).
AnyTimes()
return mock
Expand All @@ -385,7 +385,7 @@ func TestCoursesCRUD(t *testing.T) {
mock := mock_dao.NewMockCoursesDao(gomock.NewController(t))
mock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseTensNet.Slug, "S", 2023).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseTensNet.Slug, "S", 2023, testutils.TUMLiveContextStudent.User.ID).
Return(model.Course{}, errors.New("")).
AnyTimes()
return mock
Expand All @@ -403,7 +403,7 @@ func TestCoursesCRUD(t *testing.T) {
mock := mock_dao.NewMockCoursesDao(gomock.NewController(t))
mock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseTensNet.Slug, "S", 2023).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseTensNet.Slug, "S", 2023, testutils.TUMLiveContextAdmin.User.ID).
Return(testutils.CourseTensNet, nil).
AnyTimes()
return mock
Expand Down Expand Up @@ -442,7 +442,7 @@ func TestCoursesCRUD(t *testing.T) {
AnyTimes()
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, testutils.TUMLiveContextStudent.User.ID).
Return(testutils.CourseFPV, nil).
AnyTimes()
return coursesMock
Expand All @@ -468,7 +468,7 @@ func TestCoursesCRUD(t *testing.T) {
AnyTimes()
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, testutils.TUMLiveContextAdmin.User.ID).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -622,7 +622,7 @@ func TestCoursesCRUD(t *testing.T) {
coursesMock := mock_dao.NewMockCoursesDao(ctrl)
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), request.Slug, "S", 2020).
GetCourseBySlugYearAndTerm(gomock.Any(), request.Slug, "S", 2020, gomock.Any()).
Return(model.Course{}, nil).
AnyTimes()
return coursesMock
Expand All @@ -642,7 +642,7 @@ func TestCoursesCRUD(t *testing.T) {
coursesMock := mock_dao.NewMockCoursesDao(ctrl)
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), request.Slug, "S", 2020).
GetCourseBySlugYearAndTerm(gomock.Any(), request.Slug, "S", 2020, gomock.Any()).
Return(model.Course{}, errors.New("")).
AnyTimes()
coursesMock.
Expand All @@ -667,11 +667,11 @@ func TestCoursesCRUD(t *testing.T) {
coursesMock := mock_dao.NewMockCoursesDao(ctrl)
first := coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), request.Slug, "S", 2020).
GetCourseBySlugYearAndTerm(gomock.Any(), request.Slug, "S", 2020, gomock.Any()).
Return(model.Course{}, errors.New("")).Times(1)
second := coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), request.Slug, "S", 2020).
GetCourseBySlugYearAndTerm(gomock.Any(), request.Slug, "S", 2020, gomock.Any()).
Return(newCourse, errors.New("")).Times(1)

gomock.InOrder(first, second)
Expand Down Expand Up @@ -780,7 +780,7 @@ func TestCoursesCRUD(t *testing.T) {
AnyTimes()
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -818,7 +818,7 @@ func TestCoursesCRUD(t *testing.T) {
AnyTimes()
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -927,7 +927,7 @@ func TestCoursesLectureActions(t *testing.T) {
AnyTimes()
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -970,7 +970,7 @@ func TestCoursesLectureActions(t *testing.T) {
AnyTimes()
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
GetCourseBySlugYearAndTerm(gomock.Any(), testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -1822,7 +1822,7 @@ func TestAdminFunctions(t *testing.T) {
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(),
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm,
testutils.CourseFPV.Year).
testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -1926,7 +1926,7 @@ func TestAdminFunctions(t *testing.T) {
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(),
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -1957,7 +1957,7 @@ func TestAdminFunctions(t *testing.T) {
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(),
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -2015,7 +2015,7 @@ func TestAdminFunctions(t *testing.T) {
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(),
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -2102,7 +2102,7 @@ func TestAdminFunctions(t *testing.T) {
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(),
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -2131,7 +2131,7 @@ func TestAdminFunctions(t *testing.T) {
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(),
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -2160,7 +2160,7 @@ func TestAdminFunctions(t *testing.T) {
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(),
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down Expand Up @@ -2190,7 +2190,7 @@ func TestAdminFunctions(t *testing.T) {
coursesMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(),
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year).
testutils.CourseFPV.Slug, testutils.CourseFPV.TeachingTerm, testutils.CourseFPV.Year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
coursesMock.
Expand Down
2 changes: 1 addition & 1 deletion api/download_ics.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func (r downloadICSRoutes) downloadICS(c *gin.Context) {
return
}

course, err := r.CoursesDao.GetCourseBySlugYearAndTerm(c, slug, term, year)
course, err := r.CoursesDao.GetCourseBySlugYearAndTerm(c, slug, term, year, 0)
if err != nil {
_ = c.Error(tools.RequestError{
Status: http.StatusBadRequest,
Expand Down
4 changes: 2 additions & 2 deletions api/download_ics_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func TestDownloadICS(t *testing.T) {
courseMock := mock_dao.NewMockCoursesDao(gomock.NewController(t))
courseMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), slug, term, year).
GetCourseBySlugYearAndTerm(gomock.Any(), slug, term, year, gomock.Any()).
Return(model.Course{}, errors.New("")).
AnyTimes()
return courseMock
Expand All @@ -67,7 +67,7 @@ func TestDownloadICS(t *testing.T) {
courseMock := mock_dao.NewMockCoursesDao(gomock.NewController(t))
courseMock.
EXPECT().
GetCourseBySlugYearAndTerm(gomock.Any(), slug, term, year).
GetCourseBySlugYearAndTerm(gomock.Any(), slug, term, year, gomock.Any()).
Return(testutils.CourseFPV, nil).
AnyTimes()
return courseMock
Expand Down
4 changes: 2 additions & 2 deletions api/search.go
Original file line number Diff line number Diff line change
Expand Up @@ -262,7 +262,7 @@ func checkAndFillResponse(c *gin.Context, user *model.User, limit int64, daoWrap
}

for _, meiliCourse := range meiliCourses {
course, err := daoWrapper.CoursesDao.GetCourseBySlugYearAndTerm(c, meiliCourse.Slug, meiliCourse.TeachingTerm, meiliCourse.Year)
course, err := daoWrapper.CoursesDao.GetCourseBySlugYearAndTerm(c, meiliCourse.Slug, meiliCourse.TeachingTerm, meiliCourse.Year, 0)
if err == nil && user.IsEligibleToSearchForCourse(course) {
res.Hits = append(res.Hits, meiliCourse)
}
Expand Down Expand Up @@ -543,7 +543,7 @@ func parseCourses(c *gin.Context, daoWrapper dao.DaoWrapper, urlParamCourse stri
}
length := len(courseString)
year, _ := strconv.Atoi(courseString[length-5 : length-1])
course, err := daoWrapper.CoursesDao.GetCourseBySlugYearAndTerm(c, courseString[:length-5], courseString[length-1:], year)
course, err := daoWrapper.CoursesDao.GetCourseBySlugYearAndTerm(c, courseString[:length-5], courseString[length-1:], year, 0)
if err != nil {
return nil, 1
}
Expand Down
4 changes: 2 additions & 2 deletions api/search_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,10 +331,10 @@ func getCoursesMock(t *testing.T) *mock_dao.MockCoursesDao {
mock := mock_dao.NewMockCoursesDao(gomock.NewController(t))
for _, course := range testutils.AllCoursesForSearchTests {
mock.EXPECT().GetCourseById(gomock.Any(), course.ID).Return(course, nil).AnyTimes()
mock.EXPECT().GetCourseBySlugYearAndTerm(gomock.Any(), course.Slug, course.TeachingTerm, course.Year).Return(course, nil).AnyTimes()
mock.EXPECT().GetCourseBySlugYearAndTerm(gomock.Any(), course.Slug, course.TeachingTerm, course.Year, gomock.Any()).Return(course, nil).AnyTimes()
}
mock.EXPECT().GetCourseById(gomock.Any(), gomock.Any()).Return(model.Course{}, errors.New("whoops")).AnyTimes()
mock.EXPECT().GetCourseBySlugYearAndTerm(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(model.Course{}, errors.New("whoops")).AnyTimes()
mock.EXPECT().GetCourseBySlugYearAndTerm(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Return(model.Course{}, errors.New("whoops")).AnyTimes()
return mock
}

Expand Down
65 changes: 65 additions & 0 deletions api/stream.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,11 @@ func configGinStreamRestRouter(router *gin.Engine, daoWrapper dao.DaoWrapper) {

streamById.GET("/playlist", routes.getStreamPlaylist)

withUser := streamById.Use(tools.LoggedIn)
{
withUser.PUT("/personalLectureName", routes.changePersonalLectureName)
}

thumbs := streamById.Group("/thumbs")
{
thumbs.GET(":fid", routes.getThumbs)
Expand Down Expand Up @@ -894,3 +899,63 @@ func (r streamRoutes) updateChatEnabled(c *gin.Context) {
return
}
}

type changePersonalLectureNameRequest struct {
PersonalLectureName string `json:"personalLectureName"`
}

func (r streamRoutes) changePersonalLectureName(c *gin.Context) {
ctx := c.MustGet("TUMLiveContext").(tools.TUMLiveContext)

streamIdAsString := c.Param("streamID")
streamId, err := strconv.ParseUint(streamIdAsString, 10, 32)
if err != nil {
logger.Error("can not parse stream id in request url", "err", err)
_ = c.Error(tools.RequestError{
Status: http.StatusBadRequest,
CustomMessage: "can not parse stream id in request url",
Err: err,
})
return
}

var update changePersonalLectureNameRequest
err = c.BindJSON(&update)
if err != nil {
logger.Error("failed to bind personal lecture name JSON", "err", err)
_ = c.Error(tools.RequestError{
Status: http.StatusBadRequest,
CustomMessage: "can not bind body",
Err: err,
})
return
}

if update.PersonalLectureName == "" {
err = r.UserDefinedLectureTitlesDao.Delete(ctx.User.ID, uint(streamId))
if err != nil {
logger.Error("failed to delete personal lecture name", "err", err)
_ = c.Error(tools.RequestError{
Status: http.StatusInternalServerError,
CustomMessage: "can not delete personal lecture name",
Err: err,
})
}
return
}

err = r.UserDefinedLectureTitlesDao.Save(&model.UserDefinedLectureTitle{
UserID: ctx.User.ID,
StreamID: uint(streamId),
Title: update.PersonalLectureName,
})
if err != nil {
logger.Error("failed to save personal lecture name", "err", err)
_ = c.Error(tools.RequestError{
Status: http.StatusInternalServerError,
CustomMessage: "can not save personal lecture name",
Err: err,
})
return
}
}
4 changes: 4 additions & 0 deletions apiv2/helpers/parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@ func ParseStreamToProto(stream model.Stream, downloads []model.DownloadableVod)
s.Downloads = append(s.Downloads, ParseDownloadToProto(download))
}

if len(stream.CustomLectureTitles) > 0 {
s.CustomLectureTitle = stream.CustomLectureTitles[0].Title
}

return s
}

Expand Down
Loading
Loading