From b6782962f1bd5166fca3d415d95b04a23d4e2b48 Mon Sep 17 00:00:00 2001 From: nemunaire Date: Mon, 26 Dec 2016 03:44:04 +0100 Subject: [PATCH] [admin] Add events --- admin/api/events.go | 57 ++++++++++++++++++++++++++++++ admin/static/js/app.js | 49 +++++++++++++++++++++++++ admin/static/views/event-list.html | 19 ++++++++++ admin/static/views/event.html | 20 +++++++++++ libfic/event.go | 43 +++++++++++++++++++++- 5 files changed, 187 insertions(+), 1 deletion(-) create mode 100644 admin/static/views/event-list.html create mode 100644 admin/static/views/event.html diff --git a/admin/api/events.go b/admin/api/events.go index 22972ec0..a9fd5977 100644 --- a/admin/api/events.go +++ b/admin/api/events.go @@ -1,6 +1,8 @@ package api import ( + "encoding/json" + "srs.epita.fr/fic-server/libfic" "github.com/julienschmidt/httprouter" @@ -8,6 +10,13 @@ import ( func init() { router.GET("/api/events/", apiHandler(getEvents)) + router.GET("/api/events.json", apiHandler(getLastEvents)) + router.POST("/api/events/", apiHandler(newEvent)) + router.DELETE("/api/events/", apiHandler(clearEvents)) + + router.GET("/api/events/:evid", apiHandler(eventHandler(showEvent))) + router.PUT("/api/events/:evid", apiHandler(eventHandler(updateEvent))) + router.DELETE("/api/events/:evid", apiHandler(eventHandler(deleteEvent))) } func getEvents(_ httprouter.Params, _ []byte) (interface{}, error) { @@ -17,3 +26,51 @@ func getEvents(_ httprouter.Params, _ []byte) (interface{}, error) { return evts, nil } } + +func getLastEvents(_ httprouter.Params, _ []byte) (interface{}, error) { + if evts, err := fic.GetLastEvents(); err != nil { + return nil, err + } else { + return evts, nil + } +} + +func showEvent(event fic.Event, _ []byte) (interface{}, error) { + return event, nil +} + +func newEvent(_ httprouter.Params, body []byte) (interface{}, error) { + var ue fic.Event + if err := json.Unmarshal(body, &ue); err != nil { + return nil, err + } + + if event, err := fic.NewEvent(ue.Text, ue.Kind); err != nil { + return nil, err + } else { + return event, nil + } +} + +func clearEvents(_ httprouter.Params, _ []byte) (interface{}, error) { + return fic.ClearEvents() +} + +func updateEvent(event fic.Event, body []byte) (interface{}, error) { + var ue fic.Event + if err := json.Unmarshal(body, &ue); err != nil { + return nil, err + } + + ue.Id = event.Id + + if _, err := ue.Update(); err != nil { + return nil, err + } else { + return ue, nil + } +} + +func deleteEvent(event fic.Event, _ []byte) (interface{}, error) { + return event.Delete() +} diff --git a/admin/static/js/app.js b/admin/static/js/app.js index c59a8a53..670fd174 100644 --- a/admin/static/js/app.js +++ b/admin/static/js/app.js @@ -33,6 +33,14 @@ angular.module("FICApp", ["ngRoute", "ngResource", "ngSanitize"]) controller: "TeamNewController", templateUrl: "views/team-new.html" }) + .when("/events", { + controller: "EventsListController", + templateUrl: "views/event-list.html" + }) + .when("/events/:eventId", { + controller: "EventController", + templateUrl: "views/event.html" + }) .when("/", { templateUrl: "views/home.html" }); @@ -43,6 +51,11 @@ angular.module("FICApp") .factory("Version", function($resource) { return $resource("/api/version") }) + .factory("Event", function($resource) { + return $resource("/api/events/:eventId", { eventId: '@id' }, { + 'update': {method: 'PUT'}, + }) + }) .factory("Team", function($resource) { return $resource("/api/teams/:teamId", { teamId: '@id' }, { 'update': {method: 'PUT'}, @@ -166,6 +179,42 @@ angular.module("FICApp") $scope.v = Version.get(); }) + .controller("EventsListController", function($scope, Event, $location) { + $scope.events = Event.query(); + $scope.fields = ["id", "kind", "txt", "time"]; + + $scope.clearEvents = function(id) { + Event.delete(function() { + $scope.events = []; + }); + }; + $scope.show = function(id) { + $location.url("/events/" + id); + }; + }) + .controller("EventController", function($scope, Event, $routeParams, $location) { + $scope.event = Event.get({ eventId: $routeParams.eventId }); + $scope.fields = ["kind", "txt", "time"]; + $scope.kinds = { + "alert-info": "Info", + "alert-warning": "Warning", + "alert-success": "Success" + }; + + $scope.saveEvent = function() { + if (this.event.id) { + this.event.$update(); + } else { + this.event.$save(function() { + $location.url("/events/" + $scope.event.id); + }); + } + } + $scope.deleteEvent = function() { + this.event.$remove(function() { $location.url("/events/");}); + } + }) + .controller("ThemesListController", function($scope, Theme, $location) { $scope.themes = Theme.query(); $scope.fields = ["id", "name"]; diff --git a/admin/static/views/event-list.html b/admin/static/views/event-list.html new file mode 100644 index 00000000..c5c20d5f --- /dev/null +++ b/admin/static/views/event-list.html @@ -0,0 +1,19 @@ +

Événements Vider la liste Ajouter un événement

+ +

+ + + + + + + + + + + +
+ {{ field }} +
+ {{ event[field] }} +
diff --git a/admin/static/views/event.html b/admin/static/views/event.html new file mode 100644 index 00000000..70f08ea9 --- /dev/null +++ b/admin/static/views/event.html @@ -0,0 +1,20 @@ +

Événement

+ +
+
+ +
+ + + +
+
+
+ + Delete +
+
+ +
+
diff --git a/libfic/event.go b/libfic/event.go index 7a91c0a1..14502b86 100644 --- a/libfic/event.go +++ b/libfic/event.go @@ -11,7 +11,7 @@ type Event struct { Time time.Time `json:"time"` } -func GetEvents() ([]Event, error) { +func GetLastEvents() ([]Event, error) { if rows, err := DBQuery("SELECT id_event, txt, kind, time FROM events ORDER BY time DESC LIMIT 6"); err != nil { return nil, err } else { @@ -33,6 +33,37 @@ func GetEvents() ([]Event, error) { } } +func GetEvents() ([]Event, error) { + if rows, err := DBQuery("SELECT id_event, txt, kind, time FROM events ORDER BY time DESC"); err != nil { + return nil, err + } else { + defer rows.Close() + + var events = make([]Event, 0) + for rows.Next() { + var e Event + if err := rows.Scan(&e.Id, &e.Text, &e.Kind, &e.Time); err != nil { + return nil, err + } + events = append(events, e) + } + if err := rows.Err(); err != nil { + return nil, err + } + + return events, nil + } +} + +func GetEvent(id int) (Event, error) { + var e Event + if err := DBQueryRow("SELECT id_event, txt, kind, time FROM events WHERE id_event=?", id).Scan(&e.Id, &e.Text, &e.Kind, &e.Time); err != nil { + return e, err + } + + return e, nil +} + func NewEvent(txt string, kind string) (Event, error) { if res, err := DBExec("INSERT INTO events (txt, kind, time) VALUES (?, ?, ?)", txt, kind, time.Now()); err != nil { return Event{}, err @@ -62,3 +93,13 @@ func (e Event) Delete() (int64, error) { return nb, err } } + +func ClearEvents() (int64, error) { + if res, err := DBExec("DELETE FROM events"); err != nil { + return 0, err + } else if nb, err := res.RowsAffected(); err != nil { + return 0, err + } else { + return nb, err + } +}