44import java .io .IOException ;
55import java .io .InputStream ;
66import java .security .Principal ;
7+ import java .util .Date ;
78
9+ import de .bogenliga .application .business .veranstaltung .api .VeranstaltungComponent ;
10+ import de .bogenliga .application .business .veranstaltung .api .types .VeranstaltungDO ;
811import de .bogenliga .application .business .wettkampf .api .types .WettkampfDO ;
912import de .bogenliga .application .business .wettkampf .api .WettkampfComponent ;
1013import de .bogenliga .application .springconfiguration .security .permissions .RequiresPermission ;
2023import org .springframework .web .bind .annotation .*;
2124import de .bogenliga .application .business .bogenkontrollliste .api .BogenkontrolllisteComponent ;
2225import de .bogenliga .application .business .dsbmannschaft .api .DsbMannschaftComponent ;
26+ import de .bogenliga .application .business .dsbmannschaft .api .types .DsbMannschaftDO ;
2327import de .bogenliga .application .business .meldezettel .api .MeldezettelComponent ;
2428import de .bogenliga .application .business .schusszettel .api .SchusszettelComponent ;
2529import de .bogenliga .application .business .setzliste .api .SetzlisteComponent ;
@@ -70,6 +74,7 @@ public class DownloadService implements ServiceFacade {
7074 private final RueckennummernComponent rueckennummernComponent ;
7175 private final WettkampfComponent wettkampfComponent ;
7276 private final DsbMannschaftComponent dsbMannschaftComponent ;
77+ private final VeranstaltungComponent veranstaltungComponent ;
7378 private final RequiresOnePermissionAspect requiresOnePermissionAspect ;
7479
7580
@@ -84,6 +89,7 @@ public DownloadService(final SetzlisteComponent setzlisteComponent, final Lizenz
8489 final RueckennummernComponent rueckennummernComponent ,
8590 final WettkampfComponent wettkampfComponent ,
8691 final DsbMannschaftComponent dsbMannschaftComponent ,
92+ final VeranstaltungComponent veranstaltungComponent ,
8793 final RequiresOnePermissionAspect requiresOnePermissionAspect ) {
8894 this .lizenzComponent = lizenzComponent ;
8995 this .setzlisteComponent = setzlisteComponent ;
@@ -93,6 +99,7 @@ public DownloadService(final SetzlisteComponent setzlisteComponent, final Lizenz
9399 this .rueckennummernComponent = rueckennummernComponent ;
94100 this .wettkampfComponent = wettkampfComponent ;
95101 this .dsbMannschaftComponent = dsbMannschaftComponent ;
102+ this .veranstaltungComponent = veranstaltungComponent ;
96103 this .requiresOnePermissionAspect = requiresOnePermissionAspect ;
97104 }
98105
@@ -246,7 +253,14 @@ ResponseEntity<InputStreamResource> downloadbogenkontrolllistePdf(@RequestParam(
246253 @ RequiresPermission (UserPermission .CAN_READ_DEFAULT )
247254 public
248255 ResponseEntity <InputStreamResource > downloadRueckennummernPdf (@ RequestParam ("mannschaftid" ) final long mannschaftid ) {
249-
256+ var mannschaft = dsbMannschaftComponent .findById (mannschaftid );
257+ boolean isSportleiter = requiresOnePermissionAspect .hasSpecificPermissionSportleiter (
258+ UserPermission .CAN_MODIFY_MY_VEREIN , mannschaft .getVereinId ());
259+ boolean isLigaleiter = requiresOnePermissionAspect .hasSpecificPermissionLigaLeiterID (
260+ UserPermission .CAN_MODIFY_MY_VERANSTALTUNG , mannschaft .getVeranstaltungId ());
261+ if (isSportleiter && !isLigaleiter ) {
262+ checkDownloadDeadline (mannschaft );
263+ }
250264
251265 final byte [] fileBloB = rueckennummernComponent .getMannschaftsRueckennummernPDFasByteArray (mannschaftid );
252266
@@ -272,12 +286,38 @@ ResponseEntity<InputStreamResource> downloadRueckennummernPdf(@RequestParam("man
272286 public
273287 ResponseEntity <InputStreamResource > downloadRueckennummerPdf (@ RequestParam ("mannschaftid" ) final long mannschaftid ,
274288 @ RequestParam ("dsbmitgliedid" ) final long dsbmitgliedid ) {
289+ var mannschaft = dsbMannschaftComponent .findById (mannschaftid );
290+ boolean isSportleiter = requiresOnePermissionAspect .hasSpecificPermissionSportleiter (
291+ UserPermission .CAN_MODIFY_MY_VEREIN , mannschaft .getVereinId ());
292+ boolean isLigaleiter = requiresOnePermissionAspect .hasSpecificPermissionLigaLeiterID (
293+ UserPermission .CAN_MODIFY_MY_VERANSTALTUNG , mannschaft .getVeranstaltungId ());
294+ if (isSportleiter && !isLigaleiter ) {
295+ checkDownloadDeadline (mannschaft );
296+ }
275297
276298 final byte [] fileBloB = rueckennummernComponent .getRueckennummerPDFasByteArray (mannschaftid ,dsbmitgliedid );
277299
278300 return generateInputStream (fileBloB );
279301 }
280302
303+ /**
304+ * Throws BusinessException if the current user is a Sportleiter and the Meldedeadline has not yet passed.
305+ * Ligaleiter for the event and Admins are not affected by this check.
306+ */
307+ private void checkDownloadDeadline (DsbMannschaftDO mannschaft ) {
308+ VeranstaltungDO veranstaltung = veranstaltungComponent .findById (mannschaft .getVeranstaltungId ());
309+ if (veranstaltung == null || veranstaltung .getVeranstaltungMeldeDeadline () == null ) {
310+ return ;
311+ }
312+ final Date today = new Date ();
313+ if (!today .after (veranstaltung .getVeranstaltungMeldeDeadline ())) {
314+ throw new BusinessException (
315+ ErrorCode .PDF_DOWNLOAD_BEFORE_MELDEDEADLINE ,
316+ "PDF-Download erst nach Ablauf der Meldedeadline möglich."
317+ );
318+ }
319+ }
320+
281321 /**
282322 * generates a pdf file as InputStreamResource from fileBloB
283323 * @param fileBloB bytearray from file that the pdf is based on
@@ -327,6 +367,10 @@ public ResponseEntity<InputStreamResource> downloadLizenz(@PathVariable("dsbMitg
327367 String .format ("User does not have permission to download license for team %d" , teamID ));
328368 }
329369
370+ if (isSportleiter && !isLigaleiter ) {
371+ checkDownloadDeadline (mannschaft );
372+ }
373+
330374 final byte [] fileBloB = lizenzComponent .getLizenzPDFasByteArray (dsbMitgliedID , teamID );
331375
332376 return generateInputStream (fileBloB );
@@ -369,6 +413,10 @@ ResponseEntity<InputStreamResource> downloadLizenzenPdf(@RequestParam("mannschaf
369413 String .format ("User does not have permission to download licenses for team %d" , mannschaftid ));
370414 }
371415
416+ if (isSportleiter && !isLigaleiter ) {
417+ checkDownloadDeadline (mannschaft );
418+ }
419+
372420 final byte [] fileBloB = lizenzComponent .getMannschaftsLizenzenPDFasByteArray (mannschaftid );
373421
374422 return generateInputStream (fileBloB );
0 commit comments