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