initial commit

This commit is contained in:
gong01
2026-03-06 02:52:38 +08:00
commit ea0292491a
492 changed files with 169588 additions and 0 deletions

9
.editorconfig Normal file
View File

@@ -0,0 +1,9 @@
root = true
[*]
indent_style = space # 탭 대신 공백 사용 (탭 문자 발생 방지)
indent_size = 4 # 공백은 4칸으로 고정
end_of_line = lf # 줄바꿈은 무조건 LF로 통일 (리눅스 방식)
charset = utf-8 # 인코딩 통일
trim_trailing_whitespace = true # 줄 끝의 불필요한 공백 제거
insert_final_newline = true # 파일 끝에 빈 줄 하나 추가

77
.gitignore vendored Normal file
View File

@@ -0,0 +1,77 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
# --- Build outputs ---
/target/
/build/
/out/
# --- Maven ---
.mvn/wrapper/maven-wrapper.jar
.mvn/wrapper/maven-wrapper.properties
.settings/
# --- Gradle ---
.gradle/
/gradle/
/gradlew
gradlew.bat
!gradle/wrapper/gradle-wrapper.jar
# --- Logs ---
*.log
logs/
log/
# --- Spring Boot ---
*.pid
*.pid.lock
*.iml
# --- IDE (IntelliJ / Eclipse / STS / VSCode) ---
.idea/
*.ipr
*.iws
.classpath
.project
.factorypath
.settings/
.springBeans
.springdsl
.vscode/
.history/
.remote/
# --- OS specific ---
.DS_Store
Thumbs.db
# --- Temporary / cache ---
*.tmp
*.bak
*.swp
*.swo
*.orig
.cache/
tmp/
bin/
generated/
# --- Security / credentials (예: 환경변수 파일) ---
.env
*.key
*.pem
*.p12
# application-*.yml
# application-*.properties
# application.properties
# --- Docker ---
/docker-compose.override.yml
# --- API Test Tool ---
api_test_tool/

117
.mvn/wrapper/MavenWrapperDownloader.java vendored Normal file
View File

@@ -0,0 +1,117 @@
/*
* Copyright 2007-present the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.net.*;
import java.io.*;
import java.nio.channels.*;
import java.util.Properties;
public class MavenWrapperDownloader {
private static final String WRAPPER_VERSION = "0.5.6";
/**
* Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided.
*/
private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/"
+ WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar";
/**
* Path to the maven-wrapper.properties file, which might contain a downloadUrl property to
* use instead of the default one.
*/
private static final String MAVEN_WRAPPER_PROPERTIES_PATH =
".mvn/wrapper/maven-wrapper.properties";
/**
* Path where the maven-wrapper.jar will be saved to.
*/
private static final String MAVEN_WRAPPER_JAR_PATH =
".mvn/wrapper/maven-wrapper.jar";
/**
* Name of the property which should be used to override the default download url for the wrapper.
*/
private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl";
public static void main(String args[]) {
System.out.println("- Downloader started");
File baseDirectory = new File(args[0]);
System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath());
// If the maven-wrapper.properties exists, read it and check if it contains a custom
// wrapperUrl parameter.
File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH);
String url = DEFAULT_DOWNLOAD_URL;
if(mavenWrapperPropertyFile.exists()) {
FileInputStream mavenWrapperPropertyFileInputStream = null;
try {
mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile);
Properties mavenWrapperProperties = new Properties();
mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream);
url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url);
} catch (IOException e) {
System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'");
} finally {
try {
if(mavenWrapperPropertyFileInputStream != null) {
mavenWrapperPropertyFileInputStream.close();
}
} catch (IOException e) {
// Ignore ...
}
}
}
System.out.println("- Downloading from: " + url);
File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH);
if(!outputFile.getParentFile().exists()) {
if(!outputFile.getParentFile().mkdirs()) {
System.out.println(
"- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'");
}
}
System.out.println("- Downloading to: " + outputFile.getAbsolutePath());
try {
downloadFileFromURL(url, outputFile);
System.out.println("Done");
System.exit(0);
} catch (Throwable e) {
System.out.println("- Error downloading");
e.printStackTrace();
System.exit(1);
}
}
private static void downloadFileFromURL(String urlString, File destination) throws Exception {
if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) {
String username = System.getenv("MVNW_USERNAME");
char[] password = System.getenv("MVNW_PASSWORD").toCharArray();
Authenticator.setDefault(new Authenticator() {
@Override
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(username, password);
}
});
}
URL website = new URL(urlString);
ReadableByteChannel rbc;
rbc = Channels.newChannel(website.openStream());
FileOutputStream fos = new FileOutputStream(destination);
fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
fos.close();
rbc.close();
}
}

83
deploy-aws.sh Normal file
View File

@@ -0,0 +1,83 @@
#!/bin/bash
# AWS 서버 파일 업로드 스크립트
# 사용법: ./deploy-aws.sh <aws-server> <aws-user> <aws-key> <jar-file> <deploy-path>
set -e
AWS_SERVER=$1
AWS_USER=$2
AWS_KEY_PATH=$3
JAR_FILE=$4
DEPLOY_PATH=$5
if [ -z "$AWS_SERVER" ] || [ -z "$AWS_USER" ] || [ -z "$AWS_KEY_PATH" ] || [ -z "$JAR_FILE" ] || [ -z "$DEPLOY_PATH" ]; then
echo "사용법: $0 <aws-server> <aws-user> <aws-key> <jar-file> <deploy-path>"
echo "예시: $0 47.129.51.216 root /path/to/key.pem target/core.jar /home/run"
exit 1
fi
echo "=== AWS 서버 파일 업로드 시작 ==="
echo "AWS Server: $AWS_SERVER"
echo "AWS User: $AWS_USER"
echo "JAR File: $JAR_FILE"
echo "Deploy Path: $DEPLOY_PATH"
# JAR 파일 존재 확인
if [ ! -f "$JAR_FILE" ]; then
echo "❌ JAR 파일을 찾을 수 없습니다: $JAR_FILE"
exit 1
fi
# AWS 키 파일 존재 확인
if [ ! -f "$AWS_KEY_PATH" ]; then
echo "❌ AWS 키 파일을 찾을 수 없습니다: $AWS_KEY_PATH"
exit 1
fi
# AWS 서버 연결 테스트
echo "AWS 서버 연결 테스트 중..."
ssh -i "$AWS_KEY_PATH" -o ConnectTimeout=10 -o StrictHostKeyChecking=no "$AWS_USER@$AWS_SERVER" "echo 'AWS 서버 연결 성공'"
if [ $? -ne 0 ]; then
echo "❌ AWS 서버 연결 실패"
exit 1
fi
# AWS 서버에서 배포 디렉토리 생성 및 권한 설정 (root 권한으로)
echo "AWS 서버에서 배포 디렉토리 생성 중... (root 권한)"
ssh -i "$AWS_KEY_PATH" "$AWS_USER@$AWS_SERVER" "sudo su - root <<'ROOT_SETUP'
# 배포 디렉토리 및 로그 디렉토리 생성
mkdir -p $DEPLOY_PATH/logs
chmod -R 755 $DEPLOY_PATH
echo '배포 디렉토리 생성 완료: $DEPLOY_PATH'
ROOT_SETUP
"
# JAR 파일 이름 추출
JAR_FILENAME=$(basename "$JAR_FILE")
# JAR 파일을 AWS 서버로 전송
echo "JAR 파일을 AWS 서버로 전송 중..."
scp -i "$AWS_KEY_PATH" "$JAR_FILE" "$AWS_USER@$AWS_SERVER:$DEPLOY_PATH/$JAR_FILENAME"
# JAR 파일 권한 설정 (root가 읽을 수 있도록)
echo "JAR 파일 권한 설정 중... (root 권한)"
ssh -i "$AWS_KEY_PATH" "$AWS_USER@$AWS_SERVER" "sudo su - root <<'ROOT_CHMOD'
chmod 644 $DEPLOY_PATH/$JAR_FILENAME
echo 'JAR 파일 권한 설정 완료'
echo '업로드된 파일: $DEPLOY_PATH/$JAR_FILENAME'
ls -lh $DEPLOY_PATH/$JAR_FILENAME
ROOT_CHMOD
"
if [ $? -eq 0 ]; then
echo "✅ AWS 서버 파일 업로드 성공!"
echo "JAR 파일이 $DEPLOY_PATH/$JAR_FILENAME 에 업로드되었습니다."
else
echo "❌ AWS 서버 파일 업로드 실패!"
exit 1
fi
echo "=== AWS 서버 파일 업로드 완료 ==="

96
deploy-aws2.sh Normal file
View File

@@ -0,0 +1,96 @@
#!/bin/bash
# AWS 서버 파일 업로드 스크립트
# 사용법: ./deploy-aws.sh <aws-server> <aws-user> <aws-key> <jar-file> <deploy-path>
set -e
AWS_SERVER=$1
AWS_USER=$2
AWS_KEY_PATH=$3
JAR_FILE=$4
DEPLOY_PATH=$5
if [ -z "$AWS_SERVER" ] || [ -z "$AWS_USER" ] || [ -z "$AWS_KEY_PATH" ] || [ -z "$JAR_FILE" ] || [ -z "$DEPLOY_PATH" ]; then
echo "사용법: $0 <aws-server> <aws-user> <aws-key> <jar-file> <deploy-path>"
echo "예시: $0 47.129.51.216 root /path/to/key.pem target/core.jar /home/run"
exit 1
fi
echo "=== AWS 서버 파일 업로드 시작 ==="
echo "AWS Server: $AWS_SERVER"
echo "AWS User: $AWS_USER"
echo "JAR File: $JAR_FILE"
echo "Deploy Path: $DEPLOY_PATH"
# JAR 파일 존재 확인
if [ ! -f "$JAR_FILE" ]; then
echo "❌ JAR 파일을 찾을 수 없습니다: $JAR_FILE"
exit 1
fi
# AWS 키 파일 존재 확인
if [ ! -f "$AWS_KEY_PATH" ]; then
echo "❌ AWS 키 파일을 찾을 수 없습니다: $AWS_KEY_PATH"
exit 1
fi
# AWS 서버 연결 테스트
echo "AWS 서버 연결 테스트 중..."
ssh -i "$AWS_KEY_PATH" -o ConnectTimeout=10 -o StrictHostKeyChecking=no "$AWS_USER@$AWS_SERVER" "echo 'AWS 서버 연결 성공'"
if [ $? -ne 0 ]; then
echo "❌ AWS 서버 연결 실패"
exit 1
fi
# AWS 서버에서 배포 디렉토리 생성 및 권한 설정 (root 권한으로)
echo "AWS 서버에서 배포 디렉토리 생성 중... (root 권한)"
ssh -i "$AWS_KEY_PATH" "$AWS_USER@$AWS_SERVER" "sudo su - root <<ROOT_SETUP
# 배포 디렉토리 및 로그 디렉토리 생성
mkdir -p $DEPLOY_PATH/logs
chmod -R 755 $DEPLOY_PATH
echo '배포 디렉토리 생성 완료: $DEPLOY_PATH'
ROOT_SETUP
"
# JAR 파일 이름 추출
JAR_FILENAME=$(basename "$JAR_FILE")
# 임시 업로드 경로 (rocky 계정 홈 디렉토리)
TEMP_PATH="/home/$AWS_USER/temp_${JAR_FILENAME}"
# JAR 파일을 AWS 서버의 임시 위치로 전송 (rocky 계정 권한으로)
echo "JAR 파일을 AWS 서버 임시 위치로 전송 중..."
scp -i "$AWS_KEY_PATH" "$JAR_FILE" "$AWS_USER@$AWS_SERVER:$TEMP_PATH"
# 임시 파일을 최종 위치로 이동 및 권한 설정 (root 권한으로)
echo "JAR 파일을 최종 위치로 이동 중... (root 권한)"
ssh -i "$AWS_KEY_PATH" "$AWS_USER@$AWS_SERVER" "sudo su - root <<ROOT_MOVE
# 배포 디렉토리 확인 및 생성
mkdir -p $DEPLOY_PATH
chmod -R 755 $DEPLOY_PATH
# 임시 파일을 최종 위치로 이동
mv $TEMP_PATH $DEPLOY_PATH/$JAR_FILENAME
# 파일 권한 설정
chmod 644 $DEPLOY_PATH/$JAR_FILENAME
chown root:root $DEPLOY_PATH/$JAR_FILENAME
echo 'JAR 파일 이동 및 권한 설정 완료'
echo '업로드된 파일: $DEPLOY_PATH/$JAR_FILENAME'
ls -lh $DEPLOY_PATH/$JAR_FILENAME
ROOT_MOVE
"
if [ $? -eq 0 ]; then
echo "✅ AWS 서버 파일 업로드 성공!"
echo "JAR 파일이 $DEPLOY_PATH/$JAR_FILENAME 에 업로드되었습니다."
else
echo "❌ AWS 서버 파일 업로드 실패!"
exit 1
fi
echo "=== AWS 서버 파일 업로드 완료 ==="

Binary file not shown.

90
jenkinsfile Normal file
View File

@@ -0,0 +1,90 @@
pipeline {
agent any
environment {
JAVA_HOME = '/var/lib/jenkins/tools/openjdk17'
MAVEN_HOME = '/usr/share/maven'
PATH = "${MAVEN_HOME}/bin:${JAVA_HOME}/bin:${PATH}"
APP_NAME = 'triple'
VERSION = '0.0.1-SNAPSHOT'
JAR_FILE = "target/triple.jar"
AWS_SERVER = '13.215.48.238'
AWS_USER = 'root'
DEPLOY_PATH = '/home/build' // 빌드 산출물 업로드 경로
RUN_PATH = '/home/run' // 실행 경로
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build') {
steps {
sh 'echo "Building application..."'
script {
def mvnHome = tool 'maven'
sh "${mvnHome}/bin/mvn clean package -Pdev -DskipTests -Dspring.profiles.active=dev"
}
}
}
stage('Archive Artifacts') {
steps {
sh 'echo "Checking JAR file..."'
sh 'ls -la target/'
sh 'ls -la target/*.jar'
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
stage('Deploy to AWS') {
steps {
script {
// 실제 빌드된 JAR 파일 찾기
def jarFiles = sh(
script: 'find target -name "*.jar" -not -name "*-sources.jar" -not -name "*-javadoc.jar" | head -1',
returnStdout: true
).trim()
if (!jarFiles) {
error "JAR 파일을 찾을 수 없습니다."
}
def actualJarFile = jarFiles.split('\n')[0]
echo "실제 JAR 파일: ${actualJarFile}"
withCredentials([sshUserPrivateKey(credentialsId: 'coreserver', keyFileVariable: 'SSH_KEY')]) {
sh """
echo "Deploying to AWS server..."
chmod +x deploy-aws.sh
./deploy-aws.sh ${AWS_SERVER} ${AWS_USER} "\${SSH_KEY}" ${actualJarFile} ${DEPLOY_PATH}
echo "Uploading and running runApi.sh..."
chmod +x runApi.sh
scp -i "\${SSH_KEY}" runApi.sh ${AWS_USER}@${AWS_SERVER}:${RUN_PATH}/runApi.sh
ssh -i "\${SSH_KEY}" ${AWS_USER}@${AWS_SERVER} "chmod +x ${RUN_PATH}/runApi.sh && JAR_NAME=\$(basename ${actualJarFile}) BUILD_DIR=${DEPLOY_PATH} RUN_DIR=${RUN_PATH} ${RUN_PATH}/runApi.sh"
"""
}
}
}
}
}
post {
success {
echo 'Pipeline succeeded!'
// 슬랙 알림 등 추가 가능
}
failure {
echo 'Pipeline failed!'
// 실패 알림 등 추가 가능
}
always {
// 빌드 결과 정리
sh 'echo "Build completed"'
}
}
}

90
jenkinsfile2 Normal file
View File

@@ -0,0 +1,90 @@
pipeline {
agent any
environment {
JAVA_HOME = '/var/lib/jenkins/tools/openjdk17'
MAVEN_HOME = '/usr/share/maven'
PATH = "${MAVEN_HOME}/bin:${JAVA_HOME}/bin:${PATH}"
APP_NAME = 'triple'
VERSION = '0.0.1-SNAPSHOT'
JAR_FILE = "target/triple.jar"
AWS_SERVER = '13.229.206.39'
AWS_USER = 'rocky'
DEPLOY_PATH = '/home/build' // 빌드 산출물 업로드 경로
RUN_PATH = '/home/run' // 실행 경로
}
stages {
stage('Checkout') {
steps {
checkout scm
}
}
stage('Build') {
steps {
sh 'echo "Building application..."'
script {
def mvnHome = tool 'maven'
sh "${mvnHome}/bin/mvn clean package -Pdev -DskipTests -Dspring.profiles.active=dev"
}
}
}
stage('Archive Artifacts') {
steps {
sh 'echo "Checking JAR file..."'
sh 'ls -la target/'
sh 'ls -la target/*.jar'
archiveArtifacts artifacts: 'target/*.jar', fingerprint: true
}
}
stage('Deploy to AWS') {
steps {
script {
// 실제 빌드된 JAR 파일 찾기
def jarFiles = sh(
script: 'find target -name "*.jar" -not -name "*-sources.jar" -not -name "*-javadoc.jar" | head -1',
returnStdout: true
).trim()
if (!jarFiles) {
error "JAR 파일을 찾을 수 없습니다."
}
def actualJarFile = jarFiles.split('\n')[0]
echo "실제 JAR 파일: ${actualJarFile}"
withCredentials([sshUserPrivateKey(credentialsId: 'coreserver2', keyFileVariable: 'SSH_KEY')]) {
sh """
echo "Deploying to AWS server..."
chmod +x deploy-aws2.sh
./deploy-aws2.sh ${AWS_SERVER} ${AWS_USER} "\${SSH_KEY}" ${actualJarFile} ${DEPLOY_PATH}
echo "Uploading and running runApi.sh..."
chmod +x runApi.sh
scp -i "\${SSH_KEY}" runApi.sh ${AWS_USER}@${AWS_SERVER}:/home/${AWS_USER}/temp_runApi.sh
ssh -i "\${SSH_KEY}" ${AWS_USER}@${AWS_SERVER} "sudo -i bash -c 'mv /home/${AWS_USER}/temp_runApi.sh ${RUN_PATH}/runApi.sh && chmod +x ${RUN_PATH}/runApi.sh && JAR_NAME=\$(basename ${actualJarFile}) BUILD_DIR=${DEPLOY_PATH} RUN_DIR=${RUN_PATH} ${RUN_PATH}/runApi.sh'"
"""
}
}
}
}
}
post {
success {
echo 'Pipeline succeeded!'
// 슬랙 알림 등 추가 가능
}
failure {
echo 'Pipeline failed!'
// 실패 알림 등 추가 가능
}
always {
// 빌드 결과 정리
sh 'echo "Build completed"'
}
}
}

310
mvnw vendored Normal file
View File

@@ -0,0 +1,310 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Maven Start Up Batch script
#
# Required ENV vars:
# ------------------
# JAVA_HOME - location of a JDK home dir
#
# Optional ENV vars
# -----------------
# M2_HOME - location of maven2's installed home dir
# MAVEN_OPTS - parameters passed to the Java VM when running Maven
# e.g. to debug Maven itself, use
# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
# MAVEN_SKIP_RC - flag to disable loading of mavenrc files
# ----------------------------------------------------------------------------
if [ -z "$MAVEN_SKIP_RC" ] ; then
if [ -f /etc/mavenrc ] ; then
. /etc/mavenrc
fi
if [ -f "$HOME/.mavenrc" ] ; then
. "$HOME/.mavenrc"
fi
fi
# OS specific support. $var _must_ be set to either true or false.
cygwin=false;
darwin=false;
mingw=false
case "`uname`" in
CYGWIN*) cygwin=true ;;
MINGW*) mingw=true;;
Darwin*) darwin=true
# Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
# See https://developer.apple.com/library/mac/qa/qa1170/_index.html
if [ -z "$JAVA_HOME" ]; then
if [ -x "/usr/libexec/java_home" ]; then
export JAVA_HOME="`/usr/libexec/java_home`"
else
export JAVA_HOME="/Library/Java/Home"
fi
fi
;;
esac
if [ -z "$JAVA_HOME" ] ; then
if [ -r /etc/gentoo-release ] ; then
JAVA_HOME=`java-config --jre-home`
fi
fi
if [ -z "$M2_HOME" ] ; then
## resolve links - $0 may be a link to maven's home
PRG="$0"
# need this for relative symlinks
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG="`dirname "$PRG"`/$link"
fi
done
saveddir=`pwd`
M2_HOME=`dirname "$PRG"`/..
# make it fully qualified
M2_HOME=`cd "$M2_HOME" && pwd`
cd "$saveddir"
# echo Using m2 at $M2_HOME
fi
# For Cygwin, ensure paths are in UNIX format before anything is touched
if $cygwin ; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --unix "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
fi
# For Mingw, ensure paths are in UNIX format before anything is touched
if $mingw ; then
[ -n "$M2_HOME" ] &&
M2_HOME="`(cd "$M2_HOME"; pwd)`"
[ -n "$JAVA_HOME" ] &&
JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
fi
if [ -z "$JAVA_HOME" ]; then
javaExecutable="`which javac`"
if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
# readlink(1) is not available as standard on Solaris 10.
readLink=`which readlink`
if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
if $darwin ; then
javaHome="`dirname \"$javaExecutable\"`"
javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
else
javaExecutable="`readlink -f \"$javaExecutable\"`"
fi
javaHome="`dirname \"$javaExecutable\"`"
javaHome=`expr "$javaHome" : '\(.*\)/bin'`
JAVA_HOME="$javaHome"
export JAVA_HOME
fi
fi
fi
if [ -z "$JAVACMD" ] ; then
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
else
JAVACMD="`which java`"
fi
fi
if [ ! -x "$JAVACMD" ] ; then
echo "Error: JAVA_HOME is not defined correctly." >&2
echo " We cannot execute $JAVACMD" >&2
exit 1
fi
if [ -z "$JAVA_HOME" ] ; then
echo "Warning: JAVA_HOME environment variable is not set."
fi
CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
# traverses directory structure from process work directory to filesystem root
# first directory with .mvn subdirectory is considered project base directory
find_maven_basedir() {
if [ -z "$1" ]
then
echo "Path not specified to find_maven_basedir"
return 1
fi
basedir="$1"
wdir="$1"
while [ "$wdir" != '/' ] ; do
if [ -d "$wdir"/.mvn ] ; then
basedir=$wdir
break
fi
# workaround for JBEAP-8937 (on Solaris 10/Sparc)
if [ -d "${wdir}" ]; then
wdir=`cd "$wdir/.."; pwd`
fi
# end of workaround
done
echo "${basedir}"
}
# concatenates all lines of a file
concat_lines() {
if [ -f "$1" ]; then
echo "$(tr -s '\n' ' ' < "$1")"
fi
}
BASE_DIR=`find_maven_basedir "$(pwd)"`
if [ -z "$BASE_DIR" ]; then
exit 1;
fi
##########################################################################################
# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
# This allows using the maven wrapper in projects that prohibit checking in binary data.
##########################################################################################
if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found .mvn/wrapper/maven-wrapper.jar"
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
fi
if [ -n "$MVNW_REPOURL" ]; then
jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
else
jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
fi
while IFS="=" read key value; do
case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
esac
done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
if [ "$MVNW_VERBOSE" = true ]; then
echo "Downloading from: $jarUrl"
fi
wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
if $cygwin; then
wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
fi
if command -v wget > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found wget ... using wget"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
wget "$jarUrl" -O "$wrapperJarPath"
else
wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath"
fi
elif command -v curl > /dev/null; then
if [ "$MVNW_VERBOSE" = true ]; then
echo "Found curl ... using curl"
fi
if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
curl -o "$wrapperJarPath" "$jarUrl" -f
else
curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
fi
else
if [ "$MVNW_VERBOSE" = true ]; then
echo "Falling back to using Java to download"
fi
javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
# For Cygwin, switch paths to Windows format before running javac
if $cygwin; then
javaClass=`cygpath --path --windows "$javaClass"`
fi
if [ -e "$javaClass" ]; then
if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Compiling MavenWrapperDownloader.java ..."
fi
# Compiling the Java class
("$JAVA_HOME/bin/javac" "$javaClass")
fi
if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
# Running the downloader
if [ "$MVNW_VERBOSE" = true ]; then
echo " - Running MavenWrapperDownloader.java ..."
fi
("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
fi
fi
fi
fi
##########################################################################################
# End of extension
##########################################################################################
export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
if [ "$MVNW_VERBOSE" = true ]; then
echo $MAVEN_PROJECTBASEDIR
fi
MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
# For Cygwin, switch paths to Windows format before running java
if $cygwin; then
[ -n "$M2_HOME" ] &&
M2_HOME=`cygpath --path --windows "$M2_HOME"`
[ -n "$JAVA_HOME" ] &&
JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
[ -n "$CLASSPATH" ] &&
CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
[ -n "$MAVEN_PROJECTBASEDIR" ] &&
MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
fi
# Provide a "standardized" way to retrieve the CLI args that will
# work with both Windows and non-Windows executions.
MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
export MAVEN_CMD_LINE_ARGS
WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
exec "$JAVACMD" \
$MAVEN_OPTS \
-classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
"-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"

182
mvnw.cmd vendored Normal file
View File

@@ -0,0 +1,182 @@
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Maven Start Up Batch script
@REM
@REM Required ENV vars:
@REM JAVA_HOME - location of a JDK home dir
@REM
@REM Optional ENV vars
@REM M2_HOME - location of maven2's installed home dir
@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
@REM e.g. to debug Maven itself, use
@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
@REM ----------------------------------------------------------------------------
@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
@echo off
@REM set title of command window
title %0
@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO%
@REM set %HOME% to equivalent of $HOME
if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
@REM Execute a user defined script before this one
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
@REM check for pre script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat"
if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd"
:skipRcPre
@setlocal
set ERROR_CODE=0
@REM To isolate internal variables from possible post scripts, we use another setlocal
@setlocal
@REM ==== START VALIDATION ====
if not "%JAVA_HOME%" == "" goto OkJHome
echo.
echo Error: JAVA_HOME not found in your environment. >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
:OkJHome
if exist "%JAVA_HOME%\bin\java.exe" goto init
echo.
echo Error: JAVA_HOME is set to an invalid directory. >&2
echo JAVA_HOME = "%JAVA_HOME%" >&2
echo Please set the JAVA_HOME variable in your environment to match the >&2
echo location of your Java installation. >&2
echo.
goto error
@REM ==== END VALIDATION ====
:init
@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
@REM Fallback to current working directory if not found.
set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
set EXEC_DIR=%CD%
set WDIR=%EXEC_DIR%
:findBaseDir
IF EXIST "%WDIR%"\.mvn goto baseDirFound
cd ..
IF "%WDIR%"=="%CD%" goto baseDirNotFound
set WDIR=%CD%
goto findBaseDir
:baseDirFound
set MAVEN_PROJECTBASEDIR=%WDIR%
cd "%EXEC_DIR%"
goto endDetectBaseDir
:baseDirNotFound
set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
cd "%EXEC_DIR%"
:endDetectBaseDir
IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
@setlocal EnableExtensions EnableDelayedExpansion
for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
:endReadAdditionalConfig
SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
)
@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
if exist %WRAPPER_JAR% (
if "%MVNW_VERBOSE%" == "true" (
echo Found %WRAPPER_JAR%
)
) else (
if not "%MVNW_REPOURL%" == "" (
SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar"
)
if "%MVNW_VERBOSE%" == "true" (
echo Couldn't find %WRAPPER_JAR%, downloading it ...
echo Downloading from: %DOWNLOAD_URL%
)
powershell -Command "&{"^
"$webclient = new-object System.Net.WebClient;"^
"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
"}"^
"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
"}"
if "%MVNW_VERBOSE%" == "true" (
echo Finished downloading %WRAPPER_JAR%
)
)
@REM End of extension
@REM Provide a "standardized" way to retrieve the CLI args that will
@REM work with both Windows and non-Windows executions.
set MAVEN_CMD_LINE_ARGS=%*
%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
if ERRORLEVEL 1 goto error
goto end
:error
set ERROR_CODE=1
:end
@endlocal & set ERROR_CODE=%ERROR_CODE%
if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost
@REM check for post script, once with legacy .bat ending and once with .cmd ending
if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat"
if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd"
:skipRcPost
@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
if "%MAVEN_BATCH_PAUSE%" == "on" pause
if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE%
exit /B %ERROR_CODE%

217
pom-real.xml Normal file
View File

@@ -0,0 +1,217 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<relativePath/> </parent>
<groupId>com.example</groupId>
<artifactId>apiServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>apiServer</name>
<description>Demo project for Spring Boot</description>
<properties>
<env>real</env>
<java.version>17</java.version>
<springdoc.version>2.0.2</springdoc.version>
<jjwt.version>0.11.5</jjwt.version>
<mybatis.version>3.0.0</mybatis.version>
<lombok.version>1.18.30</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230227</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>${springdoc.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.warrenstrange</groupId>
<artifactId>googleauth</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>17</source>
<target>17</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>3.0.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

222
pom.xml Normal file
View File

@@ -0,0 +1,222 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.0</version>
<relativePath/> </parent>
<groupId>com.example</groupId>
<artifactId>apiServer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>apiServer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>17</java.version>
<springdoc.version>2.0.2</springdoc.version>
<jjwt.version>0.11.5</jjwt.version>
<mybatis.version>3.0.0</mybatis.version>
<lombok.version>1.18.30</lombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>nz.net.ultraq.thymeleaf</groupId>
<artifactId>thymeleaf-layout-dialect</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.codehaus.jettison</groupId>
<artifactId>jettison</artifactId>
<version>1.5.4</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20230227</version>
</dependency>
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>${jjwt.version}</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>${jjwt.version}</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>${springdoc.version}</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.15.3</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.10.0</version>
</dependency>
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.0</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>com.warrenstrange</groupId>
<artifactId>googleauth</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-batch</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>2.0.2</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.10.1</version>
<configuration>
<source>17</source>
<target>17</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<version>3.0.0</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

108
runApi.sh Normal file
View File

@@ -0,0 +1,108 @@
#!/bin/bash
# API 서버 배포 및 실행 스크립트
# 사용법: sudo ./runApi.sh
# 필요한 경로/파일이 다를 경우 아래 변수만 수정하세요.
set -euo pipefail
JAR_NAME="${JAR_NAME:-apiServer-0.0.1-SNAPSHOT.jar}"
PID_FILE="${PID_FILE:-/home/api.pid}"
RUN_DIR="${RUN_DIR:-/home/run}"
BUILD_DIR="${BUILD_DIR:-/home/build}"
BACKUP_DIR="${BACKUP_DIR:-/home/backup}"
JAVA_BIN="${JAVA_BIN:-/home/openjdk17/bin/java}"
# SCOUTER_AGENT="${SCOUTER_AGENT:-/home/scouter/agent.java/scouter.agent.jar}"
# SCOUTER_CONF="${SCOUTER_CONF:-/home/scouter/agent.java/conf/scouter.conf}"
SPRING_PROFILE="${SPRING_PROFILE:-real}"
timestamp() {
date +"%Y%m%d_%H%M%S"
}
log() {
echo "[runApi] $*"
}
ensure_paths() {
mkdir -p "$RUN_DIR" "$BACKUP_DIR" "$BUILD_DIR"
}
stop_app() {
if [[ -f "$PID_FILE" ]]; then
local pid
pid=$(cat "$PID_FILE" 2>/dev/null || true)
if [[ -n "${pid:-}" ]] && ps -p "$pid" > /dev/null 2>&1; then
log "기존 프로세스 종료: $pid"
kill -9 "$pid" || true
else
log "PID 파일은 있으나 실행 중인 프로세스가 없습니다."
fi
rm -f "$PID_FILE"
else
log "종료할 PID 파일이 없습니다."
fi
}
backup_old() {
local current="$RUN_DIR/$JAR_NAME"
if [[ -f "$current" ]]; then
local backup="$BACKUP_DIR/oldApi_$(timestamp).jar"
log "기존 JAR 백업 -> $backup"
mv "$current" "$backup"
else
log "백업할 기존 JAR이 없습니다."
fi
}
copy_new() {
local source="$BUILD_DIR/$JAR_NAME"
local target="$RUN_DIR/$JAR_NAME"
# 소스와 타겟이 같으면 복사 불필요
if [[ "$source" == "$target" ]]; then
if [[ -f "$target" ]]; then
log "배포된 JAR 확인 -> $target"
return 0
else
log "새 JAR을 찾을 수 없습니다: $target"
exit 1
fi
fi
if [[ ! -f "$source" ]]; then
log "새 JAR을 찾을 수 없습니다: $source"
exit 1
fi
log "새 JAR 복사 -> $target"
cp "$source" "$target"
}
start_app() {
local target="$RUN_DIR/$JAR_NAME"
log "애플리케이션 시작"
local log_dir="${LOG_DIR:-/home/log/core}"
local log_file="${LOG_FILE:-$log_dir/apiServer.log}"
mkdir -p "$log_dir"
nohup "$JAVA_BIN" \
-Duser.timezone=GMT+09:00 \
-Dspring.profiles.active="$SPRING_PROFILE" \
-jar "$target" \
>> "$log_file" 2>&1 &
echo $! > "$PID_FILE"
log "시작 완료 (PID: $(cat "$PID_FILE"))"
}
main() {
ensure_paths
stop_app
backup_old
copy_new
start_app
log "배포 완료"
}
main "$@"

View File

@@ -0,0 +1,15 @@
package com.bb;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
@EnableAsync
@SpringBootApplication
public class ApiServerApplication {
public static void main(String[] args) {
SpringApplication.run(ApiServerApplication.class, args);
}
}

View File

@@ -0,0 +1,671 @@
package com.bb.admin.controller;
import java.util.HashMap;
import java.util.List;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.reactive.function.client.WebClient;
import com.bb.model.CommonParamAdmin;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import com.bb.model.Vendor;
import com.bb.service.CreditService;
import com.bb.service.SiteService;
import com.bb.util.PagingUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
@Slf4j
@Controller
@RequestMapping(value = "/agent")
@PreAuthorize("hasRole('ADMIN')")
public class AgentController {
@Autowired
SiteService siteService;
@Autowired
CreditService creditService;
@Autowired
private WebClient webClient; // 싱글톤 WebClient 주입
/*
*
* TPA 에이전트 목록 페이지 수정사항
1. 에이전트 -> "에이전시" 로 용어수정
2. 에이전시 목록 수정사항 :
- 단계 = 레벨.
- 번호 : 생성 순번 (컬럼 맨 앞으로)
- 분류 : 두가지 타입 (추후 추가될수있음) NA(Normal Agency), IA(Insure Agency)
NA, IA
- 타입 : Ota (Operator Agency) : 솔루션 운영하는 에이전시, Ppa (Paper Agency) : 하위 총판만 운영하는 에이전시
3. 검색옵션 추가 : 분류, 타입 각각 따로 검색 가능하도록 분리
4. 데이터 적용안되어 있는부분 적용 : 요율, 총 지급받은 금액 등
요율 : 기준요율만 적시 (벤더별 요율은 상세페이지에서 표시됨)
5. 소속 에이전트 삭제(어차피 내 소속임) 에이전트 아이디 클릭시 상세페이지 이동
6. 가입시각 -> 가입일시로 수정 , 가운데 "T" "%"문자 제거.
7. 관리 컬럼은 유지 타이틀 이름도 관리 유자, 내용 관리 글자 제거.
"정지"버튼 추가(클릭시 모든기능정지) "블랙"버튼 추가 (클릭시 로그인 및 PT충환전 중지)
위 기능 구현하도록 작업
*/
@GetMapping("")
public String list( HttpServletRequest request , ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
model.put("underSiteCredit", underSiteCredit);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo= new PageFormVO();
if(loginSite.getSiteLevel() >0) {
search.setUpperSiteId(loginSite.getSiteId());
}
int totalCount = siteService.getSiteListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(10);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
List<HashMap> siteList = siteService.getSiteList(search);
model.put("siteList", siteList);
return "admin/agent";
}
@GetMapping("/detail/{siteIdx}")
public String detail( HttpServletRequest request , ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("#-Agent::DETAIL::underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
model.put("underSiteCredit", underSiteCredit);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
log.info("#-Agent::DETAIL::siteIdx {}" , search.getSiteIdx());
if(loginSite.getSiteLevel() >0) {
search.setUpperSiteId(""+loginSite.getSiteId());
}
Site targetSite = siteService.getSiteDetail(search);
model.put("targetSite", targetSite);
model.put("uppersiteIdx", loginSite.getSiteIdx());
List<HashMap> vederRateList = siteService.getVenderRateList(targetSite);
model.put("vederRateList", vederRateList);
log.info("#-Agent::DETAIL::vederRateList {}", vederRateList.size());
log.info("#-Agent::DETAIL::vederRateList {}", vederRateList);
/*
HashMap vendorParam = new HashMap<>();
vendorParam.put("siteIdx", search.getSiteIdx());
vendorParam.put("vendor", "nexus");
HashMap<String, String> nexusInfo = siteService.getSiteOnlyVendorInfo(vendorParam);
log.info("#-Agent::DETAIL::nexusInfo::"+nexusInfo);
model.put("nexusInfo", nexusInfo);
vendorParam.put("vendor", "xtreem");
HashMap<String, String> xtreemInfo = siteService.getSiteOnlyVendorInfo(vendorParam);
log.info("#-Agent::DETAIL::xtreemInfo::"+xtreemInfo);
model.put("xtreemInfo", xtreemInfo);
*/
HashMap parsEvoInfo = siteService.getParseUseYn(targetSite.getSiteIdx());
int parsEvoAmount = (int) parsEvoInfo.get("parsEvoAmount");
model.put("parsEvoAmount", parsEvoAmount);
List<HashMap> mylist = siteService.getSiteVendorList2(targetSite.getSiteIdx());
List<HashMap> vendorlist = siteService.getVendorList2(targetSite.getSiteIdx());
model.put("mylist", mylist);
log.info("#-Agent::DETAIL::mylist::"+mylist);
model.put("vendorlist", vendorlist);
log.info("#-Agent::DETAIL::vendorlist::"+vendorlist);
HashMap creditInfo = siteService.getSiteSubCredit(targetSite.getSiteId());
model.put("subCreditInfo", creditInfo);
return "admin/popup";
}
@RequestMapping("/saveSvcr")
public @ResponseBody JSONObject saveSvcr(HttpServletRequest request, ModelMap model, CommonParamAdmin commonParamAdmin) throws Exception {
final String LOG_PREFIX = "#-SAVE_SCVR:::";
log.info(LOG_PREFIX + "CommonParamAdmin: " + commonParamAdmin.toString());
JSONObject obj = new JSONObject();
ObjectMapper mapper = new ObjectMapper();
HashMap paramMap = mapper.readValue(commonParamAdmin.getParam().toString(), new TypeReference<HashMap>() {});
if(paramMap.get("vendorIdx") != null) {
SiteSearch targetSearch = new SiteSearch();
long targetSiteIdx = Long.parseLong(commonParamAdmin.getParam().get("targetSiteIdx").toString());
targetSearch.setSiteIdx(targetSiteIdx);
Site targetSite = siteService.getSiteDetail(targetSearch);
String siteUrl = targetSite.getSiteCbUrl() + "/gameRateChange";
paramMap.put("siteIdx", targetSiteIdx);
if(Integer.parseInt(paramMap.get("type").toString()) == 0) {
siteService.saveVendorRate(paramMap);
}
siteService.saveSvcr(paramMap, Integer.parseInt(paramMap.get("type").toString()));
// 외부 API 호출 (WebClient 방식)
if(Integer.parseInt(paramMap.get("type").toString()) == 0) {
sendGameRateChange(siteUrl, paramMap);
}
if(targetSite.getSiteLevel() < 1) {
siteService.updateVendorUseYn(paramMap);
}
}
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/saveSvcrAll")
public @ResponseBody JSONObject saveSvcrAll(HttpServletRequest request, ModelMap model, CommonParamAdmin commonParamAdmin) throws Exception {
final String LOG_PREFIX = "#-SAVE_SCVRALL:::";
log.info(LOG_PREFIX + "CommonParamAdmin: " + commonParamAdmin.toString());
JSONObject obj = new JSONObject();
for(int i=0; i < commonParamAdmin.getParamlist().length; i++) {
JSONObject paramData = commonParamAdmin.getParamlist()[i];
paramData.put("siteIdx", commonParamAdmin.getParam().get("targetSiteIdx"));
ObjectMapper mapper = new ObjectMapper();
HashMap paramMap = mapper.readValue(paramData.toString(), new TypeReference<HashMap>() {});
long targetSiteIdx = Long.parseLong(commonParamAdmin.getParam().get("targetSiteIdx").toString());
SiteSearch targetSearch = new SiteSearch();
targetSearch.setSiteIdx(targetSiteIdx);
Site targetSite = siteService.getSiteDetail(targetSearch);
String siteUrl = targetSite.getSiteCbUrl() + "/gameRateChange";
if(paramMap.get("vendorIdx") != null) {
paramMap.put("siteIdx", targetSiteIdx);
if(Integer.parseInt(paramMap.get("type").toString()) == 0) {
siteService.saveVendorRate(paramMap);
}
siteService.saveSvcr(paramMap, Integer.parseInt(paramMap.get("type").toString()));
// 외부 API 호출 (WebClient 방식)
if(Integer.parseInt(paramMap.get("type").toString()) == 0) {
sendGameRateChange(siteUrl, paramMap);
}
if(targetSite.getSiteLevel() < 1) {
siteService.updateVendorUseYn(paramMap);
}
}
}
obj.put("RES", "SUCCESS");
return obj;
}
/**
* WebClient를 이용한 외부 API 호출 공통 메서드 (동기 방식)
*/
private void sendGameRateChange(String url, HashMap paramMap) {
try {
log.info("##### WebClient gmeRateChange 시작 #####");
JSONObject paramBody = new JSONObject();
paramBody.put("siteApiKey", siteService.getSiteKey(paramMap));
paramBody.put("vendor", siteService.getVendorTitle(paramMap));
paramBody.put("vendorIdx", paramMap.get("vendorIdx"));
paramBody.put("gameRate", Double.parseDouble(paramMap.get("rate").toString()));
String response = webClient.post()
.uri(url)
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.header("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36")
.bodyValue(paramBody.toString())
.retrieve()
.bodyToMono(String.class)
.block(); // MVC 환경이므로 결과를 기다림(동기)
log.info("##### WebClient 응답 완료 : {}", response);
} catch (Exception e) {
log.error("##### WebClient 호출 에러 : {}", e.getMessage());
}
}
@GetMapping("/add")
public String add( HttpServletRequest request , ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
model.put("underSiteCredit", underSiteCredit);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/agentAdd";
}
@RequestMapping("/siteUpdate")
public @ResponseBody JSONObject siteUpdate( HttpServletRequest request, ModelMap model, Site site) throws Exception {
JSONObject obj = new JSONObject();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
site.setUpperSiteId(loginSite.getSiteId());
site.setUpperSiteIdx(loginSite.getSiteIdx());
final String LOG_PREFIX = "#-super::siteUpdate:::";
log.info(LOG_PREFIX+ "Site Info: " + site.toString());
log.info(LOG_PREFIX+ "Site IP: " + site.getSiteIp());
siteService.siteUpdate(LOG_PREFIX, site);
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/agentUpdate")
public @ResponseBody JSONObject agentUpdate( HttpServletRequest request, ModelMap model, Site site) throws Exception {
JSONObject obj = new JSONObject();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
// site.setSiteId(loginSite.getSiteId());
final String LOG_PREFIX = "#-super::agentUpdate:::";
if("new".equals(site.getSiteKey())) {
String newsiteKey = makeApiKey(loginSite.getSiteId());
site.setSiteKey(newsiteKey);
obj.put("DATA", newsiteKey);
}
log.info(LOG_PREFIX+ "Site Info: " + site.toString());
log.info(LOG_PREFIX+ "Site IP: " + site.getSiteIp());
siteService.siteUpdate(LOG_PREFIX, site);
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/agentIpsUpdate")
public @ResponseBody JSONObject agentIpsUpdate( HttpServletRequest request, ModelMap model, Site site) throws Exception {
JSONObject obj = new JSONObject();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
// site.setSiteId(loginSite.getSiteId());
siteService.agentIpsUpdate(site) ;
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/forDefault")
public @ResponseBody JSONObject forDefault(HttpServletRequest request, ModelMap model, SiteSearch search) throws Exception {
JSONObject obj = new JSONObject();
//Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
//Site site = (Site) authentication.getDetails();
Site site = siteService.getSiteDetail(search);
final String LOG_PREFIX = "#-Proc::forDefault::"+site.getSiteIdx()+"::";
log.info(LOG_PREFIX + "loginSite::" + site.toString());
log.info(LOG_PREFIX+ "Site IP: " + site.getSiteIp());
siteService.siteUpdate(LOG_PREFIX, site);
siteService.forDefaultProc(site);
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/saveParsEvoAmount")
public @ResponseBody JSONObject saveParsEvoAmount(HttpServletRequest request, ModelMap model, SiteSearch param) throws Exception {
JSONObject obj = new JSONObject();
final String LOG_PREFIX = "#-Proc::saveParsEvoAmount::"+param.getSiteIdx()+"::";
log.info(LOG_PREFIX + "ParsEvoAmount::" + param.getParsEvoAmount());
int updResult = siteService.saveParsEvoAmount(param);
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/creditRateSave")
public @ResponseBody JSONObject setSave( HttpServletRequest request, ModelMap model, CommonParamAdmin commonParamAdmin ) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
JSONObject obj = new JSONObject();
log.info(commonParamAdmin.toString());
for(int i=0;i<commonParamAdmin.getParamlist().length;i++) {
JSONObject paramData = commonParamAdmin.getParamlist()[i];
paramData.put("siteIdx", commonParamAdmin.getParam().get("targetSiteIdx"));
paramData.put("insureUpSiteIdx", loginSite.getSiteIdx());
log.info(paramData.toString());
ObjectMapper mapper = new ObjectMapper();
HashMap paramMap = mapper.readValue(paramData.toString(), new TypeReference<HashMap>() {});
if(paramMap.get("vendorIdx")!=null) {
siteService.saveVendorRate(paramMap);
siteService.updateVendorUseYn(paramMap);
}
}
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/insurePoinRateSave")
public @ResponseBody JSONObject insurePointRateSave( HttpServletRequest request, ModelMap model, CommonParamAdmin commonParamAdmin ) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
JSONObject obj = new JSONObject();
log.info(commonParamAdmin.toString());
for(int i=0;i<commonParamAdmin.getParamlist().length;i++) {
JSONObject paramData = commonParamAdmin.getParamlist()[i];
paramData.put("siteIdx", commonParamAdmin.getParam().get("targetSiteIdx"));
paramData.put("insureUpSiteIdX", loginSite.getSiteIdx());
log.info(paramData.toString());
ObjectMapper mapper = new ObjectMapper();
HashMap paramMap = mapper.readValue(paramData.toString(), new TypeReference<HashMap>() {});
siteService.saveVendorInsurePointRate(paramMap);
}
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/addProc")
public @ResponseBody JSONObject addProc( HttpServletRequest request, ModelMap model, Site site) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
site.setUpperSiteId(loginSite.getSiteId());
site.setUpperSiteIdx(loginSite.getSiteIdx());
site.setSiteKey(makeApiKey(site.getSiteId()));
JSONObject obj = new JSONObject();
if(site.getIsTransfer() == null || "".equals(site.getIsTransfer())) {
site.setIsTransfer("N");
}
log.info(site.toString());
siteService.addProc(site);
obj.put("RES", "SUCCESS");
return obj;
}
@GetMapping("/transaction")
public String transaction( HttpServletRequest request , ModelMap model , @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo= new PageFormVO();
search.setSiteId(loginSite.getSiteId());
search.setSiteIdx(loginSite.getSiteIdx());
int totalCount = creditService.getSiteTranListCnt(search);
if(totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(15);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
List<HashMap> list = creditService.getSiteTranList(search);
log.debug(""+list.size());
model.put("list", list);
return "admin/transaction";
}
@GetMapping("/gamelink")
public String gamelink( HttpServletRequest request , ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
List<HashMap> mylist = siteService.getSiteVendorList(search);
List<HashMap> vendorlist = siteService.getVendorList(search);
model.put("mylist", mylist);
model.put("vendorlist", vendorlist);
return "admin/gamelink";
}
@GetMapping("/venderlist")
public String venderlist( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/venderlist";
}
@GetMapping("/apiset")
public String apiset( HttpServletRequest request , ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiset";
}
@RequestMapping("/siteVenderUpdate")
public @ResponseBody JSONObject siteVenderUpdate( HttpServletRequest request, ModelMap model, Vendor vendor) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
JSONObject obj = new JSONObject();
vendor.setSiteIdx(loginSite.getSiteIdx());
try {
siteService.siteVenderUpdate(vendor);
obj.put("RES", "SUCCESS");
} catch(Exception e) {
obj.put("RES", "FAIL");
}
return obj;
}
@GetMapping("/parseOnOff")
public @ResponseBody JSONObject parseOnOff(HttpServletRequest request, ModelMap model, @RequestParam("pStatus") String pStatus) throws Exception {
JSONObject obj = new JSONObject();
final String LOG_PREFIX = "#-Proc::parseOnOff:::";
log.info(LOG_PREFIX + "전체 사이트 파싱설정::" + pStatus + "::START");
String useYn = "";
if("on".equals(pStatus)) {
useYn = "Y";
} else {
useYn = "N";
}
log.info(LOG_PREFIX + "updateParseUseYN useYn::" + useYn);
int result = siteService.updateParseUseYN(useYn);
log.info(LOG_PREFIX + "updateParseUseYN result::" + result);
log.info(LOG_PREFIX + "전체 사이트 파싱설정::" + pStatus + "::END");
obj.put("RES", "SUCCESS");
return obj;
}
private String makeApiKey(String param) {
int n = 24; // n자리 쿠폰
char[] chs = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ,'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
Random rd = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
char ch = chs[rd.nextInt(chs.length)];
sb.append(ch);
}
return sb.toString();
}
}

View File

@@ -0,0 +1,559 @@
package com.bb.admin.controller;
import java.util.HashMap;
import java.util.List;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bb.model.Credit;
import com.bb.model.CreditPoint;
import com.bb.model.OTPInfo;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import com.bb.service.CreditService;
import com.bb.service.SiteService;
import com.bb.util.PagingUtil;
import com.bb.util.TOTPTokenGenerator;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
@Slf4j
@Controller
@RequestMapping(value = "/cash")
@PreAuthorize("hasRole('ADMIN')")
public class CreditController {
@Autowired
SiteService siteService;
@Autowired
CreditService creditService;
@GetMapping("/charge")
public String charge(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo = new PageFormVO();
search.setSiteId(loginSite.getSiteId());
search.setSiteIdx(loginSite.getSiteIdx());
search.setCreditType("CI");
int totalCount = creditService.getCreditListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if (search.getCount_per_list() == 0) {
commonForm.setCount_per_list(10);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
HashMap sum = creditService.getCreditSumToday(search);
model.put("sum", sum);
List<HashMap> list = creditService.getCreditList(search);
log.info("list" + list.size());
model.put("list", list);
return "admin/charge";
}
@GetMapping("/chargeWait")
public String chargeWait(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo = new PageFormVO();
search.setSiteId(loginSite.getSiteId());
search.setSiteIdx(loginSite.getSiteIdx());
search.setCreditType("CI");
search.setCreditStatus(request.getParameter("creditStatus"));
log.info(search.getCreditStatus());
int totalCount = creditService.getCreditListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if (search.getCount_per_list() == 0) {
commonForm.setCount_per_list(10);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
log.info(search.getCreditStatus());
List<HashMap> list = creditService.getCreditList(search);
log.info("" + list.size());
model.put("list", list);
return "admin/apply";
}
@GetMapping("/exchange")
public String exchange(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo = new PageFormVO();
search.setSiteId(loginSite.getSiteId());
search.setSiteIdx(loginSite.getSiteIdx());
search.setCreditType("CO");
search.setCreditStatus(request.getParameter("creditStatus"));
log.info(search.getCreditStatus());
int totalCount = creditService.getCreditListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if (search.getCount_per_list() == 0) {
commonForm.setCount_per_list(10);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
List<HashMap> list = creditService.getCreditList(search);
model.put("list", list);
return "admin/exchange";
}
@GetMapping("/exchangeWait")
public String exchangeWait(HttpServletRequest request, ModelMap model,
@ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo = new PageFormVO();
search.setSiteId(loginSite.getSiteId());
search.setSiteIdx(loginSite.getSiteIdx());
search.setCreditType("CO");
int totalCount = creditService.getCreditListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if (search.getCount_per_list() == 0) {
commonForm.setCount_per_list(10);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
List<HashMap> list = creditService.getCreditList(search);
model.put("list", list);
return "admin/exchangeapply";
}
@RequestMapping("/addProc")
public @ResponseBody JSONObject addProc(HttpServletRequest request, ModelMap model, Credit credit)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
JSONObject obj = new JSONObject();
// enum('AI','AO','CI','CO','DP','CD','SDP','SCD')
// inout (받는사람 기준으로 인인지 아웃인지)
// status 바로적립 1, 승인대기 0
// siteId 타겟사이트 아이디
final String LOG_PREFIX = "#-super::CREDIT_DEPOSIT:::";
log.info(LOG_PREFIX + "Credit::" + credit.toString());
if ("AI".equals(credit.getCreditType()) || "AO".equals(credit.getCreditType())) {
OTPInfo otpManager = siteService.getOtpInfoByManger(loginSite.getSiteIdx());
if (otpManager == null || otpManager.getAccount().equals("")) {
log.error(LOG_PREFIX + "OTP정보가 없습니다.");
obj.put("RES", "FAIL");
obj.put("MSG", "OTP정보가 없습니다.");
return obj;
} else {
log.info(LOG_PREFIX + "OTP Info::" + otpManager.toString());
String secret = otpManager.getSecretKey();
if (credit.getOtp() == null || "".equals(credit.getOtp())) {
log.error(LOG_PREFIX + "OTP 번호를 입력하세요.");
obj.put("RES", "FAIL");
obj.put("MSG", "OTP 번호를 입력하세요.");
return obj;
}
boolean chkOtp = TOTPTokenGenerator.otpVerify(secret, Integer.parseInt(credit.getOtp()));
if (!chkOtp) {
log.error(LOG_PREFIX + "OTP 번호가 일치하지 않습니다.");
obj.put("RES", "FAIL");
obj.put("MSG", "OTP 번호가 일치하지 않습니다.");
return obj;
}
}
SiteSearch search = new SiteSearch();
search.setSiteId(credit.getTargetSiteId());
search.setSiteIdx(credit.getTargetSiteIdx());
Site targetSite = siteService.getSiteDetail(search);
credit.setSiteLevel(targetSite.getSiteLevel());
}
if ("AI".equals(credit.getCreditType())) { // 관리 직접 지금
if (siteCredit < credit.getCreditAmt()) {
obj.put("RES", "FAIL");
obj.put("MSG", "크레딧이 모자릅니다.");
return obj;
}
credit.setInOut("IN");
credit.setCreditStatus(1);
credit.setSiteIdx(loginSite.getSiteIdx());
credit.setSiteId(loginSite.getSiteId());
} else if ("AO".equals(credit.getCreditType())) { // 관리자 직접환급
long targetSiteCredit = siteService.getSiteCredit(credit.getTargetSiteId());
if (targetSiteCredit < credit.getCreditAmt()) {
obj.put("RES", "FAIL");
obj.put("MSG", "해당 에이젼시의 크레딧이 모자릅니다.");
return obj;
}
credit.setInOut("OUT");
credit.setCreditStatus(1);
credit.setSiteIdx(loginSite.getSiteIdx());
credit.setSiteId(loginSite.getSiteId());
} else if ("CI".equals(credit.getCreditType())) { // 충전 신청
long targetSiteCredit = siteService.getSiteCredit(loginSite.getUpperSiteId());
if (targetSiteCredit < credit.getCreditAmt()) {
obj.put("RES", "FAIL");
obj.put("MSG", "싱으; 에이젼시의 크레딧이 모자릅니다. 상위 에이전시에 문의하세요");
return obj;
}
credit.setInOut("IN");
credit.setCreditStatus(0);
credit.setSiteIdx(loginSite.getUpperSiteIdx());// 상위사이트아이디
credit.setSiteId(loginSite.getUpperSiteId());
credit.setTargetSiteIdx(loginSite.getSiteIdx()); // 타켓사이트 아이디;
credit.setTargetSiteId(loginSite.getSiteId());
credit.setCreditRate(loginSite.getSiteCreditRate());
} else if ("CO".equals(credit.getCreditType())) { // 환전 신청
if (siteCredit < credit.getCreditAmt()) {
obj.put("RES", "FAIL");
obj.put("MSG", "크레딧이 모자릅니다.");
return obj;
}
credit.setInOut("OUT");
credit.setCreditStatus(0);
credit.setSiteIdx(loginSite.getUpperSiteIdx());// 상위사이트아이디
credit.setSiteId(loginSite.getUpperSiteId());
credit.setTargetSiteIdx(loginSite.getSiteIdx()); // 타켓사이트 아이디;
credit.setTargetSiteId(loginSite.getSiteId());
credit.setCreditRate(loginSite.getSiteCreditRate());
} else if ("DP".equals(credit.getCreditType())) { // 베팅크레딧
// credit.setInOut("OUT");
// credit.setCreditStatus(1);
} else if ("CD".equals(credit.getCreditType())) { // 윈머니크레딧
// cash.setInOut("IN");
// cash.setCreditStatus(1);
} else if ("SDP".equals(credit.getCreditType())) { // 서브포인트충전 신청
// cash.setInOut("IN");
// cash.setCreditStatus(0);
credit.setInOut("IN");
credit.setCreditStatus(0);
credit.setSiteIdx(loginSite.getUpperSiteIdx());// 상위사이트아이디
credit.setSiteId(loginSite.getUpperSiteId());
credit.setTargetSiteIdx(loginSite.getSiteIdx()); // 타켓사이트 아이디;
credit.setTargetSiteId(loginSite.getSiteId());
credit.setCreditRate(loginSite.getSiteCreditRate());
} else if ("SCD".equals(credit.getCreditType())) { // 서브포인트환전 현재 없음
}
log.info(credit.toString());
int res = creditService.insertCredit(credit);
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/statusUpdate")
public @ResponseBody JSONObject statusUpdate(HttpServletRequest request, ModelMap model, Credit credit)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
// enum('AI','AO','CI','CO','DP','CD','SDP','SCD')
// inout (받는사람 기준으로 인인지 아웃인지)
// status 바로적립 1, 승인대기 0
// siteId 타겟사이트 아이디
JSONObject obj = new JSONObject();
log.info(credit.toString());
int res = creditService.updateStatus(credit);
obj.put("RES", "SUCCESS");
return obj;
}
@GetMapping("/point")
public String point(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo = new PageFormVO();
search.setSiteId(loginSite.getSiteId());
search.setSiteIdx(loginSite.getSiteIdx());
search.setCreditType("CO");
int totalCount = creditService.getPointListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if (search.getCount_per_list() == 0) {
commonForm.setCount_per_list(10);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
List<HashMap> list = creditService.getPointList(search);
model.put("list", list);
return "admin/applypoint";
}
@RequestMapping("/addPointProc")
public @ResponseBody JSONObject addPointProc(HttpServletRequest request, ModelMap model, CreditPoint point)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
JSONObject resObj = new JSONObject();
long sitePoint = siteService.getSitePoint(point.getTargetSiteId());
final String LOG_PREFIX = "#-addPointProc::" + loginSite.getSiteId() + "=>" + point.getTargetSiteId() + ":::";
long time = System.currentTimeMillis();
log.info(LOG_PREFIX + "CreditPoint Info : " + point.toString());
OTPInfo otpManager = siteService.getOtpInfoByManger(loginSite.getSiteIdx());
if (otpManager == null || otpManager.getAccount().equals("")) {
log.error(LOG_PREFIX + "OTP정보가 없습니다.");
resObj.put("RES", "FAIL");
resObj.put("MSG", "OTP정보가 없습니다.");
return resObj;
} else {
log.info(LOG_PREFIX + "OTP Info::" + otpManager.toString());
String secret = otpManager.getSecretKey();
if (point.getOtp() == null || "".equals(point.getOtp())) {
log.error(LOG_PREFIX + "OTP 번호를 입력하세요.");
resObj.put("RES", "FAIL");
resObj.put("MSG", "OTP 번호를 입력하세요.");
return resObj;
}
boolean chkOtp = TOTPTokenGenerator.otpVerify(secret, Integer.parseInt(point.getOtp()));
if (!chkOtp) {
log.error(LOG_PREFIX + "OTP 번호가 일치하지 않습니다.");
resObj.put("RES", "FAIL");
resObj.put("MSG", "OTP 번호가 일치하지 않습니다.");
return resObj;
}
}
if ("POINT_DEPOSIT".equals(point.getVendor())) {
// 관리자 지급
String tranId = "POINT_DEPOSIT-" + loginSite.getSiteId() + ">" + point.getTargetSiteId() + "-" + time;
String betId = "포인트 수동지급-" + loginSite.getSiteId() + ">" + point.getTargetSiteId() + "-" + time;
point.setSiteIdx((long) loginSite.getSiteIdx());
point.setSiteId(loginSite.getSiteId());
point.setTranId(tranId);
point.setBetId(betId);
point.setPrePointAmt(sitePoint);
} else if ("POINT_WITHDRAW".equals(point.getVendor())) {
// 관리자 회수
if (sitePoint < point.getPointAmt().intValue()) {
resObj.put("RES", "FAIL");
resObj.put("MSG", "해당 에이젼시의 포인트가 부족합니다.");
return resObj;
}
String tranId = "POINT_WITHDRAW-" + loginSite.getSiteId() + ">" + point.getTargetSiteId() + "-" + time;
String betId = "포인트 수동회수-" + loginSite.getSiteId() + ">" + point.getTargetSiteId() + "-" + time;
point.setSiteIdx((long) loginSite.getSiteIdx());
point.setSiteId(loginSite.getSiteId());
point.setTranId(tranId);
point.setBetId(betId);
point.setPrePointAmt(sitePoint);
int pointAmt = point.getPointAmt().intValue() * -1;
point.setPointAmt(pointAmt);
}
log.info(LOG_PREFIX + "CreditPoint Info : " + point.toString());
int result = creditService.insertPoint(point);
log.info(LOG_PREFIX + "creditService.insertPoint() result : " + result);
resObj.put("RES", "SUCCESS");
return resObj;
}
}

View File

@@ -0,0 +1,401 @@
package com.bb.admin.controller;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.security.access.annotation.Secured;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.reactive.function.client.WebClientRequestException;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import com.bb.exception.ApiException;
import com.bb.model.ApiResponse;
import com.bb.model.BetParam;
import com.bb.model.NexusApiInfo;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import com.bb.model.TplusApiInfo;
import com.bb.service.SiteService;
import com.bb.service.StatService;
import com.bb.util.PagingUtil;
import com.bb.util.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.Gson;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
@Slf4j
@Controller
@RequestMapping(value = "/guest")
public class GuestController {
@Autowired
StatService statService;
@Autowired
SiteService siteService;
@GetMapping("/guestLogin")
public String guestLogin(HttpServletRequest request, ModelMap model) throws Exception {
return "admin/guestLogin";
}
@GetMapping("/simpleReport")
//@Secured("ROLE_GUEST")
public String simpleReport(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
final String LOG_PREFIX = "#-SUPER::simpleReport::::";
if(search.getSearchSiteId() != null && !"".equals(search.getSearchSiteId())) {
Site targetSite = siteService.getSiteSimpleDetail(search);
if(targetSite != null) {
search.setSearchSiteIdx(targetSite.getSiteIdx());
} else {
search.setSearchSiteIdx(0);
}
} else {
search.setSearchSiteIdx(0);
}
String toDay = new SimpleDateFormat("yyyy-MM-dd").format(new Date(System.currentTimeMillis()));
String startDay = "";
String endDay = "";
if(search.getStartDate() == null || "".equals(search.getStartDate())) {
startDay = toDay;
search.setStartDate(startDay);
} else {
startDay = search.getStartDate().substring(0, 10);
}
if(search.getEndDate() == null || "".equals(search.getEndDate())) {
endDay = toDay;
search.setEndDate(endDay);
} else {
endDay = search.getEndDate().substring(0, 10);
}
log.info(LOG_PREFIX+ "startDay::"+startDay);
log.info(LOG_PREFIX+ "endDay::"+endDay);
log.info(LOG_PREFIX+ "toDay::"+toDay);
search.setSiteDispYn("N");
if(startDay.equals(toDay) || endDay.equals(toDay)) {
search.setSiteDispYn("Y");
}
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(search);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
PageFormVO pageVo= new PageFormVO();
int totalCount = statService.getAgentReportCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
commonForm.setCount_per_list(30);
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
log.info(LOG_PREFIX+ "search.getStartDate {}", search.getStartDate());
log.info(LOG_PREFIX+ "search.getEndDate {}", search.getEndDate());
log.info(LOG_PREFIX+ "search.getSearchSiteIdx {}", search.getSearchSiteIdx());
log.info(LOG_PREFIX+ "search.getPage {}", search.getPage());
log.info(LOG_PREFIX+ "search.getLimit {}", search.getLimit());
log.info(LOG_PREFIX+ "search.getOffset {}", search.getOffset());
List<HashMap> siteList = statService.getAgentReportList(search);
model.put("siteList", siteList);
HashMap siteTotal = statService.getAgentReportTotal(search);
model.put("siteTotal", siteTotal);
return "admin/simpleReport";
}
/*
@ResponseBody
@GetMapping(value="/betDetail")
public ApiResponse betDetail(HttpServletRequest request, @RequestParam("betId") String betId) throws Exception {
ApiResponse apiResponse = new ApiResponse();
final String LOG_PREFIX = "#-CMN::BET-DETAIL::"+betId+":::";
JSONObject saveObj = null;
JSONArray saveObjs = null;
boolean isSaveEvoDetail = false;
try {
// apiKey 체크
Site site = siteService.getSiteInfo(request);
if(site ==null) {
throw new ApiException("1000", "accessDinied");
}
// 결과보내기
String dType = "detail_0";
HashMap betInfo = transService.getBetInfoByBetId(param);
log.info(LOG_PREFIX+ "betInfo {}", betInfo);
if(betInfo == null) betInfo = transService.getSiteBetByRefIdFromOld(param);
log.info(LOG_PREFIX+ "betInfo_OLD {}", betInfo);
if(betInfo != null) {
String category = betInfo.get("vendorCetegory").toString();
log.info(LOG_PREFIX+ "Game category : " + category);
if("svendor".equals(betInfo.get("vendorCode").toString())
|| "pink".equals(betInfo.get("vendorCode").toString())) {
String jsonStr = siteService.getOrgDetailData(param);
log.info(LOG_PREFIX+ "jsonStr : " + jsonStr);
if(jsonStr != null && !"".equals(jsonStr) && !"{}".equals(jsonStr)) {
dType = "detail_6";
apiResponse.put("dType", dType);
HashMap<String, Object> detailMap = new Gson().fromJson(jsonStr, HashMap.class);
apiResponse.put("detail", detailMap);
} else {
isSaveEvoDetail = true;
JSONObject dataObj = svendorService.getDetail(LOG_PREFIX, betInfo);
if(dataObj == null) {
apiResponse.put("detail", "betId is not exist");
} else {
if(dataObj.has("gameDetail") && !dataObj.isNull("gameDetail")) {
String detailType = StringUtils.getType(dataObj.getString("gameDetail"));
if(detailType.equals("URL")) {
dType = "detail_2";
apiResponse.put("dType", dType);
String detailUrl = dataObj.getString("gameDetail");
apiResponse.put("detail", detailUrl);
} else if(detailType.equals("JSON")) {
dType = "detail_6";
apiResponse.put("dType", dType);
JSONObject detailObj = dataObj.getJSONObject("gameDetail");
saveObj = detailObj;
HashMap<String, Object> detailMap = new Gson().fromJson(detailObj.toString(), HashMap.class);
apiResponse.put("detail", detailMap);
} else {
apiResponse.put("detail", "betId is not exist");
}
} else {
apiResponse.put("detail", "betId is not exist");
}
}
}
} else if("nexus".equals(betInfo.get("vendorCode").toString()) || "ace2".equals(betInfo.get("vendorCode").toString())) {
String jsonStr = siteService.getOrgDetailData(param);
log.info(LOG_PREFIX+ "jsonStr : " + jsonStr);
if(jsonStr != null && !"".equals(jsonStr) && !"{}".equals(jsonStr)) {
dType = "detail_3";
apiResponse.put("dType", dType);
HashMap<String, Object> detailMap = new Gson().fromJson(jsonStr, HashMap.class);
apiResponse.put("detail", detailMap);
}
} else if("prime".equals(betInfo.get("vendorCode").toString())
|| "dpcore".equals(betInfo.get("vendorCode").toString())) {
log.info(LOG_PREFIX+ "========== BetDetail::PRIME ==========");
dType = "detail_9";
apiResponse.put("dType", dType);
String jsonStr = siteService.getOrgDetailData(param);
if(jsonStr != null && !"".equals(jsonStr) && !"{}".equals(jsonStr)) {
HashMap<String, Object> detailMap = new Gson().fromJson(jsonStr, HashMap.class);
apiResponse.put("detail", detailMap);
}
} else if("onix".equals(betInfo.get("vendorCode").toString())) {
log.info(LOG_PREFIX+ "========== BetDetail::ONIX ==========");
dType = "detail_8";
apiResponse.put("dType", dType);
String apiBaseUrl = betInfo.get("vendorApiUrl").toString();
// Step 1: Get round info from /csapi/getBetting
String bettingUrl = apiBaseUrl + "/csapi/getBetting";
JSONObject bettingBody = new JSONObject();
bettingBody.put("userid", betInfo.get("memberId").toString());
bettingBody.put("sdate", "2000-01-01 00:00:00.000");
bettingBody.put("edate", "2099-12-31 23:59:59.999");
bettingBody.put("pagesize", "1");
bettingBody.put("gameid", "0");
bettingBody.put("tranid", param.getBetId());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
log.info(LOG_PREFIX+ "ONIX::Step1 getBetting Url: " + bettingUrl);
log.info(LOG_PREFIX+ "ONIX::Step1 getBetting Body: " + bettingBody.toString());
try {
ResponseEntity<String> bettingRes = webClient.post()
.uri(bettingUrl)
.headers(h -> h.addAll(headers))
.bodyValue(bettingBody.toString())
.retrieve()
.toEntity(String.class)
.block();
if(bettingRes != null && bettingRes.getBody() != null) {
JSONObject bettingObj = new JSONObject(bettingRes.getBody());
log.info(LOG_PREFIX+ "ONIX::Step1 getBetting Response: " + bettingObj.toString());
int bettingResult = bettingObj.getInt("result");
if(bettingResult == 1 && bettingObj.has("data")) {
JSONArray dataArray = bettingObj.getJSONArray("data");
if(dataArray.length() > 0) {
JSONObject betData = dataArray.getJSONObject(0);
String round = betData.has("round") ? betData.getString("round") : "";
String realround = betData.has("realround") ? betData.getString("realround") : "";
String game = betData.has("game") ? betData.getString("game") : "";
log.info(LOG_PREFIX+ "ONIX::Betting Info - round: " + round + ", realround: " + realround + ", game: " + game);
// Step 2: Get detail link from /api/apigamedetail.aspx
if(!round.isEmpty() && !realround.isEmpty()) {
String gtype = game.toLowerCase().contains("slot") || game.toLowerCase().contains("prg") ? "sxprg" : "apievo";
String detailUrl = apiBaseUrl + "/api/apigamedetail.aspx?gtype=" + gtype;
if(gtype.equals("apievo")) {
detailUrl += "&round=" + round + "&realround=" + realround;
} else {
detailUrl += "&roundid=" + realround;
}
log.info(LOG_PREFIX+ "ONIX::Step2 Detail Url: " + detailUrl);
try {
ResponseEntity<String> detailRes = webClient.get()
.uri(detailUrl)
.retrieve()
.toEntity(String.class)
.block();
if(detailRes != null && detailRes.getBody() != null) {
JSONObject detailObj = new JSONObject(detailRes.getBody());
log.info(LOG_PREFIX+ "ONIX::Step2 Detail Response: " + detailObj.toString());
if(detailObj.getInt("result") == 1 && detailObj.has("link")) {
isSaveEvoDetail = true;
JSONObject saveData = new JSONObject();
saveData.put("link", detailObj.getString("link"));
saveData.put("betInfo", betData);
saveObj = saveData;
HashMap<String, Object> detailMap = new HashMap<>();
detailMap.put("link", detailObj.getString("link"));
detailMap.put("betInfo", new Gson().fromJson(betData.toString(), HashMap.class));
apiResponse.put("detail", detailMap);
log.info(LOG_PREFIX+ "ONIX::Detail loaded successfully");
} else {
apiResponse.put("detail", "betId is not exist");
String msg = detailObj.has("msg") ? detailObj.getString("msg") : "Unknown error";
log.error(LOG_PREFIX+ "ONIX::Detail Error: " + msg);
}
} else {
apiResponse.put("detail", "betId is not exist");
}
} catch(Exception detailEx) {
log.error(LOG_PREFIX+ "ONIX::Detail Exception: " + detailEx.getMessage());
apiResponse.put("detail", "betId is not exist");
}
} else {
// No round info, use betting data only
isSaveEvoDetail = true;
saveObj = betData;
HashMap<String, Object> detailMap = new Gson().fromJson(betData.toString(), HashMap.class);
apiResponse.put("detail", detailMap);
log.info(LOG_PREFIX+ "ONIX::Betting data loaded (no round info)");
}
} else {
apiResponse.put("detail", "betId is not exist");
}
} else {
apiResponse.put("detail", "betId is not exist");
String errorMsg = bettingObj.has("msg") ? bettingObj.getString("msg") : "Unknown error";
log.error(LOG_PREFIX+ "ONIX::Betting Error: " + errorMsg);
}
} else {
apiResponse.put("detail", "betId is not exist");
log.error(LOG_PREFIX+ "ONIX::Betting Response is null");
}
} catch(WebClientResponseException e) {
log.error(LOG_PREFIX+ "ONIX::Betting HttpClientErrorException : " + e.getMessage());
log.error(LOG_PREFIX+ "ONIX::Betting status code : " + e.getStatusCode().value());
log.error(LOG_PREFIX+ "ONIX::Betting response body : " + e.getResponseBodyAsString());
JSONObject errorJson = new JSONObject(e.getResponseBodyAsString());
String errorMsg = errorJson.has("msg") ? errorJson.getString("msg") : "Betting API error";
log.error(LOG_PREFIX+ "ONIX::Betting error : " + errorMsg);
throw new ApiException("P209", errorMsg);
} catch (WebClientRequestException rae) {
if(rae.getCause() instanceof io.netty.channel.ConnectTimeoutException) {
log.error(LOG_PREFIX+ "ONIX::Betting ConnectTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof io.netty.handler.timeout.ReadTimeoutException) {
log.error(LOG_PREFIX+ "ONIX::Betting ReadTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX+ "ONIX::Betting InterruptedException::" + rae.getMessage());
}
throw new ApiException("P210", rae.getMessage());
} catch(Exception e) {
log.error(LOG_PREFIX+ "ONIX::Betting Exception : " + e.getMessage());
throw new ApiException("P211", e.getMessage());
}
} else if("bet_radar".equals(betInfo.get("vendorCode").toString())) {
log.info(LOG_PREFIX+ "========== BetDetail::BET_RADAR ==========");
// bet_radar_log 테이블에서 조회
String radarLogJson = siteService.getMergedBetRadarLog(param.getBetId());
if(radarLogJson != null && !radarLogJson.isEmpty()) {
log.info(LOG_PREFIX+ "bet_radar_log found, returning merged json");
dType = "detail_radar";
apiResponse.put("dType", dType);
HashMap<String, Object> detailMap = new Gson().fromJson(radarLogJson, HashMap.class);
apiResponse.put("detail", detailMap);
apiResponse.success();
return apiResponse;
}
} else {
apiResponse.put("dType", dType);
apiResponse.put("detail", "betId is not exist");
}
} else {
apiResponse.put("dType", dType);
apiResponse.put("detail", "betId is not exist");
}
apiResponse.success();
} catch (Exception e) {
log.error(LOG_PREFIX+ "[Exception]::"+e.toString());
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
*/
}

View File

@@ -0,0 +1,424 @@
package com.bb.admin.controller;
import java.util.HashMap;
import java.util.List;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bb.model.CommonParamAdmin;
import com.bb.model.Insure;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import com.bb.service.CreditService;
import com.bb.service.SiteService;
import com.bb.util.PagingUtil;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
@Slf4j
@Controller
@RequestMapping(value = "/insurance")
@PreAuthorize("hasRole('ADMIN')")
public class InsuranceController {
@Autowired
SiteService siteService;
@Autowired
CreditService creditService;
@RequestMapping("/addProc")
public @ResponseBody JSONObject addProc( HttpServletRequest request, ModelMap model, Insure insure) throws Exception {
JSONObject obj = new JSONObject();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
insure.setSiteId(loginSite.getSiteId());
insure.setSiteIdx(loginSite.getSiteIdx());
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
List<HashMap> vederRateList = siteService.getVenderRateList(loginSite);
if(vederRateList.size() <0) {
obj.put("RES", "FAIL");
obj.put("MSG", "보험설정을 해주세요.");
return obj;
}else{
System.out.println(":dddddddddd" + vederRateList.get(0).get("insureUpSiteIdx"));
if(vederRateList.get(0).get("insureUpSiteIdx") == null || "null".equals(vederRateList.get(0).get("insureUpSiteIdx"))) {
obj.put("RES", "FAIL");
obj.put("MSG", "보험적용컴퍼니가 없습니다. 보험설정을 해주세요.");
return obj;
}
}
insure.setSiteIdx(loginSite.getSiteIdx());
insure.setSiteId(loginSite.getSiteId());
insure.setInsureUpSiteId(vederRateList.get(0).get("insureUpSiteId").toString());
insure.setInsureUpSiteIdx(Long.parseLong(vederRateList.get(0).get("insureUpSiteIdx").toString()));
insure.setPreCreditAmt(siteCredit);
insure.setPreCreditPoint(sitePoint);
insure.setPreInsureAmt(insureAmt);
insure.setPreInsurePoint(insurePointAmt);
insure.setStatus("0");
insure.setRegId(loginSite.getSiteId());
if("TRANIN".equals(insure.getInsureType())){ //충전 신청
}else if("TRANOUT".equals(insure.getInsureType())){ //환전 신청
}
int res = creditService.insertInsure(insure);
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/updateStatus")
public @ResponseBody JSONObject updateStatus( HttpServletRequest request, ModelMap model, Insure insure) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
insure.setSiteId(loginSite.getSiteId());
insure.setSiteIdx(loginSite.getSiteIdx());
// 상위 보험 관련 데이터 가져오기
JSONObject obj = new JSONObject();
int res = creditService.updateInsureStatus(insure);
obj.put("RES", "SUCCESS");
return obj;
}
@GetMapping("/set")
public String index( HttpServletRequest request , ModelMap model) throws Exception {
System.out.println("index");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
//상위 컴파니 불려오기
List<HashMap> flowList = siteService.getSiteFlow(loginSite);
model.put("flowList", flowList);
//벤더 리스트 rate 불러오기
List<HashMap> vederRateList = siteService.getVenderRateList(loginSite);
int uppersiteIdx = 0;
if(vederRateList.size()>0) {
try {
uppersiteIdx = Integer.parseInt(vederRateList.get(0).get("insureUpSiteIdx").toString());
}catch(Exception e) {
uppersiteIdx = 0;
}
}
model.put("uppersiteIdx", uppersiteIdx);
/*SELECT * FROM vendors_info vi
LEFT JOIN `site_rate_info` sri ON vi.vendorIdx = sri.vendorIdx
WHERE vi.delYn= 'N' AND vi.useYn ='Y'
AND sri.siteIdx = 1
*/
model.put("vederRateList", vederRateList);
return "admin/insuredSet";
}
@RequestMapping("/setSave")
public @ResponseBody JSONObject setSave( HttpServletRequest request, ModelMap model, CommonParamAdmin commonParamAdmin ) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
JSONObject obj = new JSONObject();
log.info(commonParamAdmin.toString());
for(int i=0;i<commonParamAdmin.getParamlist().length;i++) {
JSONObject paramData = commonParamAdmin.getParamlist()[i];
paramData.put("siteIdx", loginSite.getSiteIdx());
paramData.put("insureUpSiteIdX", commonParamAdmin.getParam().get("uppersiteIdx"));
log.info(paramData.toString());
ObjectMapper mapper = new ObjectMapper();
HashMap paramMap = mapper.readValue(paramData.toString(), new TypeReference<HashMap>() {});
siteService.saveVendorInsureRate(paramMap);
}
obj.put("RES", "SUCCESS");
return obj;
}
@GetMapping("/betList")
public String betList( HttpServletRequest request ,ModelMap model , @ModelAttribute("searchVO") SiteSearch search) throws Exception {
System.out.println("index");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo= new PageFormVO();
if("up".equals(search.getUpdown())){
search.setSiteIdx(loginSite.getSiteIdx());
}else if("down".equals(search.getUpdown())){
search.setUpperSiteId(loginSite.getSiteId());
}
search.setSearchType("BET");
search.setStatus("1");
int totalCount = creditService.getInsureListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(15);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
List<HashMap> list = creditService.getInsureList(search);
model.put("list", list);
return "admin/insuredBetList";
}
@GetMapping("/history")
public String history( HttpServletRequest request , ModelMap model) throws Exception {
System.out.println("index");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/insuredHistory";
}
@GetMapping("/apply")
public String apply( HttpServletRequest request , ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
System.out.println("index");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo= new PageFormVO();
search.setUpperSiteId(loginSite.getSiteId());
search.setSearchType("TRANIN");
if(search.getStatus()==null || "".equals(search.getStatus())) {
search.setStatus("0");
}
int totalCount = creditService.getInsureListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(10);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
model.put("searchVO", search);
List<HashMap> list = creditService.getInsureList(search);
model.put("list", list);
// model.addObject("long", Long.parseLong(null));
return "admin/insuredApply";
}
@GetMapping("/exchange")
public String exchange( HttpServletRequest request , ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
System.out.println("index");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo= new PageFormVO();
search.setUpperSiteId(loginSite.getSiteId());
search.setSearchType("TRANOUT");
if(search.getStatus()==null || "".equals(search.getStatus())) {
search.setStatus("0");
}
int totalCount = creditService.getInsureListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(10);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
model.put("searchVO", search);
List<HashMap> list = creditService.getInsureList(search);
model.put("list", list);
// model.addObject("long", Long.parseLong(null));
return "admin/insuredExchange";
}
}

View File

@@ -0,0 +1,274 @@
package com.bb.admin.controller;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.reactive.function.client.WebClient;
import com.bb.model.ApiTestVO;
import com.bb.model.Site;
import com.bb.service.SiteService;
import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
@Slf4j
@Controller
@RequestMapping(value = "")
public class MainController {
@Autowired
SiteService siteService;
@Autowired
private WebClient webClient; // 싱글톤 WebClient 주입
@GetMapping("/")
@PreAuthorize("permitAll()")
public String first(HttpServletRequest request, ModelMap model) throws Exception {
System.out.println("error/404");
String code = request.getParameter("code");
model.put("code", code);
return "error/404";
}
@GetMapping("/lg")
public String loginsForm(HttpServletRequest request, ModelMap model) throws Exception {
System.out.println("login");
return "admin/lg";
}
@GetMapping("/index")
@PreAuthorize("hasRole('ADMIN')")
public String index(HttpServletRequest request, ModelMap model) throws Exception {
System.out.println("index");
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
// long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", 0);
// HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", 0);
// pot 정보 가져오기
// long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
// long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", 0);
model.put("insurePointAmt", 0);
Map dashInfo = siteService.getDashInfo(loginSite); // 베팅정보
Map dashInfo2 = siteService.getDashInfo2(loginSite); // 하부에이전수 수.
model.put("dashInfo", dashInfo);
model.put("dashInfo2", dashInfo2);
return "admin/index";
}
@GetMapping("/mypage")
@PreAuthorize("hasRole('ADMIN')")
public String mypage(HttpServletRequest request, ModelMap model) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
log.info("underSiteCredit" + underSiteCredit);
model.put("siteCredit", siteCredit);
model.put("underSiteCredit", underSiteCredit);
Site mypageInfo = siteService.getSiteInfoMypage(loginSite);
model.put("mypageInfo", mypageInfo);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/mypage";
}
@RequestMapping("/mypage/pwdUpdate")
@PreAuthorize("hasRole('ADMIN')")
public @ResponseBody JSONObject pwdUpdate(HttpServletRequest request, ModelMap model, Site site) throws Exception {
JSONObject obj = new JSONObject();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
site.setUpperSiteId(loginSite.getSiteId());
site.setUpperSiteIdx(loginSite.getSiteIdx());
Map siteParam = new HashMap();
siteParam.put("siteId", loginSite.getSiteId());
siteParam.put("sitePass", site.getNowPass());
Site checkSite = siteService.getSiteBypassword(siteParam);
if (checkSite == null) {
obj.put("RES", "FAIL");
obj.put("MSG", "현재 비밀번호를 확인해주세요.");
return obj;
} else {
siteParam.put("newPass", site.getNewPass());
siteService.updatePass(siteParam);
}
obj.put("RES", "SUCCESS");
return obj;
}
@RequestMapping("/mypage/siteUpdate")
@PreAuthorize("hasRole('ADMIN')")
public @ResponseBody JSONObject siteUpdate(HttpServletRequest request, ModelMap model, Site site) throws Exception {
JSONObject obj = new JSONObject();
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
site.setSiteId(loginSite.getSiteId());
final String LOG_PREFIX = "#-super::mySiteUpdate:::";
String siteKey = loginSite.getSiteKey();
if ("new".equals(site.getSiteKey())) {
siteKey = makeApiKey(loginSite.getSiteId());
site.setSiteKey(siteKey);
}
log.info(LOG_PREFIX + "Site Info: " + site.toString());
log.info(LOG_PREFIX + "Site IP: " + site.getSiteIp());
siteService.siteUpdate(LOG_PREFIX, site);
obj.put("RES", "SUCCESS");
obj.put("DATA", siteKey);
return obj;
}
@RequestMapping(value = "/manual/apiTest")
@PreAuthorize("hasRole('ADMIN')")
public @ResponseBody JSONObject apiTest(HttpServletRequest request, ModelMap model, ApiTestVO param)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
JSONObject obj = new JSONObject();
try {
log.info("##### API Test 시작: {}", param.toString());
String apiUrl = param.getApiUrl();
// 1. 전송할 바디 데이터 구성
JSONObject paraJson = new JSONObject();
paraJson.put("userId", param.getUserId());
paraJson.put("nickName", param.getNickName());
paraJson.put("userIp", param.getUserIp());
paraJson.put("balance", param.getBalance());
// 빈 값이 아닐 때만 파라미터 추가
if (param.getVendorKey() != null && !"".equals(param.getVendorKey()))
paraJson.put("vendorKey", param.getVendorKey());
if (param.getBetId() != null && !"".equals(param.getBetId()))
paraJson.put("betId", param.getBetId());
if (param.getStartDate() != null && !"".equals(param.getStartDate()))
paraJson.put("startDate", param.getStartDate());
if (param.getEndDate() != null && !"".equals(param.getEndDate()))
paraJson.put("endDate", param.getEndDate());
if (param.getGameKey() != null && !"".equals(param.getGameKey()))
paraJson.put("gameKey", param.getGameKey());
if (param.getIsMobile() != null && !"".equals(param.getIsMobile()))
paraJson.put("isMobile", param.getIsMobile());
if (param.getLanguage() != null && !"".equals(param.getLanguage()))
paraJson.put("language", param.getLanguage());
// 2. WebClient를 이용한 호출 (동기 방식 .block())
String responseBody = webClient.post().uri(apiUrl).contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON).header("User-Agent", "PostmanRuntime/7.28.4")
.header("Authorization", loginSite.getSiteKey())
// 토큰이 있을 경우에만 헤더 추가
.headers(headers -> {
if (param.getToken() != null && !"".equals(param.getToken())) {
headers.add("token", param.getToken());
}
}).bodyValue(paraJson.toString()).retrieve().bodyToMono(String.class).block(); // 응답이 올 때까지 대기
// 3. 응답 결과 처리
JSONObject resJson = JSONObject.fromObject(responseBody);
obj.put("RES", "SUCCESS");
obj.put("DATA", resJson);
log.info("##### API Test 응답 완료: {}", resJson.toString());
} catch (Exception e) {
log.error("##### API Test 에러 발생: {}", e.toString());
e.printStackTrace();
obj.put("RES", "FAIL");
obj.put("MESSAGE", e.getMessage()); // 에러 메시지도 화면에 전달
}
return obj;
}
@GetMapping("/limit")
@PreAuthorize("hasRole('ADMIN')")
public String limit(HttpServletRequest request, ModelMap model) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/limit";
}
private String makeApiKey(String param) {
int n = 10; // n자리 쿠폰
char[] chs = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I',
'J', 'K', 'L', 'M', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'N', 'O', 'P', 'Q',
'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y',
'z' };
Random rd = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
char ch = chs[rd.nextInt(chs.length)];
sb.append(ch);
}
return param + sb.toString();
}
}

View File

@@ -0,0 +1,246 @@
package com.bb.admin.controller;
import java.util.HashMap;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import com.bb.service.SiteService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping(value = "")
@PreAuthorize("hasRole('ADMIN')")
public class ManualController {
@Autowired
SiteService siteService;
@GetMapping("/manual")
public String devmanual( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
return "admin/api_doc";
}
@GetMapping("/apiLogdev")
public String devApiLog( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiLogdev";
}
@GetMapping("/apiIntro")
public String devIntro( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiIntro";
}
@GetMapping("/apiGame")
public String devGame( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiGame";
}
@GetMapping("/apiGamelist")
public String devGamelist( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiGamelist";
}
@GetMapping("/apiPartner")
public String devPartner( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiPartner";
}
@GetMapping("/apiBetList")
public String devBetlist( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/apiBetList";
}
@GetMapping("/apiBetDetail")
public String devBetDe( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiBetDetail";
}
@GetMapping("/apiBetCallback")
public String devBetCall( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiBetCallback";
}
@GetMapping("/apiBetInfo1")
public String devInfo1( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiBetInfo1";
}
@GetMapping("/apiBetInfo2")
public String devInfo2( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
search.setSiteIdx(loginSite.getSiteIdx());
return "admin/apiBetInfo2";
}
@GetMapping({"/apiAuth"})
public String apiAuth( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/apiAuth";
}
@GetMapping({"/apiPlay"})
public String apiPlay( HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/apiPlay";
}
}

View File

@@ -0,0 +1,339 @@
package com.bb.admin.controller;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import jakarta.servlet.http.HttpServletRequest;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import com.bb.service.SiteService;
import com.bb.service.StatService;
import com.bb.util.DateTimeUtils;
import com.bb.util.PagingUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequestMapping(value = "/stat")
@PreAuthorize("hasRole('ADMIN')")
public class StatController {
@Autowired
StatService statService;
@Autowired
SiteService siteService;
@GetMapping("")
public String loginForm(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
System.out.println(search.toString());
List<HashMap> list = statService.getSiteDailyReportList(search);
model.put("list", list);
System.out.println(list.size());
return "admin/stat";
}
@GetMapping("/bottom")
public String index(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setUpperSiteIdx(loginSite.getSiteIdx());
List<HashMap> list = statService.getBottomSiteDailyReportList(search);
model.put("list", list);
return "admin/statBottom";
}
@GetMapping("/pot")
public String mypage(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
String currDate = DateTimeUtils.getYyyymmdd();
String yyyy = currDate.substring(0, 4);
search.setSiteIdx(loginSite.getSiteIdx());
int mm = Integer.parseInt(currDate.substring(4, 6));
if (search.getStartDate() == null) {
String mmm = currDate.substring(4, 6);
model.put("yyyy", yyyy);
model.put("mmm", mmm);
search.setStartDate(mmm);
} else {
String mmm = search.getStartDate();
model.put("yyyy", yyyy);
model.put("mmm", mmm);
search.setStartDate(mmm);
}
// model.put("", yyyy);
model.put("mm", mm);
HashMap list = statService.getMonthCredit(search);
model.put("list", list);
return "admin/statPot";
}
@GetMapping("/casino")
public String statCasino(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
List<HashMap> list = statService.getVendorDailyReportList(search);
model.put("list", list);
return "admin/statCasino";
}
@GetMapping("/user")
public String statUser(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
if (search.getStartDate() == null || "".equals(search.getStartDate())) {
String currDate = DateTimeUtils.getYyyymm();
search.setStartDate(currDate.substring(0, 4));
search.setEndDate(currDate.substring(4, 6));
}
System.out.println(search.getStartDate());
List<HashMap> list = statService.getUserDailyReportList(search);
model.put("list", list);
model.put("list", list);
return "admin/statUser";
}
@GetMapping("/date")
public String statDate(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
System.out.println(search.getStartDate());
List<HashMap> list = statService.getUserReportSum(search);
model.put("list", list);
return "admin/statDate";
}
@GetMapping("/agentReport")
public String agentReport(HttpServletRequest request, ModelMap model, @ModelAttribute("searchVO") SiteSearch search)
throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site) authentication.getDetails();
final String LOG_PREFIX = "#-SUPER::agentReport::::";
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
search.setSiteId(loginSite.getSiteId());
if(search.getSearchSiteId() != null && !"".equals(search.getSearchSiteId())) {
Site targetSite = siteService.getSiteSimpleDetail(search);
if(targetSite != null) {
search.setSearchSiteIdx(targetSite.getSiteIdx());
} else {
search.setSearchSiteIdx(0);
}
} else {
search.setSearchSiteIdx(0);
}
String toDay = new SimpleDateFormat("yyyy-MM-dd").format(new Date(System.currentTimeMillis()));
String startDay = "";
String endDay = "";
if(search.getStartDate() == null || "".equals(search.getStartDate())) {
startDay = toDay;
search.setStartDate(startDay);
} else {
startDay = search.getStartDate().substring(0, 10);
}
if(search.getEndDate() == null || "".equals(search.getEndDate())) {
endDay = toDay;
search.setEndDate(endDay);
} else {
endDay = search.getEndDate().substring(0, 10);
}
log.info(LOG_PREFIX+ "startDay::"+startDay);
log.info(LOG_PREFIX+ "endDay::"+endDay);
log.info(LOG_PREFIX+ "toDay::"+toDay);
search.setSiteDispYn("N");
if(startDay.equals(toDay) || endDay.equals(toDay)) {
search.setSiteDispYn("Y");
}
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(search);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
PageFormVO pageVo= new PageFormVO();
if(loginSite.getSiteLevel() > 0) {
search.setUpperSiteId(loginSite.getSiteId());
}
int totalCount = statService.getAgentReportCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
commonForm.setCount_per_list(30);
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
log.info(LOG_PREFIX+ "search.getStartDate {}", search.getStartDate());
log.info(LOG_PREFIX+ "search.getEndDate {}", search.getEndDate());
log.info(LOG_PREFIX+ "search.getSearchSiteIdx {}", search.getSearchSiteIdx());
log.info(LOG_PREFIX+ "search.getPage {}", search.getPage());
log.info(LOG_PREFIX+ "search.getLimit {}", search.getLimit());
log.info(LOG_PREFIX+ "search.getOffset {}", search.getOffset());
List<HashMap> siteList = statService.getAgentReportList(search);
model.put("siteList", siteList);
return "admin/agentReport";
}
}

View File

@@ -0,0 +1,273 @@
package com.bb.admin.controller;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import java.util.List;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.annotation.Secured;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import com.bb.model.WithdrewRequest;
import com.bb.service.CreditService;
import com.bb.service.GsoftService;
import com.bb.service.SiteService;
import com.bb.service.TplusService;
import com.bb.util.PagingUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
@Slf4j
@Controller
@RequestMapping(value = "user")
@PreAuthorize("hasRole('ADMIN')")
public class UserController {
@Autowired
SiteService siteService;
@Autowired
TplusService tplusService;
@Autowired
GsoftService gsoftService;
@Autowired
CreditService creditService;
@GetMapping("")
public String loginForm( HttpServletRequest request, ModelMap model , @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", 0);
model.put("siteCredit",siteCredit);
model.put("sitePoint", 0);
model.put("creditWait", 0);
model.put("insureAmt", 0);
model.put("insurePointAmt", 0);
PageFormVO pageVo= new PageFormVO();
log.info("#-SUPER::USER_DETAIL::Search : "+search.toString());
int totalCount = siteService.getSiteUserListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(100);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
List<HashMap> list = siteService.getSiteUserList(search);
model.put("list", list);
return "admin/user";
}
@GetMapping("/parseOnOff")
public @ResponseBody JSONObject parseOnOff(HttpServletRequest request, ModelMap model, @RequestParam("memberIdx") String memberIdx, @RequestParam("pStatus") String pStatus) throws Exception {
JSONObject obj = new JSONObject();
final String LOG_PREFIX = "#-Proc::Evo::parseOnOff:::";
HashMap param = new HashMap<>();
param.put("memberIdx", memberIdx);
param.put("parseEvoYn", pStatus);
log.info(LOG_PREFIX + "전체 사이트 파싱설정::" + param.toString() + "::START");
int result = siteService.updateParseEvoYn(param);
log.info(LOG_PREFIX + "updateParseEvoYn result::" + result + "::END");
obj.put("RES", "SUCCESS");
return obj;
}
@GetMapping("/betlist")
public String index( HttpServletRequest request, ModelMap model , @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
PageFormVO pageVo= new PageFormVO();
search.setSiteId(loginSite.getSiteId());
search.setSiteIdx(loginSite.getSiteIdx());
int totalCount = creditService.getSiteBetListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(15);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
model.put("pageInfo", pageVo.getPagination());
}
List<HashMap> list = creditService.getSiteBetList(search);
log.debug(""+list.size());
model.put("list", list);
return "admin/betlist";
}
@GetMapping("/transaction")
public String mypage( HttpServletRequest request, ModelMap model ) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/transactionList";
}
@GetMapping("/payments")
public String limit( HttpServletRequest request, ModelMap model ) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
return "admin/payments";
}
@GetMapping("/std")
public String std ( HttpServletRequest request, ModelMap model , @ModelAttribute("searchVO") SiteSearch search) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
Site loginSite = (Site)authentication.getDetails();
model.put("loginSite", loginSite);
long siteCredit = siteService.getSiteCredit(loginSite.getSiteId());
long underSiteCredit = siteService.getUnderSiteCredit(loginSite.getSiteId());
model.put("underSiteCredit", underSiteCredit);
model.put("siteCredit", siteCredit);
long sitePoint = siteService.getSitePoint(loginSite.getSiteId());
model.put("sitePoint", sitePoint);
HashMap creditWait = siteService.getCreditWait(loginSite.getSiteIdx());
model.put("creditWait", creditWait);
long insureAmt = siteService.getInsureAmt(loginSite.getSiteId());
long insurePointAmt = siteService.getInsurePointAmt(loginSite.getSiteId());
model.put("insureAmt", insureAmt);
model.put("insurePointAmt", insurePointAmt);
search.setSiteIdx(loginSite.getSiteIdx());
List<HashMap> venderAcountList = siteService.getTrasferVendorList();
for(HashMap vendor : venderAcountList) {
String balance ="0";
vendor.put("balance", balance);
}
model.put("list", venderAcountList);
return "admin/std";
}
@PostMapping("/withdrawAll")
public synchronized @ResponseBody JSONObject withdrawAll(HttpServletRequest request, ModelMap model, WithdrewRequest withdrewRequest) throws Exception {
log.warn( " member withdrawAll 시작" + withdrewRequest.toString() );
JSONObject obj = new JSONObject();
List<HashMap> allMemberList = siteService.getAllMember2();
for(HashMap member:allMemberList) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
long reqAtL = System.currentTimeMillis();
String reqAt = sdf.format(reqAtL);
}
log.info( " member betCheck 끝" );
obj.put("RES", "SUCCESS");
return obj;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,734 @@
package com.bb.api;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.BlockGameVO;
import com.bb.model.CmnSearch;
import com.bb.model.Game;
import com.bb.model.GameVo;
import com.bb.model.Site;
import com.bb.service.CommonService;
import com.bb.service.SettingService;
import com.bb.service.SiteService;
import com.bb.util.IPKit;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping(value = "/api/v1/block")
public class ApiBlockGameController {
@Autowired
SiteService siteService;
@Autowired
SettingService settingService;
@Autowired
CommonService commonService;
@Autowired
private final JwtManager jwtManager;
@ResponseBody
@PostMapping("/vendor-selectbox")
public ApiResponse vendorSelectBox(@RequestHeader String token, HttpServletRequest request) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::vendorSelectBox::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
List<HashMap<String, Object>> list = settingService.getBlockVendorSelectBoxList("CASINO");
log.info(LOG_PREFIX + "Block-Vendor-SelectBoxList cnt::"+list.size());
responseData.put("list", list);
} catch(Exception e) {
e.printStackTrace();
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/table-selectbox")
public ApiResponse tableSelectBox(@RequestHeader String token, HttpServletRequest request, @RequestBody CmnSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::tableSelectBox::"+tokenInfo.getSid()+"::::";
search.setSiteIdx((long) site.getSiteIdx());
// 여기서 부터 로직
log.info(LOG_PREFIX + "Request Param::"+search);
List<HashMap<String, Object>> list = settingService.getBlockTableSelectBoxList(search);
log.info(LOG_PREFIX + "Block-Table-SelectBoxList cnt::"+list.size());
responseData.put("list", list);
} catch(Exception e) {
e.printStackTrace();
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/table-list")
public ApiResponse blockTableList(@RequestHeader String token, HttpServletRequest request, @RequestBody CmnSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::blockTableList::"+tokenInfo.getSid()+"::::";
search.setSiteIdx((long) site.getSiteIdx());
// 여기서 부터 로직
log.info(LOG_PREFIX + "Request Param::"+search);
List<HashMap<String, Object>> list = settingService.getBlockTableSelectBoxList(search);
List<HashMap<String, Object>> mylist = new ArrayList<HashMap<String,Object>>();
String blockTableIds = settingService.getBlockTableIds(search);
if(blockTableIds == null) blockTableIds = "";
//String[] blockTableArr = blockTableIds.split("|");
for(HashMap<String, Object> item : list) {
String tableId = item.get("tableId").toString()+"|";
if(!"".equals(blockTableIds) && blockTableIds.contains(tableId)) {
mylist.add(item);
}
}
responseData.put("list", mylist);
responseData.put("blockTableIds", blockTableIds);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/table/save")
public ApiResponse blockGameSave(@RequestHeader String token, HttpServletRequest request, @RequestBody BlockGameVO param) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::blockGameSave::"+tokenInfo.getSid()+"::::";
param.setSiteIdx((long) site.getSiteIdx());
// 여기서 부터 로직
log.info(LOG_PREFIX + "BF::BlockGameVO::"+param);
CmnSearch search = new CmnSearch();
search.setSiteIdx(param.getSiteIdx());
search.setVendorIdx(param.getVendorIdx());
String vendorTitle = settingService.getVendorTitle(search);
if(vendorTitle == null || "".equals(vendorTitle)) {
log.error(LOG_PREFIX+ "VendorTitle is not null or empty");
apiResponse.setResultCode("99");
apiResponse.setResultMessage("VendorTitle is not null or empty");
return apiResponse;
}
param.setVendorTitle(vendorTitle);
String blockTableIds = settingService.getBlockTableIds(search);
if(blockTableIds == null) blockTableIds = "";
log.info(LOG_PREFIX +"BF::blockTableIds::" + blockTableIds);
if(!"".equals(blockTableIds) && blockTableIds.contains(param.getBlockTableId())) {
log.info(LOG_PREFIX + param.getBlockTableId() + " is already saved");
} else {
blockTableIds = blockTableIds + param.getBlockTableId() + "|";
log.info(LOG_PREFIX +"AF::blockTableIds::" + blockTableIds);
param.setBlockTableIds(blockTableIds);
log.info(LOG_PREFIX +"AF::BlockGameVO::" + param);
int saveResult = settingService.blockTableIdSave(param);
log.info(LOG_PREFIX + "blockTableIdSave result::"+saveResult);
}
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/table/delete")
public ApiResponse blockGameDelete(@RequestHeader String token, HttpServletRequest request, @RequestBody BlockGameVO param) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::blockGameDelete::"+tokenInfo.getSid()+"::::";
param.setSiteIdx((long) site.getSiteIdx());
// 여기서 부터 로직
log.info(LOG_PREFIX + "BF::BlockGameVO::"+param);
CmnSearch search = new CmnSearch();
search.setSiteIdx(param.getSiteIdx());
search.setVendorIdx(param.getVendorIdx());
String vendorTitle = settingService.getVendorTitle(search);
if(vendorTitle == null || "".equals(vendorTitle)) {
log.error(LOG_PREFIX+ "VendorTitle is not null or empty");
apiResponse.setResultCode("99");
apiResponse.setResultMessage("VendorTitle is not null or empty");
return apiResponse;
}
param.setVendorTitle(vendorTitle);
String blockTableIds = settingService.getBlockTableIds(search);
if(blockTableIds == null) blockTableIds = "";
log.info(LOG_PREFIX +"BF::blockTableIds::" + blockTableIds);
if(!"".equals(blockTableIds) && !blockTableIds.contains(param.getBlockTableId())) {
log.info(LOG_PREFIX + param.getBlockTableId() + " is not found");
} else {
blockTableIds = blockTableIds.replace(param.getBlockTableId() + "|", "");
log.info(LOG_PREFIX +"AF::blockTableIds::" + blockTableIds);
param.setBlockTableIds(blockTableIds);
log.info(LOG_PREFIX +"AF::BlockGameVO::" + param);
int saveResult = settingService.blockTableIdSave(param);
log.info(LOG_PREFIX + "blockTableIdSave result::"+saveResult);
}
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/slotVendors")
public ApiResponse slotVendors(@RequestHeader String token, HttpServletRequest request) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::slotVendors::"+tokenInfo.getSid()+"::::";
CmnSearch search = new CmnSearch();
search.setSiteIdx((long) site.getSiteIdx());
search.setCategory("SLOT");
// 여기서 부터 로직
List<HashMap<String, Object>> list = settingService.getBlockVendorSelectBoxList2(search);
responseData.put("list", list);
} catch(Exception e) {
e.printStackTrace();
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/slotGames")
public ApiResponse slotGames(@RequestHeader String token, HttpServletRequest request, @RequestBody CmnSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::slotGames::"+tokenInfo.getSid()+"::::";
search.setSiteIdx((long) site.getSiteIdx());
// 여기서 부터 로직
log.info(LOG_PREFIX + "Request Param::"+search);
HashMap apiInfo = commonService.getVendorApiInfo(search);
log.info(LOG_PREFIX + "API Info::"+apiInfo.toString());
// -- grand, svendor, tower, tplus
List<GameVo> gameList = null;
if("grand".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getGrandGameList(LOG_PREFIX, apiInfo);
} else if("svendor".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getSevenGameList(LOG_PREFIX, apiInfo);
} else if("pink".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getSevenGameList(LOG_PREFIX, apiInfo);
} else if("tplus".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getTplusGameList(LOG_PREFIX, apiInfo);
} else if("pracp".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getPracpGameList(LOG_PREFIX, apiInfo);
} else if("nexus".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getNexusGameList(LOG_PREFIX, apiInfo);
} else if("ace2".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getNexusGameList(LOG_PREFIX, apiInfo);
} else if("tower".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getTowerGameList(LOG_PREFIX, apiInfo);
} else {
log.error(LOG_PREFIX + "Not found vendor company");
}
responseData.put("list", gameList);
} catch(Exception e) {
e.printStackTrace();
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/slot-block/gameList")
public ApiResponse slotBlockGameList(@RequestHeader String token, HttpServletRequest request, @RequestBody CmnSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::slotGames::"+tokenInfo.getSid()+"::::";
search.setSiteIdx((long) site.getSiteIdx());
// 여기서 부터 로직
log.info(LOG_PREFIX + "Request Param::"+search);
HashMap apiInfo = commonService.getVendorApiInfo(search);
log.info(LOG_PREFIX + "API Info::"+apiInfo.toString());
// -- grand, svendor, tower, tplus
List<GameVo> gameList = null;
if("grand".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getGrandGameList(LOG_PREFIX, apiInfo);
} else if("svendor".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getSevenGameList(LOG_PREFIX, apiInfo);
} else if("pink".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getSevenGameList(LOG_PREFIX, apiInfo);
} else if("tplus".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getTplusGameList(LOG_PREFIX, apiInfo);
} else if("pracp".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getPracpGameList(LOG_PREFIX, apiInfo);
} else if("nexus".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getNexusGameList(LOG_PREFIX, apiInfo);
} else if("ace2".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getNexusGameList(LOG_PREFIX, apiInfo);
} else if("tower".equals(apiInfo.get("vendorTitle").toString())) {
gameList = commonService.getTowerGameList(LOG_PREFIX, apiInfo);
} else {
log.error(LOG_PREFIX + "Not found vendor company");
}
List<GameVo> mylist = new ArrayList<>();
String blockTableIds = settingService.getBlockTableIds(search);
if(blockTableIds == null) blockTableIds = "";
//String[] blockTableArr = blockTableIds.split("|");
for(GameVo item : gameList) {
String tableId = item.getGameId()+"|";
if(!"".equals(blockTableIds) && blockTableIds.contains(tableId)) {
mylist.add(item);
}
}
responseData.put("list", mylist);
responseData.put("blockTableIds", blockTableIds);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/slot-block/save")
public ApiResponse SlotBlockSave(@RequestHeader String token, HttpServletRequest request, @RequestBody BlockGameVO param) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::SlotBlockSave::"+tokenInfo.getSid()+"::::";
param.setSiteIdx((long) site.getSiteIdx());
// 여기서 부터 로직
log.info(LOG_PREFIX + "BF::BlockGameVO::"+param);
CmnSearch search = new CmnSearch();
search.setSiteIdx(param.getSiteIdx());
search.setVendorIdx(param.getVendorIdx());
String blockTableIds = settingService.getBlockTableIds(search);
if(blockTableIds == null) blockTableIds = "";
log.info(LOG_PREFIX +"BF::blockTableIds::" + blockTableIds);
if(!"".equals(blockTableIds) && blockTableIds.contains(param.getBlockTableId())) {
log.info(LOG_PREFIX + param.getBlockTableId() + " is already saved");
} else {
blockTableIds = blockTableIds + param.getBlockTableId() + "|";
log.info(LOG_PREFIX +"AF::blockTableIds::" + blockTableIds);
param.setBlockTableIds(blockTableIds);
log.info(LOG_PREFIX +"AF::BlockGameVO::" + param);
int saveResult = settingService.blockTableIdSave(param);
log.info(LOG_PREFIX + "blockTableIdSave result::"+saveResult);
}
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/slot-block/delete")
public ApiResponse SlotBlockDelete(@RequestHeader String token, HttpServletRequest request, @RequestBody BlockGameVO param) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::BLOCK::SlotBlockDelete::"+tokenInfo.getSid()+"::::";
param.setSiteIdx((long) site.getSiteIdx());
// 여기서 부터 로직
log.info(LOG_PREFIX + "BF::BlockGameVO::"+param);
CmnSearch search = new CmnSearch();
search.setSiteIdx(param.getSiteIdx());
search.setVendorIdx(param.getVendorIdx());
String blockTableIds = settingService.getBlockTableIds(search);
if(blockTableIds == null) blockTableIds = "";
log.info(LOG_PREFIX +"BF::blockTableIds::" + blockTableIds);
if(!"".equals(blockTableIds) && !blockTableIds.contains(param.getBlockTableId())) {
log.info(LOG_PREFIX + param.getBlockTableId() + " is not found");
} else {
blockTableIds = blockTableIds.replace(param.getBlockTableId() + "|", "");
log.info(LOG_PREFIX +"AF::blockTableIds::" + blockTableIds);
param.setBlockTableIds(blockTableIds);
log.info(LOG_PREFIX +"AF::BlockGameVO::" + param);
int saveResult = settingService.blockTableIdSave(param);
log.info(LOG_PREFIX + "blockTableIdSave result::"+saveResult);
}
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
}

View File

@@ -0,0 +1,301 @@
package com.bb.api;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.CallbackTestResult;
import com.bb.model.Site;
import com.bb.service.CallBackTestService;
import com.bb.service.SiteService;
import com.bb.util.IPKit;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/v1/spdtest")
public class ApiCallbackSpeedTestController {
@Autowired
SiteService siteService;
@Autowired
CallBackTestService callBackService;
@Autowired
private final JwtManager jwtManager;
private static final String CHARACTERS = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
private static final SecureRandom random = new SecureRandom();
public static List<String> generateRandomStrings(int stringLength, int count) {
Set<String> uniqueStrings = new HashSet<>();
while (uniqueStrings.size() < count) {
StringBuilder sb = new StringBuilder(stringLength);
for (int i = 0; i < stringLength; i++) {
sb.append(CHARACTERS.charAt(random.nextInt(CHARACTERS.length())));
}
// 시간 기반으로 중복 확률 줄이기 (나노타임 일부 추가)
sb.append(Long.toHexString(System.nanoTime()).substring(0, 4));
uniqueStrings.add(sb.toString());
}
return new ArrayList<>(uniqueStrings);
}
@GetMapping("/testBalance")
public ApiResponse testBalance(HttpServletRequest request, @RequestHeader String token, @Valid @RequestParam String memberId) throws Exception {
ApiResponse apiResponse = new ApiResponse();
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
log.error("#-API::SPD_TEST::testBalance::Authorization apiKey check");
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("#-API::SPD_TEST::testBalance::site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
if(token == null || token.equals("")) {
log.error("#-API::SPD_TEST::testBalance::Authorization apiKey check");
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization token check");
return apiResponse;
}
try {
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::SPD_TEST::testBalance::"+tokenInfo.getSid()+"::";
// 여기서 부터 로직
List<CallbackTestResult> resultList = new ArrayList<>();
log.info(LOG_PREFIX+ "callBackService.getTestBalance() START--");
JSONObject responseObj = callBackService.getTestBalance(LOG_PREFIX, memberId, token, request.getHeader("Authorization").toString());
log.info(LOG_PREFIX+ "callBackService.getTestBalance() END--");
JSONObject dataObj = responseObj.getJSONObject("data");
JSONArray resultArray = dataObj.getJSONArray("resultList");
for(int i=0; i<resultArray.length(); i++) {
JSONObject item = resultArray.getJSONObject(i);
CallbackTestResult result = new CallbackTestResult();
result.setIndex(item.getInt("index"));
result.setStatus(item.getString("status"));
result.setMsg(item.getString("msg"));
result.setCallbackUrl(item.getString("callbackUrl"));
result.setRequestBody(item.getString("requestBody"));
result.setResponseData(item.getString("responseData"));
result.setTimeMs(item.getLong("timeMs"));
resultList.add(result);
}
responseData.put("resultList", resultList);
apiResponse.setData(responseData);
apiResponse.success();
} catch(Exception e) {
log.error("#-API::SPD_TEST::testBalance::"+ e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@GetMapping("/testCasino")
public ApiResponse testCasino(HttpServletRequest request, @RequestHeader String token, @Valid @RequestParam String memberId) throws Exception {
ApiResponse apiResponse = new ApiResponse();
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
log.error("#-API::SPD_TEST::testCasino::Authorization apiKey check");
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("#-API::SPD_TEST::testCasino::site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
if(token == null || token.equals("")) {
log.error("#-API::SPD_TEST::testCasino::Authorization apiKey check");
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization token check");
return apiResponse;
}
try {
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::SPD_TEST::testCasino::"+tokenInfo.getSid()+"::";
// 여기서 부터 로직
List<CallbackTestResult> resultList = new ArrayList<>();
log.info(LOG_PREFIX+ "callBackService.getTestChangeBalance() START--");
JSONObject responseObj = callBackService.getTestChangeBalance(LOG_PREFIX, memberId, token, request.getHeader("Authorization").toString());
log.info(LOG_PREFIX+ "callBackService.getTestChangeBalance() END--");
JSONObject dataObj = responseObj.getJSONObject("data");
JSONArray resultArray = dataObj.getJSONArray("resultList");
for(int i=0; i<resultArray.length(); i++) {
JSONObject item = resultArray.getJSONObject(i);
CallbackTestResult result = new CallbackTestResult();
result.setIndex(item.getInt("index"));
result.setStatus(item.getString("status"));
result.setMsg(item.getString("msg"));
result.setCallbackUrl(item.getString("callbackUrl"));
result.setRequestBody(item.getString("requestBody"));
result.setResponseData(item.getString("responseData"));
result.setTimeMs(item.getLong("timeMs"));
resultList.add(result);
}
responseData.put("resultList", resultList);
apiResponse.setData(responseData);
apiResponse.success();
} catch(Exception e) {
log.error("#-API::SPD_TEST::testBalance::"+ e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@GetMapping("/testSlot")
public ApiResponse testSlot(HttpServletRequest request, @RequestHeader String token, @Valid @RequestParam String memberId) throws Exception {
ApiResponse apiResponse = new ApiResponse();
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
log.error("#-API::SPD_TEST::testSlot::Authorization apiKey check");
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("#-API::SPD_TEST::testSlot::site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
if(token == null || token.equals("")) {
log.error("#-API::SPD_TEST::testSlot::Authorization apiKey check");
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization token check");
return apiResponse;
}
try {
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::SPD_TEST::testSlot::"+tokenInfo.getSid()+"::";
// 여기서 부터 로직
List<CallbackTestResult> resultList = new ArrayList<>();
log.info(LOG_PREFIX+ "callBackService.getTestChangeBalanceSlot() START--");
JSONObject responseObj = callBackService.getTestChangeBalanceSlot(LOG_PREFIX, memberId, token, request.getHeader("Authorization").toString());
log.info(LOG_PREFIX+ "callBackService.getTestChangeBalanceSlot() END--");
JSONObject dataObj = responseObj.getJSONObject("data");
JSONArray resultArray = dataObj.getJSONArray("resultList");
for(int i=0; i<resultArray.length(); i++) {
JSONObject item = resultArray.getJSONObject(i);
CallbackTestResult result = new CallbackTestResult();
result.setIndex(item.getInt("index"));
result.setStatus(item.getString("status"));
result.setMsg(item.getString("msg"));
result.setCallbackUrl(item.getString("callbackUrl"));
result.setRequestBody(item.getString("requestBody"));
result.setResponseData(item.getString("responseData"));
result.setTimeMs(item.getLong("timeMs"));
resultList.add(result);
}
responseData.put("resultList", resultList);
apiResponse.setData(responseData);
apiResponse.success();
} catch(Exception e) {
log.error("#-API::SPD_TEST::testBalance::"+ e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,635 @@
package com.bb.api;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.Arrays;
import java.util.Base64;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Controller;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientRequestException;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import org.springframework.web.util.UriComponentsBuilder;
import com.bb.exception.ApiException;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.BanGameSearch;
import com.bb.model.CmnSearch;
import com.bb.model.Site;
import com.bb.service.CommonService;
import com.bb.service.SiteService;
import com.bb.util.IPKit;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping(value = "/api/v1/cmn")
public class ApiCommonController {
@Autowired
SiteService siteService;
@Autowired
CommonService commonService;
@Autowired
WebClient webClient;
@Autowired
private final JwtManager jwtManager;
@ResponseBody
@PostMapping("/code/category")
public ApiResponse gameCategoryList(@RequestHeader String token, HttpServletRequest request) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if (site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if (!(site.getSiteIp() == null || "".equals(site.getSiteIp()) || "3.3.3.3".equals(site.getSiteIp())
|| site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0)) {
log.error("site.getSiteIp(" + site.getSiteIp() + "), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::CMN::gameCategoryList::" + tokenInfo.getSid() + "::::";
// 여기서 부터 로직
log.info(LOG_PREFIX);
List<HashMap<String, String>> list = commonService.getGameCategoryList();
responseData.put("list", list);
} catch (Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/code/vendor")
public ApiResponse gameVendorList(@RequestHeader String token, HttpServletRequest request,
@RequestBody CmnSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if (site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if (!(site.getSiteIp() == null || "".equals(site.getSiteIp()) || "3.3.3.3".equals(site.getSiteIp())
|| site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0)) {
log.error("site.getSiteIp(" + site.getSiteIp() + "), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::CMN::gameVendorList::" + tokenInfo.getSid() + "::::";
// 여기서 부터 로직
log.info(LOG_PREFIX);
List<HashMap<String, Object>> list = commonService.getGameVendorList(search);
responseData.put("list", list);
} catch (Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@GetMapping("/banGameSet/{vendorTitle}/{vendorIdx}/{skin}")
public ApiResponse banGameSetByGet(@RequestHeader String token, HttpServletRequest request,
@PathVariable("vendorTitle") String vendorTitle, @PathVariable("vendorIdx") Long vendorIdx,
@PathVariable("skin") String skin) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if (site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if (!(site.getSiteIp() == null || "".equals(site.getSiteIp()) || "3.3.3.3".equals(site.getSiteIp())
|| site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0)) {
log.error("site.getSiteIp(" + site.getSiteIp() + "), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::CMN::banGameSetByGet::" + tokenInfo.getSid() + "::::";
BanGameSearch search = new BanGameSearch();
search.setVendorTitle(vendorTitle);
search.setVendorIdx(vendorIdx);
search.setSkin(skin);
// 여기서 부터 로직
log.info(LOG_PREFIX + "BanGameSearch : " + search.toString());
if (search.getVendorTitle() == null || "".equals(search.getVendorTitle())) {
apiResponse.setResultCode("-1");
apiResponse.setResultMessage("vendorTitle is not empty");
return apiResponse;
}
List<HashMap<String, Object>> banGameList = commonService.getBanGameList(search);
if (banGameList == null || banGameList.size() == 0) {
apiResponse.setResultCode("-2");
apiResponse.setResultMessage("banGameList empty");
return apiResponse;
}
log.info(LOG_PREFIX + "BanGameSearch : " + banGameList.toString());
if ("nexus".equals(search.getVendorTitle())) {
HashMap<String, Object> apiInfo = banGameList.get(0);
String apiBaseUrl = apiInfo.get("apiBaseUrl").toString();
String apiAgentId = apiInfo.get("apiAgentId").toString();
String apiKey = apiInfo.get("apiSecretKey").toString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8")));
for (HashMap<String, Object> item : banGameList) {
String apiVendorKey = item.get("apiVendorCode").toString();
String vendorCetegory = item.get("vendorCetegory").toString();
JSONObject bodyObj = new JSONObject();
bodyObj.put("vendorKey", apiVendorKey);
if (vendorCetegory.equals("CASINO")) {
if (search.getSkin() == null || search.getSkin().equals(""))
search.setSkin("B");
bodyObj.put("skin", search.getSkin());
} else if (vendorCetegory.equals("SLOT")) {
bodyObj.put("skin", "SLOT");
bodyObj.put("type", "Slot");
search.setSkin("");
} else {
}
String bodyJson = bodyObj.toString();
log.info(LOG_PREFIX + "bodyJson::" + bodyJson);
String hashCode = getHashCode(LOG_PREFIX, bodyJson, apiKey);
headers.set("hash", hashCode);
headers.set("agent", apiAgentId);
log.info(LOG_PREFIX + "HttpHeaders::" + headers.toString());
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(apiBaseUrl + "/games");
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("vendorKey", apiVendorKey);
if (vendorCetegory.equals("CASINO")) {
params.add("skin", search.getSkin());
} else if (vendorCetegory.equals("SLOT")) {
params.add("skin", "SLOT");
params.add("type", "Slot");
} else {
}
try {
String responseBody = webClient.post().uri(uriBuilder.toUriString())
.headers(h -> h.addAll(headers)).bodyValue(params).retrieve()
.bodyToMono(String.class).block();
JSONObject resObj = new JSONObject(responseBody);
if (resObj.getInt("code") == 0) {
JSONArray games = resObj.getJSONArray("games");
int length = games.length();
for (int i = 0; i < length; i++) {
JSONObject objGame = games.getJSONObject(i);
JSONObject objName = objGame.getJSONObject("names");
String gameType = objGame.getString("type");
String gameId = objGame.getString("id");
String gameKey = objGame.getString("key");
String gameTitleEn = objName.getString("en");
String gameTitleKo = objName.getString("ko");
item.put("banGameType", gameType);
item.put("banGameId", gameId);
item.put("banGameName", gameTitleEn + "||" + gameTitleKo);
item.put("banGameNameEng", gameTitleEn);
item.put("banGameKey", gameKey);
item.put("skin", search.getSkin());
log.info(LOG_PREFIX + "item : " + item.toString());
int result = commonService.insertBanGameInfo(item);
log.info(LOG_PREFIX + "insertBanGameInfo result : " + result);
/*
* if(apiVendorKey.equals("evolution_casino")) { result =
* commonService.insertNexusGameInfo(item); log.info(LOG_PREFIX+
* "insertNexusGameInfo result : " + result); }
*/
}
} else {
apiResponse.setResultCode("-99");
apiResponse.setResultMessage("api fail");
return apiResponse;
}
} catch (WebClientResponseException e) {
log.error(LOG_PREFIX + "WebClientResponseException : " + e.getMessage());
throw new ApiException("E901", "API call failed");
} catch (WebClientRequestException e) {
log.error(LOG_PREFIX + "WebClientRequestException : " + e.getMessage());
throw new ApiException("E902", "Network error");
}
}
} else if ("ace2".equals(search.getVendorTitle())) {
HashMap<String, Object> apiInfo = banGameList.get(0);
String apiBaseUrl = apiInfo.get("apiBaseUrl").toString();
String apiAgentId = apiInfo.get("apiAgentId").toString();
String apiKey = apiInfo.get("apiSecretKey").toString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.setAcceptCharset(Arrays.asList(Charset.forName("UTF-8")));
for (HashMap<String, Object> item : banGameList) {
String apiVendorKey = item.get("apiVendorCode").toString();
String vendorCetegory = item.get("vendorCetegory").toString();
JSONObject bodyObj = new JSONObject();
bodyObj.put("vendorKey", apiVendorKey);
if (vendorCetegory.equals("CASINO")) {
if (search.getSkin() == null || search.getSkin().equals(""))
search.setSkin("B");
bodyObj.put("skin", search.getSkin());
} else if (vendorCetegory.equals("SLOT")) {
bodyObj.put("skin", "SLOT");
bodyObj.put("type", "Slot");
search.setSkin("");
} else {
}
String bodyJson = bodyObj.toString();
log.info(LOG_PREFIX + "bodyJson::" + bodyJson);
String hashCode = getHashCode(LOG_PREFIX, bodyJson, apiKey);
headers.set("hash", hashCode);
headers.set("agent", apiAgentId);
log.info(LOG_PREFIX + "HttpHeaders::" + headers.toString());
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(apiBaseUrl + "/games");
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("vendorKey", apiVendorKey);
if (vendorCetegory.equals("CASINO")) {
params.add("skin", search.getSkin());
} else if (vendorCetegory.equals("SLOT")) {
params.add("skin", "SLOT");
params.add("type", "Slot");
} else {
}
try {
String responseBody = webClient.post().uri(uriBuilder.toUriString())
.headers(h -> h.addAll(headers)).bodyValue(params).retrieve()
.bodyToMono(String.class).block();
JSONObject resObj = new JSONObject(responseBody);
if (resObj.getInt("code") == 0) {
JSONArray games = resObj.getJSONArray("games");
int length = games.length();
for (int i = 0; i < length; i++) {
JSONObject objGame = games.getJSONObject(i);
JSONObject objName = objGame.getJSONObject("names");
String gameType = objGame.getString("type");
String gameId = objGame.getString("id");
String gameKey = objGame.getString("key");
String gameTitleEn = objName.getString("en");
String gameTitleKo = objName.getString("ko");
item.put("banGameType", gameType);
item.put("banGameId", gameId);
item.put("banGameName", gameTitleEn + "||" + gameTitleKo);
item.put("banGameNameEng", gameTitleEn);
item.put("banGameKey", gameKey);
item.put("skin", search.getSkin());
log.info(LOG_PREFIX + "item : " + item.toString());
int result = commonService.insertBanGameInfo(item);
log.info(LOG_PREFIX + "insertBanGameInfo result : " + result);
/*
* if(apiVendorKey.equals("evolution_casino")) { result =
* commonService.insertNexusGameInfo(item); log.info(LOG_PREFIX+
* "insertNexusGameInfo result : " + result); }
*/
}
} else {
apiResponse.setResultCode("-99");
apiResponse.setResultMessage("api fail");
return apiResponse;
}
} catch (WebClientResponseException e) {
log.error(LOG_PREFIX + "WebClientResponseException : " + e.getMessage());
throw new ApiException("E901", "API call failed");
} catch (WebClientRequestException e) {
log.error(LOG_PREFIX + "WebClientRequestException : " + e.getMessage());
throw new ApiException("E902", "Network error");
}
}
} else if ("dpcore".equals(search.getVendorTitle())) {
HashMap<String, Object> apiInfo = banGameList.get(0);
String apiBaseUrl = apiInfo.get("apiBaseUrl").toString();
String apiAgentId = apiInfo.get("apiAgentId").toString();
String apiKey = "Bearer " + apiInfo.get("apiSecretKey").toString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.set("Authorization", apiKey);
String gameUrl = apiBaseUrl + "/api/gameList";
for (HashMap<String, Object> item : banGameList) {
String apiVendorKey = item.get("apiVendorCode").toString();
JSONObject prams = new JSONObject();
log.info(LOG_PREFIX + "DPCORE::Game List Url: " + gameUrl);
log.info(LOG_PREFIX + "DPCORE::Game List Headers: " + headers.toString());
try {
String responseBody = webClient.post().uri(gameUrl).headers(h -> h.addAll(headers))
.bodyValue(prams.toString()).retrieve().bodyToMono(String.class).block();
JSONArray games = new JSONArray(responseBody);
int length = games.length();
for (int i = 0; i < length; i++) {
JSONObject objGame = games.getJSONObject(i);
String gameType = objGame.getString("gameType");
String gameId = objGame.getString("tableId");
String gameKey = objGame.getString("tableId");
String gameTitleEn = objGame.getString("tableName");
String gameTitleKo = objGame.getString("tableName");
item.put("banGameType", gameType);
item.put("banGameId", gameId);
item.put("banGameName", gameTitleEn + "||" + gameTitleKo);
item.put("banGameNameEng", gameTitleEn);
item.put("banGameKey", gameKey);
item.put("skin", search.getSkin());
log.info(LOG_PREFIX + "item : " + item.toString());
int result = commonService.insertBanGameInfo(item);
log.info(LOG_PREFIX + "insertBanGameInfo result : " + result);
}
} catch (WebClientResponseException e) {
log.error(LOG_PREFIX + "WebClientResponseException : " + e.getMessage());
throw new ApiException("E901", "API call failed");
} catch (WebClientRequestException e) {
log.error(LOG_PREFIX + "WebClientRequestException : " + e.getMessage());
throw new ApiException("E902", "Network error");
}
}
} else if ("pink".equals(search.getVendorTitle())) {
HashMap<String, Object> apiInfo = banGameList.get(0);
String apiBaseUrl = apiInfo.get("apiBaseUrl").toString();
String apiAgentId = apiInfo.get("apiAgentId").toString();
String apiKey = apiInfo.get("apiSecretKey").toString();
String apiVendorCode = apiInfo.get("apiVendorCode").toString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.set("Authorization", apiKey);
UriComponentsBuilder uriBuilder = UriComponentsBuilder.fromHttpUrl(apiBaseUrl + "/gamelist");
MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("vendor", apiVendorCode);
params.add("type", "all");
log.info(LOG_PREFIX + "HttpHeaders::" + headers.toString());
log.info(LOG_PREFIX + "params::" + params.toString());
try {
String responseBody = webClient.post().uri(uriBuilder.toUriString())
.headers(h -> h.addAll(headers)).bodyValue(params).retrieve().bodyToMono(String.class)
.block();
JSONObject resObj = new JSONObject(responseBody);
if (resObj.getInt("code") == 0) {
log.info(LOG_PREFIX + "gameList::Response::code::" + resObj.getInt("code"));
log.info(LOG_PREFIX + "gameList::Response::msg::" + resObj.getString("msg"));
JSONArray games = resObj.getJSONArray("data");
int length = games.length();
for (int i = 0; i < length; i++) {
JSONObject objGame = games.getJSONObject(i);
String gameType = objGame.getString("type");
String gameId = objGame.getString("game");
String gameKey = objGame.getString("game");
String gameTitleEn = objGame.getString("name");
String gameTitleKo = objGame.getString("kname");
apiInfo.put("banGameType", gameType);
apiInfo.put("banGameId", gameId);
apiInfo.put("banGameName", gameTitleEn + "||" + gameTitleKo);
apiInfo.put("banGameNameEng", gameTitleEn);
apiInfo.put("banGameKey", gameKey);
apiInfo.put("skin", search.getSkin());
log.info(LOG_PREFIX + "item : " + apiInfo.toString());
int result = commonService.insertBanGameInfo(apiInfo);
log.info(LOG_PREFIX + "insertBanGameInfo result : " + result);
}
} else {
apiResponse.setResultCode("-99");
apiResponse.setResultMessage("api fail");
return apiResponse;
}
} catch (WebClientResponseException e) {
log.error(LOG_PREFIX + "WebClientResponseException : " + e.getMessage());
throw new ApiException("E901", "API call failed");
} catch (WebClientRequestException e) {
log.error(LOG_PREFIX + "WebClientRequestException : " + e.getMessage());
throw new ApiException("E902", "Network error");
}
} else if ("onix".equals(search.getVendorTitle())) {
HashMap<String, Object> apiInfo = banGameList.get(0);
String apiBaseUrl = apiInfo.get("apiBaseUrl").toString();
String apiAgentId = apiInfo.get("apiAgentId").toString();
String apiKey = "Bearer " + apiInfo.get("apiSecretKey").toString();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
headers.set("Authorization", apiKey);
String gameUrl = apiBaseUrl + "/csapi/Provider";
for (HashMap<String, Object> item : banGameList) {
String apiVendorKey = item.get("apiVendorCode").toString();
JSONObject prams = new JSONObject();
prams.put("type", "0");
prams.put("gameid", "SxCasino");
prams.put("code", "evolution");
prams.put("gametype", "live");
log.info(LOG_PREFIX + "ONIX::Game List Url: " + gameUrl);
log.info(LOG_PREFIX + "ONIX::Game List Headers: " + headers.toString());
try {
String responseBody = webClient.post().uri(gameUrl).headers(h -> h.addAll(headers))
.bodyValue(prams.toString()).retrieve().bodyToMono(String.class).block();
JSONObject resObj = new JSONObject(responseBody);
int resultCode = resObj.getInt("result");
if(resultCode == 1) {
JSONArray games = resObj.getJSONArray("data");
int length = games.length();
for (int i = 0; i < length; i++) {
JSONObject objGame = games.getJSONObject(i);
String gameType = objGame.getString("type");
String gameId = objGame.getString("subcode");
String gameTitleEn = objGame.getString("name_eng");
String gameTitleKo = objGame.getString("name_kor");
item.put("banGameType", gameType);
item.put("banGameId", gameId);
item.put("banGameName", gameTitleEn + "||" + gameTitleKo);
item.put("banGameNameEng", gameTitleEn);
item.put("skin", search.getSkin());
log.info(LOG_PREFIX + "item : " + item.toString());
int result = commonService.insertBanGameInfo(item);
log.info(LOG_PREFIX + "insertBanGameInfo result : " + result);
}
}
} catch (WebClientResponseException e) {
log.error(LOG_PREFIX + "WebClientResponseException : " + e.getMessage());
throw new ApiException("E901", "API call failed");
} catch (WebClientRequestException e) {
log.error(LOG_PREFIX + "WebClientRequestException : " + e.getMessage());
throw new ApiException("E902", "Network error");
}
}
}
} catch (Exception e) {
log.error("#-API::CMN::banGameSet::" + e.toString());
e.printStackTrace();
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
private String getHashCode(String LOG_PREFIX, String body, String secretKey) {
String hashCode = "";
LOG_PREFIX = LOG_PREFIX + "::getHashCode::";
try {
// Json String Body + Secret Key
String result = body + secretKey;
// String result =
// "{\"username\":\"057007mptest01\",\"nickname\":\"007mptest01\",\"siteUsername\":\"057007mptest01\"}";
log.info(LOG_PREFIX + "Body + Secret Key::" + result);
// SHA-256 Hash make
MessageDigest digestObj = MessageDigest.getInstance("SHA-256");
byte[] hash_data = digestObj.digest(result.getBytes("UTF-8"));
// Base64 encoding
hashCode = Base64.getEncoder().encodeToString(hash_data);
log.info(LOG_PREFIX + "hashCode::" + hashCode);
} catch (Exception e) {
log.error("#-NexusService::getHashCode::Exception::" + e.getMessage());
}
return hashCode;
}
}

View File

@@ -0,0 +1,580 @@
package com.bb.api;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.Credit;
import com.bb.model.CreditPointSearch;
import com.bb.model.CreditSearchVO;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.service.CreditService;
import com.bb.service.SiteService;
import com.bb.util.IPKit;
import com.bb.util.PagingUtil;
import com.bb.util.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping(value = "/api/v1/credit")
public class ApiCreditController {
@Autowired
SiteService siteService;
@Autowired
CreditService creditService;
@Autowired
private final JwtManager jwtManager;
@ResponseBody
@PostMapping("/list")
public ApiResponse creditList(@RequestHeader String token, HttpServletRequest request, @RequestBody CreditSearchVO search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::CREDIT::creditList::"+tokenInfo.getSid()+"::::";
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(search);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
// 여기서 부터 로직
PageFormVO pageVo= new PageFormVO();
if(search.getSiteIdx() == null || search.getSiteId() == null || search.getSiteId().equals("")) {
search.setSiteId(site.getSiteId());
search.setSiteIdx((long) site.getSiteIdx());
}
if(search.getOrderStr() == null || search.getOrderStr().equals("")) {
search.setOrderStr("UPDATE_DESC");
}
search.setTransType(search.getTransType().trim());
if(search.getTransType().equals("AD-AI") || search.getTransType().equals("AD-AO") || search.getTransType().equals("AD")) {
// 관리자 지급/회수
search.setUpperSiteIdx((long) 2);
search.setUpperSiteId("tripleSuper");
search.setTargetSiteIdx(search.getSiteIdx());
search.setTargetSiteId(search.getSiteId());
search.setSearchSiteId("");
} else if(search.getTransType().equals("UP-AI") || search.getTransType().equals("UP-AO") || search.getTransType().equals("UP")) {
// 상부가 지급/회수
search.setTargetSiteIdx(search.getSiteIdx());
search.setTargetSiteId(search.getSiteId());
} else if(search.getTransType().equals("DW-AI") || search.getTransType().equals("DW-AO") || search.getTransType().equals("DW")) {
// 하부에 지급/회수
search.setUpperSiteIdx(search.getSiteIdx());
search.setUpperSiteId(search.getSiteId());
} else if(search.getTransType().equals("MAI") || search.getTransType().equals("MAO") || search.getTransType().equals("MAIO")) {
// 회원에 충전/환전
search.setUpperSiteIdx(search.getSiteIdx());
search.setUpperSiteId(search.getSiteId());
} else {
// 전체 검색
search.setUpperSiteIdx(search.getSiteIdx());
search.setUpperSiteId(search.getSiteId());
search.setTargetSiteIdx(search.getSiteIdx());
search.setTargetSiteId(search.getSiteId());
}
log.info(LOG_PREFIX+ "CreditSearchVO::"+search.toString());
int totalCount = creditService.getTransCreditListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(30);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
responseData.put("pageInfo", pageVo);
}
List<HashMap<String, Object>> list = creditService.getTransCreditList(search);
responseData.put("list", list);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/transaction")
public ApiResponse transaction(@RequestHeader String token, HttpServletRequest request, @RequestBody CreditSearchVO search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::CREDIT::transaction::"+tokenInfo.getSid()+"::::";
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(search);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
// 여기서 부터 로직
PageFormVO pageVo= new PageFormVO();
if(search.getSiteIdx() == null || search.getSiteId() == null || search.getSiteId().equals("")) {
search.setSiteId(site.getSiteId());
search.setSiteIdx((long) site.getSiteIdx());
}
if(search.getOrderStr() == null || search.getOrderStr().equals("")) {
search.setOrderStr("UPDATE_DESC");
}
search.setTransType(search.getTransType().trim());
search.setStartDatePartition(StringUtils.convertToDateOnly(search.getStartDate()));
search.setEndDatePartition(StringUtils.convertToDateOnly(search.getEndDate()));
if(search.getTransType().equals("AD-AI") || search.getTransType().equals("AD-AO") || search.getTransType().equals("AD")) {
// 관리자 지급/회수
search.setUpperSiteIdx((long) 2);
search.setUpperSiteId("tripleSuper");
search.setTargetSiteIdx(search.getSiteIdx());
search.setTargetSiteId(search.getSiteId());
search.setSearchSiteId("");
} else if(search.getTransType().equals("UP-AI") || search.getTransType().equals("UP-AO") || search.getTransType().equals("UP")) {
// 상부가 지급/회수
search.setTargetSiteIdx(search.getSiteIdx());
search.setTargetSiteId(search.getSiteId());
} else if(search.getTransType().equals("DW-AI") || search.getTransType().equals("DW-AO") || search.getTransType().equals("DW")) {
// 하부에 지급/회수
search.setUpperSiteIdx(search.getSiteIdx());
search.setUpperSiteId(search.getSiteId());
} else if(search.getTransType().equals("MAI") || search.getTransType().equals("MAO") || search.getTransType().equals("MAIO")) {
// 회원에 충전/환전
search.setUpperSiteIdx(search.getSiteIdx());
search.setUpperSiteId(search.getSiteId());
} else if(search.getTransType().equals("DP") || search.getTransType().equals("CD") || search.getTransType().equals("CDP")) {
// 회원 베팅/결과
search.setUpperSiteIdx(search.getSiteIdx());
search.setUpperSiteId(search.getSiteId());
} else {
// 전체 검색
search.setUpperSiteIdx(search.getSiteIdx());
search.setUpperSiteId(search.getSiteId());
search.setTargetSiteIdx(search.getSiteIdx());
search.setTargetSiteId(search.getSiteId());
}
log.info(LOG_PREFIX+ "CreditSearchVO::"+search.toString());
int totalCount = creditService.getTotalTransactionListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(30);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
responseData.put("pageInfo", pageVo);
}
List<HashMap<String, Object>> list = creditService.getTotalTransactionList(search);
responseData.put("list", list);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/addProc")
public ApiResponse addProc(@RequestHeader String token, HttpServletRequest request, @RequestBody Credit credit) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map data = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::CREDIT::addProc::"+tokenInfo.getSid()+"::::";
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(credit);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
// 여기서 부터 로직
if("tripleSuper".equals(site.getSiteId())){
apiResponse.setResultCode("9991");
apiResponse.setResultMessage("Super admin is not allow");
return apiResponse;
}
if("AI".equals(credit.getCreditType())) {
// 관리자 or 상부 직접 지급
long siteCredit = siteService.getSiteCredit(tokenInfo.getSid());
if(siteCredit < credit.getCreditAmt()) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("크레딧이 모자릅니다");
return apiResponse;
}
if(credit.getTargetSiteId() == null || credit.getTargetSiteId().equals("")) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("대상이 존재하지 않습니다");
return apiResponse;
}
credit.setInOut("IN");
credit.setCreditStatus(1);
credit.setSiteIdx(site.getSiteIdx());
credit.setSiteId(site.getSiteId());
} else if("AO".equals(credit.getCreditType())) {
// 관리자 or 상부 직접환급
if(credit.getTargetSiteId() == null || credit.getTargetSiteId().equals("")) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("대상이 존재하지 않습니다");
return apiResponse;
}
long targetSiteCredit = siteService.getSiteCredit(credit.getTargetSiteId());
if(targetSiteCredit < credit.getCreditAmt()) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("해당 에이젼시의 크레딧이 모자릅니다");
return apiResponse;
}
credit.setInOut("OUT");
credit.setCreditStatus(1);
credit.setSiteIdx(site.getSiteIdx());
credit.setSiteId(site.getSiteId());
} else {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("알 수 없는 요청");
return apiResponse;
}
log.info(LOG_PREFIX+ "Credit::AF::"+credit.toString());
int result = creditService.insertCredit(credit);
log.info(LOG_PREFIX+ "insertCredit result::"+result);
} catch(Exception e) {
log.error(e.toString());
e.printStackTrace();
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(data);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/pointList")
public ApiResponse pointList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody CreditPointSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::TRANS::betlist::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
PageFormVO pageVo = new PageFormVO();
search.setSearchSiteId(site.getSiteId());
search.setSearchSiteIdx((long) site.getSiteIdx());
search.setStartDate(search.getStartDate()+".000");
search.setEndDate(search.getEndDate()+".999");
if(search.getOrderStr() == null || search.getOrderStr().equals("")) {
search.setOrderStr("BETDATE_DESC");
}
log.info(LOG_PREFIX+ "CreditPointSearch::"+search.toString());
int totalCount = creditService.getCreditPointListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(30);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
responseData.put("pageInfo", pageVo);
}
List<HashMap<String, String>> list = creditService.getCreditPointList(search);
responseData.put("list", list);
} catch(Exception e) {
log.info(e.toString());
e.printStackTrace();
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/betList")
public ApiResponse betList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody CreditPointSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::TRANS::betlist::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
PageFormVO pageVo = new PageFormVO();
search.setSearchSiteId(site.getSiteId());
search.setSearchSiteIdx((long) site.getSiteIdx());
search.setStartDate(search.getStartDate()+".000");
search.setEndDate(search.getEndDate()+".999");
if(search.getOrderStr() == null || search.getOrderStr().equals("")) {
search.setOrderStr("BETDATE_DESC");
}
log.info(LOG_PREFIX+ "CreditPointSearch::"+search.toString());
search.setStartDatePartition(StringUtils.convertToDateOnly(search.getStartDate()));
search.setEndDatePartition(StringUtils.convertToDateOnly(search.getEndDate()));
int totalCount = creditService.getCreditBetListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(30);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
responseData.put("pageInfo", pageVo);
}
List<HashMap<String, String>> list = creditService.getCreditBetList(search);
responseData.put("list", list);
} catch(Exception e) {
log.info(e.toString());
e.printStackTrace();
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
}

View File

@@ -0,0 +1,382 @@
package com.bb.api;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.bb.jwt.JwtClame;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.BoardSearch;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import com.bb.service.SiteService;
import com.bb.service.StatService;
import com.bb.util.IPKit;
import com.bb.util.PagingUtil;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping(value = "/api/v1")
public class ApiMainController {
@Autowired
private final JwtManager jwtManager;
@Autowired
SiteService siteService;
@Autowired
StatService statService;
@ResponseBody
@PostMapping(value="/login")
public ApiResponse agentBalance(HttpServletRequest request, @RequestBody JSONObject requestBody) throws Exception {
ApiResponse apiResponse = new ApiResponse();
final String LOG_PREFIX = "#-NSOFT::LOGIN::"+requestBody.getString("apiId")+":::";
try {
// apiKey 체크
log.info(LOG_PREFIX+ "Request Body: "+requestBody.toString());
String agentId = requestBody.getString("apiId");
if(agentId != null && "tripleSuper".equals(agentId)){
apiResponse.setResultCode("9991");
apiResponse.setResultMessage("Super admin login is not allow");
return apiResponse;
}
if("".equals(agentId)) {
apiResponse.setResultCode("9998");
apiResponse.setResultMessage("apiId is not null");
return apiResponse;
}
String agentPwd = requestBody.getString("apiPwd");
if("".equals(agentPwd)) {
apiResponse.setResultCode("9998");
apiResponse.setResultMessage("agentPwd is not null");
return apiResponse;
}
Map loginParam = new HashMap();
loginParam.put("siteId", agentId);
loginParam.put("sitePwd", agentPwd);
Site siteLogin = siteService.getSiteLoginApi(loginParam);
if(siteLogin == null) {
apiResponse.setResultCode("9997");
apiResponse.setResultMessage("agent info check");
return apiResponse;
}
log.info(siteLogin.getIps() +","+IPKit.getIpAddressByRequest(request) );
if( !( siteLogin.getIps() == null || "".equals(siteLogin.getIps()) || "3.3.3.3".equals(siteLogin.getIps()) || siteLogin.getIps().indexOf(IPKit.getIpAddressByRequest(request)) >= 0 ) ) {
log.error("#API::LOGIN::"+siteLogin.getSiteId() +"::siteLogin.getIps("+siteLogin.getIps()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
apiResponse.setResultMessage("access denied IP");
return apiResponse;
}
JwtClame jwtinfo = new JwtClame();
jwtinfo.setSiteId(siteLogin.getSiteId());
String token = jwtManager.generateTokenAdmin(jwtinfo);
String refresh_token = jwtManager.generateTokenRefresh(jwtinfo);
Map data = new HashMap();
data.put("siteKey", siteLogin.getSiteKey());
data.put("token", token);
data.put("refresh_token", refresh_token);
data.put("isTransfer", siteLogin.getIsTransfer());
data.put("useParseStatMenu", siteLogin.getUseParseStatMenu());
log.info("#API::LOGIN::data::" + data.toString());
apiResponse.setData(data);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping(value="/myCredit")
public ApiResponse myCredit(@RequestHeader String token, HttpServletRequest request) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
log.info(token.toString());
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp() == null || "".equals(site.getSiteIp()) || "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0 ) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
apiResponse.setResultMessage("access denied IP");
return apiResponse;
}
//토큰체크
Map data = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
log.info(tokenInfo.getSid());
long siteCredit = siteService.getSiteCredit(tokenInfo.getSid());
long sitePoint = siteService.getSitePoint(tokenInfo.getSid());
data.put("credit", siteCredit);
data.put("point", sitePoint);
data.put("siteLevel", site.getSiteLevel());
if(site.getSiteLevel() == 1) {
HashMap creditInfo = siteService.getSiteSubCredit(tokenInfo.getSid());
data.put("subCreditInfo", creditInfo);
} else {
data.put("subCreditInfo", null);
}
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(data);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping(value="/myBetInfo")
public ApiResponse myBetInfo(@RequestHeader String token, HttpServletRequest request, @RequestBody JSONObject param) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
log.info(token.toString());
String authorization = request.getHeader("Authorization").toString();
log.info("#-myBetInfo::Authorization::"+authorization);
log.info("#-myBetInfo::param::"+param);
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp() == null || "".equals(site.getSiteIp()) || "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0 ) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
apiResponse.setResultMessage("access denied IP");
return apiResponse;
}
// TO DO 토큰체크
Map data = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
log.info("#-myBetInfo::site::"+tokenInfo.getSid());
SiteSearch search = new SiteSearch();
search.setSiteIdx(site.getSiteIdx());
search.setStartDate(param.getString("targetDate"));
log.info("#-myBetInfo::search::"+search);
List<HashMap> stat = statService.getDashBoardList(search) ;
data.put("info", stat);
List<HashMap> statM = statService.getDashBoardMonth(search) ;
data.put("infoM", statM);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(data);
apiResponse.success();
} catch (Exception e) {
log.error("#-myBetInfo::Exception::"+ e.getMessage());
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/board/list")
public ApiResponse boardList(@RequestHeader String token, HttpServletRequest request, @RequestBody BoardSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::MAIN::boardList::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
search.setSiteIdx(site.getSiteIdx());
search.setSiteId(tokenInfo.getSid());
log.info(LOG_PREFIX + "BoardSearch::"+search);
if(search.getViewType() == null || search.getViewType().equals("")) {
search.setViewType("main");
}
if(search.getBoardType() == null || search.getBoardType().equals("")) {
search.setBoardType("notice");
}
if(search.getViewType().equals("main")) {
List<HashMap<String, Object>> list = siteService.getBoardList(search);
responseData.put("boardList", list);
} else {
PageFormVO pageVo = new PageFormVO();
int totalCount = siteService.getBoardListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(30);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
responseData.put("pageInfo", pageVo);
}
List<HashMap<String, Object>> list = siteService.getBoardList(search);
responseData.put("boardList", list);
}
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@GetMapping("/board/{boardIdx}")
public ApiResponse boardList(@RequestHeader String token, HttpServletRequest request, @PathVariable long boardIdx) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::MAIN::boardList::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
log.info(LOG_PREFIX + "BoardIdx::"+boardIdx);
HashMap<String, Object> detail = siteService.getBoardDetail(boardIdx);
responseData.put("boardDetail", detail);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
}

View File

@@ -0,0 +1,407 @@
package com.bb.api;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.servlet.http.HttpServletRequest;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.CmnSearch;
import com.bb.model.Site;
import com.bb.model.SiteVendorSkinVO;
import com.bb.service.BetRadarService;
import com.bb.service.SettingService;
import com.bb.service.SiteService;
import com.bb.util.IPKit;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping(value = "/api/v1/setting")
public class ApiSettingController {
@Autowired
SiteService siteService;
@Autowired
SettingService settingService;
@Autowired
BetRadarService betRadarService;
@Autowired
private final JwtManager jwtManager;
@ResponseBody
@PostMapping("/vendor")
public ApiResponse settingVendorList(@RequestHeader String token, HttpServletRequest request, @RequestBody CmnSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::SETTING::settingVendorList::"+tokenInfo.getSid()+"::::";
// POJO to JSON
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(search);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
// 여기서 부터 로직
if(search.getSiteIdx() == null || search.getSiteIdx() == 0) {
search.setSiteIdx((long) site.getSiteIdx());
search.setSiteId(tokenInfo.getSid());
}
log.info(LOG_PREFIX + "CmnSearch::"+search.toString());
List<HashMap<String, Object>> list = settingService.getSettingVendorList(search);
for(HashMap<String, Object> item : list) {
Long vendorIdx = (Long) item.get("vendorIdx");
String vendorTitle = item.get("vendorTitle").toString();
search.setVendorIdx(vendorIdx);
search.setVendorTitle(vendorTitle);
List<HashMap<String, Object>> skinList = settingService.getSettingSkinList(search);
item.put("skinList", skinList);
}
responseData.put("list", list);
} catch(Exception e) {
e.printStackTrace();
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/skin")
public ApiResponse settingSkinList(@RequestHeader String token, HttpServletRequest request, @RequestBody CmnSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::SETTING::settingSkinList::"+tokenInfo.getSid()+"::::";
// POJO to JSON
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(search);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
// 여기서 부터 로직
log.info(LOG_PREFIX + "CmnSearch::"+search.toString());
List<HashMap<String, Object>> list = settingService.getSettingSkinList(search);
responseData.put("list", list);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/vendor/save")
public ApiResponse settingVendorSave(@RequestHeader String token, HttpServletRequest request, @RequestBody List<SiteVendorSkinVO> param) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::SETTING::settingSkinList::"+tokenInfo.getSid()+"::::";
// POJO to JSON
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(param);
JSONArray reqObj = new JSONArray(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
// 여기서 부터 로직
log.info(LOG_PREFIX + "List<SiteVendorSkinVO>::"+param.toString());
for(SiteVendorSkinVO item : param) {
if(!item.getCategory().equals("CASINO") && !item.getCategory().equals("HCASINO")) {
item.setSkinType("A");
}
switch (item.getSkinType()) {
case "A": item.setNexusSkinType("A");
item.setExtrSkinType("1");
break;
case "B": item.setNexusSkinType("B");
item.setExtrSkinType("2");
break;
case "C": item.setNexusSkinType("C");
item.setExtrSkinType("3");
break;
case "D": item.setNexusSkinType("D");
item.setExtrSkinType("4");
break;
case "E": item.setNexusSkinType("E");
item.setExtrSkinType("5");
break;
case "F": item.setNexusSkinType("E");
item.setExtrSkinType("6");
break;
case "G": item.setNexusSkinType("E");
item.setExtrSkinType("7");
break;
case "H": item.setNexusSkinType("E");
item.setExtrSkinType("8");
break;
case "I": item.setNexusSkinType("E");
item.setExtrSkinType("9");
break;
case "J": item.setNexusSkinType("E");
item.setExtrSkinType("10");
break;
default: item.setNexusSkinType("A");
item.setExtrSkinType("1");
break;
}
int saveResult = settingService.settingVendorSkinSave(item);
log.info(LOG_PREFIX + "vendorIdx::"+item.getVendorIdx()+"::saveResult::"+saveResult);
}
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/whiteIp")
public ApiResponse whiteIpList(@RequestHeader String token, HttpServletRequest request, @RequestBody CmnSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::SETTING::whiteIpList::"+tokenInfo.getSid()+"::::";
// POJO to JSON
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(search);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
// 여기서 부터 로직
if(search.getSiteIdx() == null || search.getSiteIdx() == 0) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("대상이 존재하지 않습니다");
return apiResponse;
}
log.info(LOG_PREFIX + "CmnSearch::"+search.toString());
List<String> list = settingService.getWhiteIpList(search);
responseData.put("list", list);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/getSportsSetting")
public ApiResponse getSportsSetting(@RequestHeader String token, HttpServletRequest request) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::SETTING::getSportsSetting::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
HashMap<String, String> apiInfo = settingService.getBetRadarApiInfo(tokenInfo.getSid());
if(apiInfo == null || apiInfo.get("apiKey") == null) {
apiResponse.setResultCode("8888");
apiResponse.setResultMessage("Not found 'BetRadar' settings..");
log.info(LOG_PREFIX+ "Not found 'BetRadar' settings..");
return apiResponse;
}
log.info(LOG_PREFIX + "ApiInfo::"+apiInfo.toString());
String url = betRadarService.getSportsSetting(LOG_PREFIX, apiInfo);
responseData.put("url", url);
} catch(Exception e) {
e.printStackTrace();
log.info("#-API::SETTING::getSportsSetting::"+ e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
log.info("#-API::SETTING::getSportsSetting::"+ e.toString());
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,389 @@
package com.bb.api;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.validation.Valid;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.CashParam;
import com.bb.model.Credit;
import com.bb.model.Member;
import com.bb.model.PageFormVO;
import com.bb.model.Site;
import com.bb.model.UserSearch;
import com.bb.service.CreditService;
import com.bb.service.SiteService;
import com.bb.service.StatService;
import com.bb.util.IPKit;
import com.bb.util.PagingUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Controller
@RequiredArgsConstructor
@RequestMapping(value = "/api/v1/user")
public class ApiUserController {
@Autowired
SiteService siteService;
@Autowired
StatService statService;
@Autowired
CreditService creditService;
@Autowired
private final JwtManager jwtManager;
@ResponseBody
@PostMapping("/list")
public ApiResponse userList(@RequestHeader String token, HttpServletRequest request, @Valid @RequestBody UserSearch search) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::USER::userList::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
PageFormVO pageVo= new PageFormVO();
search.setSiteId(site.getSiteId());
search.setSiteIdx((long) site.getSiteIdx());
search.setTopId(tokenInfo.getSid());
log.info(LOG_PREFIX+ "UserSearch::"+search.toString());
int totalCount = siteService.getUserListCnt(search);
if (totalCount != 0) {
PageFormVO commonForm = new PageFormVO();
commonForm.setFunction_name("goPage");
commonForm.setPage(search.getPage());
commonForm.setCount_per_page(20);
if(search.getCount_per_list()==0) {
commonForm.setCount_per_list(30);
} else {
commonForm.setCount_per_list(search.getCount_per_list());
}
commonForm.setTatal_list_count(totalCount);
pageVo = PagingUtil.setPageUtil(commonForm);
search.setLimit(pageVo.getLimit());
search.setOffset(pageVo.getOffset());
search.setTatal_list_count(totalCount);
responseData.put("pageInfo", pageVo);
}
List<HashMap<String, Object>> list = siteService.getUserList(search);
responseData.put("list", list);
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@GetMapping("/detail/{siteIdx}/{memberIdx}")
public ApiResponse userDetail( @RequestHeader String token, HttpServletRequest request, @PathVariable long siteIdx, @PathVariable long memberIdx) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
log.info(token.toString());
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp() == null || "".equals(site.getSiteIp()) || "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0 ) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
apiResponse.setResultMessage("access denied IP");
return apiResponse;
}
// TO DO 토큰체크
Map responseData = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::USER::userDetail::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
UserSearch search = new UserSearch();
search.setSiteIdx(siteIdx);
search.setMemberIdx(memberIdx);
search.setTopId(tokenInfo.getSid());
log.info(LOG_PREFIX+ "UserSearch::"+search.toString());
HashMap<String, Object> targetUser = siteService.getUserDetail(search);
responseData.put("targetUser", targetUser); // 유저 상세정보
boolean isMyAgent = false;
List<HashMap> treeInfo = (List<HashMap>) targetUser.get("treeInfo");
for(HashMap item : treeInfo) {
if(tokenInfo.getSid().equals(item.get("upperSiteId").toString())) {
isMyAgent = true;
}
}
if(!isMyAgent) {
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
// TODO : 에이전트 상세 베팅통계 데이터
// TODO : 에이전트 상세 베팅통계 데이터
HashMap ydayBetInfo = statService.getYdayBetInfoByUser(targetUser);
log.info(LOG_PREFIX+ "ydayBetInfo {}", ydayBetInfo);
HashMap monthBetInfo = statService.getMonthBetInfoByUser(targetUser);
log.info(LOG_PREFIX+ "monthBetInfo {}", monthBetInfo);
responseData.put("ydayBetInfo", ydayBetInfo); // 어제 배팅통계
responseData.put("monthBetInfo", monthBetInfo); // 이번달 배팅통계
} catch(Exception e) {
log.info(e.toString());
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.setData(responseData);
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@PostMapping("/cashInOut")
public ApiResponse cashInOut(@RequestHeader String token, HttpServletRequest request, @RequestBody CashParam param) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
Site site = siteService.getSiteInfoAPI(request);
if(site == null) {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("Authorization apiKey check");
return apiResponse;
}
if( !( site.getSiteIp()==null || "".equals(site.getSiteIp())
|| "3.3.3.3".equals(site.getSiteIp()) || site.getSiteIp().indexOf(IPKit.getIpAddressByRequest(request)) >= 0) ) {
log.error("site.getSiteIp("+site.getSiteIp()+"), denied" + IPKit.getIpAddressByRequest(request));
apiResponse.setResultCode("10001");
return apiResponse;
}
// TO DO 토큰체크
Map data = new HashMap();
try {
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfoAdmin(token);
final String LOG_PREFIX = "#-API::CASH::cashInOut::"+tokenInfo.getSid()+"::::";
// 여기서 부터 로직
ObjectMapper objectMapper = new ObjectMapper();
String reqJsonStr = objectMapper.writeValueAsString(param);
JSONObject reqObj = new JSONObject(reqJsonStr);
log.info(LOG_PREFIX+ "Request {}", reqObj);
if("tripleSuper".equals(site.getSiteId())){
apiResponse.setResultCode("9991");
apiResponse.setResultMessage("Super admin is not allow");
return apiResponse;
}
if("N".equals(site.getIsTransfer())) {
apiResponse.setResultCode("9992");
apiResponse.setResultMessage("NOT_TRANSFER_SITE");
return apiResponse;
}
//회원정보
param.setSiteIdx(site.getSiteIdx());
Member member = siteService.getMember2(param);
if(member == null) {
// Fail
log.error(LOG_PREFIX+ "9993:NOT_FOUND_USER");
apiResponse.setResultCode("9993");
apiResponse.setResultMessage("NOT_FOUND_USER");
return apiResponse;
}
log.info(LOG_PREFIX+ "Member::"+member.toString());
long amount = Long.parseLong(param.getAmount());
// Insert credit_info : MAI, IN / MAO, OUT
Credit credit = new Credit();
credit.setSiteIdx(site.getSiteIdx());
credit.setSiteId(site.getSiteId());
credit.setTargetSiteIdx(member.getMemberIdx());
credit.setTargetSiteId(member.getMemberId());
credit.setCreditType(param.getCreditType());
if("MAI".equals(credit.getCreditType())) {
// 관리자 > 회원 보유금 지급
long siteCredit = site.getCredit();
if(siteCredit < amount) {
log.error(LOG_PREFIX+ "9994:사이트 크레딧 부족");
apiResponse.setResultCode("9994");
apiResponse.setResultMessage("사이트 크레딧 부족");
return apiResponse;
}
credit.setCreditRate(null);
credit.setInOut("IN");
credit.setTranId("회원 보유금 지급");
credit.setCreditAmt(Long.parseLong(param.getAmount()));
credit.setUserAmt(Long.parseLong(param.getAmount()));
credit.setCreditStatus(1);
credit.setWaitTime(-5); // 재요청 대기시간 5초
credit.setPreBalance(member.getUserBalance());
int cnt = creditService.checkRequestTime(credit);
if(cnt > 0) {
// Fail
log.error(LOG_PREFIX+ "T1005:재요청 대기시간 5초");
apiResponse.setResultCode("T1005");
apiResponse.setResultMessage("재요청 대기시간 5초");
return apiResponse;
}
log.info(LOG_PREFIX+ "Credit::"+credit.toString());
int result = creditService.insertCreditByCash(credit);
log.info(LOG_PREFIX+ "insertCredit result::"+result);
if(result < 0) {
// Fail
log.error(LOG_PREFIX+ "T1009:DEPOSIT_FAIL");
apiResponse.setResultCode("T1009");
apiResponse.setResultMessage("DEPOSIT_FAIL");
return apiResponse;
}
} else if("MAO".equals(credit.getCreditType())) {
// 관리자 < 회원 보유금 회수
long userBalance = member.getUserBalance();
if(param.getWithAll() != null && param.getWithAll().equals("Y")) {
amount = userBalance;
param.setAmount(Long.toString(amount));
}
if(userBalance < amount) {
log.error(LOG_PREFIX+ "9995:유저 잔액 부족");
apiResponse.setResultCode("9995");
apiResponse.setResultMessage("유저 잔액 부족");
return apiResponse;
}
credit.setCreditRate(null);
credit.setInOut("OUT");
credit.setTranId("회원 보유금 회수");
credit.setCreditAmt(Long.parseLong(param.getAmount()));
credit.setUserAmt(Long.parseLong(param.getAmount()));
credit.setCreditStatus(1);
credit.setWaitTime(-5); // 재요청 대기시간 5초
credit.setPreBalance(member.getUserBalance());
int cnt = creditService.checkRequestTime(credit);
if(cnt > 0) {
// Fail
log.error(LOG_PREFIX+ "T1005:재요청 대기시간 5초");
apiResponse.setResultCode("T1005");
apiResponse.setResultMessage("재요청 대기시간 5초");
return apiResponse;
}
log.info(LOG_PREFIX+ "Credit::"+credit.toString());
int result = creditService.insertCreditByCash(credit);
log.info(LOG_PREFIX+ "insertCredit result::"+result);
if(result < 0) {
// Fail
log.error(LOG_PREFIX+ "T1009:WITHDRAW_FAIL");
apiResponse.setResultCode("T1009");
apiResponse.setResultMessage("WITHDRAW_FAIL");
return apiResponse;
}
} else {
apiResponse.setResultCode("9999");
apiResponse.setResultMessage("알 수 없는 요청");
return apiResponse;
}
} catch(Exception e) {
log.error(e.toString());
e.printStackTrace();
apiResponse.setResultCode("99995");
apiResponse.setResultMessage("token is no valid");
return apiResponse;
}
apiResponse.success();
} catch (Exception e) {
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
}

View File

@@ -0,0 +1,62 @@
package com.bb.common.bean;
import java.util.concurrent.TimeUnit;
import jakarta.annotation.Resource;
//import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import com.bb.common.model.OutLoginVO;
import com.bb.util.TempKey;
import com.google.gson.Gson;
//@Component
/*
public class RedisSession {
@Resource(name="redisTemplate")
private ValueOperations<String, String> tokens;
private Gson gson = new Gson();
public String getToken(OutLoginVO outLoginVO) {
TempKey tempKey = new TempKey();
String newToken = tempKey.getKey(300);
String oldToken = getCheckId(outLoginVO);
String token = null;
if(oldToken == null) {
token = newToken;
}else {
token = oldToken;
}
setToken(token, outLoginVO);
return token;
}
private String getCheckId(OutLoginVO outLoginVO) {
String oldToken = (String) tokens.get(outLoginVO.getId()+outLoginVO.getDomain());
return oldToken;
}
private void setToken(String token, OutLoginVO outLoginVO) {
if(outLoginVO.getTimeout()==0 || outLoginVO.getTimeUnit()==null) {
tokens.set(token, gson.toJson(outLoginVO), 30, TimeUnit.MINUTES);
tokens.set(outLoginVO.getId()+outLoginVO.getDomain(), token, 30, TimeUnit.MINUTES);
}else {
tokens.set(token, gson.toJson(outLoginVO), outLoginVO.getTimeout(), outLoginVO.getTimeUnit());
tokens.set(outLoginVO.getId()+outLoginVO.getDomain(), token, outLoginVO.getTimeout(), outLoginVO.getTimeUnit());
}
}
public OutLoginVO getUserVO(String token) {
OutLoginVO outLoginVO = gson.fromJson(tokens.get(token), OutLoginVO.class);
if(outLoginVO != null) {
setToken(token, outLoginVO);
}
return outLoginVO;
}
}
*/

View File

@@ -0,0 +1,11 @@
package com.bb.common.controller;
public class BetResultProcController {
//베팅결과 가져와서 우리족 디비에넣고 해당사이트에로 연동 URL 보내주기 (베팅 , 당첨 )
//해당 사이트 크레딧 처리
}

View File

@@ -0,0 +1,39 @@
package com.bb.common.model;
public class InChatMessageVO {
private String token; // 사용자 정보를 가져올 토큰
private String content; // 메세지 내용
private String type; // 채팅 타입
private String chatId; // 채팅 고유 아이디
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public String getChatId() {
return chatId;
}
public void setChatId(String chatId) {
this.chatId = chatId;
}
@Override
public String toString() {
return "InChatMessageVO [token=" + token + ", content=" + content + ", type=" + type + ", chatId=" + chatId
+ "]";
}
}

View File

@@ -0,0 +1,43 @@
package com.bb.common.model;
public class OutChatMessageVO {
private String id;
private String content;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
@Override
public String toString() {
return "OutChatMessageVO [id=" + id + ", content=" + content + "]";
}
}

View File

@@ -0,0 +1,51 @@
package com.bb.common.model;
import java.io.Serializable;
import java.util.concurrent.TimeUnit;
public class OutLoginVO implements Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String domain;
private int timeout;
private TimeUnit timeUnit;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDomain() {
return domain;
}
public void setDomain(String domain) {
this.domain = domain;
}
public int getTimeout() {
return timeout;
}
public void setTimeout(int timeout) {
this.timeout = timeout;
}
public TimeUnit getTimeUnit() {
return timeUnit;
}
public void setTimeUnit(TimeUnit timeUnit) {
this.timeUnit = timeUnit;
}
@Override
public String toString() {
return "OutLoginVO [id=" + id + ", name=" + name + ", domain=" + domain + ", timeout=" + timeout + ", timeUnit="
+ timeUnit + "]";
}
}

View File

@@ -0,0 +1,125 @@
package com.bb.config;
/*
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import jakarta.servlet.*;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@Component
public class AccessLogFilter implements Filter {
private static final Logger LOG = LoggerFactory.getLogger(AccessLogFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
CustomRequestWrapper customRequestWrapper = new CustomRequestWrapper((HttpServletRequest) servletRequest);
String accessLog = buildAccessLog(customRequestWrapper);
LOG.info(accessLog);
try {
filterChain.doFilter(customRequestWrapper, servletResponse);
} finally {
customRequestWrapper.setBody(null);
}
}
private String buildAccessLog(CustomRequestWrapper customRequestWrapper) {
String requestURL = getRequestURL(customRequestWrapper);
String remoteAddr = getRemoteAddr(customRequestWrapper);
String method = getMethod(customRequestWrapper);
String queryString = getQueryString(customRequestWrapper);
String requestBody = getRequestBody(customRequestWrapper);
StringBuilder sb = new StringBuilder();
sb.append("##### ACCESS LOG {");
if (requestURL != null) {
sb
.append("\"").append("requestURL").append("\"")
.append(":")
.append("\"").append(requestURL).append("\"");
}
if (remoteAddr != null) {
sb
.append(",")
.append("\"").append("remoteAddr").append("\"")
.append(":")
.append("\"").append(remoteAddr).append("\"");
}
if (method != null) {
sb
.append(",")
.append("\"").append("method").append("\"")
.append(":")
.append("\"").append(method).append("\"");
}
if (queryString != null) {
sb
.append(",")
.append("\"").append("queryString").append("\"")
.append(":")
.append("\"").append(queryString).append("\"");
}
if (requestBody != null && requestBody.length() > 0) {
sb
.append(",")
.append("\"").append("body").append("\"")
.append(":")
.append("\"").append(requestBody).append("\"");
}
sb.append("}");
return sb.toString();
}
private String getRequestBody(CustomRequestWrapper customRequestWrapper) {
String content = null;
String method = customRequestWrapper.getMethod().toLowerCase();
// POST, PUT + application/json
if (method.startsWith("p")) {
if (customRequestWrapper.getContentType().toLowerCase().indexOf("json") > 0) {
try {
content = new String(customRequestWrapper.getBody(), customRequestWrapper.getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
LOG.error(e.getMessage());
}
}
}
return content;
}
private String getQueryString(CustomRequestWrapper customRequestWrapper) {
String queryString = null;
if (customRequestWrapper.getQueryString() != null) {
queryString = customRequestWrapper.getQueryString();
}
return queryString;
}
private String getMethod(CustomRequestWrapper customRequestWrapper) {
return customRequestWrapper.getMethod();
}
private String getRemoteAddr(CustomRequestWrapper customRequestWrapper) {
return customRequestWrapper.getRemoteAddr();
}
private String getRequestURL(CustomRequestWrapper customRequestWrapper) {
return customRequestWrapper.getRequestURL().toString();
}
}
*/

View File

@@ -0,0 +1,39 @@
package com.bb.config;
import java.io.IOException;
import jakarta.servlet.Filter;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.ServletRequest;
import jakarta.servlet.ServletResponse;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import com.bb.util.StringUtils;
@Component
public class ApiKeyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse res = (HttpServletResponse) response;
String reqKey = req.getHeader("Authorization");
if (StringUtils.isEmpty(reqKey)) {
res.setStatus(HttpStatus.UNAUTHORIZED.value());
} else {
request.setAttribute("Authorization", reqKey);
chain.doFilter(request, response);
}
}
}

View File

@@ -0,0 +1,59 @@
package com.bb.config;
import java.util.concurrent.Executor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurerSupport;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
@EnableAsync
public class AsyncConfig extends AsyncConfigurerSupport {
// 기본 실행 대기하는 Thread의 수
private final int CORE_POOL_SIZE = 10;
// 동시 동작하는 최대 Thread의 수
private final int MAX_POOL_SIZE = 50;
// MaxPoolSize 초과 요청에서 Thread 생성 요청 시, 해당 요청을 Queue에 저장하는데 이때 최대 수용 가능한 Queue의 수
private final int QUEUE_CAPACITY = 500;
// maxPoolSize가 모두 사용되다가 idle(쓰레드 휴식상태)로 돌아갔을 때 종료하기까지 대기하는 걸리는 시간
private final int KEEP_ALIVE_SECONDS = 60;
// 생성되는 Thread 접두사 지정
private final String CUSTOM_THREAD_NAME_PREFIX = "HSLOT-ASYNC-";
// 시스템을 종료(shutdown)할 때 queue에 남아있는 작업을 모두 완료한 후 종료 하도록 처리
private final boolean WAIT_FOR_TASKS_TO_COMPLETE_ON_SHOUTDOWN = true;
@Override
public Executor getAsyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(CORE_POOL_SIZE);
executor.setMaxPoolSize(MAX_POOL_SIZE);
executor.setQueueCapacity(QUEUE_CAPACITY);
executor.setKeepAliveSeconds(KEEP_ALIVE_SECONDS);
executor.setThreadNamePrefix(CUSTOM_THREAD_NAME_PREFIX);
executor.setWaitForTasksToCompleteOnShutdown(WAIT_FOR_TASKS_TO_COMPLETE_ON_SHOUTDOWN);
executor.initialize();
return executor;
}
// 포인트 처리 전용 Executor 추가
@Bean(name = "pointTaskExecutor")
public Executor pointTaskExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(5);
executor.setMaxPoolSize(10);
executor.setQueueCapacity(100);
executor.setKeepAliveSeconds(60);
executor.setThreadNamePrefix("PointAsync-");
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.initialize();
return executor;
}
}

View File

@@ -0,0 +1,35 @@
package com.bb.config;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import javax.xml.transform.Result;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import org.springframework.stereotype.Component;
/**
* 로그인 실패 핸들러
*
* @author wedul
*
*/
@Component
public class AuthFailureHandler extends SimpleUrlAuthenticationFailureHandler {
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
AuthenticationException exception) throws IOException, ServletException {
ObjectMapper om = new ObjectMapper();
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
//response.getWriter().print(om.writeValueAsString("FAIL"));
//response.getWriter().flush();
response.sendRedirect(request.getContextPath() + "/login?code=1");
}
}

View File

@@ -0,0 +1,144 @@
package com.bb.config;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;
import com.bb.admin.controller.MainController;
import com.bb.exception.ApiException;
import com.bb.model.OTPInfo;
import com.bb.model.Site;
import com.bb.service.SiteService;
import com.bb.util.TOTPTokenGenerator;
import lombok.extern.slf4j.Slf4j;
/**
* Description: 스프링시큐리티 로그인 인증
* Path : 스프링시큐리티
* @FileName : AsRepairController.java
* @Version : 2019. 8. 27.
* @Author : LeeChunghan
* @Comment :
*/
@Slf4j
@Component("authProvider")
public class AuthProvider implements AuthenticationProvider {
@Autowired
SiteService siteService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String id = authentication.getName();
String password = authentication.getCredentials().toString();
String verificationCode = ((CustomWebAuthenticationDetails) authentication.getDetails()).getVerificationCode();
final String LOG_PREFIX = "#-AP::"+id+":::";
log.info(LOG_PREFIX+ "Authentication::"+authentication.toString());
log.info(LOG_PREFIX+ "verificationCode::"+verificationCode);
Site agency = null;
boolean isAdmin = false;
if(!"".equals(id)) {
log.info(LOG_PREFIX+ "Super Login!!!");
isAdmin = true;
agency = siteService.getSiteLogin(authentication);
} else {
log.info(LOG_PREFIX+ "Guest Login!!!");
isAdmin = false;
agency = siteService.getGuestLogin();
id = "oms";
}
OTPInfo otpInfo = siteService.getOtpInfo(agency.getSiteIdx());
if(otpInfo == null || otpInfo.getAccount().equals("")) {
log.error(LOG_PREFIX+ "OTP 정보를 찾을 수 없습니다.");
return null;
}
if(otpInfo.getSecretKey() == null || otpInfo.getSecretKey().equals("")) {
// Create New OTP
otpInfo = TOTPTokenGenerator.getGoogleAuthQRUrl(otpInfo);
log.info(LOG_PREFIX+ "makeOtp:: secret : " + otpInfo.getSecretKey());
log.info(LOG_PREFIX+ "makeOtp::account : " + otpInfo.getAccount());
log.info(LOG_PREFIX+ "makeOtp:: issuer : " + otpInfo.getIssuer());
log.info(LOG_PREFIX+ "makeOtp:: URL : " + otpInfo.getUrl());
int result = siteService.registSuperOtp(otpInfo);
log.info(LOG_PREFIX+ "makeOtp:: result : " + result);
} else {
log.info(LOG_PREFIX+ "OTP Info : " + otpInfo);
String secret = otpInfo.getSecretKey();
if(verificationCode == null || verificationCode.equals("")) {
log.error(LOG_PREFIX+ "OTP 번호를 입력하세요.");
return null;
}
boolean chkOtp = TOTPTokenGenerator.otpVerify(secret, Integer.parseInt(verificationCode));
if(!chkOtp) {
log.error(LOG_PREFIX+ "OTP 번호가 일치하지 않습니다.");
return null;
}
}
if(isAdmin) {
OTPInfo otpManager = siteService.getOtpInfoByManger(agency.getSiteIdx());
if(otpManager.getSecretKey() == null || otpManager.getSecretKey().equals("")) {
// Create New Manager OTP
otpManager = TOTPTokenGenerator.getGoogleAuthQRUrl(otpManager);
log.info(LOG_PREFIX+ "Manager makeOtp:: secret : " + otpManager.getSecretKey());
log.info(LOG_PREFIX+ "ManagermakeOtp::account : " + otpManager.getAccount());
log.info(LOG_PREFIX+ "ManagermakeOtp:: issuer : " + otpManager.getIssuer());
log.info(LOG_PREFIX+ "ManagermakeOtp:: URL : " + otpManager.getUrl());
log.info(LOG_PREFIX+ "Manager otpManager:: " + otpManager.toString());
int result = siteService.registSuperOtp(otpManager);
log.info(LOG_PREFIX+ "ManagermakeOtp:: result : " + result);
}
}
if(agency == null) {
return null;
} else {
Site loginVO = new Site();
loginVO = agency;
List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
if(isAdmin) {
roles.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
} else {
roles.add(new SimpleGrantedAuthority("ROLE_GUEST"));
}
UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken(id, password, roles);
result.setDetails(loginVO);
// log.info(LOG_PREFIX+ "UsernamePasswordAuthenticationToken result::"+result.getDetails().toString());
return result;
}
}
@Override
public boolean supports(Class<?> authentication) {
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}

View File

@@ -0,0 +1,89 @@
package com.bb.config;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import com.bb.common.model.OutLoginVO;
import com.bb.model.Site;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContext;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationSuccessHandler;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
import org.springframework.security.web.context.SecurityContextRepository;
import org.springframework.stereotype.Component;
/**
* Description: 스프링시큐리티 인증 성공 핸들러 (Spring Security 6 대응)
* 작성된 코드에서 JSON 출력 로직을 제거하고 명시적 세션 저장을 추가했습니다.
*/
@Slf4j
@Component
public class AuthSuccessHandler extends SimpleUrlAuthenticationSuccessHandler {
// [1번 방식 핵심] SecurityContextConfig에서 등록한 빈을 주입받아 사용합니다.
// 이를 통해 SecurityConfig와의 순환 참조 문제를 해결합니다.
@Autowired
private SecurityContextRepository securityContextRepository;
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws ServletException, IOException {
// 1. [핵심] SecurityContext 생성 및 명시적 저장
// Spring Security 6부터는 이 과정이 있어야 리다이렉트 후 @Secured가 권한을 올바르게 인식합니다.
SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(authentication);
SecurityContextHolder.setContext(context);
// [수정] 빈으로 주입받은 repository를 통해 세션에 SecurityContext를 영구 저장 (Persistence)
securityContextRepository.saveContext(context, request, response);
request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, context);
// 2. 로그인 사용자 정보 추출 (UserDetails 대신 사용 중인 Site 객체)
Site login = (Site) authentication.getDetails();
final String LOG_PREFIX = "#-AS::" + (login != null ? login.getSiteId() : "Unknown") + ":::";
String authorities = authentication.getAuthorities()
.stream()
.map(GrantedAuthority::getAuthority)
.reduce((a, b) -> a + ", " + b)
.orElse("없음");
log.info(LOG_PREFIX + "로그인 성공 - 권한: " + authorities);
// 3. 커스텀 세션 정보 저장
HttpSession session = request.getSession(true);
session.setAttribute("user", login);
// 4. 권한에 따른 리다이렉트 경로 결정
String targetUrl;
if (authorities.contains("ROLE_ADMIN")) {
// 관리자 세션 추가 정보 설정 (필요 시)
OutLoginVO outLoginVO = new OutLoginVO();
outLoginVO.setDomain(login != null ? login.getDomain() : "");
outLoginVO.setId(login != null ? login.getSiteId() : "");
targetUrl = "/index";
} else {
targetUrl = "/guest/simpleReport";
}
log.info(LOG_PREFIX + "Redirecting to: " + targetUrl);
// 5. 리다이렉트 실행 (Clear prior attributes and redirect)
clearAuthenticationAttributes(request);
getRedirectStrategy().sendRedirect(request, response, targetUrl);
}
}

View File

@@ -0,0 +1,33 @@
package com.bb.config;
import jakarta.servlet.ReadListener;
import jakarta.servlet.ServletInputStream;
import java.io.ByteArrayInputStream;
public class CachedByteArrayInputStream extends ServletInputStream {
private ByteArrayInputStream in;
public CachedByteArrayInputStream(byte[] body) {
this.in = new ByteArrayInputStream(body);
}
@Override
public boolean isFinished() {
return false;
}
@Override
public boolean isReady() {
return false;
}
@Override
public void setReadListener(ReadListener readListener) {
}
@Override
public int read() {
return in.read();
}
}

View File

@@ -0,0 +1,23 @@
package com.bb.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class CorsConfig implements WebMvcConfigurer{
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/api/**")
.allowedOriginPatterns("*")
.allowedHeaders("*") // 어떤 헤더들을 허용할 것인지
.allowedMethods("*") // 어떤 메서드를 허용할 것인지 (GET, POST...)
.allowCredentials(false) // 쿠키 요청을 허용한다(다른 도메인 서버
.maxAge(86400);
WebMvcConfigurer.super.addCorsMappings(registry);
}
}

View File

@@ -0,0 +1,45 @@
package com.bb.config;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletRequestWrapper;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.IOException;
public class CustomRequestWrapper extends HttpServletRequestWrapper {
private byte[] body;
public CustomRequestWrapper(HttpServletRequest httpServletRequest) {
super(httpServletRequest);
try {
// this.body = IOUtils.toByteArray(httpServletRequest.getInputStream());
DataInputStream dis = new DataInputStream(httpServletRequest.getInputStream());
ByteArrayOutputStream os = new ByteArrayOutputStream();
// byte[] buffer = new byte[0xFFFF];
byte[] buffer = new byte[1024];
for (int len = dis.read(buffer); len != -1; len = dis.read(buffer)) {
os.write(buffer, 0, len);
}
os.flush();
this.body = os.toByteArray();
} catch (IOException ioe) {
System.out.println("IOException");
}
}
public byte[] getBody() {
return body;
}
public void setBody(byte[] body) {
this.body = body;
}
@Override
public ServletInputStream getInputStream() {
return new CachedByteArrayInputStream(this.body);
}
}

View File

@@ -0,0 +1,25 @@
package com.bb.config;
import org.springframework.stereotype.Component;
import org.springframework.web.filter.OncePerRequestFilter;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
public class CustomServletWrappingFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
ContentCachingRequestWrapper wrappingRequest = new ContentCachingRequestWrapper(request);
ContentCachingResponseWrapper wrappingResponse = new ContentCachingResponseWrapper(response);
filterChain.doFilter(wrappingRequest, wrappingResponse);
wrappingResponse.copyBodyToResponse();
}
}

View File

@@ -0,0 +1,20 @@
package com.bb.config;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
public class CustomWebAuthenticationDetails extends WebAuthenticationDetails {
private String verificationCode;
public CustomWebAuthenticationDetails(HttpServletRequest request) {
super(request);
verificationCode = request.getParameter("code");
}
public String getVerificationCode() {
return verificationCode;
}
}

View File

@@ -0,0 +1,18 @@
package com.bb.config;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.security.authentication.AuthenticationDetailsSource;
import org.springframework.security.web.authentication.WebAuthenticationDetails;
import org.springframework.stereotype.Component;
@Component
public class CustomWebAuthenticationDetailsSource implements AuthenticationDetailsSource<HttpServletRequest, WebAuthenticationDetails> {
@Override
public WebAuthenticationDetails buildDetails(HttpServletRequest context) {
// TODO Auto-generated method stub
return new CustomWebAuthenticationDetails(context);
}
}

View File

@@ -0,0 +1,130 @@
package com.bb.config;
import java.util.Arrays;
import java.util.HashSet;
import javax.sql.DataSource;
import org.apache.ibatis.session.AutoMappingBehavior;
import org.apache.ibatis.session.ExecutorType;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.boot.autoconfigure.SpringBootVFS;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import com.zaxxer.hikari.HikariDataSource;
@Configuration
public class DbConfig {
/** DataSource 트리플-Main 생성 */
@Bean
@Primary
@ConfigurationProperties(prefix = "spring.datasource1")
public DataSource mysql1DataSource() {
return DataSourceBuilder.create()
.type(HikariDataSource.class)
.build();
}
/** DataSource 트리플-Sub 생성 */
@Bean
@ConfigurationProperties(prefix = "spring.datasource2")
public DataSource mysql2DataSource() {
return DataSourceBuilder.create()
.type(HikariDataSource.class)
.build();
}
/** sqlSessionFactory 트리플-Main 생성 */
@Bean
@Primary
public SqlSessionFactory sqlSessionFactoryMain(@Autowired @Qualifier("mysql1DataSource") DataSource dataSource) throws Exception {
// logger.info("SqlSessionFactory Main Start");
org.apache.ibatis.session.Configuration configuration = this.getMybatisConfig();
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setVfs(SpringBootVFS.class);
factoryBean.setConfiguration(configuration);
factoryBean.setTypeHandlersPackage("com.commax.tool.framework.mybatis.typehandler");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resource = resolver.getResources("db1/**/*.xml");
factoryBean.setMapperLocations(resource);
return factoryBean.getObject();
}
/** sqlSessionFactory 트리플-Sub 생성 */
@Bean
public SqlSessionFactory sqlSessionFactory(@Autowired @Qualifier("mysql2DataSource") DataSource dataSource) throws Exception {
//logger.info("SqlSessionFactory SUB Start");
org.apache.ibatis.session.Configuration configuration = this.getMybatisConfig();
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
factoryBean.setVfs(SpringBootVFS.class);
factoryBean.setConfiguration(configuration);
factoryBean.setTypeHandlersPackage("com.commax.tool.framework.mybatis.typehandler");
ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
Resource[] resource = resolver.getResources("db2/**/*.xml");
factoryBean.setMapperLocations(resource);
return factoryBean.getObject();
}
/** sqlSession 트리플-Main 생성 */
@Bean
@Primary
public SqlSession sqlSessionMain(@Autowired @Qualifier("sqlSessionFactoryMain") SqlSessionFactory factory) {
return new SqlSessionTemplate(factory);
}
/** sqlSession 트리플-Sub 생성 */
@Bean
public SqlSession sqlSessionSub(@Autowired @Qualifier("sqlSessionFactory") SqlSessionFactory factory) {
return new SqlSessionTemplate(factory);
}
/** MybatisConfig 설정정보 */
private org.apache.ibatis.session.Configuration getMybatisConfig() {
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setCacheEnabled(true);
configuration.setLazyLoadingEnabled(false);
configuration.setAggressiveLazyLoading(false);
configuration.setMultipleResultSetsEnabled(true);
configuration.setUseColumnLabel(true);
configuration.setAutoMappingBehavior(AutoMappingBehavior.PARTIAL);
configuration.setDefaultExecutorType(ExecutorType.SIMPLE);
configuration.setDefaultStatementTimeout(25000);
configuration.setMapUnderscoreToCamelCase(true);
configuration.setJdbcTypeForNull(JdbcType.NVARCHAR);
configuration.setLazyLoadTriggerMethods(new HashSet<>(Arrays.asList("equals", "clone", "hashCode", "toString")));
configuration.setLogPrefix("[SQL]");
return configuration;
}
}

View File

@@ -0,0 +1,21 @@
package com.bb.config;
import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;
@ControllerAdvice
public class GlobalModelAdvice {
@ModelAttribute("currentURI")
public String currentURI(HttpServletRequest request) {
String uri = request.getRequestURI();
String query = request.getQueryString();
// 쿼리 스트링이 있다면 URI 뒤에 붙여서 반환 (예: /insurance/betList?updown=up)
if (query != null && !query.isEmpty()) {
return uri + "?" + query;
}
return uri;
}
}

View File

@@ -0,0 +1,86 @@
package com.bb.config;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.stereotype.Component;
import com.bb.model.OTPInfo;
import com.bb.model.Site;
import com.bb.service.SiteService;
import com.bb.util.TOTPTokenGenerator;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Component("guestProvider")
public class GuestProvider implements AuthenticationProvider {
@Autowired
SiteService siteService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String verificationCode = ((CustomWebAuthenticationDetails) authentication.getDetails()).getVerificationCode();
final String LOG_PREFIX = "#-GuestProvider:::";
log.info(LOG_PREFIX+ "Authentication::"+authentication.toString());
log.info(LOG_PREFIX+ "verificationCode::"+verificationCode);
Site guest = siteService.getGuestLogin();
OTPInfo otpInfo = siteService.getOtpInfo(guest.getSiteIdx());
if(otpInfo.getSecretKey() == null || otpInfo.getSecretKey().equals("")) {
// Create New OTP
otpInfo = TOTPTokenGenerator.getGoogleAuthQRUrl(otpInfo);
log.info(LOG_PREFIX+ "makeOtp:: secret : " + otpInfo.getSecretKey());
log.info(LOG_PREFIX+ "makeOtp::account : " + otpInfo.getAccount());
log.info(LOG_PREFIX+ "makeOtp:: issuer : " + otpInfo.getIssuer());
log.info(LOG_PREFIX+ "makeOtp:: URL : " + otpInfo.getUrl());
int result = siteService.registSuperOtp(otpInfo);
log.info(LOG_PREFIX+ "makeOtp:: result : " + result);
} else {
log.info(LOG_PREFIX+ "OTP Info : " + otpInfo);
String secret = otpInfo.getSecretKey();
if(verificationCode == null || verificationCode.equals("")) {
log.error(LOG_PREFIX+ "OTP 번호를 입력하세요.");
return null;
}
boolean chkOtp = TOTPTokenGenerator.otpVerify(secret, Integer.parseInt(verificationCode));
if(!chkOtp) {
log.error(LOG_PREFIX+ "OTP 번호가 일치하지 않습니다.");
return null;
}
}
if(guest == null) {
return null;
} else {
List<GrantedAuthority> roles = new ArrayList<GrantedAuthority>();
roles.add(new SimpleGrantedAuthority("GUEST"));
UsernamePasswordAuthenticationToken result = new UsernamePasswordAuthenticationToken("oms", "ehfrhfo22#", roles);
result.setDetails(guest);
return result;
}
}
@Override
public boolean supports(Class<?> authentication) {
// TODO Auto-generated method stub
return authentication.equals(UsernamePasswordAuthenticationToken.class);
}
}

View File

@@ -0,0 +1,83 @@
package com.bb.config;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import com.bb.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import java.io.DataInputStream;
import java.util.Enumeration;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@Slf4j
@Component
public class HttpInterceptor implements HandlerInterceptor {
private final static String REQUEST_POST = "POST";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("Requested Domain (Host): {}", request.getHeader("Host"));
log.info("[preHandle]"+request.getRequestURI() +","+request.getMethod());
log.info("___________________Parameter____________________________ ");
Enumeration params = request.getParameterNames();
while (params.hasMoreElements()) {
String name = (String) params.nextElement();
String value = request.getParameter(name);
log.info(name + "=" + value);
}
log.info("____________________________ Header ____________________________ ");
Enumeration<String> headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
String name = (String) headers.nextElement();
String value = request.getHeader(name);
log.info(name + "=" + value);
}
log.info("____________________________ Request Body ____________________________ ");
/*
try {
DataInputStream dis = new DataInputStream(request.getInputStream());
String str = null;
while ((str = dis.readLine()) != null) {
log.info(new String(str.getBytes("ISO-8859-1"), "euc-kr")+"<br/>");
// utf-8로 전송된 한글은 깨짐
}
}catch(Exception e) {
log.info("ERROR E : {}", e.getMessage());
}
*/
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("[postHandle]"+request.getRequestURI());
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception {
log.info("[afterCompletion]"+request.getRequestURI());
}
}

View File

@@ -0,0 +1,17 @@
package com.bb.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new HttpInterceptor())
.addPathPatterns("/api/*") .addPathPatterns("/api/**")
.excludePathPatterns("/api/login", "/api/signUp"); // 해당 경로는 인터셉터가 가로채지 않는다.
}
}

View File

@@ -0,0 +1,55 @@
package com.bb.config;
// 중요: 패키지 경로에 .models 가 추가되었습니다.
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.swagger.v3.oas.annotations.servers.Server;
@Configuration
@OpenAPIDefinition(
servers = {
@Server(url = "https://oprvender.com"),
@Server(url = "http://localhost"),
@Server(url = "http://lz.akrra.cc")
},
info = @Info(title = "My API", version = "v1")
)
@SecurityScheme(
name = "Authorization",
scheme = "basic",
type = SecuritySchemeType.APIKEY,
in = SecuritySchemeIn.HEADER
)
public class OpenapiConfig {
@Bean
public GroupedOpenApi publicOpenAPI() {
return GroupedOpenApi.builder()
.group("front")
.packagesToScan("com.bb.front")
.build();
}
@Bean
public GroupedOpenApi adminAPI() {
return GroupedOpenApi.builder()
.group("admin")
.packagesToScan("com.bb.admin")
.build();
}
@Bean
public GroupedOpenApi commonAPI() {
return GroupedOpenApi.builder()
.group("common")
.packagesToScan("com.bb.common")
.build();
}
}

View File

@@ -0,0 +1,26 @@
package com.bb.config;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
//import org.springframework.data.redis.connection.RedisConnectionFactory;
//import org.springframework.data.redis.core.StringRedisTemplate;
/*
@Configuration
public class RedisConfig {
@Bean
public StringRedisTemplate stringRedisTemplate(
@Qualifier("redisConnectionFactory") RedisConnectionFactory redisConnectionFactory
) {
StringRedisTemplate template = new StringRedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
}
*/

View File

@@ -0,0 +1,43 @@
package com.bb.config;
import org.apache.hc.client5.http.classic.HttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public HttpClient httpClient() {
// HttpClient 5에서는 PoolingHttpClientConnectionManager를 사용하여 커넥션 풀을 관리합니다.
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(4096); // 최대 오픈되는 커넥션 수
connectionManager.setDefaultMaxPerRoute(200); // IP, 포트 1쌍에 대해 수행할 커넥션 수
return HttpClientBuilder.create()
.setConnectionManager(connectionManager)
.build();
}
@Bean
public HttpComponentsClientHttpRequestFactory factory(HttpClient httpClient) {
// HttpClient 5를 사용하는 팩토리 생성
HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(httpClient);
// Spring Boot 3/HttpClient 5에서는 타임아웃 설정을 팩토리에서 직접 관리하거나
// 필요한 경우 빌더 단계에서 설정합니다.
factory.setConnectTimeout(3000); // 연결시간초과, ms
// 주의: v5용 팩토리에서 setReadTimeout은 지원되지 않을 수 있으므로,
// 런타임 에러 시 빌더의 RequestConfig 설정을 사용해야 합니다.
return factory;
}
@Bean
public RestTemplate restTemplate(HttpComponentsClientHttpRequestFactory factory) {
return new RestTemplate(factory);
}
}

View File

@@ -0,0 +1,122 @@
package com.bb.config;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler;
import org.springframework.security.access.expression.method.MethodSecurityExpressionHandler;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.context.SecurityContextRepository;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@Configuration
@EnableWebSecurity
@EnableMethodSecurity(securedEnabled = true, prePostEnabled = true, proxyTargetClass = true) // EnableGlobalMethodSecurity 대체
@ComponentScan(basePackages = {"com.bb.*"})
public class SecurityConfig {
@Autowired
AuthProvider authProvider;
@Autowired
AuthFailureHandler authFailureHandler;
@Autowired
AuthSuccessHandler authSuccessHandler;
@Autowired
CustomWebAuthenticationDetailsSource authenticationDetailsSource;
static final String SERVER_HOST_1 = "139-162-90-184.ip.linodeusercontent.com";
static final String SERVER_HOST_2 = "139-162-90-179.ip.linodeusercontent.com";
@Bean
public MethodSecurityExpressionHandler methodSecurityExpressionHandler() {
DefaultMethodSecurityExpressionHandler expressionHandler = new DefaultMethodSecurityExpressionHandler();
// ROLE_ 접두사 규칙을 강제합니다.
expressionHandler.setDefaultRolePrefix("ROLE_");
return expressionHandler;
}
/**
* 기존 web.ignoring() 설정 부분
*/
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return (web) -> web.ignoring().requestMatchers(
"/v3/api-docs", "/swagger-resources/**", "/webjars/**", "/swagger/**", "/favicon.ico",
"/html/**", "/resources/**", "/websocket", "/websocket/**", "/images/**",
"/img/**", "/css/**", "/js/**"
);
}
/**
* 관리자 및 메인 보안 설정 (SecurityFilterChain)
*/
@Bean
public SecurityFilterChain filterChain(HttpSecurity http, SecurityContextRepository securityContextRepository) throws Exception {
http
.cors(cors -> cors.configurationSource(corsConfigurationSource()))
.csrf(csrf -> csrf.disable())
.headers(headers -> headers.frameOptions(frame -> frame.disable()))
.securityContext(context -> context
.securityContextRepository(securityContextRepository)
)
.authenticationProvider(authProvider);
http.authorizeHttpRequests(auth -> auth
.requestMatchers("/", "/login/**", "/lg/**", "/api/**", "/actuator/**", "/lunch/**", "/websocket", "/websocket/**", "/guest/guestLogin").permitAll()
.anyRequest().authenticated()
);
http.formLogin(form -> form
.loginPage("/lg")
.loginProcessingUrl("/authenticate")
.failureHandler(authFailureHandler)
.successHandler(authSuccessHandler)
.usernameParameter("id")
.passwordParameter("pw")
.authenticationDetailsSource(authenticationDetailsSource)
);
return http.build();
}
@Bean
public FilterRegistrationBean<ApiKeyFilter> filterRegistrationBean() {
FilterRegistrationBean<ApiKeyFilter> registrationBean = new FilterRegistrationBean<>();
ApiKeyFilter customURLFilter = new ApiKeyFilter();
registrationBean.setFilter(customURLFilter);
registrationBean.addUrlPatterns("/api/login");
registrationBean.setOrder(1);
return registrationBean;
}
@Bean
public CorsConfigurationSource corsConfigurationSource() {
final CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOriginPatterns(Arrays.asList("*"));
configuration.addAllowedHeader("*");
configuration.addAllowedMethod("*");
configuration.setAllowCredentials(false);
final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
}

View File

@@ -0,0 +1,26 @@
package com.bb.config;
import jakarta.annotation.PostConstruct;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
import org.springframework.security.web.context.SecurityContextRepository;
@Configuration // @Component보다 설정을 위한 @Configuration 권장
public class SecurityContextConfig {
@PostConstruct
public void init() {
// 부모 스레드의 SecurityContext를 자식 스레드에서 상속받도록 설정
SecurityContextHolder.setStrategyName(SecurityContextHolder.MODE_INHERITABLETHREADLOCAL);
}
/**
* [핵심] 세션 저장소를 빈으로 등록하여 순환 참조 방지 및 공유
*/
@Bean
public SecurityContextRepository securityContextRepository() {
return new HttpSessionSecurityContextRepository();
}
}

View File

@@ -0,0 +1,43 @@
package com.bb.config;
import io.netty.channel.ChannelOption;
import io.netty.handler.timeout.ReadTimeoutHandler;
import io.netty.handler.timeout.WriteTimeoutHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.reactive.ReactorClientHttpConnector;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
// 1. 커넥션 풀 설정
ConnectionProvider provider = ConnectionProvider.builder("my-connection-pool")
.maxConnections(4096) // 기존 MaxTotal(4096)과 매칭
.pendingAcquireTimeout(Duration.ofMillis(3000))
.maxIdleTime(Duration.ofSeconds(20))
.build();
// 2. 타임아웃 및 Netty HttpClient 설정
HttpClient httpClient = HttpClient.create(provider)
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 3000) // 기존 ConnectTimeout(3000)과 매칭
.responseTimeout(Duration.ofSeconds(8)) // 응답 대기 시간
.doOnConnected(conn ->
conn.addHandlerLast(new ReadTimeoutHandler(9, TimeUnit.SECONDS))
.addHandlerLast(new WriteTimeoutHandler(9, TimeUnit.SECONDS))
);
// 3. WebClient 빈 생성
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(2 * 1024 * 1024)) // 2MB
.build();
}
}

View File

@@ -0,0 +1,32 @@
package com.bb.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.ChannelRegistration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer; // 인터페이스로 변경
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer { // implements로 변경
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
// 기존 allowedOriginPatterns("*") 유지
registry.addEndpoint("/websocket")
.setAllowedOriginPatterns("*")
.withSockJS();
}
@Override
public void configureClientInboundChannel(ChannelRegistration registration) {
registration.interceptors(new WebSocketInterceptor());
}
}

View File

@@ -0,0 +1,32 @@
package com.bb.config;
import java.util.HashSet;
import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessageChannel;
import org.springframework.messaging.support.ChannelInterceptor; // 인터페이스로 변경
import org.springframework.stereotype.Component;
@Component
public class WebSocketInterceptor implements ChannelInterceptor { // implements로 변경
Set<String> sessionSet = new HashSet<>();
@Override
public Message<?> preSend(Message<?> message, MessageChannel channel) {
String simpMessageType = String.valueOf(message.getHeaders().get("simpMessageType"));
if(StringUtils.equals(simpMessageType, "CONNECT")) {
String simpSessionId = String.valueOf(message.getHeaders().get("simpSessionId"));
sessionSet.add(simpSessionId);
} else if(StringUtils.equals(simpMessageType, "DISCONNECT")) {
String simpSessionId = String.valueOf(message.getHeaders().get("simpSessionId"));
sessionSet.remove(simpSessionId);
}
// int uniqueJoinSessionCount = sessionSet.size();
// 인터페이스에는 super.preSend()가 없으므로 message를 그대로 리턴합니다.
return message;
}
}

View File

@@ -0,0 +1,5 @@
package com.bb.controller;
public class PragmaticController {
}

View File

@@ -0,0 +1,14 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
public interface CallBackDao {
void insertCallBackErrLog(HashMap logParam);
void insertBetRadarLog(HashMap sData);
List<HashMap> getBetRadarLogByBetId(String betId);
}

View File

@@ -0,0 +1,39 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
@Repository("callBackDao")
public class CallBackDaoImpl implements CallBackDao {
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
@Override
public void insertCallBackErrLog(HashMap logParam) {
sqlSession.insert("insertCallBackErrLog", logParam);
}
@Override
public void insertBetRadarLog(HashMap sData) {
// TODO Auto-generated method stub
sqlSession.insert("insertBetRadarLog", sData);
}
@Override
public List<HashMap> getBetRadarLogByBetId(String betId) {
return sqlSessionSub.selectList("getBetRadarLogByBetId", betId);
}
}

View File

@@ -0,0 +1,10 @@
package com.bb.dao;
import com.bb.model.CoinVo;
public interface CoinDao {
void saveCoinInfo(CoinVo coinInfo);
CoinVo getCoinInfo(String coinSymbol, String currency);
}

View File

@@ -0,0 +1,38 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.bb.model.CoinVo;
@Repository("coinDao")
public class CoinDaoImpl implements CoinDao{
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
@Override
public void saveCoinInfo(CoinVo coinInfo) {
sqlSession.insert("saveCoinInfo", coinInfo);
}
@Override
public CoinVo getCoinInfo(String coinSymbol, String currency) {
Map param = new HashMap();
param.put("coinSymbol", coinSymbol);
param.put("currency", currency);
return sqlSessionSub.selectOne("getCoinInfo", param);
}
}

View File

@@ -0,0 +1,23 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import com.bb.model.BanGameSearch;
import com.bb.model.CmnSearch;
public interface CommonDao {
List<HashMap<String, String>> getGameCategoryList();
List<HashMap<String, Object>> getGameVendorList(CmnSearch search);
List<HashMap<String, Object>> getBanGameList(BanGameSearch search);
int insertBanGameInfo(HashMap<String, Object> item);
int insertNexusGameInfo(HashMap<String, Object> item);
HashMap getVendorApiInfo(CmnSearch search);
}

View File

@@ -0,0 +1,60 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.bb.model.BanGameSearch;
import com.bb.model.CmnSearch;
@Repository("commonDao")
public class CommonDaoImpl implements CommonDao {
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
@Override
public List<HashMap<String, String>> getGameCategoryList() {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getGameCategoryList");
}
@Override
public List<HashMap<String, Object>> getGameVendorList(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getGameVendorList", search);
}
@Override
public List<HashMap<String, Object>> getBanGameList(BanGameSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getBanGameList", search);
}
@Override
public int insertBanGameInfo(HashMap<String, Object> item) {
// TODO Auto-generated method stub
return sqlSession.update("insertBanGameInfo", item);
}
@Override
public int insertNexusGameInfo(HashMap<String, Object> item) {
// TODO Auto-generated method stub
return sqlSession.update("insertNexusGameInfo", item);
}
@Override
public HashMap getVendorApiInfo(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getVendorApiInfo", search);
}
}

View File

@@ -0,0 +1,98 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import jakarta.validation.Valid;
import com.bb.model.CashParam;
import com.bb.model.Credit;
import com.bb.model.CreditPoint;
import com.bb.model.CreditPointSearch;
import com.bb.model.CreditSearchVO;
import com.bb.model.Insure;
import com.bb.model.SiteSearch;
public interface CreditDao {
void insertCredit(Credit credit);
void insertCreditByCash(Credit credit);
void setSiteCreditUpdate(HashMap param);
int getCreditListCnt(SiteSearch search);
List<HashMap> getCreditList(SiteSearch search);
int getSiteTranListCnt(SiteSearch search);
List<HashMap> getSiteTranList(SiteSearch search);
void updateStatus(Credit credit);
int getPointListCnt(SiteSearch search);
List<HashMap> getPointList(SiteSearch search);
int getSiteBetListCnt(SiteSearch search);
List<HashMap> getSiteBetList(SiteSearch search);
void updateInsureStatus(Insure insure);
void insertInsure(Insure insure);
HashMap getMyInsureInfo(int siteIdx);
HashMap getMyRateInfo(int siteIdx);
int getInsureListCnt(SiteSearch search);
List<HashMap> getInsureList(SiteSearch search);
HashMap getCreditSumToday(SiteSearch search);
void updateSetStatus(Credit credit2);
void updateCreditYn(Credit credit);
String getRoundIdByGsoft(String refId);
void insertCreditAiAo(Credit credit);
void insertCreditPoint(HashMap pointParam);
int insertPoint(CreditPoint point);
int checkRequestTime(Credit credit);
int getCashInOutListCnt(CashParam param);
List<HashMap> getCashInOutList(CashParam param);
int getTransCreditListCnt(CreditSearchVO search);
List<HashMap<String, Object>> getTransCreditList(CreditSearchVO search);
int getTotalTransactionListCnt(CreditSearchVO search);
List<HashMap<String, Object>> getTotalTransactionList(CreditSearchVO search);
int getCreditPointListCnt(@Valid CreditPointSearch search);
List<HashMap<String, String>> getCreditPointList(@Valid CreditPointSearch search);
int getCreditBetListCnt(@Valid CreditPointSearch search);
List<HashMap<String, String>> getCreditBetList(@Valid CreditPointSearch search);
int getStatCreditListCnt(SiteSearch search);
List<HashMap> getStatCreditList(SiteSearch search);
HashMap getStatCreditTotal(SiteSearch search);
void updateSubCredit(Credit credit);
}

View File

@@ -0,0 +1,261 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import jakarta.validation.Valid;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.bb.model.CashParam;
import com.bb.model.Credit;
import com.bb.model.CreditPoint;
import com.bb.model.CreditPointSearch;
import com.bb.model.CreditSearchVO;
import com.bb.model.Insure;
import com.bb.model.SiteSearch;
@Repository("creditDao")
public class CreditDaoImpl implements CreditDao {
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
@Override
public void insertCredit(Credit credit) {
sqlSession.insert("insertCredit", credit);
}
@Override
public void insertCreditByCash(Credit credit) {
sqlSession.insert("insertCreditByCash", credit);
}
@Override
public void setSiteCreditUpdate(HashMap param) {
sqlSession.update("setSiteCreditUpdate", param);
}
@Override
public int getCreditListCnt(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getCreditListCnt", search);
}
@Override
public List<HashMap> getCreditList(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectList("getCreditList", search);
}
@Override
public int getSiteTranListCnt(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getSiteTranListCnt", search);
}
@Override
public List<HashMap> getSiteTranList(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectList("getSiteTranList", search);
}
@Override
public void updateStatus(Credit credit) {
// TODO Auto-generated method stub
sqlSession.update("updateStatus", credit);
}
@Override
public int getPointListCnt(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getPointListCnt", search);
}
@Override
public List<HashMap> getPointList(SiteSearch search) {
return sqlSession.selectList("getPointList", search);
}
@Override
public int getSiteBetListCnt(SiteSearch search) {
return sqlSession.selectOne("getSiteBetListCnt", search);
}
@Override
public List<HashMap> getSiteBetList(SiteSearch search) {
return sqlSession.selectList("getSiteBetList", search);
}
@Override
public void updateInsureStatus(Insure insure) {
// TODO Auto-generated method stub
sqlSession.update("updateInsureStatus", insure);
}
@Override
public void insertInsure(Insure insure) {
// TODO Auto-generated method stub
sqlSession.insert("insertInsure", insure);
}
@Override
public HashMap getMyInsureInfo(int siteIdx) {
return sqlSession.selectOne("getMyInsureInfo", siteIdx);
}
@Override
public HashMap getMyRateInfo(int siteIdx) {
return sqlSession.selectOne("getMyRateInfo", siteIdx);
}
@Override
public int getInsureListCnt(SiteSearch search) {
return sqlSession.selectOne("getInsureListCnt", search);
}
@Override
public List<HashMap> getInsureList(SiteSearch search) {
return sqlSession.selectList("getInsureList", search);
}
@Override
public HashMap getCreditSumToday(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getCreditSumToday", search);
}
@Override
public void updateSetStatus(Credit credit2) {
// TODO Auto-generated method stub
sqlSession.update("updateSetStatus", credit2);
}
@Override
public void updateCreditYn(Credit credit) {
// TODO Auto-generated method stub
sqlSession.update("updateCreditYn", credit);
}
@Override
public String getRoundIdByGsoft(String refId) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getRoundIdByGsoft", refId);
}
@Override
public void insertCreditAiAo(Credit credit) {
// TODO Auto-generated method stub
sqlSession.insert("insertCreditAiAo", credit);
}
@Override
public void insertCreditPoint(HashMap pointParam) {
// TODO Auto-generated method stub
sqlSession.insert("insertCreditPoint", pointParam);
}
@Override
public int insertPoint(CreditPoint point) {
// TODO Auto-generated method stub
return sqlSession.insert("insertPoint", point);
}
@Override
public int checkRequestTime(Credit credit) {
// TODO Auto-generated method stub
return sqlSession.selectOne("checkRequestTime", credit);
}
@Override
public int getCashInOutListCnt(CashParam param) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getCashInOutListCnt", param);
}
@Override
public List<HashMap> getCashInOutList(CashParam param) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getCashInOutList", param);
}
@Override
public int getTransCreditListCnt(CreditSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getTransCreditListCnt", search);
}
@Override
public List<HashMap<String, Object>> getTransCreditList(CreditSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getTransCreditList", search);
}
@Override
public int getTotalTransactionListCnt(CreditSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getTotalTransactionListCnt", search);
}
@Override
public List<HashMap<String, Object>> getTotalTransactionList(CreditSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getTotalTransactionList", search);
}
@Override
public int getCreditPointListCnt(@Valid CreditPointSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getCreditPointListCnt", search);
}
@Override
public List<HashMap<String, String>> getCreditPointList(@Valid CreditPointSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getCreditPointList", search);
}
@Override
public int getCreditBetListCnt(@Valid CreditPointSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getCreditBetListCnt", search);
}
@Override
public List<HashMap<String, String>> getCreditBetList(@Valid CreditPointSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getCreditBetList", search);
}
@Override
public int getStatCreditListCnt(SiteSearch search) {
return sqlSessionSub.selectOne("getStatCreditListCnt", search);
}
@Override
public List<HashMap> getStatCreditList(SiteSearch search) {
return sqlSessionSub.selectList("getStatCreditList", search);
}
@Override
public HashMap getStatCreditTotal(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getStatCreditTotal", search);
}
@Override
public void updateSubCredit(Credit credit) {
// TODO Auto-generated method stub
sqlSession.update("updateSubCredit", credit);
}
}

View File

@@ -0,0 +1,34 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import com.bb.model.BlockGameVO;
import com.bb.model.CmnSearch;
import com.bb.model.SiteVendorSkinVO;
public interface SettingDao {
List<HashMap<String, Object>> getSettingVendorList(CmnSearch search);
List<HashMap<String, Object>> getSettingSkinList(CmnSearch search);
int settingVendorSkinSave(SiteVendorSkinVO item);
String getWhiteIpListStr(CmnSearch search);
List<HashMap<String, Object>> getBlockVendorSelectBoxList(String category);
List<HashMap<String, Object>> getBlockVendorSelectBoxList2(CmnSearch search);
List<HashMap<String, Object>> getBlockTableSelectBoxList(CmnSearch search);
String getBlockTableIds(CmnSearch search);
int blockTableIdSave(BlockGameVO blockGameVO);
String getVendorTitle(CmnSearch search);
HashMap<String, String> getBetRadarApiInfo(String siteId);
}

View File

@@ -0,0 +1,104 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.bb.model.BlockGameVO;
import com.bb.model.CmnSearch;
import com.bb.model.SiteVendorSkinVO;
@Repository("settingDao")
public class SettingDaoImpl implements SettingDao {
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
@Override
public List<HashMap<String, Object>> getSettingVendorList(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getSettingVendorList", search);
}
@Override
public List<HashMap<String, Object>> getSettingSkinList(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getSettingSkinList", search);
}
@Override
public int settingVendorSkinSave(SiteVendorSkinVO item) {
// TODO Auto-generated method stub
return sqlSession.update("settingVendorSkinSave", item);
}
@Override
public String getWhiteIpListStr(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getWhiteIpListStr", search);
}
@Override
public List<HashMap<String, Object>> getBlockVendorSelectBoxList(String category) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getBlockVendorSelectBoxList", category);
}
@Override
public List<HashMap<String, Object>> getBlockVendorSelectBoxList2(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getBlockVendorSelectBoxList2", search);
}
@Override
public List<HashMap<String, Object>> getBlockTableSelectBoxList(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getBlockTableSelectBoxList", search);
}
@Override
public String getBlockTableIds(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getBlockTableIds", search);
}
@Override
public int blockTableIdSave(BlockGameVO blockGameVO) {
// TODO Auto-generated method stub
return sqlSession.update("blockTableIdSave", blockGameVO);
}
@Override
public String getVendorTitle(CmnSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getVendorTitle", search);
}
@Override
public HashMap<String, String> getBetRadarApiInfo(String siteId) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getBetRadarApiInfo", siteId);
}
}

View File

@@ -0,0 +1,489 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.security.core.Authentication;
import com.bb.model.BalanceParam;
import com.bb.model.BetParam;
import com.bb.model.BoardSearch;
import com.bb.model.CashParam;
import com.bb.model.CommonParam;
import com.bb.model.Game;
import com.bb.model.Member;
import com.bb.model.OTPInfo;
import com.bb.model.Site;
import com.bb.model.SitePwdVO;
import com.bb.model.SiteSearch;
import com.bb.model.TrfApiInfo;
import com.bb.model.UserSearch;
import com.bb.model.Vendor;
import com.bb.model.VendorChangeBalanceLogVo;
public interface SiteDao {
Site getSiteInfo(String authorization);
Site getSiteInfoAPI(String authorization);
Member getMember(CommonParam commonParam);
Member getMember2(CashParam param);
void insertMember(CommonParam commonParam);
HashMap getVenderApiInfo(CommonParam commonParam);
int commonBetinsert(HashMap tranParam);
int commonBetinsert2(HashMap tranParam);
List<HashMap> getCbList();
void updateCbApi(HashMap upParam);
HashMap getSiteApiInfo(HashMap sParam);
HashMap getSiteApiInfo2(HashMap sParam);
Site getSiteLogin(Authentication authentication);
Site getSiteLoginApi(Map site);
Site getGuestLogin();
int getSiteListCnt(SiteSearch search);
List<HashMap> getSiteList(SiteSearch search);
void addProc(Site site);
void addCreditInfo(Site site);
void addsiteFlow(Site site);
void insertVendors(Site site);
Site getSiteInfoMypage(Site site);
long getSiteCredit(String siteId);
long getUnderSiteCredit(String siteId);
long getSitePoint(String siteId);
void addPointInfo(Site site);
HashMap getCreditWait(int siteIdx);
int getSiteUserListCnt(SiteSearch search);
List<HashMap> getSiteUserList(SiteSearch search);
int getTranCheck(String tranId);
void insertError(HashMap eParam);
int getFinalErr(String betId);
void updateSid(Member member);
long getInsureAmt(String siteId);
long getInsurePointAmt(String siteId);
void insertinsurance(Site site);
void insertinsurancePoint(Site site);
List<HashMap> getVenderRateList(Site loginSite);
int getBetCancelCount(String betId);
void updateBombKey(Member member);
Member getMemByBombAccId(HashMap memParam);
void insertBetDetail(Map detailMap);
String getBetInfo(BetParam param);
List<HashMap> getSiteFlow(Site loginSite);
void saveVendorRate(HashMap paramMap);
HashMap getEvoApiInfo();
String getSiteIdByRefId(String refId);
void updateDetailLastTime(HashMap evoInfo);
Site getSiteDetail(SiteSearch search);
Site getSiteSimpleDetail(SiteSearch search);
HashMap getVenderApiInfoByToken(Map paramV);
Site getSiteBypassword(Map siteParam);
void updatePass(Map siteParam);
void siteUpdate(Site site);
void saveVendorInsurePointRate(HashMap paramMap);
HashMap getDashInfo(Site loginSite);
HashMap getDashInfo2(Site loginSite);
void insertVendorsRate(Site site);
HashMap getMicroApiInfo();
int getApiStatus(HashMap tranParam);
void saveVendorInsureRate(HashMap paramMap);
void updateVendorUseYn(HashMap paramMap);
List<HashMap> getSiteVendorList(SiteSearch search);
List<HashMap> getVendorList(SiteSearch search);
void siteVenderUpdate(Vendor vendor);
HashMap getDowinApiInfo();
long getSiteMaxBet(HashMap sParam);
Long getUserMaxBet(HashMap sParam);
int getBetCheckByHc(String refId);
void updatePragmaticId(Member member);
HashMap getProgmaticApiInfo();
HashMap getSiteApiInfoByPra(HashMap sParam);
String getlastDepostId(HashMap dParam);
List<HashMap> getNotUseMemberListProgama();
List<Game> getGameList(HashMap param);
HashMap getOnlyVenderInfo(CommonParam commonParam);
int getBotaAutoCancelCnt(String tranId);
int getBotaBetCnt(String tranId);
HashMap getProgmaticApiInfo2();
List<HashMap> getBotaBetListMinute();
String getSiteIdByRefId2(String string);
int getTranIdCheck(String string);
int getTranIdCheck2(String string);
HashMap getSiteMember(String string);
void updateDebitCancel(String refId);
void insertSiteCallBackLog(HashMap logParam);
List<HashMap> getBetList(BetParam param);
List<HashMap> getMonsterGameList();
HashMap getProgmaticApiInfo3(String code);
long getBetCancelAmt(String string);
int getBetIdCheck(String refId);
int getBetIdCheck2(String refId);
int getTranCheck2(String betId);
void insertSlotCity(HashMap slotMap);
void botaAutoCancel(HashMap tranParam);
void seattleCredit();
void updateDecimal(HashMap decimalParam);
List<HashMap> getonlyDebitList();
void insertAutoLose(HashMap loseCredit);
HashMap getBetCheck(BetParam param);
int callbackTokenCheck(String token);
HashMap getVenderInfo(BalanceParam param);
String getRefIdByTranId(String tranId);
List<HashMap> getCreditReSendList();
void updateMemCancelCnt(long memberIdx);
Long getMemberIdx(HashMap memParam);
int insertVendorChangeBalanceLog(VendorChangeBalanceLogVo logVo);
HashMap getGsoftVendorInfo(String gameID);
String getCreditRate(HashMap upParam);
void inserDemoUSer(String bombToken);
HashMap getDemoByBombAccId(HashMap memParam);
void updateDemoUSer(HashMap memParam);
List<HashMap> getTrasferVendorList();
List<HashMap> getAllMember();
int gethourBetCheck(long member);
List<HashMap> getAllMember2();
HashMap getUserVendorInfo(HashMap memParam);
Member getMemberByToken(Map authParam);
HashMap getSiteApiInfoByToken(Map authParam);
double getBetDepositAmt(String tranId);
void insertSplusTran(Map trxParam);
void updateSplusTran(Map trxParam);
String getCbData(String reserve_id);
void updatesPurchaseId(Map trxParam);
double getBetGapAmt(String pid);
void insertToken(String base64Token);
int getSplusToken(String base64Token);
String getRefIdByPurchaseId(String purchase_id);
List<HashMap> getSplusDetailData(BetParam param);
String getKorNameTeam(String txt);
String getKorNameLeague(String txt);
void insertVendorsCodeRate(Site site);
HashMap getBetInfoByTranId(String reference);
int getSuccDebitCnt(String betId);
HashMap<String, String> getSiteVendorInfo(HashMap param);
int updatePowerballApiInfo(HashMap<String, String> registParam);
List<HashMap<String, String>> getPowerBallInfoList(String gameType);
HashMap<String, String> getSiteApiInfoByApiKey(HashMap param);
HashMap<String, String> getSiteApiInfoByCallbackKey(HashMap param);
int updMemLastVendorIdx(HashMap memParam);
List<HashMap> getVendorListByVendorKey(HashMap venderInfo);
void vendorUpdate(HashMap venderInfo);
List<HashMap> getNexusSkinListByVendorKey(HashMap venderInfo);
void nexusSkinUpdate(HashMap venderInfo);
String getParseTarget();
String getParseTargetExtr();
HashMap getParseUseYn(int siteIdx);
void insertParseUse(HashMap parseParam);
List<HashMap> getApiBetVendorList(int siteIdx);
int getApiBetTransactionCnt(BetParam param);
List<HashMap> getApiBetTransactionList(BetParam param);
void updVendorMapForDefault(Site site);
void updVendorCreditRateForDefault(Site site);
void deleteVendorAccountForDefault(Site site);
HashMap getParseUserYn(HashMap pum);
void setParseUserYn(HashMap pum);
OTPInfo getOtpInfo(long siteIdx);
OTPInfo getOtpInfoByManger(long siteIdx);
int registSuperOtp(OTPInfo param);
HashMap<String, String> getSiteOnlyVendorInfo(HashMap vendorParam);
TrfApiInfo getTrfApiInfo(HashMap mapParam);
void agentIpsUpdate(Site site);
int insertEvoDetail(HashMap detailMap);
HashMap getCommonApiInfo(HashMap commonParam);
HashMap<String, String> getBeforeTranInfo(String vendorTranKey);
List<HashMap> getParseTargetGame(String gameType);
String getOrgDetailData(BetParam param);
String getParDetailData(BetParam param);
HashMap<String, Object> getBetInfoByTranKey(String vendorTranKey);
HashMap<String, String> getParseInfo(HashMap param);
int getBlockParseGameId(String gameId);
HashMap<String, String> getBeforeTranInfo2(String vendorTranKey);
String getMemberByIdx(HashMap memParam);
List<HashMap> getSiteVendorList2(int siteIdx);
List<HashMap> getVendorList2(int siteIdx);
void saveSvcr(HashMap paramMap);
int siteVenderCodeCheck(HashMap paramMap);
void saveVendorRate2(HashMap paramMap);
String getSiteKey(HashMap paramMap);
String getVendorTitle(HashMap paramMap);
Long getUserTimeout(HashMap accLog);
int updateUserTimeout(HashMap accLog);
String getGameKeyByNexusGameId(String gameId);
String getDebitIsParse(String betId);
int updateParseUseYN(String useYn);
int insertTheaTrxId(HashMap param);
HashMap<String, String> getApiKeyInfo(String vendorTitle);
HashMap<String, String> getApiKeyInfo2(HashMap<String, String> keyParam);
HashMap<String, Object> getRefBetInfoByTranId(String tranId);
int updMemberBalance(HashMap balanceMap);
int getMemberBalance(HashMap balanceMap);
HashMap<String, String> getMemberId(String vendorUsername);
int checkMemberId(String vendorUsername);
HashMap getNewSiteApiInfo(String vendorUsername);
HashMap getNewSiteVendorInfo(HashMap param);
int updateTestCnt(Site site);
int updateParseEvoYn(HashMap param);
int saveParsEvoAmount(SiteSearch param);
int getUserBalance(HashMap balanceMap);
List<HashMap> getMyDownSite(SiteSearch search);
HashMap<String, String> getCreditInfo(String siteId);
int checkDownSite(Map checkDown);
List<HashMap> getSiteTreeList(String siteId);
int getMyDownSiteCheck(Site targetsite);
void insertParseUseYn(Site site);
int updateSitePwd(SitePwdVO sitePwdVO);
Site getSite(Site site);
void siteVenderLobbyUpdate(Vendor vendor);
List<HashMap> getVendorMapList(SiteSearch search);
List<HashMap> geLobbyList(SiteSearch search);
String siteVenderRate(Vendor vendor);
int getBoardListCnt(BoardSearch search);
List<HashMap<String, Object>> getBoardList(BoardSearch search);
HashMap<String, Object> getBoardDetail(long boardIdx);
int getSiteCallbackErrLogListCnt(SiteSearch search);
List<HashMap> getSiteCallbackErrLogList(SiteSearch search);
List<HashMap> getSiteTreeInfo(HashMap param);
int getUserListCnt(UserSearch search);
List<HashMap<String, Object>> getUserList(UserSearch search);
HashMap<String, Object> getUserDetail(UserSearch search);
void insertCmsIp(Site site);
int getSiteListCntForApi(SiteSearch search);
List<HashMap> getSiteListForApi(SiteSearch search);
Site getSiteDetailForApi(SiteSearch search);
List<HashMap> getVendorListForApi(SiteSearch search);
List<HashMap> getSiteVendorListForApi(SiteSearch search);
HashMap getRefIdByVendorTranKey(String vendorTranKey);
int updateUserMaxBet(HashMap param);
int insertTranLog(HashMap logParam);
HashMap getSiteSubCredit(String siteId);
String getBetAmountByTranParam(HashMap param);
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,24 @@
package com.bb.dao;
import java.util.Map;
public interface SplusDao {
void insertSplus(Map splusBetParam);
void udpateEvent(Map eventParam);
void udpateBet(Map splusBetParam);
void cancelBet(Map splusBetParam);
int getReserveCnt(Map trxParam);
int getCommitCnt(Map trxParam);
int getDeReverseCnt(Map trxParam);
int getCustomerCnt(Map trxParam);
}

View File

@@ -0,0 +1,78 @@
package com.bb.dao;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
@Repository("splusDao")
public class SplusDaoImpl implements SplusDao {
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
@Override
public void insertSplus(Map splusBetParam) {
System.out.print("dsfsdfsdfsdfsdfsdf");
sqlSession.insert("insertSplus", splusBetParam);
}
@Override
public void udpateEvent(Map eventParam) {
sqlSession.update("udpateEvent", eventParam);
}
@Override
public void udpateBet(Map splusBetParam) {
sqlSession.update("udpateBet", splusBetParam);
}
@Override
public void cancelBet(Map splusBetParam) {
sqlSession.update("udpacancelBeteBet", splusBetParam);
}
@Override
public int getReserveCnt(Map trxParam) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getReserveCnt", trxParam);
}
@Override
public int getCommitCnt(Map trxParam) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getCommitCnt", trxParam);
}
@Override
public int getDeReverseCnt(Map trxParam) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getDeReverseCnt", trxParam);
}
@Override
public int getCustomerCnt(Map trxParam) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getCustomerCnt", trxParam);
}
}

View File

@@ -0,0 +1,89 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import com.bb.model.ReportSearch;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import jakarta.validation.Valid;
public interface StatDao {
int getSiteDailyReportListCnt(SiteSearch search);
List<HashMap> getSiteDailyReportList(SiteSearch search);
int getVendorDailyReportListCnt(SiteSearch search);
List<HashMap> getVendorDailyReportList(SiteSearch search);
List<HashMap> getBottomSiteDailyReportList(SiteSearch search);
HashMap getMonthCredit(SiteSearch search);
List<HashMap> getUserDailyReportList(SiteSearch search);
List<HashMap> getUserReportSum(SiteSearch search);
List<HashMap> getAdminPushInfo();
int getAgentReportCnt(SiteSearch search);
List<HashMap> getAgentReportList(SiteSearch search);
int getAgentReportCnt2(SiteSearch search);
List<HashMap> getAgentReportList2(SiteSearch search);
HashMap getAgentReportTotal(SiteSearch search);
String getlastMonth(SiteSearch search);
List<HashMap> getVendorDailyReportListDay(SiteSearch search);
List<HashMap> getVendorDailyReportListMonth(SiteSearch search);
List<HashMap> getVendorDailyReportListDaySUM(SiteSearch search);
List<HashMap> getVendorDailyReportListMonthSUM(SiteSearch search);
List<HashMap> getSiteReportList(SiteSearch search);
List<HashMap> getSiteReportListSum(SiteSearch search);
List<HashMap> getSiteReportMemList(SiteSearch search);
List<HashMap> getSiteReportMemListSum(SiteSearch search);
List<HashMap> getSiteReportListToDay(SiteSearch search);
List<HashMap> getSiteReportListSumToDay(SiteSearch search);
List<HashMap> getDashBoardList(SiteSearch search);
List<HashMap> getDashBoardMonth(SiteSearch search);
HashMap getYdayBetInfoBySite(Site targetSite);
HashMap getMonthBetInfoBySite(Site targetSite);
HashMap getYdayBetInfoByUser(HashMap targetUser);
HashMap getMonthBetInfoByUser(HashMap targetUser);
HashMap getVendorDailyReportMonthByParse(SiteSearch search);
List<HashMap> getVendorDailyReportListDayByParse(SiteSearch search);
HashMap getHybridReport(ReportSearch search);
List<HashMap> getHybridReportList(@Valid ReportSearch search);
HashMap getHybridReportTotal(@Valid ReportSearch search);
}

View File

@@ -0,0 +1,236 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.bb.model.ReportSearch;
import com.bb.model.Site;
import com.bb.model.SiteSearch;
import jakarta.validation.Valid;
@Repository("statDao")
public class StatDaoImpl implements StatDao {
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
@Override
public int getSiteDailyReportListCnt(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getSiteDailyReportListCnt", search);
}
@Override
public List<HashMap> getSiteDailyReportList(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectList("getSiteDailyReportList", search);
}
@Override
public int getVendorDailyReportListCnt(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getVendorDailyReportListCnt", search);
}
@Override
public List<HashMap> getVendorDailyReportList(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectList("getVendorDailyReportList", search);
}
@Override
public List<HashMap> getBottomSiteDailyReportList(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectList("getBottomSiteDailyReportList", search);
}
@Override
public HashMap getMonthCredit(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getMonthCredit", search);
}
@Override
public List<HashMap> getUserDailyReportList(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectList("getUserDailyReportList", search);
}
@Override
public List<HashMap> getUserReportSum(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectList("getUserReportSum", search);
}
@Override
public List<HashMap> getAdminPushInfo() {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getAdminPushInfo", null);
}
@Override
public int getAgentReportCnt(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getAgentReportCnt", search);
}
@Override
public List<HashMap> getAgentReportList(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getAgentReportList", search);
}
@Override
public int getAgentReportCnt2(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getAgentReportCnt2", search);
}
@Override
public List<HashMap> getAgentReportList2(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getAgentReportList2", search);
}
@Override
public HashMap getAgentReportTotal(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getAgentReportTotal", search);
}
@Override
public String getlastMonth(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSession.selectOne("getlastMonth", search);
}
@Override
public List<HashMap> getVendorDailyReportListDay(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getVendorDailyReportListDay", search);
}
@Override
public List<HashMap> getVendorDailyReportListMonth(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getVendorDailyReportListMonth", search);
}
@Override
public List<HashMap> getVendorDailyReportListDaySUM(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getVendorDailyReportListDaySUM", search);
}
@Override
public List<HashMap> getVendorDailyReportListMonthSUM(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getVendorDailyReportListMonthSUM", search);
}
@Override
public List<HashMap> getSiteReportList(SiteSearch search) {
return sqlSessionSub.selectList("getSiteReportList", search);
}
@Override
public List<HashMap> getSiteReportListSum(SiteSearch search) {
return sqlSessionSub.selectList("getSiteReportListSum", search);
}
@Override
public List<HashMap> getSiteReportMemList(SiteSearch search) {
return sqlSessionSub.selectList("getSiteReportMemList", search);
}
@Override
public List<HashMap> getSiteReportMemListSum(SiteSearch search) {
return sqlSessionSub.selectList("getSiteReportMemListSum", search);
}
@Override
public List<HashMap> getSiteReportListToDay(SiteSearch search) {
return sqlSessionSub.selectList("getSiteReportListToDay", search);
}
@Override
public List<HashMap> getSiteReportListSumToDay(SiteSearch search) {
return sqlSessionSub.selectList("getSiteReportListSumToDay", search);
}
@Override
public List<HashMap> getDashBoardList(SiteSearch search) {
return sqlSessionSub.selectList("getDashBoardList", search);
}
@Override
public List<HashMap> getDashBoardMonth(SiteSearch search) {
return sqlSessionSub.selectList("getDashBoardMonth", search);
}
@Override
public HashMap getYdayBetInfoBySite(Site targetSite) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getYdayBetInfoBySite", targetSite);
}
@Override
public HashMap getMonthBetInfoBySite(Site targetSite) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getMonthBetInfoBySite", targetSite);
}
@Override
public HashMap getYdayBetInfoByUser(HashMap targetUser) {
return sqlSessionSub.selectOne("getYdayBetInfoByUser", targetUser);
}
@Override
public HashMap getMonthBetInfoByUser(HashMap targetUser) {
return sqlSessionSub.selectOne("getMonthBetInfoByUser", targetUser);
}
@Override
public HashMap getVendorDailyReportMonthByParse(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getVendorDailyReportMonthByParse", search);
}
@Override
public List<HashMap> getVendorDailyReportListDayByParse(SiteSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getVendorDailyReportListDayByParse", search);
}
@Override
public HashMap getHybridReport(ReportSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getHybridReport", search);
}
@Override
public List<HashMap> getHybridReportList(@Valid ReportSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getHybridReportList", search);
}
@Override
public HashMap getHybridReportTotal(@Valid ReportSearch search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getHybridReportTotal", search);
}
}

View File

@@ -0,0 +1,5 @@
package com.bb.dao;
public interface TplusDao {
}

View File

@@ -0,0 +1,24 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.bb.model.CronStatusVo;
@Repository("tplusDao")
public class TplusDaoImpl implements TplusDao {
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
}

View File

@@ -0,0 +1,36 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import com.bb.model.BetParam;
import com.bb.model.NexusTrplVO;
import com.bb.model.TransSearchVO;
public interface TransDao {
int getTransBetListCnt(TransSearchVO search);
List<HashMap<String, Object>> getTransBetList(TransSearchVO search);
HashMap<String, Object> getTransBetListSum(TransSearchVO search);
int getTransBetFastListCnt(TransSearchVO search);
List<HashMap<String, String>> getTransBetFastList(TransSearchVO search);
HashMap<String, Object> getBetListItem(String betId);
HashMap<String, String> getTransBetFastListSum(TransSearchVO search);
HashMap getBetInfoByBetId(BetParam param);
String getGsoftRoundIdByBetId(String betId);
HashMap getSiteBetByRefIdFromOld(BetParam param);
HashMap<String, String> getApiInfo(String vendorTitle);
int deleteEvoDetailNull(HashMap detailMap);
}

View File

@@ -0,0 +1,98 @@
package com.bb.dao;
import java.util.HashMap;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Repository;
import com.bb.model.BetParam;
import com.bb.model.NexusTrplVO;
import com.bb.model.TransSearchVO;
@Repository("transDao")
public class TransDaoImpl implements TransDao {
/** 메인DB 연결 */
@Autowired @Qualifier("sqlSessionMain")
protected SqlSession sqlSession;
/** 서브DB 연결 */
@Autowired @Qualifier("sqlSessionSub")
protected SqlSession sqlSessionSub;
@Override
public int getTransBetListCnt(TransSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getTransBetListCnt", search);
}
@Override
public List<HashMap<String, Object>> getTransBetList(TransSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getTransBetList", search);
}
@Override
public HashMap<String, Object> getTransBetListSum(TransSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getTransBetListSum", search);
}
@Override
public int getTransBetFastListCnt(TransSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getTransBetFastListCnt", search);
}
@Override
public List<HashMap<String, String>> getTransBetFastList(TransSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectList("getTransBetFastList", search);
}
@Override
public HashMap<String, Object> getBetListItem(String betId) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getBetListItem", betId);
}
@Override
public HashMap<String, String> getTransBetFastListSum(TransSearchVO search) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getTransBetFastListSum", search);
}
@Override
public HashMap getBetInfoByBetId(BetParam param) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getBetInfoByBetId", param);
}
@Override
public String getGsoftRoundIdByBetId(String betId) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getGsoftRoundIdByBetId", betId);
}
@Override
public HashMap getSiteBetByRefIdFromOld(BetParam param) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getSiteBetByRefIdFromOld", param);
}
@Override
public HashMap<String, String> getApiInfo(String vendorTitle) {
// TODO Auto-generated method stub
return sqlSessionSub.selectOne("getApiInfo", vendorTitle);
}
@Override
public int deleteEvoDetailNull(HashMap detailMap) {
// TODO Auto-generated method stub
return sqlSession.delete("deleteEvoDetailNull", detailMap);
}
}

View File

@@ -0,0 +1,37 @@
package com.bb.exception;
import com.bb.model.ApiResponse;
/**
* @FileName : ApiException
* @Project : skhappy
* @Date : 2019. 04. 10.
* @Author : pulip
* @Description :
*/
public class ApiException extends Exception {
protected ApiResponse apiResponse;
public ApiException() {
this("E001", "오류가 발생하였습니다.");
}
public ApiException(String message) {
this("E001", message);
}
/*public ApiException(ApiResponse apiResponse) {
this(apiResponse, "오류가 발생하였습니다.");
}*/
public ApiException(String resultCode, String message) {
this.apiResponse = new ApiResponse();
this.apiResponse.setResultCode(resultCode);
this.apiResponse.setResultMessage(message);
}
public ApiResponse getApiResponse() {
return this.apiResponse;
}
}

View File

@@ -0,0 +1,9 @@
package com.bb.exception;
public class NoDataApiException extends ApiException {
public NoDataApiException() {
super("9004", "조회된 데이터가 없습니다.");
}
}

View File

@@ -0,0 +1,10 @@
package com.bb.exception;
public class RequestArraySizeApiException extends ApiException {
public RequestArraySizeApiException(String parameterName) {
super("9003", "요청 배열 파라미터 크기에 오류가 있습니다. : " + parameterName);
}
}

View File

@@ -0,0 +1,9 @@
package com.bb.exception;
public class RequestHeaderApiException extends ApiException {
public RequestHeaderApiException(String headerName) {
super("9001", "요청 헤더정보가 없습니다 : " + headerName);
}
}

View File

@@ -0,0 +1,8 @@
package com.bb.exception;
public class RequestParameterApiException extends ApiException {
public RequestParameterApiException(String parameterName) {
super("9002", "필수 요청 파라미터가 없습니다. : " + parameterName);
}
}

View File

@@ -0,0 +1,177 @@
package com.bb.front;
import java.io.IOException;
import java.net.InetAddress;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.bb.exception.ApiException;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.CoinVo;
import com.bb.model.Site;
import com.bb.service.CoinService;
import com.bb.service.SiteService;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
@RestController
@Slf4j
@RequestMapping("/api/coin")
@RequiredArgsConstructor
@SecurityRequirement(name = "Authorization")
public class ApiCoinController {
@Autowired
private final JwtManager jwtManager;
@Autowired
SiteService siteService;
@Autowired
CoinService coinService;
@ResponseBody
@PostMapping(value="")
public ApiResponse getCoinInfo(@RequestHeader String token, HttpServletRequest request) throws Exception {
ApiResponse apiResponse = new ApiResponse();
String coinSymbol = request.getParameter("symbol");
String currency = request.getParameter("currency");
try {
//apiKey 체크
Site site = siteService.getSiteInfo(request);
if(site==null) {
throw new ApiException("1000", "accessDinied");
}
if(token==null) {
throw new ApiException("1000", "accessDinied");
}
//토큰체크
JwtManager.TokenInfo tokenInfo = jwtManager.getTokenInfo(token);
if(token == null) {
log.error("#-p1::agentBalance::"+ "access denied token");
throw new ApiException("1000", "access denied token");
}
CoinVo coinVo = coinService.getCoinInfo(coinSymbol, currency);
apiResponse.put("info",coinVo);
apiResponse.success();
return apiResponse;
}catch(Exception e) {
log.info("ddd" +e.toString());
apiResponse.fail();
return apiResponse;
}
}
@Scheduled(fixedDelay = 300*1000) // 5분
public void getCoinAllInfo() throws Exception {
// Authentication auth =
// new UsernamePasswordAuthenticationToken("system", null,
// AuthorityUtils.createAuthorityList("ROLE_ADMIN"));
// SecurityContextHolder.getContext().setAuthentication(auth);
String hostname = InetAddress.getLocalHost().getHostName();
if("ip-172-31-40-216.ap-northeast-3.compute.internal".equals(hostname)) { // 3번 서버 호스트 네임으로 빠꺼야함
String[] currency = {"usd","krw"};
String cgApiKey = "CG-wJAwrJWZCSbzmBhk545CTcR3";
try {
for(int cu=0;cu<currency.length;cu++) {
OkHttpClient client = new OkHttpClient();
Request req = new Request.Builder()
.url("https://pro-api.coingecko.com/api/v3/coins/markets?vs_currency="+currency[cu])
.get()
.addHeader("accept", "application/json")
.addHeader("x-cg-pro-api-key", cgApiKey)
.build();
try (Response response = client.newCall(req).execute()) {
if (!response.isSuccessful()) {
log.info("Request failed with code: " + response.code());
} else {
String responseBody = response.body().string(); // 응답 본문 저장
// log.info("Response: " + responseBody);
// JSON 처리 예제
JSONArray coinList = new JSONArray(responseBody);
for (int c = 0; c < coinList.length(); c++) {
// log.info(coinList.get(c).toString());
JSONObject coinjson = new JSONObject(coinList.get(c).toString());
CoinVo coinInfo = new CoinVo();
coinInfo.setId(coinjson.getString("id"));
coinInfo.setSymbol(coinjson.getString("symbol"));
coinInfo.setName(coinjson.getString("name"));
coinInfo.setCurrency(currency[cu]);
coinInfo.setImage(coinjson.getString("image"));
coinInfo.setCurrentPrice(String.valueOf(coinjson.get("current_price")));
coinInfo.setMarketCap(String.valueOf(coinjson.get("market_cap")));
coinInfo.setMarketCapRank(coinjson.getInt("market_cap_rank"));
coinInfo.setFullyDilutedValuation(String.valueOf(coinjson.get("fully_diluted_valuation")));
coinInfo.setTotalVolume(String.valueOf(coinjson.get("total_volume")));
coinInfo.setHigh24h(String.valueOf(coinjson.get("high_24h")));
coinInfo.setLow24h(String.valueOf(coinjson.get("low_24h")));
coinInfo.setPriceChange24h(String.valueOf(coinjson.get("price_change_24h")));
coinInfo.setPriceChangePercentage24h(String.valueOf(coinjson.get("price_change_percentage_24h")));
coinInfo.setMarketCapChange24h(String.valueOf(coinjson.get("market_cap_change_24h")));
coinInfo.setMarketCapChangePercentage24h(String.valueOf(coinjson.get("market_cap_change_percentage_24h")));
coinInfo.setCirculatingSupply(String.valueOf(coinjson.get("circulating_supply")));
coinInfo.setTotalSupply(String.valueOf(coinjson.get("total_supply")));
coinInfo.setMaxSupply(String.valueOf(coinjson.get("max_supply")));
coinInfo.setAth(String.valueOf(coinjson.get("ath")));
coinInfo.setAthChangePercentage(String.valueOf(coinjson.get("ath_change_percentage")));
coinInfo.setAthDate(LocalDateTime.parse(coinjson.getString("ath_date"), DateTimeFormatter.ISO_DATE_TIME));
coinInfo.setAtl(String.valueOf(coinjson.get("atl")));
coinInfo.setAtlChangePercentage(String.valueOf(coinjson.get("atl_change_percentage")));
coinInfo.setAtlDate(LocalDateTime.parse(coinjson.getString("atl_date"), DateTimeFormatter.ISO_DATE_TIME));
coinInfo.setRoi(coinjson.isNull("roi") ? null : coinjson.get("roi").toString());
coinInfo.setLastUpdated(LocalDateTime.parse(coinjson.getString("last_updated"), DateTimeFormatter.ISO_DATE_TIME));
coinService.saveCoinInfo(coinInfo);
}
}
} catch (IOException e) {
log.error("Error during API call", e);
}
}
}catch(Exception e) {
log.info("ddd" +e.toString());
}
}
// SecurityContextHolder.clearContext();
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,964 @@
package com.bb.front;
import java.util.HashMap;
import java.util.Random;
import jakarta.servlet.http.HttpServletRequest;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientRequestException;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import com.bb.jwt.JwtManager;
import com.bb.model.ApiResponse;
import com.bb.model.AuthParam;
import com.bb.model.CheckVo;
import com.bb.model.CommonParam;
import com.bb.model.EvoResponse;
import com.bb.model.EvolutionVo;
import com.bb.model.Member;
import com.bb.model.PlayParam;
import com.bb.service.SiteService;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RestController
@Slf4j
@RequestMapping("/api/callback/evot")
@RequiredArgsConstructor
@SecurityRequirement(name = "Authorization")
public class CallBackBetGambleController {
@Autowired
private final JwtManager jwtManager;
@Autowired
SiteService siteService;
@Autowired
WebClient webClient;
@ResponseBody
@RequestMapping(value="/test")
public EvoResponse test(HttpServletRequest request, @RequestBody EvolutionVo evo) throws Exception {
EvoResponse evoResponse = new EvoResponse();
try {
log.debug(evo.toString());
JSONObject member = new JSONObject();
member.put("userId", "moka_gk01");
log.info("# site.getSiteCbUrl() : " + "https://dev-api.allboxstage.com/triple/balance");
log.info("# site.getSiteCbUrl() : " + member.toString());
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json");
header.add("Accept", "application/json");
header.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
ResponseEntity<String> responseEntity = null;
try {
responseEntity = webClient.post()
.uri("https://dev-api.allboxstage.com/triple/balance")
.headers(h -> h.addAll(header))
.bodyValue(member.toString())
.retrieve()
.toEntity(String.class)
.block();
} catch(WebClientResponseException e) {
log.error("test::HttpClientErrorException : " + e.getMessage());
log.error("test::status code : " + e.getStatusCode().value());
log.error("test::response body : " + e.getResponseBodyAsString());
evoResponse.fail();
return evoResponse;
} catch (WebClientRequestException rae) {
if(rae.getCause() instanceof io.netty.channel.ConnectTimeoutException) {
log.error("test::ConnectTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof io.netty.handler.timeout.ReadTimeoutException) {
log.error("test::SocketTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error("test::InterruptedException::" + rae.getMessage());
}
log.error("test::WebClientRequestException : " + rae.getMessage());
evoResponse.fail();
return evoResponse;
}
if(responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
log.info("status code : {}", responseEntity.getStatusCode());
log.info("body: {}", responseEntity.getBody());
JSONObject resData = new JSONObject(responseEntity.getBody());
if(resData.getInt("result_code") == 0) {
evoResponse.setUuid(evo.getUuid());
evoResponse.setBalance( resData.getDouble("balance"));
evoResponse.setBonus(0.0);
evoResponse.success();
}else {
evoResponse.setBalance( resData.getDouble("balance"));
evoResponse.fail();
}
} else {
log.error("test::Unexpected response status code");
evoResponse.fail();
}
} catch (Exception e) {
log.info(e.toString());
e.printStackTrace();
evoResponse.fail();
}
return evoResponse;
}
@ResponseBody
@RequestMapping(value="/")
public ApiResponse main(HttpServletRequest request, @RequestBody CheckVo check) throws Exception {
ApiResponse apiResponse = new ApiResponse();
try {
apiResponse.success();
} catch (Exception e) {
log.info(e.toString());
e.printStackTrace();
apiResponse.fail();
}
return apiResponse;
}
@ResponseBody
@RequestMapping(value={"/sid"})
public EvoResponse sid(HttpServletRequest request, @RequestBody CheckVo check) throws Exception {
EvoResponse evoResponse = new EvoResponse();
System.out.print("sid CHECK " + check.toString());
try {
//사이트정보
HashMap sParam = new HashMap();
sParam.put("siteIdx",Integer.parseInt(check.getUserId().substring(0, 3), 16));
sParam.put("memberId", check.getUserId().substring(3, check.getUserId().length()));
String memberId =check.getUserId().substring(3, check.getUserId().length());
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
AuthParam param = new AuthParam();
param.setBalance(0);
param.setUserId(memberId);
param.setNickName(check.getUserId());
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(Integer.parseInt(siteApiInfo.get("siteIdx").toString()));
commonParam.setAuthParam(param);
System.out.print("CHECK " + check.toString());
Member member = siteService.getMember(commonParam);
if(member == null) {
siteService.insertMember(commonParam);
member = siteService.getMember(commonParam);
}
String sid = makeApiKey("");
member.setLastSid(sid);
siteService.updateSid(member);
evoResponse.setSid(sid);
evoResponse.setUuid(check.getUuid());
evoResponse.success();
} catch (Exception e) {
log.info(e.toString());
e.printStackTrace();
evoResponse.fail();
}
return evoResponse;
}
@ResponseBody
@RequestMapping(value={"/check"})
public EvoResponse check(HttpServletRequest request, @RequestBody CheckVo check) throws Exception {
EvoResponse evoResponse = new EvoResponse();
try {
System.out.print("check CHECK " + check.toString());
evoResponse.setSid(check.getSid());
evoResponse.setUuid(check.getUuid());
//사이트정보
HashMap sParam = new HashMap();
sParam.put("siteIdx",Integer.parseInt(check.getUserId().substring(0, 3), 16));
sParam.put("memberId", check.getUserId().substring(3, check.getUserId().length()));
String memberId =check.getUserId().substring(3, check.getUserId().length());
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
AuthParam param = new AuthParam();
param.setBalance(0);
param.setUserId(memberId);
param.setNickName(check.getUserId());
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(Integer.parseInt(siteApiInfo.get("siteIdx").toString()));
commonParam.setAuthParam(param);
System.out.print("CHECK " + check.toString());
Member member = siteService.getMember(commonParam);
// 회원 없을경우 가입시키기
if(member == null) {
System.out.print("CHECK INVALID_PARAMETER");
evoResponse.fail("INVALID_PARAMETER");
return evoResponse;
}
/*
if(!check.getSid().equals(member.getLastSid())) {
evoResponse.fail("INVALID_SID");
return evoResponse;
}
*/
evoResponse.success();
} catch (Exception e) {
log.info(e.toString());
e.printStackTrace();
evoResponse.fail();
}
return evoResponse;
}
@ResponseBody
@RequestMapping(value="/balance")
public EvoResponse balance(HttpServletRequest request, @RequestBody EvolutionVo evo) throws Exception {
EvoResponse evoResponse = new EvoResponse();
try {
log.debug(evo.toString());
//사이트정보
HashMap sParam = new HashMap();
sParam.put("siteIdx",Integer.parseInt(evo.getUserId().substring(0, 3), 16));
sParam.put("memberId", evo.getUserId().substring(3, evo.getUserId().length()));
String memberId =evo.getUserId().substring(3, evo.getUserId().length());
/*
AuthParam param = new AuthParam();
param.setBalance(0);
param.setUserId("moka_"+evo.getUserId());
param.setNickName(evo.getUserId());
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(1);
commonParam.setAuthParam(param);
Member memberS = siteService.getMember(commonParam);
if(!evo.getSid().equals(memberS.getLastSid())) {
evoResponse.fail("INVALID_SID");
return evoResponse;
}
*/
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
if(siteApiInfo==null) {
evoResponse.setBalance(null);
evoResponse.fail();
return evoResponse;
}
JSONObject member = new JSONObject();
member.put("userId", memberId);
log.info("# site.getSiteCbUrl() : " + siteApiInfo.get("siteCbUrl")+"/balance");
log.info("# site.getSiteCbUrl() : " + member.toString());
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json");
header.add("Accept", "application/json");
header.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
ResponseEntity<String> responseEntity = null;
try {
responseEntity = webClient.post()
.uri(siteApiInfo.get("siteCbUrl")+"/balance")
.headers(h -> h.addAll(header))
.bodyValue(member.toString())
.retrieve()
.toEntity(String.class)
.block();
} catch(WebClientResponseException e) {
log.error("balance::HttpClientErrorException : " + e.getMessage());
log.error("balance::status code : " + e.getStatusCode().value());
log.error("balance::response body : " + e.getResponseBodyAsString());
evoResponse.setBalance(null);
evoResponse.fail();
return evoResponse;
} catch (WebClientRequestException rae) {
if(rae.getCause() instanceof io.netty.channel.ConnectTimeoutException) {
log.error("balance::ConnectTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof io.netty.handler.timeout.ReadTimeoutException) {
log.error("balance::SocketTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error("balance::InterruptedException::" + rae.getMessage());
}
log.error("balance::WebClientRequestException : " + rae.getMessage());
evoResponse.setBalance(null);
evoResponse.fail();
return evoResponse;
}
if(responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
log.info("status code : {}", responseEntity.getStatusCode());
log.info("body: {}", responseEntity.getBody());
JSONObject resData = new JSONObject(responseEntity.getBody());
if(resData.getInt("result_code") == 0) {
evoResponse.setUuid(evo.getUuid());
evoResponse.setBalance( resData.getDouble("balance"));
evoResponse.setBonus(0.0);
evoResponse.success();
}else {
evoResponse.setBalance( resData.getDouble("balance"));
evoResponse.fail();
}
} else {
log.error("balance::Unexpected response status code");
evoResponse.setBalance(null);
evoResponse.fail();
}
} catch (Exception e) {
log.info(e.toString());
e.printStackTrace();
evoResponse.fail();
}
return evoResponse;
}
@ResponseBody
@RequestMapping(value="/debit")
public EvoResponse debit (HttpServletRequest request, @RequestBody EvolutionVo evo) throws Exception {
EvoResponse evoResponse = new EvoResponse();
try {
log.debug(evo.toString());
//사이트정보
//사이트정보
HashMap sParam = new HashMap();
sParam.put("siteIdx",Integer.parseInt(evo.getUserId().substring(0, 3), 16));
sParam.put("memberId", evo.getUserId().substring(3, evo.getUserId().length()));
String memberId =evo.getUserId().substring(3, evo.getUserId().length());
/*
AuthParam param = new AuthParam();
param.setBalance(0);
param.setUserId("moka_"+evo.getUserId());
param.setNickName(evo.getUserId());
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(1);
commonParam.setAuthParam(param);
Member memberS = siteService.getMember(commonParam);
if(!evo.getSid().equals(memberS.getLastSid())) {
evoResponse.fail("INVALID_SID");
return evoResponse;
}
*/
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
String siteId = siteApiInfo.get("siteId").toString();
if(siteApiInfo==null) {
evoResponse.setBalance(null);
evoResponse.fail();
return evoResponse;
}
// 사이트에 크레딧이 없을경우 에러 보냄 베팅막음
long targetSiteCredit = siteService.getSiteCredit(siteApiInfo.get("siteId").toString());
if(targetSiteCredit < evo.getTransaction().getAmount() ) {
System.out.println("no siteCredit");
evoResponse.setBalance(null);
evoResponse.fail("INSUFFICIENT_FUNDS2");
return evoResponse;
}
//최대베팅액 (userMaxBet 우선 적용)
sParam.put("vendorIdx", 1);
long maxBet = siteService.getSiteMaxBet(sParam);
// userMaxBet 조회
long userMaxBet = 0;
Long userMaxBetObj = siteService.getUserMaxBet(sParam);
if(userMaxBetObj != null) {
userMaxBet = userMaxBetObj;
}
// 최종 maxBet 결정: userMaxBet이 0이면 siteMaxBet 사용, 0이 아니면 userMaxBet 사용
long finalMaxBet = (userMaxBet > 0) ? userMaxBet : maxBet;
System.out.println("MaxBet Info - siteMaxBet: " + maxBet + ", userMaxBet: " + userMaxBet + ", finalMaxBet: " + finalMaxBet);
if(evo.getTransaction().getAmount() > finalMaxBet) {
System.out.println("Over bet money - finalMaxBet: " + finalMaxBet);
evoResponse.setBalance(null);
evoResponse.fail("INSUFFICIENT_FUNDS3");
return evoResponse;
}
int fatErrCnt = siteService.getFinalErr(evo.getTransaction().getRefId());
if(fatErrCnt > 0) {
JSONObject member = new JSONObject();
member.put("userId", memberId);
HttpHeaders headerb = new HttpHeaders();
headerb.add("Content-Type", "application/json");
headerb.add("Accept", "application/json");
ResponseEntity<String> responseEntityb = null;
try {
responseEntityb = webClient.post()
.uri(siteApiInfo.get("siteCbUrl")+"/balance")
.headers(h -> h.addAll(headerb))
.bodyValue(member.toString())
.retrieve()
.toEntity(String.class)
.block();
} catch(WebClientResponseException e) {
log.error("debit(fatErrCnt)::HttpClientErrorException : " + e.getMessage());
log.error("debit(fatErrCnt)::status code : " + e.getStatusCode().value());
log.error("debit(fatErrCnt)::response body : " + e.getResponseBodyAsString());
evoResponse.fail();
return evoResponse;
} catch (WebClientRequestException rae) {
if(rae.getCause() instanceof io.netty.channel.ConnectTimeoutException) {
log.error("debit(fatErrCnt)::ConnectTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof io.netty.handler.timeout.ReadTimeoutException) {
log.error("debit(fatErrCnt)::SocketTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error("debit(fatErrCnt)::InterruptedException::" + rae.getMessage());
}
log.error("debit(fatErrCnt)::WebClientRequestException : " + rae.getMessage());
evoResponse.fail();
return evoResponse;
}
if(responseEntityb != null && responseEntityb.getStatusCode() == HttpStatus.OK) {
log.info("status code : {}", responseEntityb.getStatusCode());
log.info("body: {}", responseEntityb.getBody());
JSONObject resDatab = new JSONObject(responseEntityb.getBody());
evoResponse.setBalance(resDatab.getDouble("balance"));
evoResponse.fail("FINAL_ERROR_ACTION_FAILED");
return evoResponse;
}
}
HashMap tranParam = new HashMap();
tranParam.put("tranId", siteId+evo.getTransaction().getId());
tranParam.put("refId", siteId+evo.getTransaction().getRefId());
tranParam.put("siteIdx", siteApiInfo.get("siteIdx"));
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", siteApiInfo.get("memberIdx"));
tranParam.put("memberId", memberId);
tranParam.put("vendorIdx", 1);
tranParam.put("vendorCode", "evolution");
tranParam.put("vendorTranKey", evo.getTransaction().getId());
tranParam.put("gameIdx", evo.getGame().getType());
tranParam.put("tranType", "debit");
tranParam.put("depositAmt", evo.getTransaction().getAmount());
tranParam.put("creditAmt", "0");
tranParam.put("isCancel", "N");
tranParam.put("isTie", "N");
tranParam.put("apiStatus", 0);
tranParam.put("completed", false);
try {
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(Integer.parseInt(siteApiInfo.get("siteIdx").toString()));
PlayParam param = new PlayParam();
param.setVendorKey("C01");
commonParam.setPlayParam(param);
HashMap venderInfo = siteService.getVenderApiInfo(commonParam);
tranParam.put("vendorApiId", venderInfo.get("vendorApiId").toString());
}catch(Exception e) {System.out.println("VI ERR:" + e.toString());}
siteService.commonBetinsert(tranParam);
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json");
header.add("Accept", "application/json");
header.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
JSONObject debit = new JSONObject();
debit.put("betId", siteId+evo.getTransaction().getRefId());
debit.put("tranId", siteId+evo.getTransaction().getId());
debit.put("userId", memberId);
debit.put("vendorIdx", 1);
debit.put("vendorKey","C01");
debit.put("vendor", "evolution");
debit.put("gameIdx", 1);
debit.put("gameKey",evo.getGame().getType());
debit.put("tranType", "debit");
debit.put("debit", evo.getTransaction().getAmount());
debit.put("credit", 0);
debit.put("isCancel", 0);
debit.put("isBonus",0);
log.info("send code : {}", debit.toString());
ResponseEntity<String> responseEntity = null;
try {
responseEntity = webClient.post()
.uri(siteApiInfo.get("siteCbUrl")+"/changebalance")
.headers(h -> h.addAll(header))
.bodyValue(debit.toString())
.retrieve()
.toEntity(String.class)
.block();
} catch(WebClientResponseException e) {
log.error("debit::HttpClientErrorException : " + e.getMessage());
log.error("debit::status code : " + e.getStatusCode().value());
log.error("debit::response body : " + e.getResponseBodyAsString());
evoResponse.fail();
return evoResponse;
} catch (WebClientRequestException rae) {
if(rae.getCause() instanceof io.netty.channel.ConnectTimeoutException) {
log.error("debit::ConnectTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof io.netty.handler.timeout.ReadTimeoutException) {
log.error("debit::SocketTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error("debit::InterruptedException::" + rae.getMessage());
}
log.error("debit::WebClientRequestException : " + rae.getMessage());
evoResponse.fail();
return evoResponse;
}
if(responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
log.info("status code : {}", responseEntity.getStatusCode());
log.info("bodyD: {}", responseEntity.getBody());
JSONObject resData = new JSONObject(responseEntity.getBody());
log.info("result_Dcode: {}", resData.getInt("result_code"));
if(resData.getLong("result_code") == 0) {
tranParam.put("balance", resData.getDouble("balance"));
int res = siteService.updateCbApi(tranParam);
log.info("result_Dcode: {}2");
evoResponse.setUuid(evo.getUuid());
evoResponse.setBalance( resData.getDouble("balance"));
evoResponse.setBonus(0.0);
evoResponse.success();
}else if(resData.getLong("result_code") == 80) {
evoResponse.setBalance( resData.getDouble("balance"));
evoResponse.fail("INSUFFICIENT_FUNDS");
}else if(resData.getLong("result_code") == 98) {
log.info("result_Dcode 98: {}1");
evoResponse.fail("BET_ALREADY_EXIST");
evoResponse.setBalance( resData.getDouble("balance"));
}else {
evoResponse.fail();
}
} else {
log.error("debit::Unexpected response status code");
evoResponse.fail();
}
} catch (Exception e) {
log.info(e.toString());
e.printStackTrace();
evoResponse.fail();
}
return evoResponse;
}
@ResponseBody
@RequestMapping(value={"/credit","/cancel"})
public EvoResponse credit (HttpServletRequest request, @RequestBody EvolutionVo evo) throws Exception {
EvoResponse evoResponse = new EvoResponse();
try {
log.debug(evo.toString());
//사이트정보
HashMap sParam = new HashMap();
sParam.put("siteIdx",Integer.parseInt(evo.getUserId().substring(0, 3), 16));
sParam.put("memberId", evo.getUserId().substring(3, evo.getUserId().length()));
String memberId =evo.getUserId().substring(3, evo.getUserId().length());
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
String siteId = siteApiInfo.get("siteId").toString();
HashMap tranParam = new HashMap();
tranParam.put("tranId",siteId+evo.getTransaction().getId());
tranParam.put("refId", siteId+evo.getTransaction().getRefId());
tranParam.put("siteIdx", siteApiInfo.get("siteIdx"));
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", siteApiInfo.get("memberIdx"));
tranParam.put("memberId", memberId);
tranParam.put("vendorIdx", 1);
tranParam.put("vendorCode", "evolution");
tranParam.put("vendorTranKey", evo.getTransaction().getId());
tranParam.put("gameIdx", evo.getGame().getType());
tranParam.put("tranType", "credit");
tranParam.put("depositAmt", 0);
tranParam.put("creditAmt", evo.getTransaction().getAmount());
tranParam.put("completed", true);
tranParam.put("isCancel", "N");
if(request.getRequestURI().indexOf("cancel") > 0 ) {
tranParam.put("isCancel", "Y");
}
tranParam.put("isTie", "N");
tranParam.put("apiStatus", 0);
try {
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(Integer.parseInt(siteApiInfo.get("siteIdx").toString()));
PlayParam param = new PlayParam();
param.setVendorKey("C01");
commonParam.setPlayParam(param);
HashMap venderInfo = siteService.getVenderApiInfo(commonParam);
tranParam.put("vendorApiId", venderInfo.get("vendorApiId").toString());
}catch(Exception e) {System.out.println("VI ERR:" + e.toString());}
siteService.commonBetinsert(tranParam);
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json");
header.add("Accept", "application/json");
header.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
JSONObject debit = new JSONObject();
debit.put("betId", siteId+evo.getTransaction().getRefId());
debit.put("tranId", siteId+evo.getTransaction().getId());
debit.put("userId", memberId);
debit.put("vendorIdx", 1);
debit.put("vendorKey","C01");
debit.put("vendor", "evolution");
debit.put("gameIdx", 1);
debit.put("gameKey",evo.getGame().getType());
debit.put("tranType", "credit");
debit.put("debit", 0);
debit.put("credit", evo.getTransaction().getAmount());
debit.put("isCancel",0);
debit.put("isBonus",0);
if(request.getRequestURI().indexOf("cancel") > 0 ) {
debit.put("isCancel",1);
}
log.info("send code : {}", debit.toString());
ResponseEntity<String> responseEntity = null;
try {
responseEntity = webClient.post()
.uri(siteApiInfo.get("siteCbUrl")+"/changebalance")
.headers(h -> h.addAll(header))
.bodyValue(debit.toString())
.retrieve()
.toEntity(String.class)
.block();
} catch(WebClientResponseException e) {
log.error("credit::HttpClientErrorException : " + e.getMessage());
log.error("credit::status code : " + e.getStatusCode().value());
log.error("credit::response body : " + e.getResponseBodyAsString());
evoResponse.fail();
return evoResponse;
} catch (WebClientRequestException rae) {
if(rae.getCause() instanceof io.netty.channel.ConnectTimeoutException) {
log.error("credit::ConnectTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof io.netty.handler.timeout.ReadTimeoutException) {
log.error("credit::SocketTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error("credit::InterruptedException::" + rae.getMessage());
}
log.error("credit::WebClientRequestException : " + rae.getMessage());
evoResponse.fail();
return evoResponse;
}
if(responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
log.info("status code : {}", responseEntity.getStatusCode());
log.info("bodyC: {}", responseEntity.getBody());
JSONObject resData = new JSONObject(responseEntity.getBody());
log.info("result_DCcode: {}", resData.getInt("result_code"));
if(resData.getLong("result_code") == 0) {
log.info("siteService.updateCbApi(tranParam)");
tranParam.put("balance", resData.getDouble("balance"));
int res = siteService.updateCbApi(tranParam);
evoResponse.setUuid(evo.getUuid());
evoResponse.setBalance( resData.getDouble("balance"));
evoResponse.setBonus(0.0);
evoResponse.success();
}else if(resData.getLong("result_code") == 99) {
if(request.getRequestURI().indexOf("cancel") > 0 ) {
HashMap eParam = new HashMap();
eParam.put("betId", evo.getTransaction().getRefId());
eParam.put("errorType", "FATAL_ERROR");
siteService.insertError(eParam);
}
evoResponse.fail("BET_DOES_NOT_EXIST");
evoResponse.setBalance( resData.getDouble("balance"));
}else if(resData.getLong("result_code") == 98) {
evoResponse.fail("BET_ALREADY_SETTLED");
evoResponse.setBalance( resData.getDouble("balance"));
}else {
evoResponse.fail();
}
} else {
log.error("credit::Unexpected response status code");
evoResponse.fail();
}
} catch (Exception e) {
log.info(e.toString());
e.printStackTrace();
evoResponse.fail();
}
return evoResponse;
}
@ResponseBody
@RequestMapping(value={"/promo_payout"})
public EvoResponse promo_payout (HttpServletRequest request, @RequestBody EvolutionVo evo) throws Exception {
EvoResponse evoResponse = new EvoResponse();
try {
log.debug(evo.toString());
//사이트정보
HashMap sParam = new HashMap();
String[] usrinfo = evo.getUserId().split("_");
sParam.put("siteIdx",Integer.parseInt(evo.getUserId().substring(0, 3), 16));
sParam.put("memberId", evo.getUserId().substring(3, evo.getUserId().length()));
String memberId =evo.getUserId().substring(3, evo.getUserId().length());
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
String siteId = siteApiInfo.get("siteId").toString();
HashMap tranParam = new HashMap();
tranParam.put("tranId",siteId+evo.getPromoTransaction().getId());
tranParam.put("refId", siteId+evo.getPromoTransaction().getId());
tranParam.put("siteIdx", siteApiInfo.get("siteIdx"));
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", siteApiInfo.get("memberIdx"));
tranParam.put("memberId", memberId);
tranParam.put("vendorIdx", 1);
tranParam.put("vendorCode", "evolution");
tranParam.put("vendorTranKey", evo.getPromoTransaction().getId());
tranParam.put("gameIdx", evo.getPromoTransaction().getType());
tranParam.put("tranType", "promo");
tranParam.put("depositAmt", 0);
tranParam.put("creditAmt", evo.getPromoTransaction().getAmount());
tranParam.put("isCancel", "N");
if(request.getRequestURI().indexOf("cancel") > 0 ) {
tranParam.put("isCancel", "Y");
}
tranParam.put("isTie", "N");
tranParam.put("apiStatus", 0);
tranParam.put("completed", true);
try {
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(Integer.parseInt(siteApiInfo.get("siteIdx").toString()));
PlayParam param = new PlayParam();
param.setVendorKey("C01");
commonParam.setPlayParam(param);
HashMap venderInfo = siteService.getVenderApiInfo(commonParam);
tranParam.put("vendorApiId", venderInfo.get("vendorApiId").toString());
}catch(Exception e) {System.out.println("VI ERR:" + e.toString());}
siteService.commonBetinsert(tranParam);
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json");
header.add("Accept", "application/json");
header.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
JSONObject debit = new JSONObject();
debit.put("betId", siteId+evo.getPromoTransaction().getId());
debit.put("tranId", siteId+evo.getPromoTransaction().getId());
debit.put("userId", memberId);
debit.put("vendorIdx", 1);
debit.put("vendorKey","C01");
debit.put("vendor","evolution");
debit.put("gameIdx", 1);
debit.put("gameKey",evo.getPromoTransaction().getType());
debit.put("tranType", "credit");
debit.put("debit", 0);
debit.put("credit", evo.getPromoTransaction().getAmount());
debit.put("isCancel",0);
debit.put("isBonus",1);
log.info("send code : {}", debit.toString());
ResponseEntity<String> responseEntity = null;
try {
responseEntity = webClient.post()
.uri(siteApiInfo.get("siteCbUrl")+"/changebalance")
.headers(h -> h.addAll(header))
.bodyValue(debit.toString())
.retrieve()
.toEntity(String.class)
.block();
} catch(WebClientResponseException e) {
log.error("promo_payout::HttpClientErrorException : " + e.getMessage());
log.error("promo_payout::status code : " + e.getStatusCode().value());
log.error("promo_payout::response body : " + e.getResponseBodyAsString());
evoResponse.fail();
return evoResponse;
} catch (WebClientRequestException rae) {
if(rae.getCause() instanceof io.netty.channel.ConnectTimeoutException) {
log.error("promo_payout::ConnectTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof io.netty.handler.timeout.ReadTimeoutException) {
log.error("promo_payout::SocketTimeoutException::" + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error("promo_payout::InterruptedException::" + rae.getMessage());
}
log.error("promo_payout::WebClientRequestException : " + rae.getMessage());
evoResponse.fail();
return evoResponse;
}
if(responseEntity != null && responseEntity.getStatusCode() == HttpStatus.OK) {
log.info("status code : {}", responseEntity.getStatusCode());
log.info("bodyC: {}", responseEntity.getBody());
JSONObject resData = new JSONObject(responseEntity.getBody());
log.info("result_DCcode: {}", resData.getInt("result_code"));
if(resData.getLong("result_code") == 0) {
log.info("siteService.updateCbApi(tranParam)");
tranParam.put("balance", resData.getDouble("balance"));
int res = siteService.updateCbApi(tranParam);
evoResponse.setUuid(evo.getUuid());
evoResponse.setBalance( resData.getDouble("balance"));
evoResponse.setBonus(0.0);
evoResponse.success();
}else if(resData.getLong("result_code") == 99) {
evoResponse.fail("BET_DOES_NOT_EXIST");
evoResponse.setBalance( resData.getDouble("balance"));
}else if(resData.getLong("result_code") == 98) {
evoResponse.fail("BET_ALREADY_SETTLED");
evoResponse.setBalance( resData.getDouble("balance"));
}else if(resData.getLong("result_code") == 70) {
evoResponse.fail("BET_ALREADY_SETTLED");
evoResponse.setBalance( resData.getDouble("balance"));
}else {
evoResponse.fail();
}
} else {
log.error("promo_payout::Unexpected response status code");
evoResponse.fail();
}
} catch (Exception e) {
log.info(e.toString());
e.printStackTrace();
evoResponse.fail();
}
return evoResponse;
}
private String makeApiKey(String param) {
int n = 20; // n자리 쿠폰
char[] chs = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' ,'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
Random rd = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < n; i++) {
char ch = chs[rd.nextInt(chs.length)];
sb.append(ch);
}
return param + sb.toString();
}
}

View File

@@ -0,0 +1,559 @@
package com.bb.front;
import java.text.SimpleDateFormat;
import java.util.HashMap;
import jakarta.servlet.http.HttpServletRequest;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.bb.jwt.JwtManager;
import com.bb.model.BombAuthVO;
import com.bb.model.BombReponseVo;
import com.bb.model.CommonParam;
import com.bb.model.Member;
import com.bb.model.PlayParam;
import com.bb.service.CallBackService;
import com.bb.service.SiteService;
import com.bb.util.AesUtil;
import com.google.gson.Gson;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RestController
@Slf4j
@RequestMapping("/api/cb/pbomb")
@RequiredArgsConstructor
@SecurityRequirement(name = "Authorization")
public class CallBackBombController {
// https://oprvender.com/api/cb/live
@Autowired
private final JwtManager jwtManager;
@Autowired
SiteService siteService;
@Autowired
CallBackService callBackService;
@ResponseBody
@RequestMapping(value = "/loginAuth", method = RequestMethod.POST)
public BombReponseVo minegameLoginAuth(@RequestBody BombAuthVO bombAuthVO, HttpServletRequest request)
throws Exception {
BombReponseVo bombReponseVo = new BombReponseVo();
log.info("#bomb::loginAuth::" + "bombAuthVO" + bombAuthVO.toString());
Gson gson = new Gson();
bombAuthVO = gson.fromJson(AesUtil.getAES128_Decode(bombAuthVO.getEp()), BombAuthVO.class);
log.info("#bomb::loginAuth::" + "dec bombAuthVO" + bombAuthVO.toString());
HashMap memParam = new HashMap();
memParam.put("bombAccId", bombAuthVO.getLoginToken());
Member member = siteService.getMemByBombAccId(memParam);
try {
String accID = bombAuthVO.getAccID();
String token = bombAuthVO.getLoginToken();
log.info("#bomb::loginAuth::" + accID);
log.info("#bomb::loginAuth::" + token);
log.info("#bomb::loginAuth::" + member);
if (member.getBombAccId().equals(token)) {
log.info("#bomb::loginAuth::" + 1111111);
bombReponseVo.setAccId(accID);
bombReponseVo.setNickName(member.getMemberNick());
bombReponseVo.setCode(0);
bombReponseVo.setDemo(false);
// 밸런스 가져오기
HashMap sParam = new HashMap();
// String[] usrinfo = accID.split("_");
// String memberId ="";
// String siteId ="";
sParam.put("siteIdx", Integer.parseInt(accID.substring(0, 3), 16));
sParam.put("memberId", accID.substring(3, accID.length()));
String memberId = accID.substring(3, accID.length());
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
JSONObject parammember = new JSONObject();
parammember.put("userId", member.getMemberId());
// 밸런스가져오기
JSONObject resData = callBackService.getBalance(siteApiInfo, parammember);
if(resData == null) {
log.info("#bomb::debit::" + "balance callback error");
bombReponseVo.setCode(-1);
return bombReponseVo;
}
// JSONObject resData = new JSONObject(responseEntity.getBody());
if (resData.getInt("result_code") == 0) {
if ("Y".equals(siteApiInfo.getOrDefault("bombDecYn", "").toString())) {
bombReponseVo.setBalance("" + (resData.getDouble("balance") * 0.01));
} else {
bombReponseVo.setBalance("" + resData.getDouble("balance"));
}
} else {
bombReponseVo.fail();
}
} else {
bombReponseVo.fail();
}
} catch (Exception e) {
bombReponseVo.fail();
}
log.info("#bomb::loginAuth::" + "BOMB AUTH RESbody: {}", bombReponseVo);
return bombReponseVo;
}
@ResponseBody
@RequestMapping(value = "/bet", method = RequestMethod.POST)
public BombReponseVo minegameEncBet(@RequestBody BombAuthVO bombAuthVO, HttpServletRequest request)
throws Exception {
BombReponseVo bombReponseVo = new BombReponseVo();
Gson gson = new Gson();
bombAuthVO = gson.fromJson(AesUtil.getAES128_Decode(bombAuthVO.getEp()), BombAuthVO.class);
JSONObject obj = new JSONObject();
HashMap memParam = new HashMap();
memParam.put("bombAccId", bombAuthVO.getLoginToken());
Member member = siteService.getMemByBombAccId(memParam);
try {
String accID = bombAuthVO.getAccID();
String userID = bombAuthVO.getUserID();
String token = bombAuthVO.getLoginToken();
String transferId = bombAuthVO.getTransferId();
Integer roomNo = bombAuthVO.getRoomNo();
double betAmount = (double) bombAuthVO.getAmount();
log.info("#bomb::debit::" + "bombgame bet accID : " + accID);
log.info("#bomb::debit::" + "bombgame bet userID : " + userID);
log.info("#bomb::debit::" + "bombgame bet token : " + token);
log.info("#bomb::debit::" + "bombgame bet roomNo : " + roomNo);
log.info("#bomb::debit::" + "bombgame bet transferId : " + transferId);
log.info("#bomb::debit::" + "bombgame bet betAmount : " + betAmount);
// 밸런스 가져오기
HashMap sParam = new HashMap();
sParam.put("siteIdx", Integer.parseInt(accID.substring(0, 3), 16));
sParam.put("memberId", accID.substring(3, accID.length()));
String memberId = accID.substring(3, accID.length());
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
String siteId = siteApiInfo.get("siteId").toString();
// 사이트에 크레딧이 없을경우 에러 보냄 베팅막음
long targetSiteCredit = siteService.getSiteCredit(siteId);
if (targetSiteCredit < betAmount) {
log.info("#bomb::debit::" + "no siteCredit");
bombReponseVo.setCode(-1);
return bombReponseVo;
}
// 최대베팅액 (userMaxBet 우선 적용)
sParam.put("vendorIdx", 5);
long maxBet = siteService.getSiteMaxBet(sParam);
// userMaxBet 조회
long userMaxBet = 0;
Long userMaxBetObj = siteService.getUserMaxBet(sParam);
if(userMaxBetObj != null) {
userMaxBet = userMaxBetObj;
}
// 최종 maxBet 결정: userMaxBet이 0이면 siteMaxBet 사용, 0이 아니면 userMaxBet 사용
long finalMaxBet = (userMaxBet > 0) ? userMaxBet : maxBet;
log.info("#bomb::debit::MaxBet Info - siteMaxBet: " + maxBet + ", userMaxBet: " + userMaxBet + ", finalMaxBet: " + finalMaxBet);
if (betAmount > finalMaxBet) {
log.info("#bomb::debit::" + "Over bet money - finalMaxBet: " + finalMaxBet);
bombReponseVo.setCode(-1);
return bombReponseVo;
}
JSONObject parammember = new JSONObject();
parammember.put("userId", member.getMemberId());
log.info("#bomb::debit::" + siteApiInfo);
JSONObject resData2 = callBackService.getBalance(siteApiInfo, parammember);
if(resData2 == null) {
log.info("#bomb::debit::" + "balance callback error");
bombReponseVo.setCode(-1);
return bombReponseVo;
}
if (resData2.getInt("result_code") == 0) {
if ("Y".equals(siteApiInfo.getOrDefault("bombDecYn", "").toString())) {
bombReponseVo.setBalance("" + (resData2.getDouble("balance") * 0.01));
} else {
bombReponseVo.setBalance("" + resData2.getDouble("balance"));
}
} else {
bombReponseVo.fail();
}
if (betAmount < 0) {
bombReponseVo.setCode(-99);
} else {
if (member.getBombAccId().equals(token)) {
double curCashAmount = resData2.getDouble("balance");
if (curCashAmount >= betAmount) {
// betAmount 만큼 cashAmt 차감
// memberService.updateMineMemCashAmt(bombAuthVO);
HashMap tranParam = new HashMap();
tranParam.put("tranId", siteId + "D" + bombAuthVO.getTransferId());
tranParam.put("refId", siteId + bombAuthVO.getTransferId());
tranParam.put("siteIdx", siteApiInfo.get("siteIdx"));
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", siteApiInfo.get("memberIdx"));
tranParam.put("memberId", memberId);
tranParam.put("vendorCetegory", "MINIGAME");
tranParam.put("vendorIdx", 5);
tranParam.put("vendorCode", "tpabomb");
tranParam.put("vendorTranKey", bombAuthVO.getTransferId());
tranParam.put("gameType", "");
tranParam.put("gameId", "");
tranParam.put("gameIdx", ""+roomNo);
tranParam.put("tranType", "debit");
tranParam.put("depositAmt", betAmount);
tranParam.put("creditAmt", "0");
tranParam.put("isCancel", "N");
tranParam.put("isTie", "N");
tranParam.put("apiStatus", 0);
tranParam.put("completed", false);
try {
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(Integer.parseInt(siteApiInfo.get("siteIdx").toString()));
PlayParam param = new PlayParam();
param.setVendorKey("M01");
commonParam.setPlayParam(param);
HashMap venderInfo = siteService.getVenderApiInfo(commonParam);
tranParam.put("vendorApiId", venderInfo.get("vendorApiId").toString());
} catch (Exception e) {
log.info("#bomb::debit::" + "VI ERR:" + e.toString());
}
siteService.commonBetinsert(tranParam);
JSONObject debit = new JSONObject();
debit.put("betId", siteId + bombAuthVO.getTransferId());
debit.put("tranId", siteId + "D" + bombAuthVO.getTransferId());
debit.put("userId", memberId);
debit.put("vendorIdx", 5);
debit.put("vendorKey", "M01");
debit.put("vendor", "tpabomb");
debit.put("gameIdx", 1);
debit.put("gameKey", ""+roomNo);
debit.put("gameId", "");
debit.put("gameType", "");
debit.put("tranType", "debit");
if ("Y".equals(siteApiInfo.getOrDefault("bombDecYn", "").toString())) {
Double betAmountD = betAmount * 100;
debit.put("debit", betAmountD.longValue());
} else {
debit.put("debit", betAmount);
}
debit.put("credit", 0);
debit.put("isCancel", 0);
debit.put("isBonus", 0);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
long nDate = System.currentTimeMillis();
String betDateTimeStr = sdf.format(nDate);
debit.put("requestAt", betDateTimeStr);
JSONObject resData = callBackService.changeBalance("#bomb::", siteApiInfo, debit);
log.info("#bomb::debit::" + "result_Dcode: {}", resData.getInt("result_code"));
if (resData.getLong("result_code") == 0) {
bombReponseVo.setCode(0);
bombReponseVo.setBalance("" + resData.getDouble("balance"));
if ("Y".equals(siteApiInfo.getOrDefault("bombDecYn", "").toString())) {
bombReponseVo.setBalance("" + (resData.getDouble("balance") * 0.01));
} else {
bombReponseVo.setBalance("" + resData.getDouble("balance"));
}
tranParam.put("balance", bombReponseVo.getBalance());
int res = siteService.updateCbApi(tranParam);
log.info("#bomb::debit::" + "result_Dcode: {}2");
} else if (resData.getLong("result_code") == 80) {
bombReponseVo.setCode(-1);
} else if (resData.getLong("result_code") == 98) {
log.info("#bomb::debit::" + "result_Dcode 98: {}1");
bombReponseVo.setCode(-1);
} else {
bombReponseVo.setCode(-1);
}
} else {
bombReponseVo.setCode(-1);
obj.put("code", -1);
log.info("#bomb::debit::" + "bombgame info curr cash : " + curCashAmount + ", reqest : "
+ betAmount);
}
} else {
bombReponseVo.setCode(-99);
log.info("#bomb::debit::" + "bombgame info token : " + member.getBombAccId() + ", reqest : "
+ token);
}
}
} catch (Exception e) {
bombReponseVo.setCode(-1);
log.info("#bomb::debit::" + e);
}
return bombReponseVo;
}
@ResponseBody
@RequestMapping(value = { "/payout", "/end" }, method = RequestMethod.POST)
public BombReponseVo minegameEncCredit(@RequestBody BombAuthVO bombAuthVO, HttpServletRequest request)
throws Exception {
BombReponseVo bombReponseVo = new BombReponseVo();
log.info("#bomb::credit::" + "bombAuthVO" + bombAuthVO.toString());
Gson gson = new Gson();
bombAuthVO = gson.fromJson(AesUtil.getAES128_Decode(bombAuthVO.getEp()), BombAuthVO.class);
JSONObject obj = new JSONObject();
HashMap memParam = new HashMap();
memParam.put("bombAccId", bombAuthVO.getLoginToken());
Member member = siteService.getMemByBombAccId(memParam);
try {
String accID = bombAuthVO.getAccID();
String userID = bombAuthVO.getUserID();
String token = bombAuthVO.getLoginToken();
String transferId = bombAuthVO.getTransferId();
Integer roomNo = bombAuthVO.getRoomNo();
double betAmount = (double) bombAuthVO.getAmount();
String bombs = bombAuthVO.getBombs();
String play = bombAuthVO.getPlay();
String endDate = bombAuthVO.getEndDate();
log.info("#bomb::credit::" + "bombgame bet accID : " + accID);
log.info("#bomb::credit::" + "bombgame bet userID : " + userID);
log.info("#bomb::credit::" + "bombgame bet token : " + token);
log.info("#bomb::credit::" + "bombgame bet roomNo : " + roomNo);
log.info("#bomb::credit::" + "bombgame bet transferId : " + transferId);
log.info("#bomb::credit::" + "bombgame bet betAmount : " + betAmount);
log.info("#bomb::credit::" + "bombgame bet bombs : " + bombs);
log.info("#bomb::credit::" + "bombgame bet play : " + play);
// 밸런스 가져오기
HashMap sParam = new HashMap();
sParam.put("siteIdx", Integer.parseInt(accID.substring(0, 3), 16));
sParam.put("memberId", accID.substring(3, accID.length()));
String memberId = accID.substring(3, accID.length());
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
String siteId = siteApiInfo.get("siteId").toString();
JSONObject parammember = new JSONObject();
parammember.put("userId", member.getMemberId());
JSONObject resData2 = callBackService.getBalance(siteApiInfo, parammember);
if(resData2 == null) {
log.info("#bomb::credit::" + "balance callback error");
bombReponseVo.setCode(-1);
return bombReponseVo;
}
if (resData2.getInt("result_code") == 0) {
if ("Y".equals(siteApiInfo.getOrDefault("bombDecYn", "").toString())) {
bombReponseVo.setBalance("" + (resData2.getDouble("balance") * 0.01));
} else {
bombReponseVo.setBalance("" + resData2.getDouble("balance"));
}
} else {
bombReponseVo.fail();
}
if (betAmount < 0) {
bombReponseVo.setCode(-99);
} else {
if (member.getBombAccId().equals(token)) {
double curCashAmount = resData2.getDouble("balance");
if (betAmount >= 0) {
// betAmount 만큼 cashAmt 차감
// memberService.updateMineMemCashAmt(bombAuthVO);
HashMap tranParam = new HashMap();
tranParam.put("tranId", siteId + "C" + bombAuthVO.getTransferId());
tranParam.put("refId", siteId + bombAuthVO.getTransferId());
tranParam.put("siteIdx", siteApiInfo.get("siteIdx"));
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", siteApiInfo.get("memberIdx"));
tranParam.put("memberId", memberId);
tranParam.put("vendorCetegory", "MINIGAME");
tranParam.put("vendorIdx", 5);
tranParam.put("vendorCode", "tpabomb");
tranParam.put("vendorTranKey", bombAuthVO.getTransferId());
tranParam.put("gameType", "");
tranParam.put("gameId", "");
tranParam.put("gameIdx", ""+roomNo);
tranParam.put("tranType", "credit");
tranParam.put("depositAmt", 0);
tranParam.put("creditAmt", betAmount);
tranParam.put("isCancel", "N");
tranParam.put("isTie", "N");
tranParam.put("apiStatus", 0);
tranParam.put("completed", true);
// 게임별로 상세내역 넣어주기 있을 경우에만
JSONObject detail = new JSONObject();
detail.put("roomNo ", roomNo);
detail.put("play", play);
detail.put("bombs", bombs);
tranParam.put("detail", detail.toString());
try {
CommonParam commonParam = new CommonParam();
commonParam.setSiteIdx(Integer.parseInt(siteApiInfo.get("siteIdx").toString()));
PlayParam param = new PlayParam();
param.setVendorKey("M01");
commonParam.setPlayParam(param);
HashMap venderInfo = siteService.getVenderApiInfo(commonParam);
tranParam.put("vendorApiId", venderInfo.get("vendorApiId").toString());
} catch (Exception e) {
log.info("#bomb::credit::" + "VI ERR:" + e.toString());
}
siteService.commonBetinsert(tranParam);
JSONObject debit = new JSONObject();
debit.put("betId", siteId + bombAuthVO.getTransferId());
debit.put("tranId", siteId + "C" + bombAuthVO.getTransferId());
debit.put("userId", memberId);
debit.put("vendorIdx", 5);
debit.put("vendorKey", "M01");
debit.put("vendor", "tpabomb");
debit.put("gameIdx", 1);
debit.put("gameKey", roomNo);
debit.put("gameId", "");
debit.put("gameType", "");
debit.put("tranType", "credit");
debit.put("debit", 0);
if ("Y".equals(siteApiInfo.getOrDefault("bombDecYn", "").toString())) {
Double betAmountD = betAmount * 100;
debit.put("credit", betAmountD.longValue());
} else {
debit.put("credit", betAmount);
}
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
long nDate = System.currentTimeMillis();
String betDateTimeStr = sdf.format(nDate);
debit.put("requestAt", betDateTimeStr);
debit.put("isCancel", 0);
debit.put("isBonus", 0);
debit.put("detail", detail);
JSONObject resData = callBackService.changeBalance("#bomb::", siteApiInfo, debit);
log.info("#bomb::credit::" + "result_Dcode: {}", resData.getInt("result_code"));
if (resData.getLong("result_code") == 0) {
bombReponseVo.setCode(0);
if ("Y".equals(siteApiInfo.getOrDefault("bombDecYn", "").toString())) {
bombReponseVo.setBalance("" + (resData.getDouble("balance") * 0.01));
} else {
bombReponseVo.setBalance("" + resData.getDouble("balance"));
}
tranParam.put("balance", bombReponseVo.getBalance());
int res = siteService.updateCbApi(tranParam);
log.info("#bomb::debit::" + "result_Dcode: {}2");
} else if (resData.getLong("result_code") == 80) {
bombReponseVo.setCode(-1);
} else if (resData.getLong("result_code") == 98) {
log.info("#bomb::credit::" + "result_Dcode 98: {}1");
bombReponseVo.setCode(-1);
} else {
bombReponseVo.setCode(-1);
}
} else {
bombReponseVo.setCode(-1);
obj.put("code", -1);
log.info("#bomb::credit::" + "bombgame info curr cash : " + curCashAmount + ", reqest : "
+ betAmount);
}
} else {
bombReponseVo.setCode(-99);
log.info("#bomb::credit::" + "bombgame info token : " + member.getBombAccId() + ", reqest : "
+ token);
}
}
} catch (Exception e) {
bombReponseVo.setCode(-1);
log.info("#bomb::credit::" + e);
}
return bombReponseVo;
}
}

View File

@@ -0,0 +1,159 @@
package com.bb.front;
import java.util.HashMap;
import jakarta.servlet.http.HttpServletRequest;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.bb.jwt.JwtManager;
import com.bb.model.BombAuthVO;
import com.bb.model.BombReponseVo;
import com.bb.service.SiteService;
import com.bb.util.AesUtil;
import com.google.gson.Gson;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RestController
@Slf4j
@RequestMapping("/api/cb/demopbomb")
@RequiredArgsConstructor
@SecurityRequirement(name = "Authorization")
public class CallBackBombDemoController {
// https://oprvender.com/api/cb/live
@Autowired
private final JwtManager jwtManager;
@Autowired
SiteService siteService;
@ResponseBody
@RequestMapping(value="/loginAuth", method=RequestMethod.POST)
public BombReponseVo minegameLoginAuth(@RequestBody BombAuthVO bombAuthVO, HttpServletRequest request) throws Exception {
BombReponseVo bombReponseVo = new BombReponseVo();
System.out.println("bombAuthVO" + bombAuthVO.toString());
Gson gson = new Gson();
bombAuthVO = gson.fromJson(AesUtil.getAES128_Decode(bombAuthVO.getEp()), BombAuthVO.class);
System.out.println("dec bombAuthVO" + bombAuthVO.toString());
HashMap memParam = new HashMap();
memParam.put("bombAccId", bombAuthVO.getLoginToken());
HashMap demomember = siteService.getDemoByBombAccId(memParam);
try {
String accID = bombAuthVO.getAccID();
String token= bombAuthVO.getLoginToken();
if(demomember.get("bombAccId").toString().equals(token)) {
System.out.println(1111111);
bombReponseVo.setAccId(accID);
bombReponseVo.setNickName( demomember.get("bombAccId").toString());
bombReponseVo.setCode(0);
bombReponseVo.setBalance(""+(Double.parseDouble(demomember.get("creditAmt").toString())));
bombReponseVo.setDemo(true);
} else {
bombReponseVo.fail();
}
}catch(Exception e) {
bombReponseVo.fail();
}
log.info("BOMB AUTH RESbody: {}", bombReponseVo);
return bombReponseVo;
}
@ResponseBody
@RequestMapping(value="/bet", method=RequestMethod.POST)
public BombReponseVo minegameEncBet(@RequestBody BombAuthVO bombAuthVO, HttpServletRequest request) throws Exception {
BombReponseVo bombReponseVo = new BombReponseVo();
Gson gson = new Gson();
bombAuthVO = gson.fromJson(AesUtil.getAES128_Decode(bombAuthVO.getEp()), BombAuthVO.class);
JSONObject obj = new JSONObject();
HashMap memParam = new HashMap();
memParam.put("bombAccId", bombAuthVO.getLoginToken());
HashMap demomember = siteService.getDemoByBombAccId(memParam);
double balance = Double.parseDouble(demomember.get("creditAmt").toString());
double betAmount = (double)bombAuthVO.getAmount();
log.warn("DEMO BALANCE memINFO {} {} ", demomember.toString(), betAmount);
if(balance < balance - betAmount) {
bombReponseVo.setCode(-99);
return bombReponseVo;
} else {
bombReponseVo.setBalance("" +( balance - betAmount));
memParam.put("creditAmt", "" +( balance - betAmount));
siteService.updateDemoUSer(memParam);
}
log.warn("DEMO BALANCE memParam {}", memParam.toString());
return bombReponseVo;
}
@ResponseBody
@RequestMapping(value={"/payout", "/end"}, method=RequestMethod.POST)
public BombReponseVo minegameEncCredit(@RequestBody BombAuthVO bombAuthVO, HttpServletRequest request) throws Exception {
BombReponseVo bombReponseVo = new BombReponseVo();
Gson gson = new Gson();
bombAuthVO = gson.fromJson(AesUtil.getAES128_Decode(bombAuthVO.getEp()), BombAuthVO.class);
JSONObject obj = new JSONObject();
HashMap memParam = new HashMap();
memParam.put("bombAccId", bombAuthVO.getLoginToken());
HashMap demomember = siteService.getDemoByBombAccId(memParam);
double balance = Double.parseDouble(demomember.get("creditAmt").toString());
double betAmount = (double)bombAuthVO.getAmount();
log.warn("DEMO BALANCE memINFO {} {} ", demomember.toString(), betAmount);
bombReponseVo.setBalance("" +( balance + betAmount));
memParam.put("creditAmt", "" +( balance + betAmount));
siteService.updateDemoUSer(memParam);
log.warn("DEMO BALANCE memParam {}", memParam.toString());
return bombReponseVo;
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,973 @@
package com.bb.front;
import java.net.SocketTimeoutException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import org.apache.http.conn.ConnectTimeoutException;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.client.RestTemplate;
import com.bb.model.OnixResponse;
import com.bb.service.AsyncSiteService;
import com.bb.service.CallBackService;
import com.bb.service.SiteService;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
/**
* Onix Seamless API Callback Controller
*
* API 엔드포인트:
* - /balance: 유저 잔고 조회
* - /changeBalance: 유저 머니 변경 (베팅, 승리, 취소 등)
*
* 모든 응답은 2초 이내로 반환되어야 함
* CORS 헤더 필수: Access-Control-Allow-Origin: *
*/
@Slf4j
@RequiredArgsConstructor
@SecurityRequirement(name = "Authorization")
@EnableScheduling
@RestController
@RequestMapping("/api/callback/onix")
public class CallBackOnixController {
@Autowired
private SiteService siteService;
@Autowired
private CallBackService callBackService;
@Autowired
private AsyncSiteService asyncCallBackService;
@Autowired
RestTemplate restTemplate;
@ResponseBody
@RequestMapping(path = {"/balance", "/balance/"})
public ResponseEntity<OnixResponse> balance(HttpServletRequest request, @RequestParam("userid") String onixUsername) throws Exception {
OnixResponse response = null;
long siteIdx = Long.parseLong(onixUsername.substring(0, 3), 16);
String memberId = onixUsername.substring(3, onixUsername.length());
final String LOG_PREFIX = "#-CB::ONIX::balance::"+memberId+":::";
log.info(LOG_PREFIX+ "Request::" + onixUsername);
try {
//사이트정보
HashMap sParam = new HashMap();
sParam.put("siteIdx", siteIdx);
sParam.put("memberId", memberId);
log.info(LOG_PREFIX + "SITE_API_INFO_PARAM::"+sParam.toString());
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
if(siteApiInfo == null) {
log.error(LOG_PREFIX+ "Error Msg: NOT_FOUND_SITE_INFO");
response = new OnixResponse();
response.setResult(0);
response.setBalance(0);
return new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
}
if(siteApiInfo.get("memberIdx") == null) {
log.error(LOG_PREFIX+ "존재하지 않는 회원");
response = new OnixResponse();
response.setResult(0);
response.setBalance(0);
return new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
}
// ##--isTransfer 처리-##
long balance = 0L;
if("N".equals(siteApiInfo.get("isTransfer").toString())) {
log.info(LOG_PREFIX + "PLAY_SEAMLESS");
JSONObject member = new JSONObject();
member.put("userId", memberId);
log.info(LOG_PREFIX+ "balance Req ::"+ member.toString());
JSONObject resData = callBackService.getBalance(siteApiInfo, member);
if(resData == null) {
log.error(LOG_PREFIX+ "Error Msg: BALANCE_CALLBACK_ERROR");
response = new OnixResponse();
response.setResult(0);
response.setBalance(0);
return new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
}
log.info(LOG_PREFIX+ "balance Res ::"+ resData.toString());
balance = resData.getLong("balance"); // int -> long 변경
} else {
log.info(LOG_PREFIX + "PLAY_TRANSFER");
HashMap balanceMap = new HashMap<>();
balanceMap.put("siteIdx", siteIdx);
balanceMap.put("memberId", memberId);
balance = siteService.getUserBalance(balanceMap);
if(siteApiInfo.get("siteCbUrl") != null && !"".equals(siteApiInfo.get("siteCbUrl").toString())) {
JSONObject member = new JSONObject();
member.put("userId", memberId);
member.put("balance", balance);
asyncCallBackService.asyncBalance(LOG_PREFIX, siteApiInfo, member);
}
}
// Onix 문서: {"result":1, "balance": 10000} 형식으로 응답
response = new OnixResponse();
response.setResult(1); // 성공 = 1
response.setBalance(balance);
} catch (ResourceAccessException rae) {
if(rae.getCause() instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX+ "[ConnectTimeoutException]"+rae.getMessage());
}
if(rae.getCause() instanceof SocketTimeoutException) {
log.error(LOG_PREFIX+ "[SocketTimeoutException]"+rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX+ "[InterruptedException]"+rae.getMessage());
}
response = new OnixResponse();
response.setResult(0);
response.setBalance(0);
return new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
} catch (Exception e) {
log.error(LOG_PREFIX+ "[Exception]"+e.toString());
e.printStackTrace();
response = new OnixResponse();
response.setResult(0);
response.setBalance(0);
return new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
}
ResponseEntity<OnixResponse> res = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
log.info(LOG_PREFIX+ "Response::" + response.toString());
return res;
}
@PostMapping(path = {"/changeBalance", "/changeBalance/"})
public ResponseEntity<OnixResponse> changeBalance(HttpServletRequest request, @RequestBody net.sf.json.JSONObject requestBody) {
ResponseEntity<OnixResponse> resEntity = null;
log.info("#-CB::ONIX::changeBalance::Request::" + requestBody.toString());
String onixUsername = requestBody.getString("userid");
long siteIdx = Long.parseLong(onixUsername.substring(0, 3), 16);
String memberId = onixUsername.substring(3, onixUsername.length());
String transactionId = requestBody.getString("tranid");
String transactionType = requestBody.getString("type");
final String LOG_PREFIX = "#-CB::ONIX::changeBalance::"+memberId+"::"+transactionId+"::"+transactionType+":::";
log.info(LOG_PREFIX+ "Request::" + requestBody.toString());
try {
// "time":"2023-07-05 21:16:39.473"
String betDateTimeStr = requestBody.getString("time");
log.info(LOG_PREFIX+ "========== BF_betDateTimeStr::" + betDateTimeStr);
betDateTimeStr = betDateTimeStr.substring(0, 19);
betDateTimeStr = betDateTimeStr.replace("T", " ");
//log.info(LOG_PREFIX+ "========== MF_betDateTimeStr::" + betDateTimeStr);
//betDateTimeStr = makeEdate(LOG_PREFIX, betDateTimeStr, 32400000);
log.info(LOG_PREFIX+ "========== AF_betDateTimeStr::" + betDateTimeStr);
// 사이트 정보 조회
HashMap sParam = new HashMap();
sParam.put("siteIdx", siteIdx);
sParam.put("memberId", memberId);
sParam.put("vendor", "onix");
sParam.put("vendorGameCode", "evolution");
log.info(LOG_PREFIX + "getSiteVendorInfo::" + sParam.toString());
HashMap<String, String> siteVendorInfo = siteService.getSiteVendorInfo(sParam);
if(siteVendorInfo == null) {
log.error(LOG_PREFIX + "존재하지 않는 회원입니다");
OnixResponse response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
if(transactionType.equals("bet")) {
int amount = Math.abs(requestBody.getInt("amount"));
resEntity = callBet(LOG_PREFIX, siteIdx, memberId, requestBody, betDateTimeStr, siteVendorInfo, amount);
} else if(transactionType.equals("win") || transactionType.equals("lose")) {
int amount = Math.abs(requestBody.getInt("amount"));
resEntity = callWin(LOG_PREFIX, siteIdx, memberId, requestBody, betDateTimeStr, siteVendorInfo, amount);
} else if(transactionType.equals("cancel")) {
int amount = Math.abs(requestBody.getInt("amount"));
resEntity = callCancel(LOG_PREFIX, siteIdx, memberId, requestBody, betDateTimeStr, siteVendorInfo, amount);
} else {
log.error(LOG_PREFIX + "unknown_transaction_type");
OnixResponse response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
} catch (ResourceAccessException rae) {
if (rae.getCause() instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX + "[ConnectTimeoutException]" + rae.getMessage());
}
if (rae.getCause() instanceof SocketTimeoutException) {
log.error(LOG_PREFIX + "[SocketTimeoutException]" + rae.getMessage());
}
if (rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX + "[InterruptedException]" + rae.getMessage());
}
OnixResponse response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
return resEntity;
} catch (Exception e) {
log.error(LOG_PREFIX + "[Exception]" + e.toString());
e.printStackTrace();
OnixResponse response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
return resEntity;
}
log.info(LOG_PREFIX + "Response::" + resEntity.toString());
return resEntity;
}
private ResponseEntity<OnixResponse> callBet(String LOG_PREFIX, long siteIdx, String memberId,
net.sf.json.JSONObject transaction, String betDateTimeStr, HashMap<String, String> siteVendorInfo, int amount) {
LOG_PREFIX = LOG_PREFIX + "callBet:::";
ResponseEntity<OnixResponse> resEntity = null;
OnixResponse response = new OnixResponse();
// ##--isTransfer 처리-##
final String IS_TRANSFER = siteVendorInfo.get("isTransfer").toString();
try {
String gameType = ""; // transaction.optString("gametype");
String gameName = transaction.optString("title");
String tableId = transaction.optString("subcode");
String targetTableId = tableId.replaceAll(" ", "").toLowerCase();
String banGameType = siteVendorInfo.get("banGameType").toString().replaceAll(" ", "").toLowerCase();
String banGameId = siteVendorInfo.get("banGameId").toString().replaceAll(" ", "").toLowerCase();
if (!"".equals(gameType) && !"".equals(banGameType) && banGameType.contains(gameType + "|")) {
log.error(LOG_PREFIX + "Ban Game Type : " + gameType);
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
if (!"".equals(targetTableId) && !"".equals(banGameId) && banGameId.contains(targetTableId + "|")) {
log.error(LOG_PREFIX + "Ban Game Id : " + banGameId);
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
String siteId = siteVendorInfo.get("siteId").toString();
long memberIdx = Long.parseLong(siteVendorInfo.get("memberIdx").toString());
String vendorApiId = siteVendorInfo.get("vendorApiId").toString();
String tranId = transaction.getString("tranid");
String betId = transaction.getString("realround");
String betKey = betId;
String vendorKey = siteVendorInfo.get("vendorKey").toString();
int vendorIdx = Integer.parseInt(siteVendorInfo.get("vendorIdx").toString());
String vendorCetegory = siteVendorInfo.get("vendorCetegory").toString();
// ##--isTransfer 처리-##
if(IS_TRANSFER.equals("Y")) {
// tranId 중복체크
int cntTr = siteService.getTranIdCheck2(tranId);
if(cntTr > 0) {
HashMap balanceMap = new HashMap<>();
balanceMap.put("siteIdx", siteIdx);
balanceMap.put("memberId", memberId);
int balance = siteService.getUserBalance(balanceMap);
log.error(LOG_PREFIX+ "중복요청::Response::" + response.toString());
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
}
if (siteVendorInfo.get("lastInVendorIdx") == null || "0".equals(siteVendorInfo.get("lastInVendorIdx").toString())) {
HashMap memParam = new HashMap<>();
memParam.put("siteIdx", siteIdx);
memParam.put("memberIdx", memberIdx);
memParam.put("lastInVendorIdx", Integer.parseInt(siteVendorInfo.get("vendorIdx").toString()));
int updResult = siteService.updMemLastVendorIdx(memParam);
} else {
int lastInVendorIdx = Integer.parseInt(siteVendorInfo.get("lastInVendorIdx").toString());
if (lastInVendorIdx != vendorIdx) {
log.error(LOG_PREFIX + "VendorIdx doesn't match");
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
}
long siteCredit = Long.parseLong(siteVendorInfo.get("credit").toString());
// ##--isTransfer 처리-##
if (siteCredit < amount && IS_TRANSFER.equals("N")) {
log.error(LOG_PREFIX + "NO_SITE_CREDIT");
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
// 최대 베팅 금액 처리 (userMaxBet 우선 적용)
long siteMaxBet = Long.parseLong(siteVendorInfo.get("siteMaxBet").toString());
long userMaxBet = 0;
if(siteVendorInfo.get("userMaxBet") != null && !siteVendorInfo.get("userMaxBet").toString().isEmpty()) {
try {
userMaxBet = Long.parseLong(siteVendorInfo.get("userMaxBet").toString());
} catch (NumberFormatException e) {
userMaxBet = 0;
}
}
// 최종 maxBet 결정: userMaxBet이 0이면 siteMaxBet 사용, 0이 아니면 userMaxBet 사용
long finalMaxBet = (userMaxBet > 0) ? userMaxBet : siteMaxBet;
log.info(LOG_PREFIX+ "MaxBet Info - siteMaxBet: " + siteMaxBet + ", userMaxBet: " + userMaxBet + ", finalMaxBet: " + finalMaxBet);
if (finalMaxBet < amount) {
log.error(LOG_PREFIX + "MAX_BET_AMOUNT_OVER");
log.error(LOG_PREFIX + "finalMaxBet : " + finalMaxBet + ", amount : " + amount);
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
boolean isParsing = false;
String game = transaction.optString("game");
if("evolution_new".equals(game)) {
isParsing = true;
}
HashMap tranParam = new HashMap();
tranParam.put("tranId", tranId);
tranParam.put("refId", betId);
tranParam.put("siteIdx", siteIdx);
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", memberIdx);
tranParam.put("memberId", memberId);
tranParam.put("vendorCetegory", vendorCetegory);
tranParam.put("vendorIdx", vendorIdx);
tranParam.put("vendorCode", "onix");
tranParam.put("vendorTranKey", betKey);
tranParam.put("gameType", gameType);
tranParam.put("gameId", tableId);
tranParam.put("gameIdx", gameName);
tranParam.put("tranType", "debit");
tranParam.put("depositAmt", amount);
tranParam.put("creditAmt", "0");
tranParam.put("isCancel", "N");
if(isParsing) {
tranParam.put("isTie", "P");
} else {
tranParam.put("isTie", "N");
}
tranParam.put("apiStatus", 0);
tranParam.put("vendorApiId", vendorApiId);
JSONObject callBackObj = new JSONObject();
callBackObj.put("betId", betId);
callBackObj.put("tranId", tranId);
callBackObj.put("betKey", betKey);
callBackObj.put("userId", memberId);
callBackObj.put("vendorIdx", vendorIdx);
callBackObj.put("vendorKey", vendorKey);
callBackObj.put("vendor", "onix");
callBackObj.put("gameIdx", vendorIdx);
callBackObj.put("gameKey", gameName);
callBackObj.put("gameId", tableId);
callBackObj.put("gameType", gameType);
callBackObj.put("tranType", "debit");
callBackObj.put("debit", amount);
callBackObj.put("credit", 0);
callBackObj.put("isCancel", 0);
callBackObj.put("isBonus", 0);
if(isParsing) {
callBackObj.put("isData", "Y");
} else {
callBackObj.put("isData", "N");
}
callBackObj.put("requestAt", betDateTimeStr);
// ##--isTransfer 처리-##
if(IS_TRANSFER.equals("N")) {
log.info(LOG_PREFIX + "PLAY_SEAMLESS");
log.info(LOG_PREFIX + "-----INSERT_BET_START-----");
siteService.commonBetinsert(tranParam);
log.info(LOG_PREFIX + "-----INSERT_BET_END-----");
log.info(LOG_PREFIX + "SEND_BET request body: " + callBackObj.toString());
JSONObject resData = callBackService.changeBalance(LOG_PREFIX, siteVendorInfo, callBackObj);
log.info(LOG_PREFIX + "SEND_BET status code: " + resData.getLong("result_code"));
log.info(LOG_PREFIX + "SEND_BET response body: " + resData.toString());
if (resData.getLong("result_code") == 0) {
tranParam.put("balance", resData.getInt("balance"));
tranParam.put("isTransfer", IS_TRANSFER);
int res = siteService.updateCbApi(tranParam);
log.info(LOG_PREFIX + "UPDATE_CALLBACK_API_STATUS END");
long balance = resData.getLong("balance");
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
} else if (resData.getLong("result_code") == 98) {
long balance = resData.getLong("balance");
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
} else if (resData.getLong("result_code") == 80) {
long balance = resData.getLong("balance");
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
} else {
String msg = "";
if (resData.has("error_msg")) msg = resData.getString("error_msg");
log.error(LOG_PREFIX + msg);
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
}
} else {
log.info(LOG_PREFIX + "PLAY_TRANSFER");
HashMap balanceMap = new HashMap<>();
balanceMap.put("siteIdx", siteIdx);
balanceMap.put("memberId", memberId);
int balance = siteService.getUserBalance(balanceMap);
int afBalance = balance - amount;
if(balance < amount) {
log.error(LOG_PREFIX + "beforeBalance is less than amount");
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
log.info(LOG_PREFIX + "-----INSERT_BET_START-----");
siteService.commonBetinsert(tranParam);
log.info(LOG_PREFIX + "-----INSERT_BET_END-----");
tranParam.put("balance", afBalance);
tranParam.put("preBalance", balance);
tranParam.put("isTransfer", IS_TRANSFER);
int res = siteService.updateCbApi(tranParam);
log.info(LOG_PREFIX + "UPDATE_CALLBACK_API_STATUS END");
response = OnixResponse.success(afBalance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
if(siteVendorInfo.get("siteCbUrl") != null && !"".equals(siteVendorInfo.get("siteCbUrl").toString())) {
callBackObj.put("balance", afBalance);
asyncCallBackService.asyncChangeBalance(LOG_PREFIX, siteVendorInfo, callBackObj);
}
}
} catch (ResourceAccessException rae) {
if (rae.getCause() instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX + "[ConnectTimeoutException]" + rae.getMessage());
}
if (rae.getCause() instanceof SocketTimeoutException) {
log.error(LOG_PREFIX + "[SocketTimeoutException]" + rae.getMessage());
}
if (rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX + "[InterruptedException]" + rae.getMessage());
}
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
} catch (Exception e) {
log.error(LOG_PREFIX + "[Exception]" + e.toString());
e.printStackTrace();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
}
return resEntity;
}
private ResponseEntity<OnixResponse> callWin(String LOG_PREFIX, long siteIdx, String memberId,
net.sf.json.JSONObject transaction, String betDateTimeStr, HashMap<String, String> siteVendorInfo, int amount) {
LOG_PREFIX = LOG_PREFIX + "callWin:::";
ResponseEntity<OnixResponse> resEntity = null;
OnixResponse response = new OnixResponse();
// ##--isTransfer 처리-##
final String IS_TRANSFER = siteVendorInfo.get("isTransfer").toString();
try {
String siteId = siteVendorInfo.get("siteId").toString();
long memberIdx = Long.parseLong(siteVendorInfo.get("memberIdx").toString());
String vendorApiId = siteVendorInfo.get("vendorApiId").toString();
String tranId = transaction.getString("tranid");
String betId = transaction.getString("realround");
String betKey = betId;
String vendorKey = siteVendorInfo.get("vendorKey").toString();
int vendorIdx = Integer.parseInt(siteVendorInfo.get("vendorIdx").toString());
String vendorCetegory = siteVendorInfo.get("vendorCetegory").toString();
net.sf.json.JSONArray details = transaction.optJSONArray("details");
net.sf.json.JSONObject detailObj = null;
String gameType = ""; // transaction.optString("");
String gameName = transaction.optString("title");
if(details != null && details.size() > 0) {
detailObj = details.optJSONObject(0);
if(detailObj != null) {
gameType = detailObj.optString("gameType");
HashMap detailMap = new HashMap<>();
detailMap.put("refId", betId);
detailMap.put("orgDetail", detailObj.toString());
detailMap.put("parDetail", null);
try {
int result = siteService.insertEvoDetail(detailMap);
log.info(LOG_PREFIX+ "insertEvoDetail result::" + result);
} catch(DataIntegrityViolationException de) {
log.error(LOG_PREFIX+ "Duplicate refId");
}
}
if(gameType == null) gameType = "";
}
String tableId = transaction.optString("subcode");
// ##--isTransfer 처리-##
if(IS_TRANSFER.equals("Y")) {
// tranId 중복체크
int cntTr = siteService.getTranIdCheck2(tranId);
if(cntTr > 0) {
HashMap balanceMap = new HashMap<>();
balanceMap.put("siteIdx", siteIdx);
balanceMap.put("memberId", memberId);
int balance = siteService.getUserBalance(balanceMap);
log.error(LOG_PREFIX+ "중복요청::Response::" + response.toString());
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
// 베팅 체크
int cntBet = siteService.getBetIdCheck2(betId);
if(cntBet == 0) {
// 처리한 베팅 존재X
log.error(LOG_PREFIX+ "처리한 베팅 존재X");
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
}
if (siteVendorInfo.get("lastInVendorIdx") == null || "0".equals(siteVendorInfo.get("lastInVendorIdx").toString())) {
HashMap memParam = new HashMap<>();
memParam.put("siteIdx", siteIdx);
memParam.put("memberIdx", memberIdx);
memParam.put("lastInVendorIdx", Integer.parseInt(siteVendorInfo.get("vendorIdx").toString()));
int updResult = siteService.updMemLastVendorIdx(memParam);
} else {
int lastInVendorIdx = Integer.parseInt(siteVendorInfo.get("lastInVendorIdx").toString());
if (lastInVendorIdx != vendorIdx) {
log.error(LOG_PREFIX + "VendorIdx doesn't match");
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
}
boolean isParsing = false;
String game = transaction.optString("game");
if("evolution_new".equals(game)) {
isParsing = true;
}
HashMap tranParam = new HashMap();
tranParam.put("tranId", tranId);
tranParam.put("refId", betId);
tranParam.put("siteIdx", siteIdx);
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", memberIdx);
tranParam.put("memberId", memberId);
tranParam.put("vendorCetegory", vendorCetegory);
tranParam.put("vendorIdx", vendorIdx);
tranParam.put("vendorCode", "onix");
tranParam.put("vendorTranKey", betKey);
tranParam.put("gameType", gameType);
tranParam.put("gameId", tableId);
tranParam.put("gameIdx", gameName);
tranParam.put("tranType", "credit");
tranParam.put("depositAmt", "0");
tranParam.put("creditAmt", amount);
tranParam.put("isCancel", "N");
if(isParsing) {
tranParam.put("isTie", "P");
} else {
tranParam.put("isTie", "N");
}
tranParam.put("apiStatus", 0);
tranParam.put("vendorApiId", vendorApiId);
JSONObject callBackObj = new JSONObject();
callBackObj.put("betId", betId);
callBackObj.put("tranId", tranId);
callBackObj.put("betKey", betKey);
callBackObj.put("userId", memberId);
callBackObj.put("vendorIdx", vendorIdx);
callBackObj.put("vendorKey", vendorKey);
callBackObj.put("vendor", "onix");
callBackObj.put("gameIdx", vendorIdx);
callBackObj.put("gameKey", gameName);
callBackObj.put("gameId", tableId);
callBackObj.put("gameType", gameType);
callBackObj.put("tranType", "credit");
callBackObj.put("debit", 0);
callBackObj.put("credit", amount);
callBackObj.put("isCancel", 0);
callBackObj.put("isBonus", 0);
if(isParsing) {
callBackObj.put("isData", "Y");
} else {
callBackObj.put("isData", "N");
}
callBackObj.put("requestAt", betDateTimeStr);
// ##--isTransfer 처리-##
if(IS_TRANSFER.equals("N")) {
log.info(LOG_PREFIX + "PLAY_SEAMLESS");
log.info(LOG_PREFIX + "-----INSERT_RESULT_START-----");
siteService.commonBetinsert(tranParam);
log.info(LOG_PREFIX + "-----INSERT_RESULT_END-----");
log.info(LOG_PREFIX + "SEND_RESULT request body: " + callBackObj.toString());
JSONObject resData = callBackService.changeBalance(LOG_PREFIX, siteVendorInfo, callBackObj);
log.info(LOG_PREFIX + "SEND_RESULT status code: " + resData.getLong("result_code"));
log.info(LOG_PREFIX + "SEND_RESULT response body: " + resData.toString());
if (resData.getLong("result_code") == 0) {
tranParam.put("balance", resData.getInt("balance"));
tranParam.put("isTransfer", IS_TRANSFER);
int res = siteService.updateCbApi(tranParam);
log.info(LOG_PREFIX + "UPDATE_CALLBACK_API_STATUS END");
long balance = resData.getLong("balance");
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
} else if (resData.getLong("result_code") == 98) {
long balance = resData.getLong("balance");
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
} else {
String msg = "";
if (resData.has("error_msg")) msg = resData.getString("error_msg");
log.error(LOG_PREFIX + msg);
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
}
} else {
log.info(LOG_PREFIX + "PLAY_TRANSFER");
HashMap balanceMap = new HashMap<>();
balanceMap.put("siteIdx", siteIdx);
balanceMap.put("memberId", memberId);
int balance = siteService.getUserBalance(balanceMap);
int afBalance = balance + amount;
log.info(LOG_PREFIX + "-----INSERT_RESULT_START-----");
siteService.commonBetinsert(tranParam);
log.info(LOG_PREFIX + "-----INSERT_RESULT_END-----");
tranParam.put("balance", afBalance);
tranParam.put("preBalance", balance);
tranParam.put("isTransfer", IS_TRANSFER);
int res = siteService.updateCbApi(tranParam);
log.info(LOG_PREFIX + "UPDATE_CALLBACK_API_STATUS END");
response = OnixResponse.success(afBalance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
if(siteVendorInfo.get("siteCbUrl") != null && !"".equals(siteVendorInfo.get("siteCbUrl").toString())) {
callBackObj.put("balance", afBalance);
asyncCallBackService.asyncChangeBalance(LOG_PREFIX, siteVendorInfo, callBackObj);
}
}
} catch (ResourceAccessException rae) {
if (rae.getCause() instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX + "[ConnectTimeoutException]" + rae.getMessage());
}
if (rae.getCause() instanceof SocketTimeoutException) {
log.error(LOG_PREFIX + "[SocketTimeoutException]" + rae.getMessage());
}
if (rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX + "[InterruptedException]" + rae.getMessage());
}
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
} catch (Exception e) {
log.error(LOG_PREFIX + "[Exception]" + e.toString());
e.printStackTrace();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
}
return resEntity;
}
private ResponseEntity<OnixResponse> callCancel(String LOG_PREFIX, long siteIdx, String memberId,
net.sf.json.JSONObject transaction, String betDateTimeStr, HashMap<String, String> siteVendorInfo, int amount) {
LOG_PREFIX = LOG_PREFIX + "callCancel:::";
ResponseEntity<OnixResponse> resEntity = null;
OnixResponse response = new OnixResponse();
// ##--isTransfer 처리-##
final String IS_TRANSFER = siteVendorInfo.get("isTransfer").toString();
try {
String siteId = siteVendorInfo.get("siteId").toString();
long memberIdx = Long.parseLong(siteVendorInfo.get("memberIdx").toString());
String vendorApiId = siteVendorInfo.get("vendorApiId").toString();
String tranId = transaction.getString("tranid");
String betId = transaction.getString("realround");
String betKey = betId;
String vendorKey = siteVendorInfo.get("vendorKey").toString();
int vendorIdx = Integer.parseInt(siteVendorInfo.get("vendorIdx").toString());
String vendorCetegory = siteVendorInfo.get("vendorCetegory").toString();
net.sf.json.JSONArray details = transaction.optJSONArray("details");
net.sf.json.JSONObject detailObj = null;
String gameType = ""; // transaction.optString("");
String gameName = transaction.optString("title");
if(details != null && details.size() > 0) {
detailObj = details.optJSONObject(0);
if(detailObj != null) {
gameType = detailObj.optString("gameType");
HashMap detailMap = new HashMap<>();
detailMap.put("refId", betId);
detailMap.put("orgDetail", detailObj.toString());
detailMap.put("parDetail", null);
try {
int result = siteService.insertEvoDetail(detailMap);
log.info(LOG_PREFIX+ "insertEvoDetail result::" + result);
} catch(DataIntegrityViolationException de) {
log.error(LOG_PREFIX+ "Duplicate refId");
}
}
if(gameType == null) gameType = "";
}
String tableId = transaction.optString("subcode");
// ##--isTransfer 처리-##
if(IS_TRANSFER.equals("Y")) {
// tranId 중복체크
int cntTr = siteService.getTranIdCheck2(tranId);
if(cntTr > 0) {
HashMap balanceMap = new HashMap<>();
balanceMap.put("siteIdx", siteIdx);
balanceMap.put("memberId", memberId);
int balance = siteService.getUserBalance(balanceMap);
log.error(LOG_PREFIX+ "중복요청::Response::" + response.toString());
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
// 베팅 체크
int cntBet = siteService.getBetIdCheck2(betId);
if(cntBet == 0) {
// 처리한 베팅 존재X
log.error(LOG_PREFIX+ "처리한 베팅 존재X");
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
}
if (siteVendorInfo.get("lastInVendorIdx") == null || "0".equals(siteVendorInfo.get("lastInVendorIdx").toString())) {
HashMap memParam = new HashMap<>();
memParam.put("siteIdx", siteIdx);
memParam.put("memberIdx", memberIdx);
memParam.put("lastInVendorIdx", Integer.parseInt(siteVendorInfo.get("vendorIdx").toString()));
int updResult = siteService.updMemLastVendorIdx(memParam);
} else {
int lastInVendorIdx = Integer.parseInt(siteVendorInfo.get("lastInVendorIdx").toString());
if (lastInVendorIdx != vendorIdx) {
log.error(LOG_PREFIX + "VendorIdx doesn't match");
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
return resEntity;
}
}
boolean isParsing = false;
String game = transaction.optString("game");
if("evolution_new".equals(game)) {
isParsing = true;
}
HashMap tranParam = new HashMap();
tranParam.put("tranId", tranId);
tranParam.put("refId", betId);
tranParam.put("siteIdx", siteIdx);
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", memberIdx);
tranParam.put("memberId", memberId);
tranParam.put("vendorCetegory", vendorCetegory);
tranParam.put("vendorIdx", vendorIdx);
tranParam.put("vendorCode", "onix");
tranParam.put("vendorTranKey", betKey);
tranParam.put("gameType", gameType);
tranParam.put("gameId", tableId);
tranParam.put("gameIdx", gameName);
tranParam.put("tranType", "credit");
tranParam.put("depositAmt", "0");
tranParam.put("creditAmt", amount);
tranParam.put("isCancel", "Y");
if(isParsing) {
tranParam.put("isTie", "P");
} else {
tranParam.put("isTie", "N");
}
tranParam.put("apiStatus", 0);
tranParam.put("vendorApiId", vendorApiId);
JSONObject callBackObj = new JSONObject();
callBackObj.put("betId", betId);
callBackObj.put("tranId", tranId);
callBackObj.put("betKey", betKey);
callBackObj.put("userId", memberId);
callBackObj.put("vendorIdx", vendorIdx);
callBackObj.put("vendorKey", vendorKey);
callBackObj.put("vendor", "onix");
callBackObj.put("gameIdx", vendorIdx);
callBackObj.put("gameKey", gameName);
callBackObj.put("gameId", tableId);
callBackObj.put("gameType", gameType);
callBackObj.put("tranType", "credit");
callBackObj.put("debit", 0);
callBackObj.put("credit", amount);
callBackObj.put("isCancel", 1);
callBackObj.put("isBonus", 0);
if(isParsing) {
callBackObj.put("isData", "Y");
} else {
callBackObj.put("isData", "N");
}
callBackObj.put("requestAt", betDateTimeStr);
// ##--isTransfer 처리-##
if(IS_TRANSFER.equals("N")) {
log.info(LOG_PREFIX + "PLAY_SEAMLESS");
log.info(LOG_PREFIX + "-----INSERT_CANCEL_START-----");
siteService.commonBetinsert(tranParam);
log.info(LOG_PREFIX + "-----INSERT_CANCEL_END-----");
log.info(LOG_PREFIX + "SEND_CANCEL request body: " + callBackObj.toString());
JSONObject resData = callBackService.changeBalance(LOG_PREFIX, siteVendorInfo, callBackObj);
log.info(LOG_PREFIX + "SEND_CANCEL status code: " + resData.getLong("result_code"));
log.info(LOG_PREFIX + "SEND_CANCEL response body: " + resData.toString());
if (resData.getLong("result_code") == 0) {
tranParam.put("balance", resData.getInt("balance"));
tranParam.put("isTransfer", IS_TRANSFER);
int res = siteService.updateCbApi(tranParam);
log.info(LOG_PREFIX + "UPDATE_CALLBACK_API_STATUS END");
long balance = resData.getLong("balance");
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
} else if (resData.getLong("result_code") == 98) {
long balance = resData.getLong("balance");
response = OnixResponse.success(balance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
} else {
String msg = "";
if (resData.has("error_msg")) msg = resData.getString("error_msg");
log.error(LOG_PREFIX + msg);
response = OnixResponse.failure();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
}
} else {
log.info(LOG_PREFIX + "PLAY_TRANSFER");
HashMap balanceMap = new HashMap<>();
balanceMap.put("siteIdx", siteIdx);
balanceMap.put("memberId", memberId);
int balance = siteService.getUserBalance(balanceMap);
int afBalance = balance + amount;
log.info(LOG_PREFIX + "-----INSERT_RESULT_START-----");
siteService.commonBetinsert(tranParam);
log.info(LOG_PREFIX + "-----INSERT_RESULT_END-----");
tranParam.put("balance", afBalance);
tranParam.put("preBalance", balance);
tranParam.put("isTransfer", IS_TRANSFER);
int res = siteService.updateCbApi(tranParam);
log.info(LOG_PREFIX + "UPDATE_CALLBACK_API_STATUS END");
response = OnixResponse.success(afBalance);
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.OK);
if(siteVendorInfo.get("siteCbUrl") != null && !"".equals(siteVendorInfo.get("siteCbUrl").toString())) {
callBackObj.put("balance", afBalance);
asyncCallBackService.asyncChangeBalance(LOG_PREFIX, siteVendorInfo, callBackObj);
}
}
} catch (ResourceAccessException rae) {
if (rae.getCause() instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX + "[ConnectTimeoutException]" + rae.getMessage());
}
if (rae.getCause() instanceof SocketTimeoutException) {
log.error(LOG_PREFIX + "[SocketTimeoutException]" + rae.getMessage());
}
if (rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX + "[InterruptedException]" + rae.getMessage());
}
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
} catch (Exception e) {
log.error(LOG_PREFIX + "[Exception]" + e.toString());
e.printStackTrace();
resEntity = new ResponseEntity<OnixResponse>(response, HttpStatus.INTERNAL_SERVER_ERROR);
}
return resEntity;
}
private static String makeEdate(String LOG_PREFIX, String paramDate, int flag) {
// TODO Auto-generated method stub
String eDate = "";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
try {
Date date = sdf1.parse(paramDate);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.MILLISECOND, flag);
Date date2 = calendar.getTime();
eDate = sdf2.format(date2);
} catch(Exception e) {
log.error(LOG_PREFIX+ "makeEdate::Exception::"+e.getMessage());
}
return eDate;
}
}

View File

@@ -0,0 +1,710 @@
package com.bb.front;
import java.net.SocketTimeoutException;
import java.util.HashMap;
import java.util.List;
import jakarta.servlet.http.HttpServletRequest;
import org.apache.http.conn.ConnectTimeoutException;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.ResourceAccessException;
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.web.reactive.function.client.WebClientRequestException;
import org.springframework.web.reactive.function.client.WebClientResponseException;
import com.bb.model.PowerballData;
import com.bb.model.PowerballRequest;
import com.bb.model.PowerballResponse;
import com.bb.service.CallBackService;
import com.bb.service.SiteService;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@RestController
@Slf4j
@RequestMapping("/api/callback/powerball")
@RequiredArgsConstructor
@SecurityRequirement(name = "Authorization")
public class CallBackPowerBall {
@Autowired
SiteService siteService;
@Autowired
CallBackService callBackService;
@Autowired
WebClient webClient;
@ResponseBody
@RequestMapping(path = "/balance")
public ResponseEntity<PowerballResponse> balance(HttpServletRequest request, @RequestParam String id, @RequestParam String siteName) throws Exception {
PowerballResponse response = null;
PowerballData data = null;
HttpStatus httpStatus = HttpStatus.OK;
//사이트정보
HashMap sParam = new HashMap();
long siteIdx = Long.parseLong(id.substring(0, 3), 16);
String memberId = id.substring(3, id.length());
final String LOG_PREFIX = "#-CB::POWER_BALL::"+memberId+"::BALANCE::::";
log.info(LOG_PREFIX+ "id:"+id+", siteName:"+siteName);
try {
sParam.put("siteIdx", siteIdx);
sParam.put("memberId", memberId);
HashMap siteApiInfo = siteService.getSiteApiInfo(sParam);
if(siteApiInfo == null) {
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("NOT_FOUND_USER");
data = new PowerballData();
data.setSiteId(siteName);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
log.error(LOG_PREFIX+ "Response Body: "+response.toString());
return new ResponseEntity<PowerballResponse>(response, httpStatus);
}
JSONObject member = new JSONObject();
member.put("userId", memberId);
log.info(LOG_PREFIX + "SEND_BALANCE request body: " + member.toString());
HttpHeaders header = new HttpHeaders();
header.add("Content-Type", "application/json");
header.add("Accept", "application/json");
header.add("user-agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64)" + " AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
ResponseEntity<String> responseEntity = webClient.post()
.uri(siteApiInfo.get("siteCbUrl")+"/balance")
.headers(h -> h.addAll(header))
.bodyValue(member.toString())
.retrieve()
.toEntity(String.class)
.block();
log.info(LOG_PREFIX+ "SEND_BALANCE status code: " + responseEntity.getStatusCode());
log.info(LOG_PREFIX+ "SEND_BALANCE response body: " + responseEntity.getBody());
JSONObject resData = new JSONObject(responseEntity.getBody());
int balance = resData.getInt("balance");
response = new PowerballResponse();
response.setResult("SUCCESS");
response.setMsg("");
data = new PowerballData();
data.setSiteId(siteName);
data.setMemId(id);
data.setBalance(Integer.toString(balance));
response.setData(data);
} catch (WebClientResponseException e) {
// HttpServerErrorException handling
if (e.getStatusCode().is5xxServerError()) {
log.error(LOG_PREFIX+ "WebClientResponseException 5xx: " + e.getResponseBodyAsString());
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("BALANCE_SERVER_ERROR");
data = new PowerballData();
data.setSiteId(siteName);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
}
// HttpClientErrorException handling
else if (e.getStatusCode().is4xxClientError()) {
log.error(LOG_PREFIX+ "WebClientResponseException 4xx: " + e.getResponseBodyAsString());
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("BALANCE_SERVER_ERROR");
data = new PowerballData();
data.setSiteId(siteName);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
} else {
log.error(LOG_PREFIX+ "WebClientResponseException: " + e.getResponseBodyAsString());
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("BALANCE_SERVER_ERROR");
data = new PowerballData();
data.setSiteId(siteName);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
}
} catch (WebClientRequestException e) {
// 타임아웃 등 연결 오류
Throwable cause = e.getCause();
if (cause instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX+ "ConnectTimeoutException: " + cause.getMessage());
} else if (cause instanceof SocketTimeoutException) {
log.error(LOG_PREFIX+ "SocketTimeoutException: " + cause.getMessage());
} else {
log.error(LOG_PREFIX+ "WebClientRequestException: " + e.getMessage());
}
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("TIMEOUT_ERROR");
data = new PowerballData();
data.setSiteId(siteName);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
/*
} catch (ResourceAccessException rae) {
if(rae.getCause() instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX+ "ConnectTimeoutException: " + rae.getMessage());
}
if(rae.getCause() instanceof SocketTimeoutException) {
log.error(LOG_PREFIX+ "SocketTimeoutException: " + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX+ "InterruptedException: " + rae.getMessage());
}
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("TIMEOUT_ERROR");
data = new PowerballData();
data.setSiteId(siteName);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
*/
} catch (Exception e) {
log.error(LOG_PREFIX+ "Exception: " + e.getMessage());
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("BALANCE_SERVER_ERROR");
data = new PowerballData();
data.setSiteId(siteName);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
}
log.error(LOG_PREFIX+ "Response Body: " + response.toString());
ResponseEntity<PowerballResponse> res = new ResponseEntity<PowerballResponse>(response, httpStatus);
return res;
}
@ResponseBody
@RequestMapping(path = "/bet")
public ResponseEntity<PowerballResponse> bet(HttpServletRequest request, @RequestBody net.sf.json.JSONObject reqBodyObj) throws Exception {
PowerballResponse response = null;
PowerballData data = null;
HttpStatus httpStatus = HttpStatus.OK;
ObjectMapper mapper = new ObjectMapper();
PowerballRequest reqBody = mapper.readValue(reqBodyObj.toString(), new TypeReference<PowerballRequest>() {});
//사이트정보
HashMap sParam = new HashMap();
long siteIdx = Long.parseLong(reqBody.getId().substring(0, 3), 16);
String memberId = reqBody.getId().substring(3, reqBody.getId().length());
String siteId = reqBody.getSiteId();
String id = reqBody.getId();
String transactionId = reqBody.getBetId();
String gameName = reqBody.getGameName();
String gameType = reqBody.getGameType();
String gameTypeName = "";
String betType = reqBody.getBetType();
String betTypeName = "";
String rateType = "";
final String LOG_PREFIX = "#-CB::POWER_BALL::"+memberId+"::"+transactionId+"::BET::::";
log.info(LOG_PREFIX+ "reqBodyObj:"+reqBodyObj);
log.info(LOG_PREFIX+ "reqBody:"+reqBody);
try {
sParam.put("siteIdx", siteIdx);
sParam.put("memberId", memberId);
sParam.put("vendor", "");
sParam.put("vendorGameCode", "powerball");
log.info(LOG_PREFIX + "getSiteVendorInfo::"+sParam.toString());
HashMap<String,String> siteVendorInfo = siteService.getSiteVendorInfo(sParam);
if(siteVendorInfo == null) {
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("NOT_FOUND_USER");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
log.error(LOG_PREFIX+ "Response Body: "+response.toString());
return new ResponseEntity<PowerballResponse>(response, httpStatus);
}
log.info(LOG_PREFIX + "siteVendorInfo::"+siteVendorInfo.toString());
long memberIdx = Long.parseLong(siteVendorInfo.get("memberIdx").toString());
String vendorApiId = siteVendorInfo.get("vendorApiId").toString();
int amount = Math.abs(reqBody.getBetAmt());
long siteCredit = Long.parseLong(siteVendorInfo.get("credit").toString());
if(siteCredit < amount) {
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("NO_SITE_CREDIT");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
log.error(LOG_PREFIX+ "Response Body: "+response.toString());
return new ResponseEntity<PowerballResponse>(response, httpStatus);
}
String vendorTranKey = transactionId;
String tranId = siteId + "#D#" + vendorTranKey;
String betId = siteId + "#" + vendorTranKey;
String vendorKey = siteVendorInfo.get("vendorKey").toString();
int vendorIdx = Integer.parseInt(siteVendorInfo.get("vendorIdx").toString());
String vendorCetegory = siteVendorInfo.get("vendorCetegory").toString();
List<HashMap<String,String>> infoList = siteService.getPowerBallInfoList(gameType);
for(HashMap<String,String> info : infoList) {
if(betType.equals(info.get("betType").toString())) {
gameTypeName = info.get("gameTypeName").toString();
betTypeName = info.get("betTypeName").toString();
rateType = info.get("rateType").toString();
}
}
if(gameTypeName.equals("") || betTypeName.equals("")) {
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("NOT_FOUND_GAME_TYPE");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
log.error(LOG_PREFIX+ "Response Body: "+response.toString());
return new ResponseEntity<PowerballResponse>(response, httpStatus);
}
HashMap tranParam = new HashMap();
tranParam.put("tranId", tranId);
tranParam.put("refId", betId);
tranParam.put("siteIdx", siteIdx);
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", memberIdx);
tranParam.put("memberId", memberId);
tranParam.put("vendorCetegory", vendorCetegory);
tranParam.put("vendorIdx", vendorIdx);
tranParam.put("vendorCode", "powerball");
tranParam.put("vendorTranKey", vendorTranKey);
tranParam.put("gameType", gameType);
tranParam.put("gameId", "");
tranParam.put("gameIdx", gameName+"("+gameTypeName+")");
tranParam.put("tranType", "debit");
tranParam.put("depositAmt", amount);
tranParam.put("creditAmt", 0);
tranParam.put("isCancel", "N");
tranParam.put("isTie", "N");
tranParam.put("apiStatus", 0);
tranParam.put("vendorApiId", vendorApiId);
log.info(LOG_PREFIX + "-----INSERT_BET_START-----");
siteService.commonBetinsert(tranParam);
log.info(LOG_PREFIX + "-----INSERT_BET_END-----");
JSONObject debit = new JSONObject();
debit.put("betId", betId);
debit.put("tranId", tranId);
debit.put("userId", memberId);
debit.put("vendorIdx", vendorIdx);
debit.put("vendorKey", vendorKey);
debit.put("vendor", "powerball");
debit.put("gameIdx", vendorIdx);
debit.put("gameKey", gameName+"("+gameTypeName+")");
debit.put("gameType", gameType);
debit.put("gameId", "");
debit.put("tranType", "debit");
debit.put("debit", amount);
debit.put("credit", 0);
debit.put("isCancel", 0);
debit.put("isBonus", 0);
/**
* betType : 유저가 배팅한 타입
* gameType : 게임 타입
* resultType : 결과 타입
*/
JSONArray detailsArr = new JSONArray();
JSONObject detailItem = new JSONObject();
detailItem.put("detailId", betType+"("+betTypeName+")");
detailItem.put("detailType", rateType);
detailItem.put("detailName", gameType+"("+gameTypeName+")");
detailItem.put("betAmt", amount);
detailItem.put("betWinAmt", 0);
detailsArr.put(detailItem);
debit.put("betDetails", detailsArr);
log.info(LOG_PREFIX + "SEND_DEBIT request body: " + debit.toString());
JSONObject resData = new JSONObject();
resData = callBackService.changeBalance(LOG_PREFIX, siteVendorInfo, debit);
log.info(LOG_PREFIX + "SEND_DEBIT status code: " + resData.getLong("result_code"));
log.info(LOG_PREFIX + "SEND_DEBIT response body: " + resData.toString());
if(resData.getLong("result_code") == 0) {
tranParam.put("balance", resData.getInt("balance"));
int res = siteService.updateCbApi(tranParam);
log.info(LOG_PREFIX + "UPDATE_CALLBACK_API_STATUS END");
int balance = resData.getInt("balance");
response = new PowerballResponse();
response.setResult("SUCCESS");
response.setMsg("");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance(Integer.toString(balance));
response.setData(data);
} else {
String msg = "";
if(resData.has("error_msg")) msg = resData.getString("error_msg");
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg(msg);
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
}
} catch (ResourceAccessException rae) {
if(rae.getCause() instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX+ "ConnectTimeoutException: " + rae.getMessage());
}
if(rae.getCause() instanceof SocketTimeoutException) {
log.error(LOG_PREFIX+ "SocketTimeoutException: " + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX+ "InterruptedException: " + rae.getMessage());
}
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("TIMEOUT_ERROR");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
} catch (Exception e) {
log.error(LOG_PREFIX+ "Exception: " + e.getMessage());
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("BET_SERVER_ERROR");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
}
httpStatus = HttpStatus.OK;
log.error(LOG_PREFIX+ "Response Body: " + response.toString());
ResponseEntity<PowerballResponse> res = new ResponseEntity<PowerballResponse>(response, httpStatus);
return res;
}
@ResponseBody
@RequestMapping(path = "/result")
public ResponseEntity<PowerballResponse> result(HttpServletRequest request, @RequestBody net.sf.json.JSONObject reqBodyObj) throws Exception {
PowerballResponse response = null;
PowerballData data = null;
HttpStatus httpStatus = HttpStatus.OK;
ObjectMapper mapper = new ObjectMapper();
PowerballRequest reqBody = mapper.readValue(reqBodyObj.toString(), new TypeReference<PowerballRequest>() {});
//사이트정보
HashMap sParam = new HashMap();
long siteIdx = Long.parseLong(reqBody.getId().substring(0, 3), 16);
String memberId = reqBody.getId().substring(3, reqBody.getId().length());
String siteId = reqBody.getSiteId();
String id = reqBody.getId();
String transactionId = reqBody.getBetId();
String gameName = reqBody.getGameName();
String gameType = reqBody.getGameType();
String gameTypeName = "";
String betType = reqBody.getBetType();
String betTypeName = "";
if(reqBody.getResultType() == null) {
reqBody.setResultType("");
}
String resultType = reqBody.getResultType();
String resultTypeName = "";
String rateType = "";
final String LOG_PREFIX = "#-CB::POWER_BALL::"+memberId+"::"+transactionId+"::RESULT::::";
log.info(LOG_PREFIX+ "reqBodyObj:"+reqBodyObj);
log.info(LOG_PREFIX+ "reqBody:"+reqBody);
try {
sParam.put("siteIdx", siteIdx);
sParam.put("memberId", memberId);
sParam.put("vendor", "");
sParam.put("vendorGameCode", "powerball");
log.info(LOG_PREFIX + "getSiteVendorInfo::"+sParam.toString());
HashMap<String,String> siteVendorInfo = siteService.getSiteVendorInfo(sParam);
if(siteVendorInfo == null) {
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("NOT_FOUND_USER");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
log.error(LOG_PREFIX+ "Response Body: "+response.toString());
return new ResponseEntity<PowerballResponse>(response, httpStatus);
}
log.info(LOG_PREFIX + "siteVendorInfo::"+siteVendorInfo.toString());
long memberIdx = Long.parseLong(siteVendorInfo.get("memberIdx").toString());
String vendorApiId = siteVendorInfo.get("vendorApiId").toString();
int amount = Math.abs(reqBody.getBetWinAmt());
long siteCredit = Long.parseLong(siteVendorInfo.get("credit").toString());
if(siteCredit < amount) {
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("NO_SITE_CREDIT");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
log.error(LOG_PREFIX+ "Response Body: "+response.toString());
return new ResponseEntity<PowerballResponse>(response, httpStatus);
}
String vendorTranKey = transactionId;
String tranId = siteId + "#C#" + vendorTranKey;
String betId = siteId + "#" + vendorTranKey;
String vendorKey = siteVendorInfo.get("vendorKey").toString();
int vendorIdx = Integer.parseInt(siteVendorInfo.get("vendorIdx").toString());
String vendorCetegory = siteVendorInfo.get("vendorCetegory").toString();
List<HashMap<String,String>> infoList = siteService.getPowerBallInfoList(gameType);
for(HashMap<String,String> info : infoList) {
if(betType.equals(info.get("betType").toString())) {
gameTypeName = info.get("gameTypeName").toString();
betTypeName = info.get("betTypeName").toString();
rateType = info.get("rateType").toString();
}
if(resultType.equals(info.get("betType").toString())) {
resultTypeName = info.get("betTypeName").toString();
}
}
if(gameTypeName.equals("") || betTypeName.equals("")) {
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("NOT_FOUND_GAME_TYPE");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
log.error(LOG_PREFIX+ "Response Body: "+response.toString());
return new ResponseEntity<PowerballResponse>(response, httpStatus);
}
HashMap tranParam = new HashMap();
tranParam.put("tranId", tranId);
tranParam.put("refId", betId);
tranParam.put("siteIdx", siteIdx);
tranParam.put("siteId", siteId);
tranParam.put("memberIdx", memberIdx);
tranParam.put("memberId", memberId);
tranParam.put("vendorCetegory", vendorCetegory);
tranParam.put("vendorIdx", vendorIdx);
tranParam.put("vendorCode", "powerball");
tranParam.put("vendorTranKey", vendorTranKey);
tranParam.put("gameType", gameType);
tranParam.put("gameId", "");
tranParam.put("gameIdx", gameName+"("+gameTypeName+")");
tranParam.put("tranType", "credit");
tranParam.put("depositAmt", 0);
tranParam.put("creditAmt", amount);
tranParam.put("isCancel", "N");
tranParam.put("isTie", "N");
tranParam.put("apiStatus", 0);
tranParam.put("vendorApiId", vendorApiId);
/**
* betType : 유저가 배팅한 타입
* gameType : 게임 타입
* resultType : 결과 타입
*/
JSONArray detailsArr = new JSONArray();
JSONObject detailItem = new JSONObject();
detailItem.put("detailId", betType+"("+betTypeName+")");
detailItem.put("detailType", rateType);
detailItem.put("detailName", gameType+"("+gameTypeName+")");
detailItem.put("betAmt", 0);
detailItem.put("betWinAmt", amount);
JSONObject detailCredit = new JSONObject();
detailCredit.put("rateType", rateType);
detailCredit.put("betType", betType);
detailCredit.put("betTypeName", betTypeName);
detailCredit.put("gameType", gameType);
detailCredit.put("gameTypeName", gameTypeName);
detailCredit.put("resultType", resultType);
detailCredit.put("resultTypeName", resultTypeName);
detailCredit.put("betAmt", reqBody.getBetAmt());
detailCredit.put("betWinAmt", reqBody.getBetWinAmt());
detailItem.put("detail", detailCredit);
detailsArr.put(detailItem);
tranParam.put("detail", detailCredit.toString());
log.info(LOG_PREFIX + "-----INSERT_BET_START-----");
siteService.commonBetinsert(tranParam);
log.info(LOG_PREFIX + "-----INSERT_BET_END-----");
JSONObject credit = new JSONObject();
credit.put("betId", betId);
credit.put("tranId", tranId);
credit.put("userId", memberId);
credit.put("vendorIdx", vendorIdx);
credit.put("vendorKey", vendorKey);
credit.put("vendor", "powerball");
credit.put("gameIdx", vendorIdx);
credit.put("gameKey", gameName+"("+gameTypeName+")");
credit.put("gameType", gameType);
credit.put("gameId", "");
credit.put("tranType", "credit");
credit.put("debit", 0);
credit.put("credit", amount);
credit.put("isCancel", 0);
credit.put("isBonus", 0);
credit.put("betDetails", detailsArr);
log.info(LOG_PREFIX + "SEND_CREDIT request body: " + credit.toString());
JSONObject resData = new JSONObject();
resData = callBackService.changeBalance(LOG_PREFIX, siteVendorInfo, credit);
log.info(LOG_PREFIX + "SEND_CREDIT status code: " + resData.getLong("result_code"));
log.info(LOG_PREFIX + "SEND_CREDIT response body: " + resData.toString());
if(resData.getLong("result_code") == 0) {
tranParam.put("balance", resData.getInt("balance"));
int res = siteService.updateCbApi(tranParam);
log.info(LOG_PREFIX + "UPDATE_CALLBACK_API_STATUS END");
int balance = resData.getInt("balance");
response = new PowerballResponse();
response.setResult("SUCCESS");
response.setMsg("");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance(Integer.toString(balance));
response.setData(data);
} else {
String msg = "";
if(resData.has("error_msg")) msg = resData.getString("error_msg");
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg(msg);
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
}
} catch (ResourceAccessException rae) {
if(rae.getCause() instanceof ConnectTimeoutException) {
log.error(LOG_PREFIX+ "ConnectTimeoutException: " + rae.getMessage());
}
if(rae.getCause() instanceof SocketTimeoutException) {
log.error(LOG_PREFIX+ "SocketTimeoutException: " + rae.getMessage());
}
if(rae.getCause() instanceof InterruptedException) {
log.error(LOG_PREFIX+ "InterruptedException: " + rae.getMessage());
}
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("TIMEOUT_ERROR");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
} catch (Exception e) {
log.error(LOG_PREFIX+ "Exception: " + e.getMessage());
response = new PowerballResponse();
response.setResult("FAILED");
response.setMsg("RESULT_SERVER_ERROR");
data = new PowerballData();
data.setSiteId(siteId);
data.setMemId(id);
data.setBalance("0");
response.setData(data);
}
httpStatus = HttpStatus.OK;
log.error(LOG_PREFIX+ "Response Body: " + response.toString());
ResponseEntity<PowerballResponse> res = new ResponseEntity<PowerballResponse>(response, httpStatus);
return res;
}
}

Some files were not shown because too many files have changed in this diff Show More