package jnpf.elnController; import jnpf.elnService.ElnRecordFillTicketService; import jnpf.elnService.ElnRecordFillDataService; import jnpf.elnService.ElnRecordRepeatService; import jnpf.elnService.ElnRecordSourceSyncService; import jnpf.elnEntity.runtime.ElnRecordForms; import jnpf.elnEntity.runtime.ElnRecordVos; import jnpf.util.NoDataSourceBind; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; @RestController @RequestMapping({"/onlyoffice/recordFill", "/onlyoffice/templateFill"}) public class ElnRecordFillController { private static final String TICKET_PREFIX = "Ticket "; private final ElnRecordFillTicketService ticketService; private final ElnRecordFillDataService recordFillDataService; private final ElnRecordRepeatService recordRepeatService; private final ElnRecordSourceSyncService recordSourceSyncService; ElnRecordFillController(ElnRecordFillTicketService ticketService) { this(ticketService, ticket -> Collections.emptyMap(), null, null); } public ElnRecordFillController(ElnRecordFillTicketService ticketService, ElnRecordFillDataService recordFillDataService) { this(ticketService, recordFillDataService, null, null); } public ElnRecordFillController(ElnRecordFillTicketService ticketService, ElnRecordFillDataService recordFillDataService, ElnRecordRepeatService recordRepeatService) { this(ticketService, recordFillDataService, recordRepeatService, null); } @Autowired public ElnRecordFillController(ElnRecordFillTicketService ticketService, ElnRecordFillDataService recordFillDataService, ElnRecordRepeatService recordRepeatService, ElnRecordSourceSyncService recordSourceSyncService) { this.ticketService = ticketService; this.recordFillDataService = recordFillDataService; this.recordRepeatService = recordRepeatService; this.recordSourceSyncService = recordSourceSyncService; } @PostMapping("/sourceSync/preview") @NoDataSourceBind public ResponseEntity previewSourceSync( @RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authorization) { try { return ResponseEntity.ok(recordSourceSyncService.preview(parseTicket(authorization))); } catch (ElnRecordFillTicketService.InvalidFillTicketException e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } } @PostMapping("/sourceSync") @NoDataSourceBind public ResponseEntity synchronizeSource( @RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authorization, @RequestBody(required = false) ElnRecordForms.SourceSync command) { try { return ResponseEntity.ok( recordSourceSyncService.synchronize(parseTicket(authorization), command)); } catch (ElnRecordFillTicketService.InvalidFillTicketException e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } } @GetMapping("/data") @NoDataSourceBind public ResponseEntity> data( @RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authorization) { try { ElnRecordFillTicketService.FillTicketContext ticket = parseTicket(authorization); ElnRecordVos.SourceSynchronized pending = recordSourceSyncService == null ? null : recordSourceSyncService.pending(ticket); Map data = new LinkedHashMap<>(recordFillDataService.data(ticket)); if (recordSourceSyncService != null) { data.put("pendingSourceSync", pending); } return ResponseEntity.ok(data); } catch (ElnRecordFillTicketService.InvalidFillTicketException e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(Collections.emptyMap()); } } @PostMapping("/repeatRows") @NoDataSourceBind public ResponseEntity appendRepeatRow( @RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authorization, @RequestBody(required = false) ElnRecordForms.RepeatAppend form) { try { ElnRecordFillTicketService.FillTicketContext ticket = parseTicket(authorization); return ResponseEntity.ok(recordRepeatService.append(ticket, form)); } catch (ElnRecordFillTicketService.InvalidFillTicketException e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } } @PostMapping("/repeatRows/delete") @NoDataSourceBind public ResponseEntity deleteRepeatRow( @RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authorization, @RequestBody(required = false) ElnRecordForms.RepeatDelete form) { try { ElnRecordFillTicketService.FillTicketContext ticket = parseTicket(authorization); return ResponseEntity.ok(recordRepeatService.requestDelete(ticket, form)); } catch (ElnRecordFillTicketService.InvalidFillTicketException e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } } @PostMapping("/repeatRows/restore") @NoDataSourceBind public ResponseEntity restoreRepeatRow( @RequestHeader(value = HttpHeaders.AUTHORIZATION, required = false) String authorization, @RequestBody(required = false) ElnRecordForms.RepeatRestore form) { try { ElnRecordFillTicketService.FillTicketContext ticket = parseTicket(authorization); return ResponseEntity.ok(recordRepeatService.restoreDelete(ticket, form)); } catch (ElnRecordFillTicketService.InvalidFillTicketException e) { return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build(); } } private ElnRecordFillTicketService.FillTicketContext parseTicket(String authorization) { if (authorization == null || !authorization.startsWith(TICKET_PREFIX) || authorization.length() == TICKET_PREFIX.length()) { throw new ElnRecordFillTicketService.InvalidFillTicketException(); } return ticketService.parse(authorization.substring(TICKET_PREFIX.length()).trim()); } }