Skip to content

Commit 34a9a77

Browse files
[Change] Change kakao channels, templates request type
1 parent 4e56c4c commit 34a9a77

5 files changed

Lines changed: 147 additions & 63 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "solapi",
3-
"version": "5.1.2",
3+
"version": "5.1.3",
44
"description": "SOLAPI SDK for Node.js(Server Side Only)",
55
"repository": {
66
"type": "git",

src/models/kakao/kakaoAlimtalkTemplate.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,20 @@
11
import {KakaoButton} from './kakaoButton';
2+
import {KakaoAlimtalkTemplateStatus} from '../../types/commonTypes';
23

34
/**
4-
* 카카오 알림톡 템플릿 메시지 유형
5+
* @description 카카오 알림톡 템플릿 메시지 유형
56
* BA:기본형, EX:부가정보형, AD:광고추가형, MI: 복합형
67
*/
78
export type KakaoAlimtalkTemplateMessageType = 'BA' | 'EX' | 'AD' | 'MI'
89

910
/**
10-
* 카카오 알림톡 템플릿 강조 유형
11+
* @description 카카오 알림톡 템플릿 강조 유형
1112
* NONE: 선택안함, TEXT: 강조표기형, IMAGE: 이미지형
1213
*/
1314
export type KakaoAlimtalkTemplateEmphasizeType = 'NONE' | 'TEXT' | 'IMAGE'
1415

1516
/**
16-
* 카카오 알림톡 템플릿 그룹 유형(기본값은 Channel)
17+
* @description 카카오 알림톡 템플릿 그룹 유형(기본값은 Channel)
1718
*/
1819
type KakaoAlimtalkTemplateAssignType = 'CHANNEL' | 'GROUP'
1920

@@ -25,7 +26,7 @@ type KakaoAlimtalkTemplateCommentType = {
2526
}
2627

2728
type KakaoAlimtalkTemplateCodeType = {
28-
status: 'PENDING' | 'INSPECTING' | 'REJECTED' | 'APPROVED'
29+
status: Omit<KakaoAlimtalkTemplateStatus, 'DELETED'>
2930
comments: Array<KakaoAlimtalkTemplateCommentType>
3031
}
3132

@@ -113,7 +114,7 @@ export class KakaoAlimtalkTemplate {
113114
/**
114115
* 카카오 알림톡 템플릿 상태 현황목록
115116
*/
116-
codes: Array<KakaoAlimtalkTemplateCodeType>;
117+
codes: Array<KakaoAlimtalkTemplateCodeType> | null;
117118

118119
/**
119120
* 알림톡 템플릿 생성일자

src/requests/messageRequest.ts

Lines changed: 58 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Message, MessageType} from '../models/message';
2-
import {GroupId, OperatorType} from '../types/commonTypes';
2+
import {DateOperatorType, GroupId, KakaoAlimtalkTemplateStatus} from '../types/commonTypes';
33
import {formatISO} from 'date-fns';
44
import stringDateTransfer from '../lib/stringDateTrasnfer';
55
import {KakaoButton} from '../models/kakao/kakaoButton';
@@ -13,7 +13,7 @@ export type DefaultAgentType = {
1313
osPlatform: string
1414
};
1515

16-
const sdkVersion = 'nodejs/5.1.2';
16+
const sdkVersion = 'nodejs/5.1.3';
1717

1818
export const defaultAgent: DefaultAgentType = {
1919
sdkVersion,
@@ -197,15 +197,23 @@ export type CreateGroupRequest = DefaultAgentType & {
197197
appId?: string
198198
}
199199

200+
/**
201+
* @description GET API 중 일부 파라미터 조회 시 필요한 객체
202+
* @see https://docs.solapi.com/api-reference/overview#operator
203+
*/
204+
export type DatePayloadType = {
205+
[key in DateOperatorType]?: string | Date;
206+
};
207+
200208
export type GetKakaoChannelsRequest = {
201-
channelId: string;
202-
searchId: string;
203-
phoneNumber: string;
204-
categoryCode: string;
205-
dateCreated: Record<keyof Omit<OperatorType, 'ne' | 'like' | 'in'>, string>;
206-
dateUpdated: Record<keyof Omit<OperatorType, 'ne' | 'like' | 'in'>, string>;
207-
startKey: string;
208-
limit: number;
209+
channelId: string
210+
searchId: string
211+
phoneNumber: string
212+
categoryCode: string
213+
dateCreated: DatePayloadType
214+
dateUpdated: DatePayloadType
215+
startKey: string
216+
limit: number
209217
}
210218

211219
export type CreateKakaoChannelTokenRequest = {
@@ -220,48 +228,43 @@ export type CreateKakaoChannelRequest = {
220228
token: string
221229
}
222230

223-
export type GetKakaoAlimtalkTemplatesRequestType = {
224-
name?: string
225-
pfId?: string
226-
templateId?: string
227-
isHidden?: boolean
228-
status?: string
229-
startKey?: string
230-
limit?: number
231-
dateCreated?: string
232-
dateUpdated?: string
233-
}
234-
235-
export class GetKakaoAlimtalkTemplatesRequest {
236-
'name[like]'?: string;
237-
pfId?: string;
238-
templateId?: string;
239-
isHidden?: boolean;
240-
status?: string;
241-
startKey?: string;
242-
limit?: number;
243-
'dateCreated[gte]'?: string;
244-
'dateUpdated[gte]'?: string;
245-
246-
constructor(getKakaoAlimtalkTemplatesRequestType: GetKakaoAlimtalkTemplatesRequestType) {
247-
this['name[like]'] = getKakaoAlimtalkTemplatesRequestType.name;
248-
this.pfId = getKakaoAlimtalkTemplatesRequestType.pfId;
249-
this.templateId = getKakaoAlimtalkTemplatesRequestType.templateId;
250-
this.isHidden = getKakaoAlimtalkTemplatesRequestType.isHidden;
251-
this.status = getKakaoAlimtalkTemplatesRequestType.status;
252-
this.startKey = getKakaoAlimtalkTemplatesRequestType.startKey;
253-
this.limit = getKakaoAlimtalkTemplatesRequestType.limit;
254-
this['dateCreated[gte]'] = getKakaoAlimtalkTemplatesRequestType.dateCreated;
255-
this['dateUpdated[gte]'] = getKakaoAlimtalkTemplatesRequestType.dateUpdated;
256-
}
231+
/**
232+
* @description 카카오 알림톡 조회를 위한 요청 타입
233+
* @param {string} name - 알림톡 템플릿 제목
234+
* @param {string} channelId - 카카오 비즈니스 채널 ID
235+
* @param {string} templateId - 카카오 알림톡 템플릿 ID
236+
* @param {boolean} isHidden - 숨긴 템플릿 여부 확인
237+
* @param {KakaoAlimtalkTemplateStatus} status - 알림톡 템플릿 상태
238+
* @param {string} startKey - 페이지네이션 조회 키
239+
* @param {number} limit - 조회 시 제한할 건 수 (기본: 20, 최대: 500)
240+
* @param {DatePayloadType} dateCreated - 생성일자 (조회 조건 -> eq, lte, gte 등이 포함되어야 함)
241+
* @param {DatePayloadType} dateUpdated - 수정일자 (조회 조건 -> eq, lte, gte 등이 포함되어야 함)
242+
*/
243+
export type GetKakaoAlimtalkTemplatesRequest = {
244+
name: string
245+
channelId: string
246+
templateId: string
247+
isHidden: boolean
248+
status: KakaoAlimtalkTemplateStatus
249+
startKey: string
250+
limit: number
251+
dateCreated: DatePayloadType
252+
dateUpdated: DatePayloadType
257253
}
258254

259255
/**
260-
* @description 카카오 알림톡 템플릿 요청 파라미터 타입
261-
* @param name 알림톡 템플릿 제목 (동일한 채널에 중복적인 이름 등록 불가)
262-
* @property content 알림톡 템플릿 내용
263-
* @property categoryCode 알림톡 템플릿 카테고리 코드, KakaoAlimtalkTemplateCategory 타입 참고
264-
* @property buttons 알림톡 템플릿
256+
* @description 카카오 알림톡 템플릿 요청 타입
257+
* @param {string|undefined} name - 알림톡 템플릿 제목 (동일한 채널에 중복적인 이름 등록 불가)
258+
* @param {string|undefined} content - 알림톡 템플릿 내용
259+
* @param {string|undefined} categoryCode - 알림톡 템플릿 카테고리 코드, KakaoAlimtalkTemplateCategory 타입 참고
260+
* @param {KakaoButton[]|undefined} buttons - 알림톡 템플릿 버튼 목록
261+
* @param {KakaoAlimtalkTemplateMessageType|undefined} messageType - 알림톡 템플릿 메시지 유형
262+
* @param {KakaoAlimtalkTemplateEmphasizeType|undefined} emphasizeType - 카카오 알림톡 템플릿 강조 유형
263+
* @param {string|undefined} extra - 부가정보, 치환문구를 넣을 수 없음
264+
* @param {string|undefined} emphasizeTitle - 강조 표기 제목 (강조 표기형 유형만 등록 가능)
265+
* @param {string|undefined} emphasizeSubTitle - 강조 표기 부제목 (강조 표기형 유형만 등록 가능)
266+
* @param {boolean|undefined} securityFlag - 보안 템플릿 여부
267+
* @param {string|undefined} imageId - 알림톡 템플릿 내에 업로드 할 이미지 ID (Storage API 사용 필요)
265268
*/
266269
export type KakaoAlimtalkTemplateRequest = {
267270
name?: string;
@@ -271,13 +274,18 @@ export type KakaoAlimtalkTemplateRequest = {
271274
messageType?: KakaoAlimtalkTemplateMessageType;
272275
emphasizeType?: KakaoAlimtalkTemplateEmphasizeType;
273276
extra?: string;
274-
ad?: string;
275277
emphasizeTitle?: string;
276278
emphasizeSubtitle?: string;
277279
securityFlag?: boolean;
278280
imageId?: string;
279281
};
280282

283+
/**
284+
* @description 카카오 알림톡 템플릿 생성 요청 타입
285+
* @see {KakaoAlimtalkTemplateRequest}
286+
* @param {string|undefined} channelId - 카카오 비즈니스 채널 ID
287+
* @param {string|undefined} channelGroupId - 카카오 비즈니스 채널 그룹 ID
288+
*/
281289
export type CreateKakaoAlimtalkTemplateRequest = KakaoAlimtalkTemplateRequest & {
282290
channelId?: string;
283291
channelGroupId?: string;

src/solapi.ts

Lines changed: 64 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import {
1010
GetGroupMessagesRequest,
1111
GetGroupsRequest,
1212
GetKakaoAlimtalkTemplatesRequest,
13-
GetKakaoAlimtalkTemplatesRequestType,
1413
GetKakaoChannelsRequest,
1514
GetMessagesRequest,
1615
GetMessagesRequestType,
@@ -42,7 +41,7 @@ import {
4241
RequestKakaoChannelTokenResponse,
4342
SingleMessageSentResponse
4443
} from './responses/messageResponses';
45-
import {GroupId} from './types/commonTypes';
44+
import {DateOperatorType, GroupId} from './types/commonTypes';
4645
import queryParameterGenerator from './lib/queryParameterGenerator';
4746
import {formatISO} from 'date-fns';
4847
import ImageToBase64 from 'image-to-base64';
@@ -377,7 +376,36 @@ export class SolapiMessageService {
377376
* @param data 카카오 채널 목록을 더 자세하게 조회할 때 필요한 파라미터
378377
*/
379378
async getKakaoChannels(data?: Partial<GetKakaoChannelsRequest>): Promise<GetKakaoChannelsResponse> {
380-
const parameter = qs.stringify(data, {indices: false});
379+
const payload = data;
380+
if (payload?.dateCreated && typeof payload?.dateCreated != 'undefined') {
381+
const dateCreatedPayload = payload.dateCreated;
382+
Object.keys(dateCreatedPayload).forEach((key) => {
383+
const dateKey = key as DateOperatorType;
384+
const dateCreated = dateCreatedPayload[dateKey];
385+
if (dateCreated) {
386+
const formattedDateCreated = formatISO(stringDateTransfer(dateCreated));
387+
if (payload.dateCreated) {
388+
payload.dateCreated[dateKey] = formattedDateCreated;
389+
}
390+
}
391+
});
392+
}
393+
394+
if (data?.dateUpdated && typeof payload?.dateUpdated != 'undefined') {
395+
const dateUpdatedPayload = payload.dateUpdated;
396+
Object.keys(dateUpdatedPayload).forEach(key => {
397+
const dateKey = key as DateOperatorType;
398+
const dateUpdated = dateUpdatedPayload[dateKey];
399+
if (dateUpdated) {
400+
const formattedDateUpdated = formatISO(stringDateTransfer(dateUpdated));
401+
if (payload.dateUpdated) {
402+
payload.dateUpdated[dateKey] = formattedDateUpdated;
403+
}
404+
}
405+
});
406+
}
407+
408+
const parameter = qs.stringify(payload, {indices: false});
381409
const endpoint = `${this.baseUrl}/kakao/v2/channels?${parameter}`;
382410
const requestConfig: RequestConfig = {
383411
method: 'GET',
@@ -437,10 +465,39 @@ export class SolapiMessageService {
437465
* 카카오 템플릿 목록 조회
438466
* @param data 카카오 템플릿 목록을 더 자세하게 조회할 때 필요한 파라미터
439467
*/
440-
async getKakaoAlimtalkTemplates(data?: GetKakaoAlimtalkTemplatesRequestType): Promise<GetKakaoAlimtalkTemplatesResponse> {
441-
const parameter: GetKakaoAlimtalkTemplatesRequest | object = data ? new GetKakaoAlimtalkTemplatesRequest(data) : {};
442-
const endpoint = queryParameterGenerator(`${this.baseUrl}/kakao/v2/templates`, parameter);
468+
async getKakaoAlimtalkTemplates(data?: Partial<GetKakaoAlimtalkTemplatesRequest>): Promise<GetKakaoAlimtalkTemplatesResponse> {
469+
// TODO: need to eliminate duplicate code
470+
const payload = data;
471+
if (payload?.dateCreated && typeof payload?.dateCreated != 'undefined') {
472+
const dateCreatedPayload = payload.dateCreated;
473+
Object.keys(dateCreatedPayload).forEach((key) => {
474+
const dateKey = key as DateOperatorType;
475+
const dateCreated = dateCreatedPayload[dateKey];
476+
if (dateCreated) {
477+
const formattedDateCreated = formatISO(stringDateTransfer(dateCreated));
478+
if (payload.dateCreated) {
479+
payload.dateCreated[dateKey] = formattedDateCreated;
480+
}
481+
}
482+
});
483+
}
484+
485+
if (data?.dateUpdated && typeof payload?.dateUpdated != 'undefined') {
486+
const dateUpdatedPayload = payload.dateUpdated;
487+
Object.keys(dateUpdatedPayload).forEach(key => {
488+
const dateKey = key as DateOperatorType;
489+
const dateUpdated = dateUpdatedPayload[dateKey];
490+
if (dateUpdated) {
491+
const formattedDateUpdated = formatISO(stringDateTransfer(dateUpdated));
492+
if (payload.dateUpdated) {
493+
payload.dateUpdated[dateKey] = formattedDateUpdated;
494+
}
495+
}
496+
});
497+
}
443498

499+
const parameter = qs.stringify(payload, {indices: false});
500+
const endpoint = `${this.baseUrl}/kakao/v2/templates?${parameter}`;
444501
const requestConfig: RequestConfig = {
445502
method: 'GET',
446503
url: endpoint
@@ -531,6 +588,6 @@ export class SolapiMessageService {
531588
method: 'DELETE',
532589
url: `${this.baseUrl}/kakao/v2/templates/${templateId}`
533590
};
534-
return defaultFetcher<unknown, KakaoAlimtalkTemplate>(this.authInfo, requestConfig, {});
591+
return defaultFetcher<never, KakaoAlimtalkTemplate>(this.authInfo, requestConfig);
535592
}
536593
}

src/types/commonTypes.ts

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,24 @@ export type Group = {
8888

8989

9090
/**
91+
* @description 검색 조건 파라미터
9192
* @see https://docs.solapi.com/api-reference/overview#operator
9293
*/
9394
export type OperatorType = 'eq' | 'gte' | 'lte' | 'ne' | 'in' | 'like' | 'gt' | 'lt'
95+
96+
/**
97+
* @description 검색 조건 파라미터
98+
* @see https://docs.solapi.com/api-reference/overview#operator
99+
*/
100+
export type DateOperatorType = 'eq' | 'gte' | 'lte' | 'gt' | 'lt'
101+
102+
/**
103+
* @description 카카오 알림톡 템플릿 상태
104+
* PENDING - 대기
105+
* INSPECTING - 검수중
106+
* APPROVED - 등록완료(검수완료)
107+
* REJECTED - 반려됨
108+
* DELETED - 삭제됨
109+
*/
110+
export type KakaoAlimtalkTemplateStatus = 'PENDING' | 'INSPECTING' | 'APPROVED' |
111+
'REJECTED' | 'DELETED'

0 commit comments

Comments
 (0)