1package api 2 3import ( 4 "net/http" 5 6 "github.com/ansible-semaphore/semaphore/db" 7 8 "github.com/ansible-semaphore/semaphore/util" 9 "github.com/gorilla/context" 10 "github.com/masterminds/squirrel" 11) 12 13//nolint: gocyclo 14func getEvents(w http.ResponseWriter, r *http.Request, limit uint64) { 15 user := context.Get(r, "user").(*db.User) 16 17 q := squirrel.Select("event.*, p.name as project_name"). 18 From("event"). 19 LeftJoin("project as p on event.project_id=p.id"). 20 OrderBy("created desc") 21 22 if limit > 0 { 23 q = q.Limit(limit) 24 } 25 26 projectObj, exists := context.GetOk(r, "project") 27 if exists { 28 // limit query to project 29 project := projectObj.(db.Project) 30 q = q.Where("event.project_id=?", project.ID) 31 } else { 32 q = q.LeftJoin("project__user as pu on pu.project_id=p.id"). 33 Where("p.id IS NULL or pu.user_id=?", user.ID) 34 } 35 36 var events []db.Event 37 38 query, args, err := q.ToSql() 39 util.LogWarning(err) 40 if _, err := db.Mysql.Select(&events, query, args...); err != nil { 41 panic(err) 42 } 43 44 for i, evt := range events { 45 if evt.ObjectID == nil || evt.ObjectType == nil { 46 continue 47 } 48 49 var q squirrel.SelectBuilder 50 51 switch *evt.ObjectType { 52 case "task": 53 q = squirrel.Select("case when length(task.playbook) > 0 then task.playbook else tpl.playbook end"). 54 From("task"). 55 Join("project__template as tpl on task.template_id=tpl.id"). 56 Where("task.id=?", evt.ObjectID) 57 default: 58 continue 59 } 60 61 query, args, err := q.ToSql() 62 util.LogWarning(err) 63 name, err := db.Mysql.SelectNullStr(query, args...) 64 if err != nil { 65 panic(err) 66 } 67 68 if name.Valid { 69 events[i].ObjectName = name.String 70 } 71 } 72 73 util.WriteJSON(w, http.StatusOK, events) 74} 75 76func getLastEvents(w http.ResponseWriter, r *http.Request) { 77 getEvents(w, r, 200) 78} 79 80func getAllEvents(w http.ResponseWriter, r *http.Request) { 81 getEvents(w, r, 0) 82} 83