-
Notifications
You must be signed in to change notification settings - Fork 42
/
lecture_halls.go
134 lines (109 loc) · 4.7 KB
/
lecture_halls.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
package dao
import (
"time"
"github.com/TUM-Dev/gocast/model"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
//go:generate mockgen -source=lecture_halls.go -destination ../mock_dao/lecture_halls.go
type LectureHallsDao interface {
CreateLectureHall(lectureHall model.LectureHall)
SavePreset(preset model.CameraPreset) error
SaveLectureHallFullAssoc(lectureHall model.LectureHall)
SaveLectureHall(lectureHall model.LectureHall) error
FindPreset(lectureHallID string, presetID string) (model.CameraPreset, error)
GetAllLectureHalls() []model.LectureHall
GetLectureHallByPartialName(name string) (model.LectureHall, error)
GetLectureHallByID(id uint) (model.LectureHall, error)
GetStreamsForLectureHallIcal(userId uint, lectureHalls []uint, all bool) ([]CalendarResult, error)
UnsetDefaults(lectureHallID string) error
DeleteLectureHall(id uint) error
}
type lectureHallsDao struct {
db *gorm.DB
}
func NewLectureHallsDao() LectureHallsDao {
return lectureHallsDao{db: DB}
}
func (d lectureHallsDao) CreateLectureHall(lectureHall model.LectureHall) {
DB.Create(&lectureHall)
}
func (d lectureHallsDao) SavePreset(preset model.CameraPreset) error {
return DB.Clauses(clause.OnConflict{UpdateAll: true}).Save(&preset).Error
}
func (d lectureHallsDao) SaveLectureHallFullAssoc(lectureHall model.LectureHall) {
DB.Delete(model.CameraPreset{}, "lecture_hall_id = ?", lectureHall.ID)
DB.Clauses(clause.OnConflict{UpdateAll: true}).Session(&gorm.Session{FullSaveAssociations: true}).Updates(&lectureHall)
}
func (d lectureHallsDao) SaveLectureHall(lectureHall model.LectureHall) error {
return DB.Save(&lectureHall).Error
}
func (d lectureHallsDao) FindPreset(lectureHallID string, presetID string) (model.CameraPreset, error) {
var preset model.CameraPreset
err := DB.First(&preset, "preset_id = ? AND lecture_hall_id = ?", presetID, lectureHallID).Error
return preset, err
}
func (d lectureHallsDao) GetAllLectureHalls() []model.LectureHall {
var lectureHalls []model.LectureHall
_ = DB.Preload("CameraPresets").Find(&lectureHalls)
return lectureHalls
}
func (d lectureHallsDao) GetLectureHallByPartialName(name string) (model.LectureHall, error) {
var res model.LectureHall
err := DB.Where("full_name LIKE ?", "%"+name+"%").First(&res).Error
return res, err
}
func (d lectureHallsDao) GetLectureHallByID(id uint) (model.LectureHall, error) {
var lectureHall model.LectureHall
err := DB.Preload("CameraPresets").First(&lectureHall, id).Error
return lectureHall, err
}
// GetStreamsForLectureHallIcal returns an instance of []calendarResult for the ical export.
// if a user id is given, only streams of the user are returned. All streams are returned otherwise.
// streams that happened more than on month ago and streams that are more than 3 months in the future are omitted.
func (d lectureHallsDao) GetStreamsForLectureHallIcal(userId uint, lectureHalls []uint, all bool) ([]CalendarResult, error) {
var res []CalendarResult
err := DB.Model(&model.Stream{}).
Joins("LEFT JOIN lecture_halls ON lecture_halls.id = streams.lecture_hall_id").
Joins("JOIN courses ON courses.id = streams.course_id").
Joins("LEFT JOIN course_admins ON courses.id = course_admins.course_id").
Select("streams.id as stream_id, streams.created_at as created, "+
"lecture_halls.name as lecture_hall_name, "+
"streams.start, streams.end, courses.name as course_name").
Where("(streams.start BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) and DATE_ADD(NOW(), INTERVAL 3 MONTH)) "+
"AND (courses.user_id = ? OR 0 = ? OR course_admins.user_id = ?) AND courses.deleted_at IS NULL "+
"AND (streams.lecture_hall_id IN ? OR (0 in ? AND streams.lecture_hall_id is null) OR ?)", userId, userId, userId, lectureHalls, lectureHalls, all).
Group("streams.id").
Scan(&res).Error
return res, err
}
// UnsetDefaults makes all camera presets not default
func (d lectureHallsDao) UnsetDefaults(lectureHallID string) error {
return DB.Model(&model.CameraPreset{}).Where("lecture_hall_id = ?", lectureHallID).Update("default", nil).Error
}
func (d lectureHallsDao) DeleteLectureHall(id uint) error {
err := DB.Delete(&model.LectureHall{}, id).Error
if err != nil {
return err
}
DB.Delete(model.CameraPreset{}, "lecture_hall_id = ?", id)
DB.Exec("UPDATE streams SET lecture_hall_id = NULL WHERE lecture_hall_id = ?", id)
return nil
}
type CalendarResult struct {
StreamID uint
Created time.Time
Start time.Time
End time.Time
CourseName string
LectureHallName string
}
func (r CalendarResult) IsoStart() string {
return r.Start.Format("20060102T150405")
}
func (r CalendarResult) IsoEnd() string {
return r.End.Format("20060102T150405")
}
func (r CalendarResult) IsoCreated() string {
return r.Created.Format("20060102T150405")
}