[admin] Add events
This commit is contained in:
parent
2b9c449df6
commit
875cb11747
5 changed files with 187 additions and 1 deletions
|
@ -1,6 +1,8 @@
|
||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
|
||||||
"srs.epita.fr/fic-server/libfic"
|
"srs.epita.fr/fic-server/libfic"
|
||||||
|
|
||||||
"github.com/julienschmidt/httprouter"
|
"github.com/julienschmidt/httprouter"
|
||||||
|
@ -8,6 +10,13 @@ import (
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
router.GET("/api/events/", apiHandler(getEvents))
|
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) {
|
func getEvents(_ httprouter.Params, _ []byte) (interface{}, error) {
|
||||||
|
@ -17,3 +26,51 @@ func getEvents(_ httprouter.Params, _ []byte) (interface{}, error) {
|
||||||
return evts, nil
|
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()
|
||||||
|
}
|
||||||
|
|
|
@ -33,6 +33,14 @@ angular.module("FICApp", ["ngRoute", "ngResource", "ngSanitize"])
|
||||||
controller: "TeamNewController",
|
controller: "TeamNewController",
|
||||||
templateUrl: "views/team-new.html"
|
templateUrl: "views/team-new.html"
|
||||||
})
|
})
|
||||||
|
.when("/events", {
|
||||||
|
controller: "EventsListController",
|
||||||
|
templateUrl: "views/event-list.html"
|
||||||
|
})
|
||||||
|
.when("/events/:eventId", {
|
||||||
|
controller: "EventController",
|
||||||
|
templateUrl: "views/event.html"
|
||||||
|
})
|
||||||
.when("/", {
|
.when("/", {
|
||||||
templateUrl: "views/home.html"
|
templateUrl: "views/home.html"
|
||||||
});
|
});
|
||||||
|
@ -43,6 +51,11 @@ angular.module("FICApp")
|
||||||
.factory("Version", function($resource) {
|
.factory("Version", function($resource) {
|
||||||
return $resource("/api/version")
|
return $resource("/api/version")
|
||||||
})
|
})
|
||||||
|
.factory("Event", function($resource) {
|
||||||
|
return $resource("/api/events/:eventId", { eventId: '@id' }, {
|
||||||
|
'update': {method: 'PUT'},
|
||||||
|
})
|
||||||
|
})
|
||||||
.factory("Team", function($resource) {
|
.factory("Team", function($resource) {
|
||||||
return $resource("/api/teams/:teamId", { teamId: '@id' }, {
|
return $resource("/api/teams/:teamId", { teamId: '@id' }, {
|
||||||
'update': {method: 'PUT'},
|
'update': {method: 'PUT'},
|
||||||
|
@ -166,6 +179,42 @@ angular.module("FICApp")
|
||||||
$scope.v = Version.get();
|
$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) {
|
.controller("ThemesListController", function($scope, Theme, $location) {
|
||||||
$scope.themes = Theme.query();
|
$scope.themes = Theme.query();
|
||||||
$scope.fields = ["id", "name"];
|
$scope.fields = ["id", "name"];
|
||||||
|
|
19
admin/static/views/event-list.html
Normal file
19
admin/static/views/event-list.html
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
<h2>É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>
|
20
admin/static/views/event.html
Normal file
20
admin/static/views/event.html
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<h2>É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>
|
|
@ -11,7 +11,7 @@ type Event struct {
|
||||||
Time time.Time `json:"time"`
|
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 {
|
if rows, err := DBQuery("SELECT id_event, txt, kind, time FROM events ORDER BY time DESC LIMIT 6"); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
} else {
|
} 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) {
|
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 {
|
if res, err := DBExec("INSERT INTO events (txt, kind, time) VALUES (?, ?, ?)", txt, kind, time.Now()); err != nil {
|
||||||
return Event{}, err
|
return Event{}, err
|
||||||
|
@ -62,3 +93,13 @@ func (e Event) Delete() (int64, error) {
|
||||||
return nb, err
|
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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Reference in a new issue