diff --git a/source/app.d b/source/app.d index 01c7404..302107b 100644 --- a/source/app.d +++ b/source/app.d @@ -1,15 +1,73 @@ +import std.datetime.date; + import vibe.vibe; -import std.datetime.date; +class CalendarWebapp +{ +private: + immutable fileName = Path("events.json"); + + struct Event + { + string name, place; + DateTime begin, end; + } + + Event[] getEventsFromFile(in Path fileName) + { + Event[] events; + auto eventsString = readFileUTF8(fileName); + try + { + deserializeJson(events, eventsString.parseJsonString); + } + catch (std.json.JSONException) + { + } + return events; + } + +public: + + @method(HTTPMethod.POST) @path("/event/create") + void createEvent(string Ereignisname, string Ereignisort, string Von, string Bis) + { + Event event; + + event.name = Ereignisname; + event.place = Ereignisort; + + event.begin = DateTime.fromISOExtString(Von ~ ":00"); + event.end = DateTime.fromISOExtString(Bis ~ ":00"); + enforce(event.end - event.begin > 0.seconds); + + auto events = getEventsFromFile(fileName); + + events ~= event; + + writeFileUTF8(fileName, events.serializeToJsonString()); + + render!("listevents.dt", events); + } + + @method(HTTPMethod.GET) @path("create") + void newEvent() + { + render!("create.dt"); + } + + void index() + { + auto events = getEventsFromFile(fileName); + render!("listevents.dt", events); + } + +} shared static this() { auto router = new URLRouter; - router.get("/", &listEvents); - router.get("/create", staticTemplate!"create.dt"); - router.get("/event/create", &createEvent); - router.post("/event/create", &createEvent); - router.get("*", serveStaticFiles("/public")); + router.registerWebInterface(new CalendarWebapp); auto settings = new HTTPServerSettings; settings.port = 8080; @@ -18,54 +76,3 @@ shared static this() logInfo("Please open http://127.0.0.1:8080/ in your browser."); } - -void listEvents(HTTPServerRequest req, HTTPServerResponse res) -{ - auto fileName = Path("events.json"); - - auto events = fileName.getEventsFromFile; - render!("listevents.dt", events)(res); -} - -void createEvent(HTTPServerRequest req, HTTPServerResponse res) -{ - if (req.method != HTTPMethod.POST && req.method != HTTPMethod.GET) - return; - auto formdata = (req.method == HTTPMethod.POST) ? &req.form : &req.query; - - auto fileName = Path("events.json"); - Event event; - - event.name = formdata.get("Ereignisname"); - event.place = formdata.get("Ereignisort"); - - event.begin = DateTime.fromISOExtString(formdata.get("Von") ~ ":00"); - event.end = DateTime.fromISOExtString(formdata.get("Bis") ~ ":00"); - - auto events = fileName.getEventsFromFile; - - events ~= event; - - writeFileUTF8(fileName, events.serializeToJsonString()); - - render!("listevents.dt", events)(res); -} - -Event[] getEventsFromFile(in Path fileName) -{ - Event[] events; - auto eventsString = readFileUTF8(fileName); - try - { - deserializeJson(events, eventsString.parseJsonString); - } - catch(std.json.JSONException) - {} - return events; -} - -struct Event -{ - string name, place; - DateTime begin, end; -}