package com.alterdekim.game.controller; import com.alterdekim.game.component.GameServer; import com.alterdekim.game.component.NativeDao; import com.alterdekim.game.component.StartUpListener; import com.alterdekim.game.controller.result.api.ApiResult; import com.alterdekim.game.controller.result.api.PreloaderResult; import com.alterdekim.game.controller.result.api.PromotionBannerResult; import com.alterdekim.game.controller.result.api.PromotionResult; import com.alterdekim.game.entity.Location; import com.alterdekim.game.entity.Preloader; import com.alterdekim.game.entity.Promotion; import com.alterdekim.game.entity.PromotionBanner; import com.alterdekim.game.service.*; import com.alterdekim.game.utils.DateUtils; import com.fasterxml.jackson.annotation.JsonProperty; import jakarta.servlet.http.HttpServletRequest; import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.io.IOException; import java.io.RandomAccessFile; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.nio.file.Path; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.time.Duration; import java.time.temporal.ChronoUnit; import java.util.*; import java.util.stream.Collectors; @Slf4j @RestController @RequestMapping("/api") public class ApiController { @Autowired private Environment env; @Autowired private NativeDao nativeDao; @Autowired private StartUpListener startUpListener; @Autowired private GameServer gameServer; @Autowired private UserService userService; @Autowired private PreloaderService preloaderService; @Autowired private PromotionService promotionService; @Autowired private PromotionBannerService promotionBannerService; @Autowired private LocationService locationService; @PostMapping("/delete_row") public ResponseEntity deleteRow(@RequestParam("table") APITable table, @RequestParam("row") Long rowId) { switch (table) { case Preloaders -> preloaderService.removeById(rowId); case Promotions -> promotionService.removeById(rowId); case Banners -> promotionBannerService.removeById(rowId); case Locations -> locationService.removeById(rowId); } return ResponseEntity.ok().build(); } @PostMapping("/update_table") public ResponseEntity updateRow(@RequestParam("table") APITable table, @RequestParam("column") String column, @RequestParam("id") Long id, @RequestParam("val") Boolean val) { if( column.matches("[^a-zA-Z]") || id < 1 ) return ResponseEntity.badRequest().build(); nativeDao.updateTable(table.getVal(), column, val, id); return ResponseEntity.noContent().build(); } @RequestMapping(value = "/get_entity_info", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> getEntityInfo(@RequestParam("table") APITable table) { Map m = new HashMap<>(); for( Field f : table.getCl().getDeclaredFields() ) { m.put(f.getName(), f.getType().getSimpleName()); } return ResponseEntity.ok(m); } @Getter @AllArgsConstructor public enum APITable { Preloaders("preloaders", Preloader.class, StaticController.PanelSection.Preloaders), Promotions("promotions", Promotion.class, StaticController.PanelSection.Preloaders), Banners("promotion_banners", PromotionBanner.class, StaticController.PanelSection.Preloaders), Locations("locations", Location.class, StaticController.PanelSection.Locations); private final String val; private final Class cl; private final StaticController.PanelSection section; } @GetMapping("/get_dashboard_logs") public ResponseEntity getLogs() { try { Path logFile = Paths.get(env.getProperty("logging.file.name")); RandomAccessFile file = new RandomAccessFile(logFile.toFile(), "r"); int n = 2048; file.seek(logFile.toFile().length() - n); byte[] b = new byte[n]; file.read(b, 0, n); return ResponseEntity.ok(new String(b)); } catch (IOException e) { log.error("getLogs error: {}", e.getMessage()); return ResponseEntity.badRequest().build(); } } @GetMapping("/get_uptime") public ResponseEntity getUpTime() { return ResponseEntity.ok( DateUtils.prettyPrint(Duration.of(System.currentTimeMillis() - startUpListener.getStartTime(), ChronoUnit.MILLIS)) ); } @GetMapping("/get_players_online") public ResponseEntity getPlayersOnline() { return ResponseEntity.ok(gameServer.getPlayersCount()); } @GetMapping("/get_users_count") public ResponseEntity getUsersCount() { return ResponseEntity.ok(userService.getUsersCount()); } @RequestMapping(value = "/get_entity_rows", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity> getEntityRows(@RequestParam("entity") APITable table) { var r = switch (table) { case Preloaders -> preloaderService.getAll(); case Promotions -> promotionService.getAll(); case Banners -> promotionBannerService.getAll(); case Locations -> locationService.getAll(); }; return ResponseEntity.ok( r .stream() .map(ApiResult::toAPIResult) .collect(Collectors.toList()) ); } @RequestMapping(value = "/add_row", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity addSpecificRow(HttpServletRequest httpServletRequest) { if( !httpServletRequest.getParameterMap().containsKey("table") ) return ResponseEntity.badRequest().build(); try { APITable table = APITable.valueOf(httpServletRequest.getParameterMap().get("table")[0]); List fields = Arrays.stream(table.getCl().getDeclaredFields()) .filter(f -> httpServletRequest.getParameterMap().containsKey(f.getName())) .collect(Collectors.toList()); Map vals = new HashMap<>(); for (Field f : fields) { String val = httpServletRequest.getParameterMap().get(f.getName())[0]; val = switch (f.getType().getSimpleName()) { case "String" -> "'" + val + "'"; case "Boolean" -> val.equals("true") ? "1" : "0"; default -> val; }; vals.put(f.getName(), val); } nativeDao.insertEntity(table.getVal(), vals); return ResponseEntity.ok(new AddEntryResponse(table.getSection().name())); } catch (Exception e) { log.error("addEntry error: {}", e.getMessage()); } return ResponseEntity.internalServerError().build(); } @AllArgsConstructor private class AddEntryResponse { @JsonProperty private String section; } }