[admin] Add events

This commit is contained in:
nemunaire 2016-12-26 03:44:04 +01:00 committed by Pierre-Olivier Mercier
parent 863070c037
commit b6782962f1
5 changed files with 187 additions and 1 deletions

View File

@ -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()
}

View File

@ -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"];

View File

@ -0,0 +1,19 @@
<h2>&Eacute;vénements<a ng-click="clearEvents()" class="pull-right btn btn-danger"><span class="glyphicon glyphicon-remove-sign" aria-hidden="true"></span> Vider la liste</a><a ng-click="show('new')" class="pull-right btn btn-primary" style="margin-right: 10px"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Ajouter un événement</a></h2>
<p><input type="search" class="form-control" placeholder="Search" ng-model="query"></p>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th ng-repeat="field in fields">
{{ field }}
</th>
</tr>
</thead>
<tbody>
<tr ng-repeat="event in events | filter: query" ng-click="show(event.id)">
<td ng-repeat="field in fields">
{{ event[field] }}
</td>
</tr>
</tbody>
</table>

View File

@ -0,0 +1,20 @@
<h2>&Eacute;vénement</h2>
<form ng-submit="saveEvent()" class="form-horizontal">
<div class="form-group" ng-repeat="field in fields">
<label for="{{ field }}" class="col-sm-1 control-label">{{ field | capitalize }}</label>
<div class="col-sm-11">
<input type="text" class="form-control" id="{{ field }}" ng-model="event[field]" ng-show="field != 'kind' && field != 'time'">
<input type="datetime" class="form-control" id="{{ field }}" ng-model="event[field]" ng-show="field == 'time' && event.id">
<select class="form-control" id="{{ field }}" ng-model="event[field]" ng-options="k as v for (k, v) in kinds" ng-show="field == 'kind'">
</select>
</div>
</div>
<div class="text-right" ng-show="event.id">
<button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-save" aria-hidden="true"></span> Save</button>
<a class="btn btn-danger" ng-click="deleteEvent()"><span class="glyphicon glyphicon-remove" aria-hidden="true"></span> Delete</a>
</div>
<div class="text-right" ng-show="!event.id">
<button type="submit" class="btn btn-primary"><span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Ajouter l'événement</button>
</div>
</form>

View File

@ -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
}
}