diff --git a/calendar/api_event.go b/calendar/api_event.go index dbb551b..4464d69 100644 --- a/calendar/api_event.go +++ b/calendar/api_event.go @@ -27,17 +27,22 @@ func ApiEventQuery(c *gin.Context) { } var result *gorm.DB - if grp != "" && auth.ACHas(c, auth.ADMIN, auth.SYSTEM, grp) { - var grp_id uint - db.Raw("select id from groups where name = ?", grp).Scan(&grp_id) - if grp_id == 0 { - panic(errors.ErrorNotFound) + if grp != "" { + if !auth.ACHas(c, auth.ADMIN, auth.SYSTEM, grp) { + panic(errors.ErrorForbidden) } - result = db.Find(&events, "`group_id` = ? ", grp_id) + result = db.Find(&events, `event_group_id in ( + select id from event_groups where group_id = ( + select id from groups where name = ? + ) + )`, grp) } else if !auth.ACHas(c, auth.ADMIN, auth.SYSTEM) { - result = db. - Find(&events, "`group_id` in (?) or group_id = 0", - db.Table("groups").Select("id").Where("name in ?", cl.Groups)) + result = db.Find(&events, `event_group_id in ( + select eg.id from event_groups eg where eg.group_id in ( + select g.id from groups g where g.name in ? + ) + )`, cl.Groups) + } else { result = db.Find(&events) } @@ -60,15 +65,28 @@ func ApiEventNew(c *gin.Context) { if e.Start.IsZero() || e.End.IsZero() || e.Start.Before(e.End) { panic(ErrorInvalidTime) } - if !auth.ACHas(c, auth.ADMIN, auth.SYSTEM, e.GroupName) { + cal := 0 + if db.Raw("select count(id) from calendars where id = ?", e.CalendarID). + Scan(&cal); cal != 1 { + panic(errors.ErrorNotFound) + } + if !auth.ACHas(c, auth.ADMIN, auth.SYSTEM, e.EventGroup.GroupName) { panic(errors.ErrorForbidden) } - if err := db.Create(e).Error; err != nil { + if e.EventGroup.Name == "" { + e.EventGroup.Name = e.Name + } + if err := db.Transaction(func(tx *gorm.DB) error { + if err := tx.Create(e).Error; err != nil { + return err + } + return nil + }); err != nil { panic(err) } history.Send(history.Info(). Nm("Create"). - Grp(e.GroupName).Bd(e). + Grp(e.EventGroup.GroupName).Bd(e). Iss(c.GetString(auth.GinUserKey)). Msg("Event created")) server.OK(c, e) @@ -90,7 +108,7 @@ func ApiEventUpdate(c *gin.Context) { } history.Send(history.Info(). Nm("Update"). - Grp(e.GroupName).Bd(e). + Grp(e.EventGroup.GroupName).Bd(e). Iss(c.GetString(auth.GinUserKey)). Msg("Event Updated")) server.OK(c, e) @@ -107,13 +125,16 @@ func ApiEventDelete(c *gin.Context) { panic(err) } - err = db.Delete(&Calendar{}, "id = ?", id).Error + err = db.Delete(e, "id = ?", id).Error if err != nil { panic(errors.NewError(404, err)) } + db.Exec(`delete from event_groups where id = ? + and 0 = (select count(id) from events where event_group_id = ?)`, + e.EventGroupID, e.EventGroupID) history.Send(history.Info(). Nm("Delete"). - Grp(e.GroupName).Bd(e). + Grp(e.EventGroup.GroupName).Bd(e). Iss(c.GetString(auth.GinUserKey)). Msg("Event Deleted")) server.OK(c, "ok") diff --git a/calendar/calendar.go b/calendar/calendar.go index 40bb22b..0dbc0d8 100644 --- a/calendar/calendar.go +++ b/calendar/calendar.go @@ -14,6 +14,11 @@ var l zerolog.Logger var db *gorm.DB +var color []string = []string{ + "red", "pink", "purple", "deep-purple", "indigo", "blue", "light-blue", "cyan", "teal", "green", + "light-green", "lime", "yellow", "amber", "orange", "deep-orange", "blue-grey", +} + type Calendar struct { ID string `gorm:"primaryKey"` @@ -63,5 +68,6 @@ func (c *Calendar) AfterFind(tx *gorm.DB) (err error) { db.Raw("select name from groups where id = ?", c.GroupID).Scan(&name) c.GroupName = name } + return } diff --git a/calendar/event.go b/calendar/event.go index 186ba13..3569031 100644 --- a/calendar/event.go +++ b/calendar/event.go @@ -5,46 +5,31 @@ import ( "github.com/rs/xid" "gorm.io/gorm" - "kumoly.io/kumoly/app/auth" "kumoly.io/kumoly/app/errors" ) type Event struct { ID string `gorm:"primaryKey"` - Start time.Time - End time.Time - Name string `gorm:"not null"` - Hosts string - Description string - Location string + Start time.Time + End time.Time + Name string `gorm:"not null"` - // ntu - Class string - CourseID string - Semester string + Color string `gorm:"-"` + + IsExt bool CalendarID string + EventGroup EventGroup `json:"Detial"` EventGroupID string - Group auth.Group `json:"-"` - GroupName string `gorm:"-" json:"Group"` - GroupID uint `json:"-"` - CreatedAt time.Time UpdatedAt time.Time } func (e *Event) BeforeSave(tx *gorm.DB) (err error) { - if e.GroupName != "" { - var grp_id uint - db.Raw("select id from groups where name = ?", e.GroupName).Scan(&grp_id) - if grp_id == 0 { - return errors.ErrorNotFound - } - e.GroupID = grp_id - } else { - e.GroupID = 0 + if e.CalendarID == "" { + return errors.ErrorBadRequest } return } @@ -53,14 +38,16 @@ func (e *Event) BeforeCreate(tx *gorm.DB) (err error) { if e.ID == "" { e.ID = xid.New().String() } + e.IsExt = false return } func (e *Event) AfterFind(tx *gorm.DB) (err error) { - if e.GroupID != 0 { - var name string - db.Raw("select name from groups where id = ?", e.GroupID).Scan(&name) - e.GroupName = name + eg := EventGroup{} + if err := tx.First(&eg, "id = ?", e.EventGroupID).Error; err != nil { + return err } + e.EventGroup = eg + e.Color = color[e.EventGroup.Color%len(color)] return } diff --git a/calendar/event_group.go b/calendar/event_group.go index a383b97..94bb387 100644 --- a/calendar/event_group.go +++ b/calendar/event_group.go @@ -15,7 +15,19 @@ type EventGroup struct { Name string Rrule string - Events []Event + // event header + Hosts string + Description string + Location string + + // ntu + Class string + CourseID string + Semester string + + // UI + Color int + // event end Group auth.Group `json:"-"` GroupName string `gorm:"-" json:"Group"` @@ -36,6 +48,8 @@ func (eg *EventGroup) BeforeSave(tx *gorm.DB) (err error) { } else { eg.GroupID = 0 } + eg.Color = GetNewColor(eg.GroupName) + return } func (eg *EventGroup) BeforeCreate(tx *gorm.DB) (err error) { diff --git a/calendar/service.go b/calendar/service.go index b969f5e..1fadbfb 100644 --- a/calendar/service.go +++ b/calendar/service.go @@ -1,6 +1,9 @@ package calendar import ( + "math/rand" + "time" + "kumoly.io/kumoly/app/server" "kumoly.io/kumoly/app/store" "kumoly.io/kumoly/app/util" @@ -16,6 +19,7 @@ func (srv Service) Del() {} func (srv Service) Health() error { return nil } func (srv Service) Init() error { + rand.Seed(time.Now().UnixNano()) db = store.DB l = util.Klog.With().Str("mod", "auth").Logger() diff --git a/calendar/util.go b/calendar/util.go index 11f7a78..9602793 100644 --- a/calendar/util.go +++ b/calendar/util.go @@ -1,6 +1,8 @@ package calendar import ( + "math/rand" + "github.com/gin-gonic/gin" "gorm.io/gorm" "kumoly.io/kumoly/app/auth" @@ -26,10 +28,10 @@ func HasEventAccess(c *gin.Context, e *Event, cid string) error { if err != nil { return errors.NewError(404, err) } - if e.GroupName == "" { + if e.EventGroup.GroupName == "" { return nil } - if !auth.ACHas(c, auth.ADMIN, auth.SYSTEM, e.GroupName) { + if !auth.ACHas(c, auth.ADMIN, auth.SYSTEM, e.EventGroup.GroupName) { return errors.ErrorForbidden } return nil @@ -47,3 +49,13 @@ func ChangeCalGroup(tx *gorm.DB, cal_id, to string) error { ) where calendar_id = ?`, to, cal_id) return nil } + +func GetNewColor(GroupName string) int { + eg := &EventGroup{} + if err := db.Select("color"). + Where("group_id = (select id from groups where name = ? )", GroupName). + Last(eg).Error; err != nil { + return rand.Intn(len(color)) + } + return eg.Color + 1 +}