export txt, ics

This commit is contained in:
mbremer
2021-07-18 21:18:59 +02:00
parent f4bfa7ed2f
commit 6b1b1f1d00
10 changed files with 167 additions and 24 deletions

View File

@@ -20,4 +20,8 @@ public class CommonExtensions {
public static int plus(int a, int b) {
return a + b;
}
public static String rightPad(String str, int length) {
return String.format("%1$-" + length + "s", str);
}
}

View File

@@ -0,0 +1,35 @@
package de.mbremer.kalender;
import lombok.Getter;
import javax.validation.constraints.NotNull;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.UUID;
@Getter
public class Event {
private final String created;
private final String dtStart;
private final String dtEnd;
private final String uid;
public Event(@NotNull LocalDateTime created, LocalDate date) {
this.created = created.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
.replaceAll("[-:]", "") + "Z";
this.dtStart = date.format(DateTimeFormatter.ISO_LOCAL_DATE)
.replace("-", "");
this.dtEnd = date.plusDays(1).format(DateTimeFormatter.ISO_LOCAL_DATE)
.replace("-", "");
this.uid = UUID.randomUUID().toString() + "@buerokalender";
}
public String getLastModified() {
return created;
}
public String getDtStamp() {
return created;
}
}

View File

@@ -1,6 +1,7 @@
package de.mbremer.kalender;
import de.mbremer.secutity.User;
import io.quarkus.qute.Location;
import io.quarkus.qute.Template;
import io.quarkus.qute.TemplateInstance;
import io.quarkus.security.identity.SecurityIdentity;
@@ -14,6 +15,7 @@ import javax.transaction.Transactional;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -28,35 +30,32 @@ public class KalenderResource {
SecurityIdentity identity;
@Inject
Template kalenderpage;
@Inject
@Location("export/textExport.txt")
Template textExport;
@Location("export/icsExport.ics")
Template icsExport;
@Path("")
@GET
@Produces(MediaType.TEXT_HTML)
public TemplateInstance kalender() {
return kalenderWithOffset(0);
}
@Path("offset/{weeks}")
@GET
@Produces(MediaType.TEXT_HTML)
public TemplateInstance kalenderWithOffset(@PathParam("weeks") int offsetInWeeks) {
User currentUser = User.find("username", identity.getPrincipal().getName()).singleResult();
LocalDate today = LocalDate.now();
LocalDate montag = today.minusDays(today.getDayOfWeek().getValue() - 1).plusDays(7 * offsetInWeeks);
List<KalenderTag> week = getWeek(currentUser, montag);
public TemplateInstance kalender(@QueryParam("offset") @DefaultValue("0") int offsetInWeeks) {
List<KalenderTag> week = getWeek(offsetInWeeks);
return kalenderpage
.data("today", today)
.data("today", LocalDate.now())
.data("offset", offsetInWeeks)
.data("week", week);
}
private List<KalenderTag> getWeek(User currentUser, LocalDate start) {
private List<KalenderTag> getWeek(int offsetInWeeks) {
User currentUser = getCurrentUser();
LocalDate today = LocalDate.now();
LocalDate montag = today.minusDays(today.getDayOfWeek().getValue() - 1).plusDays(7 * offsetInWeeks);
return Stream.iterate(0, i -> i < 5, i -> ++i)
.map(d -> {
LocalDate day = start.plusDays(d);
LocalDate day = montag.plusDays(d);
KalenderTag tag = (KalenderTag) KalenderTag.find("day", day).singleResultOptional().orElse(new KalenderTag(day));
tag.setCurrentUserInOffice(currentUser.equals(tag.getInOffice()));
tag.setToday(LocalDate.now().equals(day));
@@ -65,6 +64,14 @@ public class KalenderResource {
.collect(Collectors.toList());
}
private List<Event> getEvents(int offsetInWeeks) {
List<KalenderTag> week = getWeek(offsetInWeeks);
return week.stream()
.filter(d -> d.isCurrentUserInOffice())
.map(d-> new Event(LocalDateTime.now(), d.getDay()))
.collect(Collectors.toList());
}
@POST
@Transactional
@Consumes(MediaType.MULTIPART_FORM_DATA)
@@ -73,7 +80,7 @@ public class KalenderResource {
@QueryParam("offset") int offsetInWeeks, @MultipartForm KalenderTagForm kalenderForm) {
LocalDate dayParsed = LocalDate.parse(day);
User currentUser = User.find("username", identity.getPrincipal().getName()).singleResult();
User currentUser = getCurrentUser();
try {
KalenderTag tag = KalenderTag.find("day", dayParsed).singleResult();
if (kalenderForm.isInOffice() && tag.getInOffice() == null) {
@@ -87,6 +94,24 @@ public class KalenderResource {
tag.persist();
}
return kalenderWithOffset(offsetInWeeks);
return kalender(offsetInWeeks);
}
private User getCurrentUser() {
return User.find("username", identity.getPrincipal().getName()).singleResult();
}
@GET
@Produces(MediaType.TEXT_PLAIN)
@Path("export/txt")
public TemplateInstance exportTxt(@QueryParam("offset") int offset) {
return textExport.data("week", getWeek(offset));
}
@GET
@Produces("text/calendar")
@Path("export/ics")
public TemplateInstance exportIcs(@QueryParam("offset") int offset) {
return icsExport.data("events", getEvents(offset));
}
}