본문 바로가기

Terminal/TOP web IDE

TOP React Widget

[Common]

 

( 유저 정보 조회 ) - 프로미스

import { userApi } from '../gloabllogic/userApi' (경로에 맞게 추가)

userApi.getLoginUserId() => 로그인 아이디 리턴

userApi.getLoginUserInfo( '타입' ) => 로그인한 유저의 정보 조회

(타입이 있는 경우 = 유저 정보[type] / ex) '이름1'

없는 경우 = 유저 정보 전체 )



userApi.getUserInfo( '아이디' , '타입' ) => 해당 '아이디' 유저의 정보 조회

(타입이 O = 유저 정보[type] X = 유저 정보 전체 )

 

userApi.getRoomUser( '룸아이디' , '타입' ) => 해당 룸의 유저 목록 조회

(타입 O = 특정 정보 배열 / ex) ['이름1', '이름2', '이름3' ] X = 유저 정보 전체 배열)



/* 업데이트 호출 후 상단의 조회 함수 다시 호출 필요

userApi.update() => 로그인한 유저 정보 db에서 재조회 필요한 경우

userApi.updateUser( '아이디' ) => 특정 유저 정보 db에서 재조회 필요한 경우

userApi.updateRoom( '룸아이디' ) => 특정 룸 유저 정보 db에서 재조회 필요한 경우



/* 유저 타입 목록



( 룸 정보 조회 ) - 프로미스

import { roomApi } from '../gloabllogic/roomApi' (경로에 맞게 추가)

roomApi.getRoomList( '타입' ) => 로그인한 유저의 룸 목록 조회

(타입 O = 룸 목록의 특정 정보 배열 X = 룸 목록 전체 정보 )



roomApi.getRoom( '룸아이디', '타입' ) => 로그인한 유저의 특정 룸 정보 조회 (가입된 룸만)

(타입 O = 룸 정보[type] / ex) '룸 이름1' X = 특정 룸 정보 전체 )



roomApi.getMyRoom( '타입' ) => 로그인한 유저의 나의 룸 정보 조회

(타입 O = 룸 정보[type] / ex) '룸 이름1' X = 나의 룸 정보 전체 )



roomApi.getChannels ( '룸아이디', '채널 타입' )

=> 채널 타입 O = 특정 룸의 특정 채널 조회 X = 특정 룸의 채널 목록 조회



/* 룸 타입 목록

룸 ID

roomApi.getMyRoomId

 

각 앱 채널 ID

roomApi.getChannels(룸아이디, 채널타입) 

 

가입된 모든 룸의 채널

roomApi.getChannels(null, 채널타입) 

 

[Navigator]

 

Property 설정 UI가 추가되었습니다.

각 Type별로
stack => edit options(id, initItem 제외한 property), Screen Options(Stack Navigator의 screenOptions), 

tab => edit options(id, initItem 제외한 property), TabBar Options (Tab Navigator의 tabBarOptions),

drawer => edit options(id, initItem 제외한 property), content options(Drawer Navigator의 drawerContentOptions), bottom => edit options(id, initItem 제외한 property), bottom option(Bottom Navigator의 screenOptions) 버튼이 있고

 

type에 해당하는 option 들을 설정 할 수 있습니다.

navigator 내부 item의 option도 동일합니다. 

그리고 option의 타입 이 object type인 경우 아래 사진처럼 Dialog를 이용해 수정할 수 있습니다.

default value type은 string이며 boolen 혹은 number로 들어가야 한다면 우측 체크박스를 체크

 

모바일 서비스 연동 리스트

https://docs.google.com/spreadsheets/d/1Q1kv4i-npIsPnPsIaScx8Zh703WYbDkHwWutvmb_TvM/edit#gid=1181895720

 

https://docs.google.com/spreadsheets/d/1Q1kv4i-npIsPnPsIaScx8Zh703WYbDkHwWutvmb_TvM/edit#gid=0

 

[브랜치 정책]


1. 패키지 명을 위와 같이 정리한 이후부터, 패키지 명과 동일한 브랜치를 만든다. (ex. common, friends, ...)


2. 각 브랜치에서 git pull --rebase 기능을 활용하여 작업한다.


3. 정기적으로 master에 gitlab merge request를 이용하여 넣는다. (common -> master, friends -> master, ...)


4. 3번이 일어난 이후 각 브랜치에는 git rebase를 이용하여 최신을 반영한다. (주의!! 그냥 merge하지 말것)


5. git 설정은 author/email을 gitlab에 있는것과 동일하게 설정해야 함 - 회사 이메일 사용(ex. git config --global user.name "Min-Gyu, Kim")
(ex. git config --global user.email "mingyu_kim@tmax.co.kr")

 

[용어 정리]

 

snake_case: 단어 중간에 '_'(underscore)가 들어가는 형태
camelCase: 단어 구분을 대문자로 하는 형태
PascalCase: 앞이 대문자인 camelCase


[이름 짓기]

 

1. 패키지 명은 소문자 단일 단어: common, friends, space, mail, office, note, calendar, drive, meeting


2. 컨트롤러/레이아웃(데이터 패키지명은 기본생성만 활용)은 PascalCase (ex. FriendList)


3. 데이터 인스턴스 이름은 camelCase (ex. unreadMessage)


4. selectById()에 넣을 위젯 ID는 자동 생성되는 레이아웃 이름 뒤에 '-' 붙이고 PascalCase (ex. ChatView-Title)


[코딩 스타일]

 

1. js 코드 내에서는 w3schools 제공 스타일을 따른다

(https://www.w3schools.com/js/js_conventions.asp). (Google style은 vscode와 너무 다름)

 

2. 코드 수정 후에 studio 혹은 vscode에서 "format document (ctrl+shift+i)" 기능으로 포맷팅 하고 올릴것

 

3. Object의 key는 quote 하지 않는다 (ex. { abc: "my abc" })


4. Index 접근은 static한 경우 '.'으로만 한다 (ex. this.data NOT this["data"])


5. 문자열 quote는 쌍따옴표(")로 한다 (ex. "hello world!!" NOT 'hello world!!')(3~5번은 format document 하면 거의 자동으로 될듯)

 

6. git submodule의 주소는 git 프로토콜을 사용하고 ssh key를 등록하는 방식으로 적용한다

- http로 적용 금지

 

w3schools.com

JavaScript Style Guide

Well organized and easy to understand Web building tutorials with lots of examples of how to use HTML, CSS, JavaScript, SQL, PHP, Python, Bootstrap, Java and XML.

 

[StorageManager ]

 

기존에 StorageManager 파일을 StorageApi 로 master에 올려놓았습니다.
위치는 TeeSpace_Mobile_Common/meta/globallogic/StorageApi.js 에 있고 함수는
uploadFile,
downloadFile,
downloadFiles,
getFileURL,
getDownloadFileInfo,
copyFile

 

web에서 talk 서비스 js파일

axios.defaults.headers.common['Content-Type'] = 'application/json';
axios.defaults.timeout = talkData.responseTimeLimit;
​
const talkServer2 = (function () {
    return {
        ttalk_unreadList : function(talkId, startMsg, endMsg) {
        	if(talkId && startMsg && endMsg) return axios.put(talkData.serverURL + "Messenger/messengers/"+talkId+"/TtalkUnread?action=List&start="+startMsg+"&end="+endMsg)
            return new Promise((resolve,reject)=>{
                reject('ttalk_unreadList is error!');
            })
        },
​
    	
    	// 타이핑 중인 유저 알림 서비스 : 특정 방에 누군가 타이핑을 하고 있는 지를 서로의 client에게 알려주기 위한 서비스
    	sendTyping : function(workspaceId, messengerId, userId){
    		return axios.post(_workspace.url + "Messenger/workspaces/"+workspaceId+"/messengers/"+messengerId+"/ttalkrooms?action=Typing&user-id="+userId);
        	
    	},
    	//메시지 검색 서비스 : 특정 방에 특정 키워드의 내용을 가진 메시지를 반환한다.
    	searchMessage: function(talkId, keyword, type){
    		let messageList;
    		 jQuery.ajax({
                 type: "POST",
                 url: talkData.serverURL + "Messenger/ttalkmessages?action=Search&talk-id="+ talkId +"&keyword=" + keyword + "&msg-type=" + type ,                 
                 contentType: "application/json",
                 async: false,
                 success: function (data) {
                     messageList = data.dto.MSG_LIST;
                     for(let i=0; i<messageList.length; i++){  
                         if(messageList[i].MSG_BODY!==null&&messageList[i].MSG_BODY.includes("<")){
                        	 messageList[i].MSG_BODY = talkContent.convertToMsgBodyText(messageList[i].MSG_BODY);
                         }
                      }
                 }
             });           
             return messageList;
    	},
    	//메신저 조회 서비스 : 내가 포함되어 있는 모든 메신저를 조회한다.
    	getMessengerRooms: function (userId, isTemp="false", workspaceId) {
    		let urlStr;
    		if(workspaceId){
    			urlStr = _workspace.url + "Messenger/ttalkmessengers?action=List&user-id=" + userId + "&ws-id=" + workspaceId + "&istemp=" + isTemp;
    		}
    		else{
    			urlStr = _workspace.url + "Messenger/ttalkmessengers?action=List&user-id=" + userId + "&istemp=" + isTemp;
    		}
            let userInfo = {};
​
            jQuery.ajax({
                type: "GET",
                url: urlStr,
                contentType: "application/json",
                async: false,
                success: function (data) {
                    messengerInfo = data.dto;
                }
            });
            
            //이부분 다 수정해야함. 우선 msg_body_text로 변환할때 기존에는 msg_body에 있는 것 만을 했지만 이제는 attachment에 있는 정보로도 convert해야함
            if(messengerInfo.ttalkMessengersList!=null){
                 let targetMessengerInfo = null;
                 // let inputText = null;
                 // let msgType, userId = null;
                 for(let i=0; i<messengerInfo.ttalkMessengersList.length; i++){ 
            	 //     //TODO : 라스트 메시지가 널일때는 아무것도 안할꺼야 
                	 targetMessengerInfo = messengerInfo.ttalkMessengersList[i];
                	 messengerInfo.ttalkMessengersList[i].MSG_BODY = talkContent.convertToMsgBodyText(targetMessengerInfo["LAST_MESSAGE"]);
                 }
             	 talkData.messengerList = messengerInfo.ttalkMessengersList;
            }
            return messengerInfo;
        },
        //유저 조회 서비스 : 유저 정보를 조회한다.
        getUserInfo: function (userId) {
            let userInfo = {};
​
            jQuery.ajax({
                type: "GET",
                url: _workspace.url + "Users/BothProfile?{%22dto%22:{%22USER_ID%22:%22" + userId + "%22}}",
                contentType: "application/json",
                async: false,
                success: function (data) {
                    userInfo = data.dto;
                }
            });
            return userInfo;
        },
        //유저의 프로필 정보를 다중으로 받아오는 로직
        getMultipleUsersInfo: function(userIdList) {
            let _userList = [];
            for (let i=0;i<userIdList.length;i++) {
                _userList.push({"USER_ID" : userIdList[i]})
            };
            jQuery.ajax({
                url: _workspace.url + "Users/BothProfileList?action=Get",
                //Service Object
                type: 'POST',
                crossDomain: true,
                contentType: 'application/json',
                data: JSON.stringify({
                  "dto": {
                    "userList" : _userList
                  }
                }),                
                async: false,
                success: function (data) {
                    userInfoList = data.dto;
                }
            })
            return userInfoList;
        },
​
        //파일 유효성 체크 서비스 : 파일의 유효성을 체크한다.
    	validFileCheck: function(fileId){
    		return axios.get(talkData.serverURL + "Storage/StorageMeta?fileID="+fileId+"&channelID="+talkData.talkId+"&userID="+talkData.myInfo.userId+"&workspaceID="+talkData.workspaceId);
    	},
    	
    	//단순 웹소켓 전송 서비스 : DB에 가지 않고 WEBSOCKET만을 사용할 때 사용한다.
    	sendWebsocketMessage: function(targetMessage){
    		let message = {
    				"MSG_TYPE":"messageUpdate",
    				"MSG_ID" : targetMessage,
    				"ROOM_ID" : talkData.selectedRoomId.get(),
    				"USER_ID" : talkData.myInfo.userId
    				
    		}
    		let inputData = {
    	            		  "dto":{
    	            		    "USER_ID" : talkData.myInfo.userId,
    	            		    "CH_ID" : talkData.talkId,
    	            		    "CH_TYPE" : "CHN0001",
    	            		    "NOTI_TARGET" : talkData.workspaceId+"/"+talkData.talkId+"/"+talkData.selectedRoomId.get()+"/"+targetMessage,
    	            		    "NOTI_TO" : talkData.talkId,
    	            		    "NOTI_TYPE" : "MESSAGE_CREATE",
    	            		    "NOTI_ETC" : JSON.stringify(message)
    	            	    }
    	            	
    		};
    		return axios.post(talkData.serverURL + "Messenger/ttalkmessages?action=Event",inputData);
    	},
    	
    	//파일 다운로드 서비스 : 파일을 다운로드한다.
    	getFileDownload: function(fileID){
    		return axios.get(talkData.serverURL + "Storage/" +
                    "StorageFile?action=Download&fileID="+fileID+"&workspaceID="+talkData.workspaceId+"&channelID="+talkData.talkId+"&userID="+talkData.myInfo.userId);
    	},
    	
    	getStorageFiles : function() {
    		return axios.get(talkData.serverURL + "Storage/" +
                    "StorageMetaList?workspaceID="+talkData.workspaceId+"&channelID="+talkData.talkId);
    	},
    	
    	deleteStorageFile : function(inputData) {
    		return axios.post(talkData.serverURL + "Storage/StorageFile?action=Delete", inputData);
    	},
    	
    	deleteStorageMultiFile : function(inputData) {
    		return axios.post(talkData.serverURL + "Storage/StorageFileMulti?action=Delete", inputData);
    	},
​
        //메시지 단일 읽음처리 서비스 : 특정 방의 마지막 읽은 메시지를 갱신한다.
        ttalk_readMessage : function(talkId, msgId, userId) {
            if(talkId && msgId && userId) return axios.put(talkData.serverURL + "Messenger/messengers/"+talkId+"/ttalkmessages?action=Read&msg-id="+msgId+"&user-id="+userId)
            return new Promise((resolve,reject)=>{
                reject('ttalk_readOneMessage is error!');
            })
        },
        
        //부가 메시지 생성 서비스 : 특정 메시지에 대한 ATTACHMENT를 생성한다.
        ttalk_createAttachment: function(msgId, TtalkAttachmentList){
        	let inputData = {
        			"dto":{
        				MSG_ID : msgId,
        				TtalkAttachmentsList : TtalkAttachmentList
        			}
        	}
    	    return axios.post(talkData.serverURL +
                  "Messenger/ttalk/" + talkData.talkId +"/ttalkattachments?user-id="+talkData.myInfo.userId,inputData)
        },
    
        //방 리스트 조회 서비스 : 특정 유저의 방을 조회한다.
        ttalk_getRoomList: function () {
            return axios.post(talkData.serverURL +
                "Messenger/ttalk/" + talkData.talkId + "/ttalkrooms?action=List&user-id=" + talkData.myInfo.userId)
        },
      //스페이스 멤버 조회 : 해당 스페이스에 포함된 유저의 정보를 조회한다.
        getSpaceMemberInfo: function (userId, workspaceId) {
            return axios.get(talkData.serverURL + "SpaceRoom/SpaceRoomMemberList?{%22dto%22:{%22USER_ID%22:%22" + userId + "%22,%22WS_ID%22:%22" + workspaceId + "%22}}");
        },
        // 메세지 생성
        createMessage: function (messageDTO, workspaceId) {
        	if(talkData.messageList.length === 0){   	
        		spaceAPI.spaceInit()        
            }
            let talkId = workspaceManager.getChannelList(workspaceId,"CHN0001");
            // let inputData = this.createMessageFormat(ROOM_ID, MSG_BODY, MSG_TYPE);
            return axios.post(talkData.serverURL +
                "Messenger/workspaces/"+workspaceId+
                "/rooms/"+workspaceId+
                "/ttalk/" + talkId + "/ttalkmessages", { "dto": messageDTO })
        },
        //테스트 용 미팅 초대용
        meetingTest: function (workspaceId, msgBody, userId, meetingRoomId, isStart){
        	return axios.post(talkData.serverURL +
                    "Messenger/workspaces/" + workspaceId + "/ttalkmessages",
                    { 
        				"dto": 
        				{
        					USER_ID: userId,
            				MSG_BODY: msgBody,
            				MSG_TYPE: "create",
            				MSG_BODY_TEXT : (isStart?"TeeMeeting을 시작합니다":"TeeMeeting을 종료합니다"),
            				ATTACHMENT_LIST : [{
            					   ATTACHMENT_TYPE: (isStart?"startMeeting":"endMeeting"),
            					   ATTACHMENT_BODY : "<{'data-type':"+(isStart?"'startMeeting'":"'endMeeting'")+", 'data-user-id':"+userId+", 'data-meetingRoom-id':"+meetingRoomId+"}>"
            					}]
        				} 
        			})
        },
        
        createMessageFormat: function (ROOM_ID, MSG_BODY, MSG_TYPE) {
            let dto = {
                USER_ID: talkData.myInfo.userId,
                ROOM_ID: null,
                MSG_BODY: MSG_BODY,
                TEMP_ID: talkUtil.generateGUID(),
                MSG_TYPE: MSG_TYPE,
                MSG_TIME: new Date(),
                ATTACHMENT_LIST: []
            }
​
            if (talkData.selectedReply.value !== null) {
                let attachmentInfo = {
                    ATTACHMENT_TYPE: "reply",
                    ATTACHMENT_BODY: talkReply.replyMsgToServerMsg(talkData.selectedReply),
                    ch_id : talkData.talkId
                };
                dto["ATTACHMENT_LIST"].push(attachmentInfo)
            }
​
            return dto;
        },        
​
        //메시지 삭제
        deleteMessage: function (roomId, msgId) {
            let inputData = {
                "dto": {
                    "MSG_TYPE": "delete"
                }
            }
            return axios.put(talkData.serverURL + "Messenger/workspaces/"+talkData.workspaceId+"/ttalk/"+talkData.talkId+"/ttalkrooms/" + roomId + "/ttalkmessages/" + msgId, inputData)
​
        },
​
        //메시지 단일 조회
        ttalk_getMessage: function(talkId, msgId){
       	 return axios.get(talkData.serverURL +"Messenger/ttalk/" + talkId + "/ttalkmessages/"+msgId)
       },
        
        // 메세지 리스트 조회
        ttalk_getMessageList: function (lastMsg, count) {
        	if(lastMsg===0){
        		lastMsg = "none";
        	}
            return axios.get(talkData.serverURL +
                "Messenger/ttalk/" + talkData.talkId + "/ttalkrooms/" + talkData.selectedRoomId.get() + "/ttalkmessages?action=List&count="
                + count + "&last-msg=" + lastMsg + "&user-id=" + talkData.myInfo.userId)
        }
    }
})();

'Terminal > TOP web IDE' 카테고리의 다른 글

yarn top 실행시 오류  (0) 2020.05.04
TOP Web IDE 개발환경 구축  (0) 2020.04.28