remake init data

json dump

Small bug fix
This commit is contained in:
liosha84
2025-08-15 02:14:54 +03:00
parent b5e99b0116
commit 0885a460c4
8 changed files with 80 additions and 34 deletions
@@ -10,10 +10,10 @@ export class SpinnerService {
} }
show() { show() {
this.visibility.next(false); this.visibility.next(true);
} }
hide() { hide() {
this.visibility.next(true); this.visibility.next(false);
} }
} }
@@ -4,7 +4,6 @@ import com.jambotronGroup.jambotron.jsonDump.JsonDumpService;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.FileSystemResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders; import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
@@ -17,15 +16,11 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.nio.file.Paths;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors;
import static java.util.stream.Collectors.toList;
@RestController @RestController
@RequestMapping("/api/admin/json-dump") @RequestMapping("/api/admin/json-dump")
@@ -79,27 +74,27 @@ public class JsonDumpController {
// ==================== IMPORT ENDPOINTS ==================== // ==================== IMPORT ENDPOINTS ====================
@PostMapping("/import/users") @PostMapping("/initData/users")
public ResponseEntity<Map<String, Object>> importUsers() { public ResponseEntity<Map<String, Object>> importUsers() {
return performImport(() -> _jsonDumpService.importUsers(), "users"); return performImport(() -> _jsonDumpService.importUsers(), "users");
} }
@PostMapping("/import/tutorials") @PostMapping("/initData/tutorials")
public ResponseEntity<Map<String, Object>> importTutorials() { public ResponseEntity<Map<String, Object>> importTutorials() {
return performImport(() -> _jsonDumpService.importTutorials(), "tutorials"); return performImport(() -> _jsonDumpService.importTutorials(), "tutorials");
} }
@PostMapping("/import/roles") @PostMapping("/initData/roles")
public ResponseEntity<Map<String, Object>> importRoles() { public ResponseEntity<Map<String, Object>> importRoles() {
return performImport(() -> _jsonDumpService.importRoles(), "roles"); return performImport(() -> _jsonDumpService.importRoles(), "roles");
} }
@PostMapping("/import/users/file") @PostMapping("/initData/users/file")
public ResponseEntity<Map<String, Object>> importUsersFromFile(@RequestParam("file") MultipartFile file) { public ResponseEntity<Map<String, Object>> importUsersFromFile(@RequestParam("file") MultipartFile file) {
return importFromFile(file, (path) -> _jsonDumpService.importUsers(path), "users"); return importFromFile(file, (path) -> _jsonDumpService.importUsers(path), "users");
} }
@PostMapping("/import/tutorials/file") @PostMapping("/initData/tutorials/file")
public ResponseEntity<Map<String, Object>> importTutorialsFromFile(@RequestParam("file") MultipartFile file) { public ResponseEntity<Map<String, Object>> importTutorialsFromFile(@RequestParam("file") MultipartFile file) {
return importFromFile(file, (path) -> _jsonDumpService.importTutorials(path), "tutorials"); return importFromFile(file, (path) -> _jsonDumpService.importTutorials(path), "tutorials");
} }
@@ -15,7 +15,7 @@ public class InitDataConfiguration {
@PostConstruct @PostConstruct
public void init() { public void init() {
_initDataService.importData(); _initDataService.initData();
} }
} }
@@ -13,11 +13,13 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Primary; import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.ResourceLoader;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.io.InputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.HashSet; import java.util.HashSet;
@@ -32,7 +34,7 @@ public class InitDataService {
private static final Logger _logger = LoggerFactory.getLogger(InitDataService.class); private static final Logger _logger = LoggerFactory.getLogger(InitDataService.class);
private ObjectMapper _mapper; protected ObjectMapper _mapper;
@Autowired @Autowired
private ResourceLoader _resources; private ResourceLoader _resources;
@@ -42,8 +44,53 @@ public class InitDataService {
@Autowired @Autowired
private UserRepository _userRepository; private UserRepository _userRepository;
private final Path _initDataPath = Path.of("/jambotron-data/initData/");
public InitDataService(){ public InitDataService(){
_mapper = new ObjectMapper(); _mapper = new ObjectMapper();
}
private void extractInitData(){
_logger.info("Extracting init data to {}", _initDataPath.toAbsolutePath());
if(!_initDataPath.toFile().exists()) {
_logger.info("Creating init data directory at {}", _initDataPath.toAbsolutePath());
try {
Files.createDirectories(_initDataPath);
} catch (Exception e) {
_logger.error("Failed to create init data directory", e);
}
}
extractJsonFile("roles.json");
extractJsonFile("users.json");
}
private void extractJsonFile(String fileName) {
try {
ClassPathResource resource = new ClassPathResource("initData/"+ fileName);
Path targetPath = _initDataPath.resolve(fileName);
if (!Files.exists(targetPath)) {
try (InputStream inputStream = resource.getInputStream()) {
Files.copy(resource.getInputStream(), targetPath);
}
_logger.info("Copied {} to {}", fileName, targetPath.toAbsolutePath());
} else {
try (InputStream inputStream = resource.getInputStream()) {
Files.copy(resource.getInputStream(), targetPath, java.nio.file.StandardCopyOption.REPLACE_EXISTING);
}
_logger.warn("{} already exists, REPLACE", targetPath.toAbsolutePath());
}
} catch (Exception e) {
_logger.error("Failed to extract JSON file: {}", fileName, e);
}
} }
@Transactional @Transactional
@@ -122,23 +169,31 @@ public class InitDataService {
return _mapper.readValue(json, type); return _mapper.readValue(json, type);
} }
public void importData() { public void initData() {
try {
Resource resource = _resources.getResource("classpath:import/roles.json");
if (resource.exists()) {
importRoles(resource.getFile().toPath()); extractInitData();
_logger.info("Initializing data import from {}", _initDataPath.toAbsolutePath());
try {
Path rolesFile = _initDataPath.resolve("roles.json");
if (rolesFile.toFile().exists()) {
importRoles(rolesFile);
} else { } else {
_logger.warn("Roles import file not found: {}", resource.getFilename()); _logger.warn("Roles import file not found: {}", rolesFile.getFileName());
} }
resource = _resources.getResource("classpath:import/users.json"); Path usersFile = _initDataPath.resolve("users.json");
if (resource.exists()) {
importUsers(resource.getFile().toPath()); if (usersFile.toFile().exists()) {
importUsers(usersFile);
} else { } else {
_logger.warn("Users import file not found: {}", resource.getFilename()); _logger.warn("Users import file not found: {}", usersFile.getFileName());
} }
} catch (Exception e) { } catch (Exception e) {
_logger.error("Error importing data", e); _logger.error("Error importing data", e);
@@ -50,16 +50,16 @@ public class JsonDumpService extends InitDataService {
private final Path _extractedPath = _root.resolve("extracted"); private final Path _extractedPath = _root.resolve("extracted");
private final ObjectMapper _mapper; //private final ObjectMapper _mapper;
@Autowired @Autowired
private final UserRepository _userRepository; private UserRepository _userRepository;
@Autowired @Autowired
private final RoleRepository _roleRepository; private RoleRepository _roleRepository;
@Autowired @Autowired
private final TutorialRepository _tutorialRepository; private TutorialRepository _tutorialRepository;
@Value("${app.json.dump.cleanup.enabled:true}") @Value("${app.json.dump.cleanup.enabled:true}")
private boolean _cleanupEnabled; private boolean _cleanupEnabled;
@@ -70,11 +70,8 @@ public class JsonDumpService extends InitDataService {
@Value("${app.json.dump.archive.enabled:true}") @Value("${app.json.dump.archive.enabled:true}")
private boolean _archiveEnabled; private boolean _archiveEnabled;
public JsonDumpService(ObjectMapper mapper, UserRepository userRepository, RoleRepository roleRepository, TutorialRepository tutorialRepository) { public JsonDumpService() {
_mapper = mapper;
_userRepository = userRepository;
_roleRepository = roleRepository;
_tutorialRepository = tutorialRepository;
} }
private static String getFileNameWithTimestamp(String prefix) { private static String getFileNameWithTimestamp(String prefix) {
@@ -1,6 +1,5 @@
package com.jambotronGroup.jambotron.security; package com.jambotronGroup.jambotron.security;
import com.jambotronGroup.jambotron.initData.InitDataService;
import com.jambotronGroup.jambotron.security.jwt.AuthEntryPointJwt; import com.jambotronGroup.jambotron.security.jwt.AuthEntryPointJwt;
import com.jambotronGroup.jambotron.security.jwt.AuthTokenFilter; import com.jambotronGroup.jambotron.security.jwt.AuthTokenFilter;
import com.jambotronGroup.jambotron.security.services.UserDetailsServiceImpl; import com.jambotronGroup.jambotron.security.services.UserDetailsServiceImpl;