diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | Makefile | 21 | ||||
-rwxr-xr-x | bin/generate-events | 38 | ||||
-rw-r--r-- | eventlogging/eventlogger.go | 18 | ||||
-rw-r--r-- | eventlogging/events.txt | 8 | ||||
-rw-r--r-- | eventlogging/types.go | 52 | ||||
-rw-r--r-- | grilist/grilist.go | 20 | ||||
-rw-r--r-- | main.go | 12 | ||||
-rw-r--r-- | modules/grils/grils.go | 5 | ||||
-rw-r--r-- | modules/lists/lists.go | 72 |
10 files changed, 235 insertions, 12 deletions
@@ -5,6 +5,7 @@ node_modules/ | |||
5 | package.json | 5 | package.json |
6 | .npm_update | 6 | .npm_update |
7 | *.d | 7 | *.d |
8 | eventlogging/events.go | ||
8 | 9 | ||
9 | #Gebuildete Dateien | 10 | #Gebuildete Dateien |
10 | assets/js/* | 11 | assets/js/* |
@@ -1,6 +1,7 @@ | |||
1 | include config.mk | 1 | include config.mk |
2 | 2 | ||
3 | BINARY_PATH=./bin | 3 | BINARY_PATH = ./bin |
4 | TARGET = $(BINARY_PATH)/$(NAME) | ||
4 | IMPORTER_FILES = $(shell find tools/importer/ -type f -name '*.go') | 5 | IMPORTER_FILES = $(shell find tools/importer/ -type f -name '*.go') |
5 | 6 | ||
6 | CSS_FILES = $(patsubst assets_src/%, assets/%, $(shell find assets_src/css/ -type f -name '*.css')) | 7 | CSS_FILES = $(patsubst assets_src/%, assets/%, $(shell find assets_src/css/ -type f -name '*.css')) |
@@ -13,7 +14,7 @@ LESSC := ./node_modules/less/bin/lessc | |||
13 | 14 | ||
14 | -include $(DEPFILES) | 15 | -include $(DEPFILES) |
15 | 16 | ||
16 | all: assets app | 17 | all: assets $(TARGET) $(IMPORTER) |
17 | 18 | ||
18 | print_info: | 19 | print_info: |
19 | @echo $(CSS_FILES) | 20 | @echo $(CSS_FILES) |
@@ -21,8 +22,10 @@ print_info: | |||
21 | @echo $(JS_FILES) | 22 | @echo $(JS_FILES) |
22 | @echo $(DEPFILES) | 23 | @echo $(DEPFILES) |
23 | 24 | ||
24 | app: | 25 | $(NAME): $(TARGET) |
25 | go build -o $(BINARY_PATH)/$(NAME) | 26 | |
27 | $(TARGET): eventlogging/events.go | ||
28 | go build -o $@ | ||
26 | 29 | ||
27 | .npm_update: package.json | 30 | .npm_update: package.json |
28 | touch $@ | 31 | touch $@ |
@@ -51,6 +54,9 @@ assets/js/%.js: assets_src/js/%.js assets_src/js/%.d .babelrc .npm_update | |||
51 | @echo browserify $< -o $@ | 54 | @echo browserify $< -o $@ |
52 | @$(BROWSERIFY) --debug $< -o $@ -t babelify | 55 | @$(BROWSERIFY) --debug $< -o $@ -t babelify |
53 | 56 | ||
57 | eventlogging/events.go: eventlogging/events.txt | ||
58 | ./bin/generate-events < $< > $@ | ||
59 | |||
54 | clean: | 60 | clean: |
55 | -rm -- $(BINARY_PATH)/$(NAME) | 61 | -rm -- $(BINARY_PATH)/$(NAME) |
56 | -rm -- $(CSS_FILES) | 62 | -rm -- $(CSS_FILES) |
@@ -58,6 +64,7 @@ clean: | |||
58 | -rm -- $(JS_FILES) | 64 | -rm -- $(JS_FILES) |
59 | -rm -- $(DEPFILES) | 65 | -rm -- $(DEPFILES) |
60 | -rm -- importer | 66 | -rm -- importer |
67 | -rm -- eventlogging/events.go | ||
61 | 68 | ||
62 | superclean: clean | 69 | superclean: clean |
63 | -rm -- .npm_update | 70 | -rm -- .npm_update |
@@ -66,11 +73,11 @@ superclean: clean | |||
66 | ultraclean: superclean | 73 | ultraclean: superclean |
67 | -rm -r -- node_modules | 74 | -rm -r -- node_modules |
68 | 75 | ||
69 | run: assets | 76 | run: assets $(TARGET) |
70 | go run *.go | 77 | $(TARGET) |
71 | 78 | ||
72 | importer: $(IMPORTER_FILES) | 79 | importer: $(IMPORTER_FILES) |
73 | go build -o importer tools/importer/*.go | 80 | go build -o importer tools/importer/*.go |
74 | 81 | ||
75 | .PHONY: all assets app print_info clean superclean ultraclean run | 82 | .PHONY: all assets $(NAME) $(TARGET) print_info clean superclean ultraclean run |
76 | 83 | ||
diff --git a/bin/generate-events b/bin/generate-events new file mode 100755 index 0000000..c4a0c1c --- /dev/null +++ b/bin/generate-events | |||
@@ -0,0 +1,38 @@ | |||
1 | #!/bin/bash | ||
2 | events=$(cat) | ||
3 | echo 'package eventlogging | ||
4 | /* | ||
5 | * THIS FILE IS AUTOGENERATED | ||
6 | * DO NOT EDIT MANUALLY!!! | ||
7 | */ | ||
8 | |||
9 | import ( | ||
10 | "fagott.pw/charakterin" | ||
11 | ) | ||
12 | |||
13 | ' | ||
14 | |||
15 | echo "var Events = []string{" | ||
16 | while read event | ||
17 | do | ||
18 | cat <<EOT | ||
19 | "$event", | ||
20 | EOT | ||
21 | done <<<"$events" | ||
22 | echo '} | ||
23 | ' | ||
24 | |||
25 | while read event | ||
26 | do | ||
27 | funcName=$(sed -r 's/(^|_)(.)([^_]*)/\2\L\3/g' <<<$event) | ||
28 | cat <<EOT | ||
29 | func (l *EventLogger) ${funcName}(user *charakterin.User, data ${funcName}Data) { | ||
30 | if user != nil { | ||
31 | data.User = user.Name | ||
32 | data.UserAgent = user.Agent | ||
33 | } | ||
34 | l.base.Log("$event", data) | ||
35 | } | ||
36 | |||
37 | EOT | ||
38 | done <<<"$events" | ||
diff --git a/eventlogging/eventlogger.go b/eventlogging/eventlogger.go new file mode 100644 index 0000000..e5a1b2b --- /dev/null +++ b/eventlogging/eventlogger.go | |||
@@ -0,0 +1,18 @@ | |||
1 | package eventlogging | ||
2 | |||
3 | import "fagott.pw/nsa" | ||
4 | |||
5 | type EventLoggerData struct { | ||
6 | User string `json:"user"` | ||
7 | UserAgent string `json:"userAgent"` | ||
8 | } | ||
9 | |||
10 | type EventLogger struct { | ||
11 | base *nsa.Logger | ||
12 | } | ||
13 | |||
14 | func NewEventLogger(ip string) *EventLogger { | ||
15 | return &EventLogger{ | ||
16 | base: nsa.NewLogger(ip), | ||
17 | } | ||
18 | } | ||
diff --git a/eventlogging/events.txt b/eventlogging/events.txt new file mode 100644 index 0000000..0e170dc --- /dev/null +++ b/eventlogging/events.txt | |||
@@ -0,0 +1,8 @@ | |||
1 | VIEW_GRIL | ||
2 | VIEW_LIST | ||
3 | CREATE_LIST | ||
4 | ADD_GRIL_TO_LIST | ||
5 | DELETE_GRIL_FROM_LIST | ||
6 | DELETE_LIST | ||
7 | EDIT_LIST | ||
8 | CHANGE_GRIL_ORDER | ||
diff --git a/eventlogging/types.go b/eventlogging/types.go new file mode 100644 index 0000000..96d0ce0 --- /dev/null +++ b/eventlogging/types.go | |||
@@ -0,0 +1,52 @@ | |||
1 | package eventlogging | ||
2 | |||
3 | type ViewGrilData struct { | ||
4 | EventLoggerData | ||
5 | GrilID int | ||
6 | } | ||
7 | |||
8 | type ViewListData struct { | ||
9 | EventLoggerData | ||
10 | ListID int | ||
11 | } | ||
12 | |||
13 | type CreateListData struct { | ||
14 | EventLoggerData | ||
15 | ListID int | ||
16 | Name string | ||
17 | Description string | ||
18 | } | ||
19 | |||
20 | type AddGrilToListData struct { | ||
21 | EventLoggerData | ||
22 | GrilID int | ||
23 | ListID int | ||
24 | } | ||
25 | |||
26 | type DeleteGrilFromListData struct { | ||
27 | EventLoggerData | ||
28 | ListID int | ||
29 | GrilID int | ||
30 | } | ||
31 | |||
32 | type DeleteListData struct { | ||
33 | EventLoggerData | ||
34 | ListID int | ||
35 | } | ||
36 | |||
37 | type EditListData struct { | ||
38 | EventLoggerData | ||
39 | ListID int | ||
40 | OldName string | ||
41 | OldDescription string | ||
42 | NewName string | ||
43 | NewDescription string | ||
44 | } | ||
45 | |||
46 | type ChangeGrilOrderData struct { | ||
47 | EventLoggerData | ||
48 | ListID int | ||
49 | GrilID int | ||
50 | OldOrder int | ||
51 | NewOrder int | ||
52 | } | ||
diff --git a/grilist/grilist.go b/grilist/grilist.go index f9a79b2..aebe45c 100644 --- a/grilist/grilist.go +++ b/grilist/grilist.go | |||
@@ -2,8 +2,13 @@ package grilist | |||
2 | 2 | ||
3 | import ( | 3 | import ( |
4 | "database/sql" | 4 | "database/sql" |
5 | "log" | ||
6 | "net" | ||
7 | "net/http" | ||
8 | "strings" | ||
5 | 9 | ||
6 | "fagott.pw/charakterin" | 10 | "fagott.pw/charakterin" |
11 | "fagott.pw/grilist/eventlogging" | ||
7 | "fagott.pw/grilist/frontend" | 12 | "fagott.pw/grilist/frontend" |
8 | 13 | ||
9 | "github.com/julienschmidt/httprouter" | 14 | "github.com/julienschmidt/httprouter" |
@@ -20,6 +25,21 @@ type Grilist struct { | |||
20 | Router *httprouter.Router | 25 | Router *httprouter.Router |
21 | } | 26 | } |
22 | 27 | ||
28 | func (g *Grilist) EventLogger(r *http.Request) *eventlogging.EventLogger { | ||
29 | forwardedIPs := strings.Split(r.Header.Get("X-Forwarded-For"), ", ") | ||
30 | ip := r.RemoteAddr | ||
31 | if len(forwardedIPs) > 0 && forwardedIPs[0] != "" { | ||
32 | ip = forwardedIPs[0] | ||
33 | } | ||
34 | host, _, err := net.SplitHostPort(ip) | ||
35 | if err != nil { | ||
36 | log.Printf("Could not split IP %s\n", ip) | ||
37 | log.Println(err) | ||
38 | host = "0.0.0.0" | ||
39 | } | ||
40 | return eventlogging.NewEventLogger(host) | ||
41 | } | ||
42 | |||
23 | // Module ist ein Modul für Grilist. | 43 | // Module ist ein Modul für Grilist. |
24 | type Module interface { | 44 | type Module interface { |
25 | Init(*Grilist) | 45 | Init(*Grilist) |
@@ -5,8 +5,10 @@ import ( | |||
5 | "fmt" | 5 | "fmt" |
6 | "log" | 6 | "log" |
7 | "net/http" | 7 | "net/http" |
8 | "strings" | ||
8 | 9 | ||
9 | "fagott.pw/charakterin" | 10 | "fagott.pw/charakterin" |
11 | "fagott.pw/grilist/eventlogging" | ||
10 | "fagott.pw/grilist/frontend" | 12 | "fagott.pw/grilist/frontend" |
11 | "fagott.pw/grilist/grilist" | 13 | "fagott.pw/grilist/grilist" |
12 | "fagott.pw/grilist/modules/grils" | 14 | "fagott.pw/grilist/modules/grils" |
@@ -15,8 +17,7 @@ import ( | |||
15 | "fagott.pw/grilist/modules/series" | 17 | "fagott.pw/grilist/modules/series" |
16 | "fagott.pw/grilist/modules/tags" | 18 | "fagott.pw/grilist/modules/tags" |
17 | "fagott.pw/grilist/modules/user" | 19 | "fagott.pw/grilist/modules/user" |
18 | 20 | "fagott.pw/nsa" | |
19 | "strings" | ||
20 | 21 | ||
21 | "github.com/julienschmidt/httprouter" | 22 | "github.com/julienschmidt/httprouter" |
22 | _ "github.com/lib/pq" | 23 | _ "github.com/lib/pq" |
@@ -53,6 +54,13 @@ func main() { | |||
53 | 54 | ||
54 | log.Println("database connection established") | 55 | log.Println("database connection established") |
55 | 56 | ||
57 | if err := nsa.Init(db); err != nil { | ||
58 | panic(err) | ||
59 | } | ||
60 | if err := nsa.SetEvents(eventlogging.Events); err != nil { | ||
61 | panic(err) | ||
62 | } | ||
63 | |||
56 | renderer := frontend.New("views") | 64 | renderer := frontend.New("views") |
57 | login := charakterin.New(db) | 65 | login := charakterin.New(db) |
58 | login.UseRenderer(renderer) | 66 | login.UseRenderer(renderer) |
diff --git a/modules/grils/grils.go b/modules/grils/grils.go index 1b1bb5f..4a9990f 100644 --- a/modules/grils/grils.go +++ b/modules/grils/grils.go | |||
@@ -11,6 +11,7 @@ import ( | |||
11 | 11 | ||
12 | "fagott.pw/charakterin" | 12 | "fagott.pw/charakterin" |
13 | "fagott.pw/grilist/cache" | 13 | "fagott.pw/grilist/cache" |
14 | "fagott.pw/grilist/eventlogging" | ||
14 | "fagott.pw/grilist/frontend" | 15 | "fagott.pw/grilist/frontend" |
15 | "fagott.pw/grilist/grilist" | 16 | "fagott.pw/grilist/grilist" |
16 | "fagott.pw/grilist/models" | 17 | "fagott.pw/grilist/models" |
@@ -237,6 +238,7 @@ func (m *GrilsModule) FromIDs(ids []int) ([]*models.Gril, error) { | |||
237 | 238 | ||
238 | func (m *GrilsModule) viewGril(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 239 | func (m *GrilsModule) viewGril(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
239 | user, _ := m.g.Charakterin.GetUserFromRequest(r) | 240 | user, _ := m.g.Charakterin.GetUserFromRequest(r) |
241 | el := m.g.EventLogger(r) | ||
240 | sid := p.ByName("id") | 242 | sid := p.ByName("id") |
241 | 243 | ||
242 | id, err := strconv.Atoi(sid) | 244 | id, err := strconv.Atoi(sid) |
@@ -288,6 +290,9 @@ func (m *GrilsModule) viewGril(w http.ResponseWriter, r *http.Request, p httprou | |||
288 | data["SimilarGrils"] = similar | 290 | data["SimilarGrils"] = similar |
289 | 291 | ||
290 | m.g.Renderer.RenderPage("gril", w, data) | 292 | m.g.Renderer.RenderPage("gril", w, data) |
293 | el.ViewGril(user, eventlogging.ViewGrilData{ | ||
294 | GrilID: gril.ID, | ||
295 | }) | ||
291 | } | 296 | } |
292 | 297 | ||
293 | func pgArray(array []byte) []string { | 298 | func pgArray(array []byte) []string { |
diff --git a/modules/lists/lists.go b/modules/lists/lists.go index 5934e9a..65e969f 100644 --- a/modules/lists/lists.go +++ b/modules/lists/lists.go | |||
@@ -14,6 +14,7 @@ import ( | |||
14 | 14 | ||
15 | "fagott.pw/charakterin" | 15 | "fagott.pw/charakterin" |
16 | "fagott.pw/grilist/cache" | 16 | "fagott.pw/grilist/cache" |
17 | "fagott.pw/grilist/eventlogging" | ||
17 | "fagott.pw/grilist/frontend" | 18 | "fagott.pw/grilist/frontend" |
18 | "fagott.pw/grilist/grilist" | 19 | "fagott.pw/grilist/grilist" |
19 | "fagott.pw/grilist/models" | 20 | "fagott.pw/grilist/models" |
@@ -260,6 +261,7 @@ func (m *Module) ProvideDashboardData(user *charakterin.User) []grilist.Dashboar | |||
260 | 261 | ||
261 | func (m *Module) viewList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 262 | func (m *Module) viewList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
262 | user, _ := m.g.Charakterin.GetUserFromRequest(r) | 263 | user, _ := m.g.Charakterin.GetUserFromRequest(r) |
264 | el := m.g.EventLogger(r) | ||
263 | sid := p.ByName("id") | 265 | sid := p.ByName("id") |
264 | 266 | ||
265 | id, err := strconv.Atoi(sid) | 267 | id, err := strconv.Atoi(sid) |
@@ -286,9 +288,13 @@ func (m *Module) viewList(w http.ResponseWriter, r *http.Request, p httprouter.P | |||
286 | } | 288 | } |
287 | 289 | ||
288 | m.g.Renderer.RenderPage("list", w, data) | 290 | m.g.Renderer.RenderPage("list", w, data) |
291 | el.ViewList(user, eventlogging.ViewListData{ | ||
292 | ListID: list.ID, | ||
293 | }) | ||
289 | } | 294 | } |
290 | 295 | ||
291 | func (m *Module) deleteList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 296 | func (m *Module) deleteList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
297 | el := m.g.EventLogger(r) | ||
292 | user, err := m.g.Charakterin.GetUserFromRequest(r) | 298 | user, err := m.g.Charakterin.GetUserFromRequest(r) |
293 | if err != nil { | 299 | if err != nil { |
294 | log.Println("invalid deleteList user") | 300 | log.Println("invalid deleteList user") |
@@ -334,6 +340,9 @@ func (m *Module) deleteList(w http.ResponseWriter, r *http.Request, p httprouter | |||
334 | 340 | ||
335 | log.Printf("list %d has been deleted by the owner %d(%s)", list.ID, list.Owner.ID, list.Owner.GetName()) | 341 | log.Printf("list %d has been deleted by the owner %d(%s)", list.ID, list.Owner.ID, list.Owner.GetName()) |
336 | http.Redirect(w, r, "/", 302) | 342 | http.Redirect(w, r, "/", 302) |
343 | el.DeleteList(user, eventlogging.DeleteListData{ | ||
344 | ListID: list.ID, | ||
345 | }) | ||
337 | } | 346 | } |
338 | 347 | ||
339 | func (m *Module) viewListSettings(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 348 | func (m *Module) viewListSettings(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
@@ -372,6 +381,7 @@ func (m *Module) viewListSettings(w http.ResponseWriter, r *http.Request, p http | |||
372 | } | 381 | } |
373 | 382 | ||
374 | func (m *Module) updateListSettings(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 383 | func (m *Module) updateListSettings(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
384 | el := m.g.EventLogger(r) | ||
375 | user, err := m.g.Charakterin.GetUserFromRequest(r) | 385 | user, err := m.g.Charakterin.GetUserFromRequest(r) |
376 | if err != nil { | 386 | if err != nil { |
377 | log.Println("invalid updateListSettings user") | 387 | log.Println("invalid updateListSettings user") |
@@ -436,6 +446,18 @@ func (m *Module) updateListSettings(w http.ResponseWriter, r *http.Request, p ht | |||
436 | return | 446 | return |
437 | } | 447 | } |
438 | 448 | ||
449 | rows, err := m.g.DB.Query("SELECT name, description FROM grilist.lists WHERE id = $1;", id) | ||
450 | if err != nil { | ||
451 | log.Println("could not get list info", id) | ||
452 | renderWithError("interner fehler", false, false) | ||
453 | return | ||
454 | } | ||
455 | defer rows.Close() | ||
456 | |||
457 | var oldName string | ||
458 | var oldDescription string | ||
459 | rows.Scan(&oldName, &oldDescription) | ||
460 | |||
439 | if list.Name != name && list.Description != description { | 461 | if list.Name != name && list.Description != description { |
440 | _, err = m.g.DB.Query(`UPDATE grilist.lists SET name = $2, description = $3 WHERE id = $1`, id, name, description) | 462 | _, err = m.g.DB.Query(`UPDATE grilist.lists SET name = $2, description = $3 WHERE id = $1`, id, name, description) |
441 | if err != nil { | 463 | if err != nil { |
@@ -463,9 +485,17 @@ func (m *Module) updateListSettings(w http.ResponseWriter, r *http.Request, p ht | |||
463 | list.Description = description | 485 | list.Description = description |
464 | 486 | ||
465 | m.viewListSettings(w, r, p) | 487 | m.viewListSettings(w, r, p) |
488 | el.EditList(user, eventlogging.EditListData{ | ||
489 | ListID: id, | ||
490 | OldName: oldName, | ||
491 | OldDescription: oldDescription, | ||
492 | NewName: name, | ||
493 | NewDescription: description, | ||
494 | }) | ||
466 | } | 495 | } |
467 | 496 | ||
468 | func (m *Module) addGrilToList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 497 | func (m *Module) addGrilToList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
498 | el := m.g.EventLogger(r) | ||
469 | slistID := p.ByName("id") | 499 | slistID := p.ByName("id") |
470 | 500 | ||
471 | user, err := m.g.Charakterin.GetUserFromRequest(r) | 501 | user, err := m.g.Charakterin.GetUserFromRequest(r) |
@@ -532,7 +562,10 @@ func (m *Module) addGrilToList(w http.ResponseWriter, r *http.Request, p httprou | |||
532 | data["Value"] = value | 562 | data["Value"] = value |
533 | list.Grils = append(list.Grils, lg) | 563 | list.Grils = append(list.Grils, lg) |
534 | m.g.Renderer.RenderPage("list_gril", w, data) | 564 | m.g.Renderer.RenderPage("list_gril", w, data) |
535 | return | 565 | el.AddGrilToList(user, eventlogging.AddGrilToListData{ |
566 | ListID: list.ID, | ||
567 | GrilID: gril.ID, | ||
568 | }) | ||
536 | } | 569 | } |
537 | 570 | ||
538 | func (m *Module) displayCreateList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 571 | func (m *Module) displayCreateList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
@@ -549,6 +582,7 @@ func (m *Module) displayCreateList(w http.ResponseWriter, r *http.Request, p htt | |||
549 | } | 582 | } |
550 | 583 | ||
551 | func (m *Module) createList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 584 | func (m *Module) createList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
585 | el := m.g.EventLogger(r) | ||
552 | user, err := m.g.Charakterin.GetUserFromRequest(r) | 586 | user, err := m.g.Charakterin.GetUserFromRequest(r) |
553 | if err != nil { | 587 | if err != nil { |
554 | log.Println(err) | 588 | log.Println(err) |
@@ -572,9 +606,15 @@ func (m *Module) createList(w http.ResponseWriter, r *http.Request, p httprouter | |||
572 | } | 606 | } |
573 | 607 | ||
574 | http.Redirect(w, r, fmt.Sprintf("/list/%d", id), 302) | 608 | http.Redirect(w, r, fmt.Sprintf("/list/%d", id), 302) |
609 | el.CreateList(user, eventlogging.CreateListData{ | ||
610 | ListID: id, | ||
611 | Name: values.Get("name"), | ||
612 | Description: values.Get("description"), | ||
613 | }) | ||
575 | } | 614 | } |
576 | 615 | ||
577 | func (m *Module) updateGrilOrder(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 616 | func (m *Module) updateGrilOrder(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
617 | el := m.g.EventLogger(r) | ||
578 | slistID := p.ByName("id") | 618 | slistID := p.ByName("id") |
579 | 619 | ||
580 | user, err := m.g.Charakterin.GetUserFromRequest(r) | 620 | user, err := m.g.Charakterin.GetUserFromRequest(r) |
@@ -607,6 +647,16 @@ func (m *Module) updateGrilOrder(w http.ResponseWriter, r *http.Request, p httpr | |||
607 | return | 647 | return |
608 | } | 648 | } |
609 | 649 | ||
650 | var oldOrder int | ||
651 | err = m.g.DB.QueryRow( | ||
652 | `SELECT "order" FROM grilist.lists_grils WHERE list_id = $1 AND gril_id = $2;`, | ||
653 | listID, grilID).Scan(&oldOrder) | ||
654 | if err != nil { | ||
655 | log.Println(err) | ||
656 | http.Error(w, "Internal Server Error", 500) | ||
657 | return | ||
658 | } | ||
659 | |||
610 | // rein in die DB damit | 660 | // rein in die DB damit |
611 | _, err = m.g.DB.Exec(`SELECT grilist.set_gril_order($1, $2, $3, $4)`, user.ID, listID, grilID, pos) | 661 | _, err = m.g.DB.Exec(`SELECT grilist.set_gril_order($1, $2, $3, $4)`, user.ID, listID, grilID, pos) |
612 | if err != nil { | 662 | if err != nil { |
@@ -623,17 +673,30 @@ func (m *Module) updateGrilOrder(w http.ResponseWriter, r *http.Request, p httpr | |||
623 | 673 | ||
624 | w.WriteHeader(200) | 674 | w.WriteHeader(200) |
625 | w.Write([]byte("ok")) | 675 | w.Write([]byte("ok")) |
626 | return | 676 | el.ChangeGrilOrder(user, eventlogging.ChangeGrilOrderData{ |
677 | ListID: listID, | ||
678 | GrilID: grilID, | ||
679 | OldOrder: oldOrder, | ||
680 | NewOrder: pos, | ||
681 | }) | ||
627 | } | 682 | } |
628 | 683 | ||
629 | func (m *Module) removeGrilFromList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 684 | func (m *Module) removeGrilFromList(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |
685 | el := m.g.EventLogger(r) | ||
630 | slistID := p.ByName("id") | 686 | slistID := p.ByName("id") |
631 | 687 | ||
688 | user, err := m.g.Charakterin.GetUserFromRequest(r) | ||
689 | if err != nil { | ||
690 | http.Error(w, "Unauthorized", 401) | ||
691 | return | ||
692 | } | ||
693 | |||
632 | listID, err := strconv.Atoi(slistID) | 694 | listID, err := strconv.Atoi(slistID) |
633 | if err != nil { | 695 | if err != nil { |
634 | http.Error(w, "invalid list ID (type mismatch)", 400) | 696 | http.Error(w, "invalid list ID (type mismatch)", 400) |
635 | return | 697 | return |
636 | } | 698 | } |
699 | //TODO: noch mal gucken ob der User Rechte hat | ||
637 | 700 | ||
638 | values, err := readBody(r) | 701 | values, err := readBody(r) |
639 | if err != nil { | 702 | if err != nil { |
@@ -667,7 +730,10 @@ func (m *Module) removeGrilFromList(w http.ResponseWriter, r *http.Request, p ht | |||
667 | 730 | ||
668 | w.WriteHeader(200) | 731 | w.WriteHeader(200) |
669 | w.Write([]byte("ok")) | 732 | w.Write([]byte("ok")) |
670 | return | 733 | el.DeleteGrilFromList(user, eventlogging.DeleteGrilFromListData{ |
734 | ListID: listID, | ||
735 | GrilID: grilID, | ||
736 | }) | ||
671 | } | 737 | } |
672 | 738 | ||
673 | func (m *Module) APIgetUserLists(w http.ResponseWriter, r *http.Request, p httprouter.Params) { | 739 | func (m *Module) APIgetUserLists(w http.ResponseWriter, r *http.Request, p httprouter.Params) { |