|
9 | 9 | import de.doubleslash.keeptime.rest.integration.heimat.HeimatAPI; |
10 | 10 | import de.doubleslash.keeptime.rest.integration.heimat.model.HeimatTask; |
11 | 11 | import de.doubleslash.keeptime.rest.integration.heimat.model.HeimatTime; |
| 12 | +import de.doubleslash.keeptime.view.MapExternalProjectsController; |
12 | 13 | import de.doubleslash.keeptime.view.ProjectReport; |
| 14 | +import javafx.collections.ObservableList; |
13 | 15 | import org.slf4j.Logger; |
14 | 16 | import org.slf4j.LoggerFactory; |
15 | 17 | import org.springframework.beans.factory.annotation.Autowired; |
@@ -273,6 +275,72 @@ public List<HeimatTask> getTasks(final LocalDate forDate) { |
273 | 275 | .toList(); |
274 | 276 | } |
275 | 277 |
|
| 278 | + public void updateMappings(final List<MapExternalProjectsController.ProjectMapping> newMappings, |
| 279 | + final List<ExternalProjectMapping> existingMappings) { |
| 280 | + final List<ExternalProjectMapping> mappingsToCreateOrUpdate = newMappings.stream() |
| 281 | + .filter(pm -> pm.getHeimatTask() |
| 282 | + != null) |
| 283 | + .map(projectMapping -> { |
| 284 | + final Optional<ExternalProjectMapping> any = existingMappings.stream() |
| 285 | + .filter( |
| 286 | + pm -> pm.getProject() |
| 287 | + .getId() |
| 288 | + == projectMapping.getProject() |
| 289 | + .getId()) |
| 290 | + .findAny(); |
| 291 | + final HeimatTask heimatTask = projectMapping.getHeimatTask(); |
| 292 | + if (any.isPresent()) { |
| 293 | + final ExternalProjectMapping projectMapping1 = any.get(); |
| 294 | + if (projectMapping1.getExternalTaskId() |
| 295 | + == heimatTask.id()) { |
| 296 | + // mapping did not change |
| 297 | + return null; |
| 298 | + } |
| 299 | + projectMapping1.setExternalProjectName( |
| 300 | + heimatTask.taskHolderName()); |
| 301 | + projectMapping1.setExternalTaskId( |
| 302 | + heimatTask.id()); |
| 303 | + projectMapping1.setExternalTaskName( |
| 304 | + heimatTask.name()); |
| 305 | + projectMapping1.setExternalTaskMetadata( |
| 306 | + heimatTask.toString()); // TODO to json |
| 307 | + |
| 308 | + return projectMapping1; |
| 309 | + } |
| 310 | + return new ExternalProjectMapping( |
| 311 | + ExternalSystem.Heimat, |
| 312 | + heimatTask.taskHolderName(), |
| 313 | + heimatTask.id(), |
| 314 | + heimatTask.name(), |
| 315 | + heimatTask.toString() |
| 316 | + // TODO to json |
| 317 | + , |
| 318 | + projectMapping.getProject()); |
| 319 | + }) |
| 320 | + .filter(Objects::nonNull) |
| 321 | + .toList(); |
| 322 | + externalProjectsMappingsRepository.saveAll(mappingsToCreateOrUpdate); |
| 323 | + |
| 324 | + // remove mappings which were removed also from database |
| 325 | + final ArrayList<ExternalProjectMapping> mappingsToRemove = existingMappings.stream() |
| 326 | + .filter( |
| 327 | + em -> newMappings.stream() |
| 328 | + .anyMatch( |
| 329 | + wantedMapping -> |
| 330 | + wantedMapping.getProject() |
| 331 | + .getId() |
| 332 | + == em.getProject() |
| 333 | + .getId() |
| 334 | + && |
| 335 | + wantedMapping.getHeimatTask() |
| 336 | + == null)) |
| 337 | + .collect(Collectors.toCollection( |
| 338 | + ArrayList::new)); |
| 339 | + // remove mappings of projects which were 'deleted' |
| 340 | + existingMappings.stream().filter(em -> !em.getProject().isEnabled()).forEach(mappingsToRemove::add); |
| 341 | + externalProjectsMappingsRepository.deleteAll(mappingsToRemove); |
| 342 | + } |
| 343 | + |
276 | 344 | public record UserMapping(Mapping mapping, boolean shouldSync, String userNotes, int userMinutes) {} |
277 | 345 |
|
278 | 346 | public record Mapping(long heimatTaskId, boolean canBeSynced, String syncMessage, List<HeimatTime> existingTimes, |
|
0 commit comments