calendar-webapp/source/calendarwebapp/jsonexport.d

189 lines
3.8 KiB
D
Raw Normal View History

2017-12-03 01:27:00 +01:00
module calendarwebapp.jsonexport;
import calendarwebapp.event : Event, EventStore;
import core.time;
import std.algorithm.iteration : each;
2017-12-03 01:27:00 +01:00
import std.datetime.date;
import std.datetime.interval;
import std.datetime.systime;
import std.format : format;
2017-12-03 01:27:00 +01:00
import poodinis : Autowire;
2017-12-10 00:44:05 +01:00
import vibe.data.serialization : name;
2017-12-03 01:27:00 +01:00
struct DayJSONManager
{
private:
Date begin, end;
Event[][Date] events;
public:
this(in Date begin, in Date end)
in
{
assert(begin < end,
"DayJSONManager: begin (%s) needs to be earlier than end (%s)".format(begin, end));
}
do
2017-12-03 01:27:00 +01:00
{
this.begin = begin;
this.end = end;
Interval!Date(this.begin, this.end).fwdRange(date => date + 1.dur!"days")
.each!(date => events[date] = []);
2017-12-03 01:27:00 +01:00
}
void addEvent(Event event)
{
2017-12-10 00:44:05 +01:00
if (Interval!Date(begin, end).contains(event.begin))
2017-12-03 01:27:00 +01:00
{
events[event.begin] ~= event;
}
}
2017-12-10 00:44:05 +01:00
auto getDayData(Date date)
{
import std.exception : enforce;
enforce(Interval!Date(begin, end).contains(date));
return DayData(date.year, date.month, date.month.toGerString, date.day,
date.dayOfWeek.dayType, events[date], date.dayOfWeek.toGerString, []);
}
2017-12-03 01:27:00 +01:00
}
class JSONExporter
{
private:
@Autowire EventStore eventStore;
public:
auto write(in Date today = cast(Date) Clock.currTime) @system
2017-12-03 01:27:00 +01:00
{
2017-12-10 00:44:05 +01:00
import std.algorithm : each, map;
import std.range : array;
2017-12-03 01:27:00 +01:00
import std.format : format;
immutable todayName = "%s, %s. %s. %s".format(today.dayOfWeek.toGerString,
today.day, today.month.toGerString, today.year);
2017-12-10 00:44:05 +01:00
immutable todays = Todays(today.year, today.month, today.day, today.dayOfWeek, todayName);
2017-12-03 01:27:00 +01:00
auto startDate = Date(today.year, today.month, 1);
auto endDate = startDate;
endDate.add!"months"(3);
2017-12-10 00:44:05 +01:00
auto dayJSONManager = new DayJSONManager(startDate, endDate);
foreach (event; eventStore.getEventsBeginningBetween(startDate, endDate))
{
dayJSONManager.addEvent(event);
}
return Interval!Date(startDate, endDate).fwdRange(date => date + 1.dur!"days")
2017-12-10 00:44:05 +01:00
.map!(day => dayJSONManager.getDayData(day)).array;
2017-12-03 01:27:00 +01:00
}
}
struct DayData
{
short year;
Month month;
string monthName;
ubyte day;
@name("daytype") DayType dayType;
Event[] eventList;
@name("wday") string weekDayName;
Line[] lines;
}
enum DayType
{
Workday,
Holiday,
Weekend
}
2017-12-03 01:27:00 +01:00
private:
string toGerString(Month m)
{
final switch (m) with (Month)
{
case jan:
return "Januar";
case feb:
return "Februar";
case mar:
return "März";
case apr:
return "April";
case may:
return "Mai";
case jun:
return "Juni";
case jul:
return "Juli";
case aug:
return "August";
case sep:
return "September";
case oct:
return "Oktober";
case nov:
return "November";
case dec:
return "Dezember";
}
}
string toGerString(DayOfWeek d)
{
final switch (d) with (DayOfWeek)
{
case mon:
return "Montag";
case tue:
return "Dienstag";
case wed:
return "Mittwoch";
case thu:
return "Donnerstag";
case fri:
return "Freitag";
case sat:
return "Samstag";
case sun:
return "Sonntag";
}
}
2017-12-10 00:44:05 +01:00
DayType dayType(DayOfWeek dayOfWeek)
{
switch (dayOfWeek) with (DayOfWeek)
{
case sat:
return DayType.Weekend;
case sun:
return DayType.Holiday;
default:
return DayType.Workday;
}
}
struct Line
{
}
struct Todays
{
short year;
Month month;
ubyte day;
DayOfWeek weekDay;
string todayName;
}
struct OutputFormat
{
Todays today;
@name("tracked_days") DayData trackedDays;
}