package app.controllers.other; import app.annotations.enums.AuthMethod; import app.annotations.enums.CollectStages; import app.annotations.interfaces.CheckPermitionFlag; import app.annotations.interfaces.CheckWebAccess; import app.annotations.interfaces.CollectStatistic; import app.annotations.interfaces.WaitAfterNext; import app.entities.PromoCodeStatus; import app.entities.VipGiveMethod; import app.entities.db.PromoCode; import app.entities.other.SteamID; import app.services.db.PromoCodeService; import app.services.db.VIPService; import app.utils.SteamIDConverter; import jakarta.servlet.http.HttpServletRequest; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @RestController @RequestMapping("api/promocode") public class PromoCodeController { private VIPService vipService; private PromoCodeService promoCodeService; @Autowired PromoCodeController(VIPService vipService, PromoCodeService promoCodeService) { this.vipService = vipService; this.promoCodeService = promoCodeService; } @GetMapping @CheckWebAccess(auth_method = AuthMethod.STEAM64) @CheckPermitionFlag(flag = "z") public ResponseEntity> getCodes(HttpServletRequest request) { return new ResponseEntity<>(promoCodeService.getActualPromocodes().stream().collect(Collectors.toMap(PromoCode::getCode, PromoCode::getAction)), HttpStatus.OK); } @PostMapping @CheckWebAccess(auth_method = AuthMethod.STEAM64) @CheckPermitionFlag(flag = "z") @CollectStatistic(stage = CollectStages.COMBINED) public ResponseEntity generateCode(HttpServletRequest request, @CookieValue(value = "steam64") String admin_steam64, @RequestParam(value = "action") String action, @RequestParam(value = "append") String append) { return new ResponseEntity<>(promoCodeService .generatePromoCode(SteamIDConverter.getSteamID(admin_steam64), action, append), HttpStatus.CREATED); } @PutMapping @CheckWebAccess(auth_method = AuthMethod.STEAM64) @CollectStatistic(stage = CollectStages.COMBINED) @WaitAfterNext(order = "promocode") public ResponseEntity acceptCode(HttpServletRequest request, @CookieValue(value = "steam64") String steam64, @RequestParam(value = "code") String code) { SteamID steamID = SteamIDConverter.getSteamID(steam64); int status = promoCodeService.acceptPromoCode(steamID, code); PromoCode promoCode = promoCodeService.getPromoCode(code); if (status > 0) { String[] action = promoCode.getAction().toLowerCase().split(":"); if ("vip".equals(action[0])) { int result = vipService.addVIP(steamID, Integer.parseInt(action[1]), VipGiveMethod.PROMOCODE, code); if (result == 0) return new ResponseEntity<>(HttpStatus.NO_CONTENT); else if (result > 0) { return new ResponseEntity<>(HttpStatus.CREATED); } else { return new ResponseEntity<>(HttpStatus.OK); } } return new ResponseEntity<>(HttpStatus.ALREADY_REPORTED); } else if (status == 0) { if (promoCode == null) return new ResponseEntity<>(HttpStatus.NOT_FOUND); if (PromoCodeStatus.DISABLED.equals(promoCode.getStatus())) return new ResponseEntity(HttpStatus.LOCKED); if (PromoCodeStatus.ACCEPTED.equals(promoCode.getStatus())) return new ResponseEntity( Map.of("steam", promoCode.getAccept(), "utime", promoCode.getAccepted_timestamp().getTime()/1000), HttpStatus.GONE ); return new ResponseEntity<>(HttpStatus.I_AM_A_TEAPOT); } else { return new ResponseEntity(Map.of("cd", status * -1), HttpStatus.CONFLICT); } } }