메시지 메타 insert bm02 쿼리 수정 및 controller, service 수정
This commit is contained in:
+1
-86
@@ -1,8 +1,6 @@
|
|||||||
package com.eactive.eai.rms.bap.manage.message.messageMeta;
|
package com.eactive.eai.rms.bap.manage.message.messageMeta;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
@@ -122,88 +120,5 @@ public class BapMessageMetaController extends BapBaseAnnotationController {
|
|||||||
return null;
|
return null;
|
||||||
|
|
||||||
}
|
}
|
||||||
@RequestMapping(value= "/bap/admin/message/messageMetaMan.json",params = "cmd=LIST_DELETE")
|
|
||||||
public String deleteList(HttpServletRequest request,
|
|
||||||
HttpServletResponse response, @RequestParam HashMap<String, Object> paramMap ) throws Exception {
|
|
||||||
for (String msgMetaDstcd : paramMap.get("msgMetaDstcdList").toString().split(",")) {
|
|
||||||
HashMap<String, Object> paramDetail = new HashMap<String,Object>();
|
|
||||||
paramDetail.put("msgMetaDstcd", msgMetaDstcd);
|
|
||||||
service.delete(paramDetail);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
|
|
||||||
}
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@RequestMapping(value= "/bap/admin/message/messageMetaMan.json",params = "cmd=CLONE")
|
|
||||||
public ModelAndView clone(HttpServletRequest request,
|
|
||||||
HttpServletResponse response,@RequestParam HashMap<String,Object> map) throws Exception {
|
|
||||||
|
|
||||||
String msgMetaDstcd = map.get("msgMetaDstcd").toString();
|
|
||||||
HashMap<String, Object> detailMap = service.selectDetail(msgMetaDstcd);
|
|
||||||
HashMap<String, Object> detail = (HashMap<String, Object>)detailMap.get("detail");
|
|
||||||
List<Map<String, Object>> list = (List<Map<String, Object>>)detailMap.get("list");
|
|
||||||
|
|
||||||
// detail insert 데이터키 치환 (insert_bm03)
|
|
||||||
String newMsgMetaDstcd = map.get("newMsgMetaDstcd").toString();
|
|
||||||
detail.put("msgMetaDstcd", newMsgMetaDstcd);
|
|
||||||
detail.put("msgDesc" , map.get("newMsgDesc") != null ? map.get("newMsgDesc") : detail.get("MSGDESC"));
|
|
||||||
detail.put("thisMsgUseYn", detail.get("THISMSGUSEYN"));
|
|
||||||
|
|
||||||
String searchMsgMetaDstcd = map.get("searchMsgMetaDstcd").toString();
|
|
||||||
String cloneMsgMetaDstcd = map.get("cloneMsgMetaDstcd").toString();
|
|
||||||
|
|
||||||
// gridList insert 데이터키 치환 (insert_bm02)
|
|
||||||
HashMap<String, Object>[] gridList = list.toArray(new HashMap[list.size()]);
|
|
||||||
for (int i=0; i<list.size(); i++) {
|
|
||||||
Map<String, Object> listMap = (Map<String, Object>)list.get(i);
|
|
||||||
gridList[i].put("msgMetaDstcd" , ((String)listMap.get("MSGMETADSTCD")).replace(searchMsgMetaDstcd,cloneMsgMetaDstcd));
|
|
||||||
gridList[i].put("thisMsgUseYn" , listMap.get("THISMSGCLMNUSEYN"));
|
|
||||||
// 메시지항목명을 치환하면 메시지항목 테이블(BM01)에 항목이 없으므로 메타 Item 리스트에 보이지 않음 --> 치환 안함으로 변경
|
|
||||||
// gridList[i].replace("MSGITEMDSTICNAME" , ((String)listMap.get("MSGITEMDSTICNAME")).replace(searchMsgMetaDstcd,cloneMsgMetaDstcd));
|
|
||||||
gridList[i].replace("MSGITEMDSTICNAME" , listMap.get("MSGITEMDSTICNAME"));
|
|
||||||
gridList[i].replace("MSGCLMNSEQ" , listMap.get("MSGCLMNSEQ"));
|
|
||||||
}
|
|
||||||
|
|
||||||
String userid = com.eactive.eai.rms.common.login.SessionManager.getUserId(request);
|
}
|
||||||
detail.put("userid", userid );
|
|
||||||
|
|
||||||
service.insert(detail,gridList);
|
|
||||||
|
|
||||||
CommonCommand command = new CommonCommand("com.eactive.eai.agent.telegram.UpdateTelegramCommand",map.get("newMsgMetaDstcd"));
|
|
||||||
agentUtilService.broadcast(command);
|
|
||||||
|
|
||||||
HashMap<String, Object> result = new HashMap<String, Object>();
|
|
||||||
result.put("detail",detail);
|
|
||||||
result.put("list",gridList);
|
|
||||||
ModelAndView modelAndView = new ModelAndView("jsonView", result);
|
|
||||||
|
|
||||||
return modelAndView;
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
@RequestMapping(value= "/bap/admin/message/messageMetaMan.json",params = "cmd=LIST_DOWNLOAD_SQL")
|
|
||||||
public ModelAndView downloadSql(HttpServletRequest request,
|
|
||||||
HttpServletResponse response,@RequestParam HashMap<String,Object> map) throws Exception {
|
|
||||||
|
|
||||||
List<Map<String, Object>> msgMetaList = new ArrayList<Map<String, Object>>();
|
|
||||||
for (String searchMsgMetaDstcd : map.get("searchMsgMetaDstcdList").toString().split(",")) {
|
|
||||||
HashMap<String, Object> msgMeta = service.selectDetail(searchMsgMetaDstcd);
|
|
||||||
msgMetaList.add((Map<String, Object>)msgMeta.get("detail"));
|
|
||||||
}
|
|
||||||
|
|
||||||
HashMap<String,Object> messageMeta = new HashMap<String,Object>();
|
|
||||||
messageMeta.put("list", msgMetaList);
|
|
||||||
messageMeta.put("userid",com.eactive.eai.rms.common.login.SessionManager.getUserId(request));
|
|
||||||
messageMeta.put("fileName", map.get("fileName"));
|
|
||||||
messageMeta.put("svrType", map.get("svrType"));
|
|
||||||
|
|
||||||
ModelAndView modelAndView = new ModelAndView("jsonView",service.mkInserSqlForMsgMeta(messageMeta));
|
|
||||||
|
|
||||||
return modelAndView;
|
|
||||||
}
|
|
||||||
@RequestMapping(value= "/bap/admin/message/messageMetaMan.view",params = "cmd=LIST_FILE_DOWNLOAD")
|
|
||||||
public String fileDownload(HttpServletRequest request) throws Exception {
|
|
||||||
|
|
||||||
return "/bap/admin/common/filedownload";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
+4
-177
@@ -1,9 +1,5 @@
|
|||||||
package com.eactive.eai.rms.bap.manage.message.messageMeta;
|
package com.eactive.eai.rms.bap.manage.message.messageMeta;
|
||||||
|
|
||||||
import java.io.FileOutputStream;
|
|
||||||
import java.io.OutputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -13,8 +9,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
|
|||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import com.eactive.eai.rms.bap.common.base.BapBaseService;
|
import com.eactive.eai.rms.bap.common.base.BapBaseService;
|
||||||
import com.eactive.eai.rms.bap.manage.comm.property.BapPropertyDao;
|
|
||||||
import com.eactive.eai.rms.common.util.SqlUtil;
|
|
||||||
|
|
||||||
@Service("bapMessageMetaService")
|
@Service("bapMessageMetaService")
|
||||||
public class BapMessageMetaService extends BapBaseService {
|
public class BapMessageMetaService extends BapBaseService {
|
||||||
@@ -23,17 +17,13 @@ public class BapMessageMetaService extends BapBaseService {
|
|||||||
@Qualifier("bapMessageMetaDao")
|
@Qualifier("bapMessageMetaDao")
|
||||||
private BapMessageMetaDao dao;
|
private BapMessageMetaDao dao;
|
||||||
|
|
||||||
@Autowired
|
|
||||||
@Qualifier("bapPropertyDao")
|
|
||||||
private BapPropertyDao propDao;
|
|
||||||
|
|
||||||
public HashMap<String, Object> selectList(int startNum,int endNum, HashMap<String, Object> paramMap) throws Exception {
|
public HashMap<String, Object> selectList(int startNum,int endNum, HashMap<String, Object> paramMap) throws Exception {
|
||||||
|
|
||||||
// 전체 목록수 얻기
|
// 전체 목록 수 얻기
|
||||||
int totalCount = dao.selectListCount(paramMap);
|
int totalCount = dao.selectListCount(paramMap);
|
||||||
|
|
||||||
paramMap.put("startNum" , startNum);// 시작 record
|
paramMap.put("startNum" , startNum);// record
|
||||||
paramMap.put("endNum" , endNum);// 끝 record
|
paramMap.put("endNum" , endNum);// record
|
||||||
|
|
||||||
List<Map<String, Object>> list = dao.selectList(paramMap);
|
List<Map<String, Object>> list = dao.selectList(paramMap);
|
||||||
HashMap<String, Object> map = new HashMap<String, Object>();
|
HashMap<String, Object> map = new HashMap<String, Object>();
|
||||||
@@ -44,11 +34,6 @@ public class BapMessageMetaService extends BapBaseService {
|
|||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int selectTotalCount(HashMap<String, Object> paramMap) throws Exception {
|
|
||||||
|
|
||||||
return dao.selectListCount(paramMap); // 전체 목록수 얻기
|
|
||||||
}
|
|
||||||
|
|
||||||
public HashMap<String, Object> selectDetail(String msgMetaDstcd) throws Exception {
|
public HashMap<String, Object> selectDetail(String msgMetaDstcd) throws Exception {
|
||||||
|
|
||||||
HashMap<String, Object> detail = dao.selectDetail(msgMetaDstcd);
|
HashMap<String, Object> detail = dao.selectDetail(msgMetaDstcd);
|
||||||
@@ -94,162 +79,4 @@ public class BapMessageMetaService extends BapBaseService {
|
|||||||
dao.deleteList(paramMap);
|
dao.deleteList(paramMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
}
|
||||||
public HashMap<String,String> mkInserSqlForMsgMeta(HashMap<String, Object> msgMetaMap) throws Exception {
|
|
||||||
|
|
||||||
StringBuffer msgMetaInsertSql = new StringBuffer();
|
|
||||||
String[] columnUserId = {"THISMSGREGSNTID","THISMSGAMNDRID","THISMSGCLMNREGSNTID","THISMSGCLMNAMNDRID"}; // userID 입력컬럼 구분
|
|
||||||
String[] columnDateTime = {"THISMSGREGIHMS","THISMSGAMNDHMS","THISMSGCLMNREGIHMS","THISMSGCLMNAMNDHMS"}; // DateTime 입력컬럼 구분
|
|
||||||
List<Map<String, Object>> msgMetaList = (List<Map<String, Object>>)msgMetaMap.get("list");
|
|
||||||
String userid = msgMetaMap.containsKey("userid") ? msgMetaMap.get("userid").toString() : "";
|
|
||||||
|
|
||||||
for (Map<String,Object> meta : msgMetaList) {
|
|
||||||
// MESSAGE META LIST into BM03
|
|
||||||
List<String> columnArr = new ArrayList<String>();
|
|
||||||
String[] columnList = {"MSGMETADSTCD","MSGDESC","THISMSGUSEYN","THISMSGREGSNTID","THISMSGREGIHMS","THISMSGAMNDRID","THISMSGAMNDHMS"};
|
|
||||||
columnArr = Arrays.asList(columnList);
|
|
||||||
msgMetaInsertSql.append("INSERT INTO EAIPKG.TSEAIBM03 (");
|
|
||||||
|
|
||||||
// 필드명 입력
|
|
||||||
for (String column : columnArr) {
|
|
||||||
msgMetaInsertSql.append((column.equals(columnArr.get(columnArr.size()-1))) ? column : column+",");
|
|
||||||
}
|
|
||||||
msgMetaInsertSql.append(") VALUES (");
|
|
||||||
// 필드값 입력
|
|
||||||
for (String column : columnArr) {
|
|
||||||
if (column.equals(columnArr.get(columnArr.size()-1))) {
|
|
||||||
if (Arrays.asList(columnUserId).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("'"+userid+"');\n");
|
|
||||||
} else if (Arrays.asList(columnDateTime).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("TO_CHAR(LOCALTIMESTAMP, 'YYYYMMDDHH24MISSFF3'));\n");
|
|
||||||
} else {
|
|
||||||
msgMetaInsertSql.append("'"+(meta.containsKey(column) ? meta.get(column) : "")+"');\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (Arrays.asList(columnUserId).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("'"+userid+"',");
|
|
||||||
} else if (Arrays.asList(columnDateTime).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("TO_CHAR(LOCALTIMESTAMP, 'YYYYMMDDHH24MISSFF3'),");
|
|
||||||
} else {
|
|
||||||
msgMetaInsertSql.append("'"+(meta.containsKey(column) ? meta.get(column) : "")+"',");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HashMap<String, Object> metaMap = selectDetail(meta.get("MSGMETADSTCD").toString());
|
|
||||||
List<Map<String, Object>> metaItemList = (List<Map<String, Object>>)metaMap.get("list");
|
|
||||||
|
|
||||||
// MESSAGE META LIST into BM02
|
|
||||||
for (Map<String, Object> metaItem : metaItemList) {
|
|
||||||
List<String> columnItemArr = new ArrayList<String>();
|
|
||||||
String[] columnItemList = {"MSGMETADSTCD","MSGCLMNSEQ","MSGITEMDSTICNAME","THISMSGCLMNUSEYN","THISMSGREGSNTID","THISMSGREGIHMS","THISMSGAMNDRID","THISMSGAMNDHMS"};
|
|
||||||
columnItemArr = Arrays.asList(columnItemList);
|
|
||||||
msgMetaInsertSql.append("INSERT INTO EAIPKG.TSEAIBM02 (MSGGROUPDSTCD,");
|
|
||||||
|
|
||||||
// 필드명 입력
|
|
||||||
for (String columnItem : columnItemArr) {
|
|
||||||
if (columnItem.equals("MSGMETADSTCD")) continue;
|
|
||||||
msgMetaInsertSql.append((columnItem.equals(columnItemArr.get(columnItemArr.size()-1))) ? columnItem : columnItem+",");
|
|
||||||
}
|
|
||||||
msgMetaInsertSql.append(") VALUES (");
|
|
||||||
// 필드값 입력
|
|
||||||
for (String column : columnItemArr) {
|
|
||||||
if (column.equals(columnItemArr.get(columnItemArr.size()-1))) {
|
|
||||||
if (Arrays.asList(columnUserId).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("'"+userid+"');\n");
|
|
||||||
} else if (Arrays.asList(columnDateTime).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("TO_CHAR(LOCALTIMESTAMP, 'YYYYMMDDHH24MISSFF3'));\n");
|
|
||||||
} else {
|
|
||||||
msgMetaInsertSql.append("'"+(metaItem.containsKey(column) ? metaItem.get(column) : "")+"');\n");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (Arrays.asList(columnUserId).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("'"+userid+"',");
|
|
||||||
} else if (Arrays.asList(columnDateTime).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("TO_CHAR(LOCALTIMESTAMP, 'YYYYMMDDHH24MISSFF3'),");
|
|
||||||
} else {
|
|
||||||
msgMetaInsertSql.append("'"+(metaItem.containsKey(column) ? metaItem.get(column) : "")+"',");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MESSAGE META LIST into BM01
|
|
||||||
for (Map<String, Object> metaItem : metaItemList) {
|
|
||||||
List<String> columnClmArr = new ArrayList<String>();
|
|
||||||
String[] columnClmList = {"MSGITEMDSTICNAME","THISMSGCLMNUSEYN","MSGCLMNNAME","MSGCLMNATTRIPTRNCD","MSGCLMNVAL","THISMSGCLMNREGSNTID","THISMSGCLMNREGIHMS","THISMSGCLMNAMNDRID","THISMSGCLMNAMNDHMS"};
|
|
||||||
columnClmArr = Arrays.asList(columnClmList);
|
|
||||||
|
|
||||||
msgMetaInsertSql.append("MERGE INTO EAIPKG.TSEAIBM01 r USING (VALUES(");
|
|
||||||
// 필드값 입력
|
|
||||||
for (String column : columnClmArr) {
|
|
||||||
if (column.equals(columnClmArr.get(columnClmArr.size()-1))) {
|
|
||||||
if (Arrays.asList(columnUserId).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("'"+userid+"')) ");
|
|
||||||
} else if (Arrays.asList(columnDateTime).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("TO_CHAR(LOCALTIMESTAMP, 'YYYYMMDDHH24MISSFF3'))) ");
|
|
||||||
} else {
|
|
||||||
msgMetaInsertSql.append("'"+(metaItem.containsKey(column) ? metaItem.get(column) : "")+"')) ");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (Arrays.asList(columnUserId).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("'"+userid+"',");
|
|
||||||
} else if (Arrays.asList(columnDateTime).contains(column)) {
|
|
||||||
msgMetaInsertSql.append("TO_CHAR(LOCALTIMESTAMP, 'YYYYMMDDHH24MISSFF3'),");
|
|
||||||
} else {
|
|
||||||
msgMetaInsertSql.append("'"+(metaItem.containsKey(column) ? metaItem.get(column) : "")+"',");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// 필드명 입력
|
|
||||||
msgMetaInsertSql.append("AS s(");
|
|
||||||
for (String columnClm : columnClmArr) {
|
|
||||||
msgMetaInsertSql.append((columnClm.equals(columnClmArr.get(columnClmArr.size()-1))) ? columnClm+")\n" : columnClm+",");
|
|
||||||
}
|
|
||||||
msgMetaInsertSql.append("ON r.MSGITEMDSTICNAME = s.MSGITEMDSTICNAME WHEN NOT MATCHED THEN\n");
|
|
||||||
msgMetaInsertSql.append("INSERT (");
|
|
||||||
for (String columnClm : columnClmArr) {
|
|
||||||
msgMetaInsertSql.append((columnClm.equals(columnClmArr.get(columnClmArr.size()-1))) ? "r."+columnClm : "r."+columnClm+",");
|
|
||||||
}
|
|
||||||
msgMetaInsertSql.append(") VALUES (");
|
|
||||||
for (String columnClm : columnClmArr) {
|
|
||||||
msgMetaInsertSql.append((columnClm.equals(columnClmArr.get(columnClmArr.size()-1))) ? "s."+columnClm+");\n" : "s."+columnClm+",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
HashMap<String,String> retMap = new HashMap<String,String>();
|
|
||||||
if (msgMetaMap.get("fileName") != null) {
|
|
||||||
OutputStream output = null;
|
|
||||||
try {
|
|
||||||
String sqlDownloadPath = getProperties("SQL_DOWNLOAD", "DOWNLOAD_PATH");
|
|
||||||
String sqlDownloadFile = sqlDownloadPath+msgMetaMap.get("fileName");
|
|
||||||
output = new FileOutputStream(sqlDownloadFile);
|
|
||||||
if (sqlDownloadPath != null) {
|
|
||||||
byte[] bt = msgMetaInsertSql.toString().getBytes();
|
|
||||||
output.write(bt);
|
|
||||||
output.close();
|
|
||||||
}
|
|
||||||
retMap.put("path", sqlDownloadPath);
|
|
||||||
} catch (Exception e) {
|
|
||||||
logger.error( e.getMessage(), e);
|
|
||||||
} finally {
|
|
||||||
if(output != null) try { output.close(); } catch(Exception ee) {logger.error( ee.getMessage(), ee);}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
retMap = SqlUtil.executeSql(msgMetaInsertSql.toString(), "BAP_"+msgMetaMap.get("svrType").toString().toUpperCase());
|
|
||||||
}
|
|
||||||
|
|
||||||
return retMap;
|
|
||||||
}
|
|
||||||
|
|
||||||
private String getProperties(String propGroup, String propName) throws Exception {
|
|
||||||
HashMap<String,Object> params = new HashMap<String,Object>();
|
|
||||||
params.put("prptyGroupName", propGroup);
|
|
||||||
params.put("prptyName", propName);
|
|
||||||
|
|
||||||
HashMap<String, Object> props = propDao.getProperties(params);
|
|
||||||
|
|
||||||
return props.get("PRPTY2VAL").toString();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -78,8 +78,8 @@
|
|||||||
ThisMsgRegsntID,
|
ThisMsgRegsntID,
|
||||||
ThisMsgRegiHMS,
|
ThisMsgRegiHMS,
|
||||||
ThisMsgAmndrID,
|
ThisMsgAmndrID,
|
||||||
ThisMsgAmndHMS )
|
ThisMsgAmndHMS,
|
||||||
<!-- MsgMetaDstcd ) -->
|
MSGMETADSTCD )
|
||||||
VALUES (
|
VALUES (
|
||||||
#msgMetaDstcd# ,
|
#msgMetaDstcd# ,
|
||||||
#msgClmnSeq# ,
|
#msgClmnSeq# ,
|
||||||
@@ -88,10 +88,10 @@
|
|||||||
#userid# ,
|
#userid# ,
|
||||||
TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHH24MISSFF3'),
|
TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHH24MISSFF3'),
|
||||||
#userid# ,
|
#userid# ,
|
||||||
TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHH24MISSFF3')
|
TO_CHAR(SYSTIMESTAMP, 'YYYYMMDDHH24MISSFF3'),
|
||||||
<!-- #msgMetaDstcd# -->
|
#msgMetaDstcd#
|
||||||
)
|
)
|
||||||
|
|
||||||
</statement>
|
</statement>
|
||||||
|
|
||||||
|
|
||||||
</sqlMap>
|
</sqlMap>
|
||||||
Reference in New Issue
Block a user