diff --git a/build.gradle b/build.gradle index 4ebd82a..75aeee9 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ plugins { } group = 'de.jottyfan.bico' -version = '0.1.2' +version = '0.1.3' description = """BibleClassOrganizer""" @@ -49,6 +49,8 @@ war { dependencies { implementation 'de.jottyfan:bicolib:4' + implementation 'org.mnode.ical4j:ical4j:4.0.3' + implementation 'org.springframework.boot:spring-boot-starter-jooq' implementation 'org.springframework.boot:spring-boot-starter-oauth2-client' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' diff --git a/src/main/java/de/jottyfan/bico/modules/ical/IcalController.java b/src/main/java/de/jottyfan/bico/modules/ical/IcalController.java new file mode 100644 index 0000000..f776536 --- /dev/null +++ b/src/main/java/de/jottyfan/bico/modules/ical/IcalController.java @@ -0,0 +1,30 @@ +package de.jottyfan.bico.modules.ical; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.GetMapping; + +import de.jottyfan.bico.modules.CommonController; +import jakarta.servlet.http.HttpServletResponse; + +/** + * + * @author jotty + * + */ +@Controller +public class IcalController extends CommonController{ + + @Autowired + private IcalService service; + + @GetMapping("/ical") + public void getIcalExport(HttpServletResponse response) throws Exception { + response.setHeader("Content-Disposition", "attachment; filename=bico.ical"); + response.setContentType("application/octet-stream"); + response.setHeader("Content-Transfer-Encoding", "binary"); + response.setHeader("Accept-Ranges", "bytes"); + service.createCalendar(response.getOutputStream()); + response.flushBuffer(); + } +} diff --git a/src/main/java/de/jottyfan/bico/modules/ical/IcalRepository.java b/src/main/java/de/jottyfan/bico/modules/ical/IcalRepository.java new file mode 100644 index 0000000..b03b13c --- /dev/null +++ b/src/main/java/de/jottyfan/bico/modules/ical/IcalRepository.java @@ -0,0 +1,31 @@ +package de.jottyfan.bico.modules.ical; + +import static de.jottyfan.bico.db.Tables.V_CALENDAR; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.jooq.DSLContext; +import org.jooq.SelectWhereStep; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Repository; + +import de.jottyfan.bico.db.tables.records.VCalendarRecord; + +/** + * + * @author jotty + * + */ +@Repository +public class IcalRepository { + private static final Logger LOGGER = LogManager.getLogger(IcalRepository.class); + + @Autowired + private DSLContext jooq; + + public VCalendarRecord[] getAllDates() { + SelectWhereStep sql = jooq.selectFrom(V_CALENDAR); + LOGGER.trace(sql); + return sql.fetchArray(); + } +} diff --git a/src/main/java/de/jottyfan/bico/modules/ical/IcalService.java b/src/main/java/de/jottyfan/bico/modules/ical/IcalService.java new file mode 100644 index 0000000..a5d5828 --- /dev/null +++ b/src/main/java/de/jottyfan/bico/modules/ical/IcalService.java @@ -0,0 +1,40 @@ +package de.jottyfan.bico.modules.ical; + +import java.io.IOException; +import java.io.OutputStream; +import java.time.LocalDateTime; +import java.time.LocalTime; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import de.jottyfan.bico.db.tables.records.VCalendarRecord; +import net.fortuna.ical4j.data.CalendarOutputter; +import net.fortuna.ical4j.model.Calendar; +import net.fortuna.ical4j.model.component.VEvent; +import net.fortuna.ical4j.validate.ValidationException; + +/** + * + * @author jotty + * + */ +@Service +public class IcalService { + + @Autowired + private IcalRepository repository; + + public void createCalendar(OutputStream stream) throws ValidationException, IOException { + Calendar calendar = new Calendar(); + CalendarOutputter out = new CalendarOutputter(); + for (VCalendarRecord record : repository.getAllDates()) { + String summary = record.getFullname(); + LocalDateTime startEvent = LocalDateTime.of(record.getSlotDay(), LocalTime.of(10, 30)); + LocalDateTime endEvent = LocalDateTime.of(record.getSlotDay(), LocalTime.of(12, 0)); + VEvent event = new VEvent(startEvent, endEvent, summary); + calendar.add(event); + } + out.output(calendar, stream);; + } +} diff --git a/src/main/resources/templates/template.html b/src/main/resources/templates/template.html index 1aa4385..2766cd1 100644 --- a/src/main/resources/templates/template.html +++ b/src/main/resources/templates/template.html @@ -29,6 +29,9 @@