remake init data

json dump

Small bug fix
This commit is contained in:
liosha84
2025-08-18 12:26:34 +03:00
parent 0885a460c4
commit a05e9a31fc
9 changed files with 120 additions and 56 deletions
@@ -74,27 +74,27 @@ public class JsonDumpController {
// ==================== IMPORT ENDPOINTS ====================
@PostMapping("/initData/users")
public ResponseEntity<Map<String, Object>> importUsers() {
@PostMapping("/restore/users")
public ResponseEntity<Map<String, Object>> restoreUsers() {
return performImport(() -> _jsonDumpService.importUsers(), "users");
}
@PostMapping("/initData/tutorials")
public ResponseEntity<Map<String, Object>> importTutorials() {
@PostMapping("/restore/tutorials")
public ResponseEntity<Map<String, Object>> restoreTutorials() {
return performImport(() -> _jsonDumpService.importTutorials(), "tutorials");
}
@PostMapping("/initData/roles")
public ResponseEntity<Map<String, Object>> importRoles() {
@PostMapping("/restore/roles")
public ResponseEntity<Map<String, Object>> restoreRoles() {
return performImport(() -> _jsonDumpService.importRoles(), "roles");
}
@PostMapping("/initData/users/file")
@PostMapping("/import/users/file")
public ResponseEntity<Map<String, Object>> importUsersFromFile(@RequestParam("file") MultipartFile file) {
return importFromFile(file, (path) -> _jsonDumpService.importUsers(path), "users");
}
@PostMapping("/initData/tutorials/file")
@PostMapping("/import/tutorials/file")
public ResponseEntity<Map<String, Object>> importTutorialsFromFile(@RequestParam("file") MultipartFile file) {
return importFromFile(file, (path) -> _jsonDumpService.importTutorials(path), "tutorials");
}
@@ -124,42 +124,41 @@ public class InitDataService {
List<UserDto> items = readList(jsonFile, new TypeReference<List<UserDto>>() {});
for (UserDto dto : items) {
User user = new User();
if (dto.getId() != null) user.setId(dto.getId());
user.setUsername(dto.getUsername());
user.setEmail(dto.getEmail());
// Expecting already-hashed values; do not import plain text secrets
user.setPassword(dto.getPassword());
if(!_userRepository.existsByUsername(dto.getUsername())) {
// Resolve roles by enum name
Set<Role> roles = new HashSet<>();
if (dto.getRoles() != null) {
for (RoleDto roleDto : dto.getRoles()) {
ERole erole = ERole.valueOf(roleDto.getName().name());
Role role = rolesByName.get(erole);
if (role == null) {
// Optionally create missing roles on the fly
role = new Role();
role.setName(erole);
role = _roleRepository.save(role);
rolesByName.put(erole, role);
User user = new User();
if (dto.getId() != null) user.setId(dto.getId());
user.setUsername(dto.getUsername());
user.setEmail(dto.getEmail());
// Expecting already-hashed values; do not import plain text secrets
user.setPassword(dto.getPassword());
// Resolve roles by enum name
Set<Role> roles = new HashSet<>();
if (dto.getRoles() != null) {
for (RoleDto roleDto : dto.getRoles()) {
ERole erole = ERole.valueOf(roleDto.getName().name());
Role role = rolesByName.get(erole);
if (role == null) {
// Optionally create missing roles on the fly
role = new Role();
role.setName(erole);
role = _roleRepository.save(role);
rolesByName.put(erole, role);
}
roles.add(role);
}
roles.add(role);
}
}
user.setRoles(roles);
user.setRoles(roles);
if(!_userRepository.existsByUsername(user.getUsername())) {
_userRepository.save(user);
_logger.info("Imported user: {} with roles: {}", user.getUsername(), user.getRoles().stream()
.map(Role::getName).collect(Collectors.toList()).stream().map(ERole::toString)
.collect(Collectors.joining(", ")));
} else {
_logger.warn("User with username {} already exists, SKIPPING import", user.getUsername());
_logger.info("Imported user: {} with roles: {}", user.getUsername(), user.getRoles().stream()
.map(Role::getName).collect(Collectors.toList()).stream().map(ERole::toString)
.collect(Collectors.joining(", ")));
_logger.warn("User with username {} already exists, SKIPPING import", dto.getUsername());
}
}
}
@@ -167,6 +167,12 @@ public class JsonDumpService extends InitDataService {
List<TutorialDto> items = super.readList(jsonFile, new TypeReference<List<TutorialDto>>() {});
for (TutorialDto dto : items) {
if(_tutorialRepository.findByUserIdAndTitle(dto.getUserID(), dto.getTitle()).size()> 0) {
_logger.warn("Tutorial with title [{}] already exists for userID [{}], SKIPPING import", dto.getTitle(), dto.getUserID());
continue;
}
Tutorial t = new Tutorial();
t.setId(dto.getId());
t.setTitle(dto.getTitle());
@@ -193,16 +199,17 @@ public class JsonDumpService extends InitDataService {
} else {
throw new IllegalArgumentException("Missing user with ROLE_ADMIN to assign tutorial: " + dto.getTitle());
}
} else {
User user = usersById.get(dto.getUserID());
//user = _entityManager.merge(user); // Ensure user is managed by EntityManager
//user.setRoles(null); // because we don't want to load roles to user object
t.setUser(user);
}
User user = usersById.get(dto.getUserID());
//user = _entityManager.merge(user); // Ensure user is managed by EntityManager
//user.setRoles(null); // because we don't want to load roles to user object
t.setUser(user);
if(_tutorialRepository.findByUserIdAndTitle(t.getUser().getId(), t.getTitle()).size()> 0) {
_logger.warn("Tutorial with title [{}] already exists for user [{}], SKIPPING import", t.getTitle(), t.getUser().getUsername());
continue;
if(_tutorialRepository.findByTitle(t.getTitle()).size() > 0) {
t.setTitle(t.getTitle() + " (imported) " + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));
}
_tutorialRepository.saveAndFlush(t);
//_tutorialRepository.save(t);
_logger.info("Imported tutorial: {} with user: {}", t.getTitle(), t.getUser().getUsername());
@@ -17,4 +17,6 @@ public interface TutorialRepository extends JpaRepository<Tutorial, Long> {
List<Tutorial> findBytobepublished(boolean tobepublished);
List<Tutorial> findByIdAndTobepublished(Long id,boolean tobepublished);
List<Tutorial> findByTitleContaining(String title);
List<Tutorial> findByTitle(String title);
}