master
Evan Chen 2021-12-25 17:48:33 +08:00
parent df63ab8d5e
commit 5c8b5c20d6
6 changed files with 90 additions and 46 deletions

View File

@ -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")

View File

@ -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
}

View File

@ -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
}

View File

@ -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) {

View File

@ -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()

View File

@ -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
}