update
parent
df63ab8d5e
commit
5c8b5c20d6
|
@ -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")
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -5,7 +5,6 @@ import (
|
|||
|
||||
"github.com/rs/xid"
|
||||
"gorm.io/gorm"
|
||||
"kumoly.io/kumoly/app/auth"
|
||||
"kumoly.io/kumoly/app/errors"
|
||||
)
|
||||
|
||||
|
@ -15,36 +14,22 @@ type Event struct {
|
|||
Start time.Time
|
||||
End time.Time
|
||||
Name string `gorm:"not null"`
|
||||
Hosts string
|
||||
Description string
|
||||
Location string
|
||||
|
||||
// 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
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue