Skip to content

Commit a436985

Browse files
Merge pull request #657 from bettercodepaul/#2089-Download-erst-nach-Deadline
2089 PDF-Downloads (Rückennummern & Lizenzen) erst nach Meldedeadline…
2 parents 49af5cd + b7ad7d4 commit a436985

3 files changed

Lines changed: 341 additions & 48 deletions

File tree

bogenliga/bogenliga-application/src/main/java/de/bogenliga/application/services/v1/download/DownloadService.java

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
import java.io.IOException;
55
import java.io.InputStream;
66
import 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;
811
import de.bogenliga.application.business.wettkampf.api.types.WettkampfDO;
912
import de.bogenliga.application.business.wettkampf.api.WettkampfComponent;
1013
import de.bogenliga.application.springconfiguration.security.permissions.RequiresPermission;
@@ -20,6 +23,7 @@
2023
import org.springframework.web.bind.annotation.*;
2124
import de.bogenliga.application.business.bogenkontrollliste.api.BogenkontrolllisteComponent;
2225
import de.bogenliga.application.business.dsbmannschaft.api.DsbMannschaftComponent;
26+
import de.bogenliga.application.business.dsbmannschaft.api.types.DsbMannschaftDO;
2327
import de.bogenliga.application.business.meldezettel.api.MeldezettelComponent;
2428
import de.bogenliga.application.business.schusszettel.api.SchusszettelComponent;
2529
import 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

Comments
 (0)