added protocol SYNC > BUDDY, GROUP, ROOM

This commit is contained in:
leejh 2019-09-24 18:21:22 +09:00
parent 58e4f249a2
commit 8c5cbe185a
9 changed files with 700 additions and 7 deletions

View File

@ -5,3 +5,5 @@
export * from './lib/services/event-protocol.service';
export * from './lib/ucap-event-protocol.module';
export * from './lib/types/event.type';

View File

@ -10,7 +10,7 @@ import {
} from '@ucap-webmessenger/protocol';
import { LocaleCode } from '@ucap-webmessenger/core';
import { RoomType } from '../types/room.type';
import { EventType } from 'projects/ucap-webmessenger-protocol-event/src/lib/types/event.type';
import { EventType } from '@ucap-webmessenger/protocol-event';
import { EmployeeType } from '../types/employee.type';
import { RoleCode } from '@ucap-webmessenger/protocol-authentication';
@ -97,9 +97,9 @@ export interface UserInfo {
isMobile: boolean;
// 10. 부서명
deptName: string;
// 11. 참여 여부
// 11. 참여 여부 <<<<
isJoinRoom: boolean;
// 12. 최종확인SEQ
// 12. 최종확인SEQ <<<<
lastReadEventSeq: number;
// 13. ActiveYN
isActive: boolean;
@ -125,7 +125,7 @@ export interface UserInfo {
deptNameEn: string;
// 24. 부서명(중국어)
deptNameCn: string;
// 25. CALL_MODE
// 25. CALL_MODE <<<
callMode: string;
// 26. 이용약관동의여부YN
isPrivacyAgree: boolean;
@ -133,7 +133,7 @@ export interface UserInfo {
isValidLogin: boolean;
// 28. 임직원유형(s)
employeeType: EmployeeType;
// 29. 사용자아이디(s)
// 29. 사용자아이디(s) <<<
id: string;
}
@ -167,7 +167,7 @@ export interface RoomUserShortDataResponse extends ProtocolResponse {
export interface RoomUserDataResponse extends ProtocolResponse {
// 0. 대화방SEQ(s)
roomSeq: string;
// 1n. {참여자정보}
// 1n. {참여자정보-D}
userInfos: UserInfo[];
}

View File

@ -0,0 +1,118 @@
import {
ProtocolRequest,
ProtocolResponse,
ProtocolEncoder,
PacketBody,
PacketBodyValue,
ProtocolDecoder,
ProtocolMessage,
BodyStringDivider
} from '@ucap-webmessenger/protocol';
import { UserInfo } from '../types/userInfo';
export interface BuddyInfo {
// 사용자SEQ
userSeq: number;
// 즐.찾 여부
isFavorit: boolean;
// 친구여부
isBuddy: boolean;
}
export interface SyncBuddyRequest extends ProtocolRequest {
// 0. 동료 씽크일시(s) cf)2019-09-24 16:51:42
syncDate: string;
}
export interface SyncBuddyDataResponse extends ProtocolResponse {
// n. {동료정보-S}...
buddyInfos: BuddyInfo[];
}
export interface SyncBuddyDataDetailResponse extends ProtocolResponse {
// n. {동료정보-S}...
buddyInfos: UserInfo[];
}
export interface SyncBuddyResponse extends ProtocolResponse {
// 0. 동료 씽크일시(s) cf)2019-09-24 16:51:42
syncDate: string;
}
export const encodeSyncBuddy: ProtocolEncoder<SyncBuddyRequest> = (
req: SyncBuddyRequest
) => {
const bodyList: PacketBody[] = [];
bodyList.push({ type: PacketBodyValue.String, value: req.syncDate || '' });
return bodyList;
};
export const decodeSyncBuddy: ProtocolDecoder<SyncBuddyResponse> = (
message: ProtocolMessage
) => {
return {
syncDate: message.bodyList[0]
} as SyncBuddyResponse;
};
export const decodeSyncBuddyData: ProtocolDecoder<SyncBuddyDataResponse> = (
message: ProtocolMessage
) => {
const buddyInfos: BuddyInfo[] = [];
message.bodyList.forEach(buddyinfo => {
const info = buddyinfo.split(BodyStringDivider);
buddyInfos.push({
userSeq: info[0],
isFavorit: info[1] === 'Y' ? true : false,
isBuddy: info[2] === 'Y' ? true : false
});
});
return {
buddyInfos
} as SyncBuddyDataResponse;
};
export const decodeSyncBuddyDataDetail: ProtocolDecoder<
SyncBuddyDataDetailResponse
> = (message: ProtocolMessage) => {
const buddyInfos: UserInfo[] = [];
message.bodyList.forEach(buddyinfo => {
const info = buddyinfo.split(BodyStringDivider);
let i = 0;
buddyInfos.push({
userSeq: info[i],
name: info[i++],
profileImageFile: info[i++],
grade: info[i++],
intro: info[i++],
companyCode: info[i++],
hpNumber: info[i++],
lineNumber: info[i++],
email: info[i++],
isMobile: info[i++],
deptName: info[i++],
isFavorit: info[i++],
isBuddy: info[i++],
isActive: info[i++],
roleCd: info[i++],
employeeNum: info[i++],
madn: info[i++],
hardSadn: info[i++],
fmcSadn: info[i++],
nameEn: info[i++],
nameCn: info[i++],
gradeEn: info[i++],
gradeCn: info[i++],
deptNameEn: info[i++],
deptNameCn: info[i++],
isPrivacyAgree: info[i++],
isValidLogin: info[i++],
employeeType: info[i++],
nickName: info[i++]
});
});
return {
buddyInfos
} as SyncBuddyDataDetailResponse;
};

View File

@ -0,0 +1,101 @@
import {
ProtocolRequest,
ProtocolResponse,
ProtocolEncoder,
PacketBody,
PacketBodyValue,
ProtocolDecoder,
ProtocolMessage,
BodyStringDivider
} from '@ucap-webmessenger/protocol';
export interface GroupInfo {
// 그룹SEQ(n)
seq: number;
// 그룹이름(s)
name: string;
// ActiveYN(s)
isActive: boolean;
// 사용자SEQ(s)
userSeqStr: string;
}
export interface SyncGroupRequest extends ProtocolRequest {
// 0. 동료 씽크일시(s) cf)2019-09-24 16:51:42
syncDate: string;
}
export interface SyncGroupDataResponse extends ProtocolResponse {
// n. {동료그룹정보}...
groupInfos: GroupInfo[];
}
export interface SyncGroupDataDetailResponse extends ProtocolResponse {
// 그룹SEQ(n)
seq: number;
// 그룹이름(s)
name: string;
// ActiveYN(s)
isActive: boolean;
// 사용자SEQ(n)1
userSeqs: number[];
}
export interface SyncGroupResponse extends ProtocolResponse {
// 0. 동료 씽크일시(s) cf)2019-09-24 16:51:42
syncDate: string;
}
export const encodeSyncGroup: ProtocolEncoder<SyncGroupRequest> = (
req: SyncGroupRequest
) => {
const bodyList: PacketBody[] = [];
bodyList.push({ type: PacketBodyValue.String, value: req.syncDate || '' });
return bodyList;
};
export const decodeSyncGroup: ProtocolDecoder<SyncGroupResponse> = (
message: ProtocolMessage
) => {
return {
syncDate: message.bodyList[0]
} as SyncGroupResponse;
};
export const decodeSyncGroupData: ProtocolDecoder<SyncGroupDataResponse> = (
message: ProtocolMessage
) => {
const groupInfos: GroupInfo[] = [];
message.bodyList.forEach(buddyinfo => {
const info = buddyinfo.split(BodyStringDivider);
groupInfos.push({
seq: info[0],
name: info[1],
isActive: info[2] === 'Y' ? true : false,
userSeqStr: info[3]
});
});
return {
groupInfos
} as SyncGroupDataResponse;
};
export const decodeSyncGroupDataDetail: ProtocolDecoder<
SyncGroupDataDetailResponse
> = (message: ProtocolMessage) => {
let userSeqs: number[] = [];
if (message.bodyList.length > 3) {
userSeqs = message.bodyList.slice(3);
}
return {
// 그룹SEQ(n)
seq: message.bodyList[0],
// 그룹이름(s)
name: message.bodyList[1],
// ActiveYN(s)
isActive: message.bodyList[2] === 'Y' ? true : false,
// 사용자SEQ(n)1
userSeqs
} as SyncGroupDataDetailResponse;
};

View File

@ -0,0 +1,175 @@
import { LocaleCode } from '@ucap-webmessenger/core';
import {
ProtocolRequest,
ProtocolResponse,
ProtocolEncoder,
PacketBody,
PacketBodyValue,
ProtocolDecoder,
ProtocolMessage,
BodyStringDivider
} from '@ucap-webmessenger/protocol';
import {
RoomInfo,
UserInfoShort,
UserInfo,
EmployeeType
} from '@ucap-webmessenger/protocol-room';
import { RoleCode } from '@ucap-webmessenger/protocol-authentication';
import { EventType } from '@ucap-webmessenger/protocol-event';
export interface SyncRoomRequest extends ProtocolRequest {
// 0. 동료 씽크일시(s) cf)2019-09-24 16:51:42
syncDate: string;
// 언어코드
localeCode: LocaleCode;
}
export interface SyncRoomDataResponse extends ProtocolResponse {
// n. {대화방정보}...
roomInfos: RoomInfo[];
}
export interface SyncRoomUserDataResponse extends ProtocolResponse {
// 0. 대화방SEQ(s)
roomSeq: string;
// 1n. {참여자정보}
userInfos: UserInfoShort[];
}
export interface SyncRoomUserDataDetailResponse extends ProtocolResponse {
// 0. 대화방SEQ(s)
roomSeq: string;
// 1n. {참여자정보-D}
userInfos: UserInfo[];
}
export interface SyncRoomResponse extends ProtocolResponse {
// 0. 동료 씽크일시(s) cf)2019-09-24 16:51:42
syncDate: string;
}
export const encodeSyncRoom: ProtocolEncoder<SyncRoomRequest> = (
req: SyncRoomRequest
) => {
const bodyList: PacketBody[] = [];
bodyList.push({ type: PacketBodyValue.String, value: req.syncDate || '' });
bodyList.push({ type: PacketBodyValue.String, value: req.localeCode });
return bodyList;
};
export const decodeSyncRoom: ProtocolDecoder<SyncRoomResponse> = (
message: ProtocolMessage
) => {
return {
syncDate: message.bodyList[0]
} as SyncRoomResponse;
};
export const decodeSyncRoomData: ProtocolDecoder<SyncRoomDataResponse> = (
message: ProtocolMessage
) => {
const roomInfos: RoomInfo[] = [];
if (message.bodyList.length > 1) {
const info = message.bodyList[1].split(BodyStringDivider);
if (info.length > 11) {
roomInfos.push({
roomSeq: info[0],
roomType: info[1],
roomName: info[2],
finalEventType: info[3] as EventType,
finalEventMessage: info[4],
finalEventDate: info[5],
joinUserCount: info[6],
noReadCnt: info[7],
isAlarm: info[8] !== 'N' ? true : false,
isJoinRoom: info[9] === 'Y' ? true : false,
expiredFileStdSeq: info[10],
isTimeRoom: info[11] === 'Y' ? true : false,
timeRoomInterval: info[11] !== 'Y' ? 0 : info[12] || 0
});
}
}
return {
roomSeq: message.bodyList[0],
roomInfos
} as SyncRoomDataResponse;
};
export const decodeSyncRoomUserData: ProtocolDecoder<
SyncRoomUserDataResponse
> = (message: ProtocolMessage) => {
const userInfos: UserInfoShort[] = [];
message.bodyList.slice(1).forEach(userInfo => {
const info = userInfo.split(BodyStringDivider);
userInfos.push({
userSeq: info[0],
name: info[1],
profileImageFile: info[2],
isJoinRoom: info[3],
lastReadEventSeq: info[4],
madn: info[5],
hardSadn: info[6],
fmcSadn: info[7],
nameEn: info[8],
nameCn: info[9],
isPrivacyAgree: info[10] === 'Y' ? true : false,
isValidLogin: info[11] === 'Y' ? true : false,
employeeType: info[12] as EmployeeType,
fontColor: info[13]
});
});
return {
roomSeq: message.bodyList[0],
userInfos
} as SyncRoomUserDataResponse;
};
export const decodeSyncRoomUserDataDetail: ProtocolDecoder<
SyncRoomUserDataDetailResponse
> = (message: ProtocolMessage) => {
const userInfos: UserInfo[] = [];
message.bodyList.slice(1).forEach(userInfo => {
const info = userInfo.split(BodyStringDivider);
userInfos.push({
userSeq: info[0],
name: info[1],
profileImageFile: info[2],
grade: info[3],
intro: info[4],
companyCode: info[5],
hpNumber: info[6],
lineNumber: info[7],
email: info[8],
isMobile: info[9] === 'Y' ? true : false,
deptName: info[10],
isJoinRoom: info[11] === 'Y' ? true : false,
lastReadEventSeq: info[12],
isActive: info[13] === 'Y' ? true : false,
roleCd: info[14] as RoleCode,
employeeNum: info[15],
madn: info[16],
hardSadn: info[17],
fmcSadn: info[18],
nameEn: info[19],
nameCn: info[20],
gradeEn: info[21],
gradeCn: info[22],
deptNameEn: info[23],
deptNameCn: info[24],
callMode: info[25],
isPrivacyAgree: info[26] === 'Y' ? true : false,
isValidLogin: info[27] === 'Y' ? true : false,
employeeType: info[28] as EmployeeType,
id: info[29]
});
});
return {
roomSeq: message.bodyList[0],
userInfos
} as SyncRoomUserDataDetailResponse;
};

View File

@ -1,8 +1,211 @@
import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { map, take, takeWhile } from 'rxjs/operators';
import { ProtocolService } from '@ucap-webmessenger/protocol';
import {
SyncBuddyRequest,
SyncBuddyResponse,
SyncBuddyDataResponse,
encodeSyncBuddy,
decodeSyncBuddyData,
decodeSyncBuddy,
decodeSyncBuddyDataDetail
} from '../models/buddy';
import {
SVC_TYPE_SYNC_BUDDY,
SSVC_TYPE_SYNC_BUDDY_REQ,
SSVC_TYPE_SYNC_BUDDY_RES,
SSVC_TYPE_SYNC_BUDDY_DATA,
SSVC_TYPE_SYNC_BUDDY2_REQ,
SSVC_TYPE_SYNC_BUDDY2_RES,
SSVC_TYPE_SYNC_BUDDY2_DATA,
SVC_TYPE_SYNC_GROUP,
SSVC_TYPE_SYNC_GROUP_REQ,
SSVC_TYPE_SYNC_GROUP_RES,
SSVC_TYPE_SYNC_GROUP_DATA,
SSVC_TYPE_SYNC_GROUP_REQ2,
SSVC_TYPE_SYNC_GROUP_RES2,
SSVC_TYPE_SYNC_GROUP_DATA2,
SVC_TYPE_SYNC_ROOM,
SSVC_TYPE_SYNC_ROOM_REQ,
SSVC_TYPE_SYNC_ROOM_RES,
SSVC_TYPE_SYNC_ROOM_DATA,
SSVC_TYPE_SYNC_ROOM_USER,
SSVC_TYPE_SYNC_ROOM_USER2,
SSVC_TYPE_SYNC_ROOM2_REQ,
SSVC_TYPE_SYNC_ROOM2_RES,
SSVC_TYPE_SYNC_ROOM2_DATA,
SSVC_TYPE_SYNC_ROOM2_USER,
SSVC_TYPE_SYNC_ROOM2_USER2
} from '../types/service';
import {
SyncGroupRequest,
SyncGroupResponse,
SyncGroupDataResponse,
encodeSyncGroup,
decodeSyncGroupDataDetail,
decodeSyncGroup,
decodeSyncGroupData,
SyncGroupDataDetailResponse
} from '../models/group';
import {
SyncRoomRequest,
SyncRoomResponse,
encodeSyncRoom,
decodeSyncRoom,
SyncRoomUserDataResponse,
SyncRoomUserDataDetailResponse,
SyncRoomDataResponse,
decodeSyncRoomData,
decodeSyncRoomUserData,
decodeSyncRoomUserDataDetail
} from '../models/room';
@Injectable({
providedIn: 'root'
})
export class SyncProtocolService {
constructor() {}
constructor(private protocolService: ProtocolService) {}
public syncBuddy(
req: SyncBuddyRequest
): Observable<SyncBuddyResponse | SyncBuddyDataResponse> {
return this.protocolService
.call(
SVC_TYPE_SYNC_BUDDY,
SSVC_TYPE_SYNC_BUDDY_REQ,
...encodeSyncBuddy(req)
)
.pipe(
takeWhile(res => SSVC_TYPE_SYNC_BUDDY_RES !== res.subServiceType),
map(res => {
if (SSVC_TYPE_SYNC_BUDDY_DATA === res.subServiceType) {
return decodeSyncBuddyData(res);
}
return decodeSyncBuddy(res);
})
);
}
public syncBuddy2(
req: SyncBuddyRequest
): Observable<SyncBuddyResponse | SyncBuddyDataResponse> {
return this.protocolService
.call(
SVC_TYPE_SYNC_BUDDY,
SSVC_TYPE_SYNC_BUDDY2_REQ,
...encodeSyncBuddy(req)
)
.pipe(
takeWhile(res => SSVC_TYPE_SYNC_BUDDY2_RES !== res.subServiceType),
map(res => {
if (SSVC_TYPE_SYNC_BUDDY2_DATA === res.subServiceType) {
return decodeSyncBuddyDataDetail(res);
}
return decodeSyncBuddy(res);
})
);
}
public syncGroup(
req: SyncGroupRequest
): Observable<SyncGroupResponse | SyncGroupDataResponse> {
return this.protocolService
.call(
SVC_TYPE_SYNC_GROUP,
SSVC_TYPE_SYNC_GROUP_REQ,
...encodeSyncGroup(req)
)
.pipe(
takeWhile(res => SSVC_TYPE_SYNC_GROUP_RES !== res.subServiceType),
map(res => {
if (SSVC_TYPE_SYNC_GROUP_DATA === res.subServiceType) {
return decodeSyncGroupData(res);
}
return decodeSyncGroup(res);
})
);
}
public syncGroup2(
req: SyncGroupRequest
): Observable<SyncGroupResponse | SyncGroupDataDetailResponse> {
return this.protocolService
.call(
SVC_TYPE_SYNC_GROUP,
SSVC_TYPE_SYNC_GROUP_REQ2,
...encodeSyncGroup(req)
)
.pipe(
takeWhile(res => SSVC_TYPE_SYNC_GROUP_RES2 !== res.subServiceType),
map(res => {
if (SSVC_TYPE_SYNC_GROUP_DATA2 === res.subServiceType) {
return decodeSyncGroupDataDetail(res);
}
return decodeSyncGroup(res);
})
);
}
public syncRoom(
req: SyncRoomRequest
): Observable<
| SyncRoomResponse
| SyncRoomDataResponse
| SyncRoomUserDataResponse
| SyncRoomUserDataDetailResponse
> {
return this.protocolService
.call(SVC_TYPE_SYNC_ROOM, SSVC_TYPE_SYNC_ROOM_REQ, ...encodeSyncRoom(req))
.pipe(
takeWhile(res => SSVC_TYPE_SYNC_ROOM_RES !== res.subServiceType),
map(res => {
if (SSVC_TYPE_SYNC_ROOM_DATA === res.subServiceType) {
return decodeSyncRoomData(res);
} else if (SSVC_TYPE_SYNC_ROOM_USER === res.subServiceType) {
return decodeSyncRoomUserData(res);
} else if (SSVC_TYPE_SYNC_ROOM_USER2 === res.subServiceType) {
return decodeSyncRoomUserDataDetail(res);
}
return decodeSyncRoom(res);
})
);
}
public syncRoom2(
req: SyncRoomRequest
): Observable<
| SyncRoomResponse
| SyncRoomDataResponse
| SyncRoomUserDataResponse
| SyncRoomUserDataDetailResponse
> {
return this.protocolService
.call(
SVC_TYPE_SYNC_ROOM,
SSVC_TYPE_SYNC_ROOM2_REQ,
...encodeSyncRoom(req)
)
.pipe(
takeWhile(res => SSVC_TYPE_SYNC_ROOM2_RES !== res.subServiceType),
map(res => {
if (SSVC_TYPE_SYNC_ROOM2_DATA === res.subServiceType) {
return decodeSyncRoomData(res);
} else if (SSVC_TYPE_SYNC_ROOM2_USER === res.subServiceType) {
return decodeSyncRoomUserData(res);
} else if (SSVC_TYPE_SYNC_ROOM2_USER2 === res.subServiceType) {
return decodeSyncRoomUserDataDetail(res);
}
return decodeSyncRoom(res);
})
);
}
}

View File

@ -0,0 +1,27 @@
export const SVC_TYPE_SYNC_BUDDY = 81; // 동료 씽크
export const SSVC_TYPE_SYNC_BUDDY_REQ = 1; // 동료목록 씽크 요청
export const SSVC_TYPE_SYNC_BUDDY_DATA = 2; // 동료목록 Data
export const SSVC_TYPE_SYNC_BUDDY_RES = 3; // 동료목록 씽크 완료
export const SSVC_TYPE_SYNC_BUDDY2_REQ = 11; // 동료목록 씽크 요청(상세)
export const SSVC_TYPE_SYNC_BUDDY2_DATA = 12; // 동료 정보 Data(상세)
export const SSVC_TYPE_SYNC_BUDDY2_RES = 13; // 동료 정보 쿼리 완료(상세)
export const SVC_TYPE_SYNC_GROUP = 82; // 동료 씽크
export const SSVC_TYPE_SYNC_GROUP_REQ = 1; // 그룹목록 씽크 요청
export const SSVC_TYPE_SYNC_GROUP_DATA = 2; // 그룹 Data
export const SSVC_TYPE_SYNC_GROUP_RES = 3; // 그룹목록 씽크 완료
export const SSVC_TYPE_SYNC_GROUP_REQ2 = 4; // 그룹목록 씽크 요청
export const SSVC_TYPE_SYNC_GROUP_DATA2 = 5; // 그룹 Data
export const SSVC_TYPE_SYNC_GROUP_RES2 = 6; // 그룹목록 씽크 완료
export const SVC_TYPE_SYNC_ROOM = 83; // 대화방 씽크
export const SSVC_TYPE_SYNC_ROOM_REQ = 1; // 대화방 목록 씽크 요청
export const SSVC_TYPE_SYNC_ROOM_DATA = 2; // 대화방 목록 Data
export const SSVC_TYPE_SYNC_ROOM_USER = 3; // 참여 정보(방갯수만큼)
export const SSVC_TYPE_SYNC_ROOM_USER2 = 5; // 참여 정보(방갯수만큼)
export const SSVC_TYPE_SYNC_ROOM_RES = 4; // 대화방 목록 씽크 완료
export const SSVC_TYPE_SYNC_ROOM2_REQ = 11; // 대화방 목록 씽크 요청
export const SSVC_TYPE_SYNC_ROOM2_DATA = 12; // 대화방 목록 Data
export const SSVC_TYPE_SYNC_ROOM2_USER = 13; // 참여 정보(방갯수만큼)
export const SSVC_TYPE_SYNC_ROOM2_USER2 = 15; // 참여 정보(방갯수만큼)
export const SSVC_TYPE_SYNC_ROOM2_RES = 14; // 대화방 목록 씽크 완료

View File

@ -0,0 +1,63 @@
import { RoleCode } from '@ucap-webmessenger/protocol-authentication';
import { EmployeeType } from '@ucap-webmessenger/protocol-room';
export interface UserInfo {
// 사용자SEQ
userSeq: number;
// 사용자명
name: string;
// 사진파일
profileImageFile: string;
// 직급
grade: string;
// 업무소개
intro: string;
// 기관코드
companyCode: string;
// 핸드폰번호
hpNumber: string;
// 내선번호
lineNumber: string;
// 이메일
email: string;
// 모바일YN
isMobile: boolean;
// 부서명
deptName: string;
// 즐.찾 여부
isFavorit: boolean;
// 친구여부
isBuddy: boolean;
// ActiveYN
isActive: boolean;
// 역할코드
roleCd: RoleCode;
// 사번
employeeNum: string;
// MADN
madn: string;
// HARDPHONE_SADN
hardSadn: string;
// FMC_SADN
fmcSadn: string;
// 사용자명(영어)
nameEn: string;
// 사용자명(중국어)
nameCn: string;
// 직급(영어)
gradeEn: string;
// 직급(중국어)
gradeCn: string;
// 부서명(영어)
deptNameEn: string;
// 부서명(중국어)
deptNameCn: string;
// 이용약관동의여부YN
isPrivacyAgree: boolean;
// 유효접속여부YN
isValidLogin: boolean;
// 임직원유형(s)
employeeType: EmployeeType;
// 별명
nickName: string;
}

View File

@ -1,7 +1,11 @@
/*
* Public API Surface of ucap-webmessenger-protocol-sync
*/
export * from './lib/models/buddy';
export * from './lib/models/group';
export * from './lib/services/sync-protocol.service';
export * from './lib/ucap-sync-protocol.module';
export * from './lib/types/userInfo';