-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathmessageService.ts
More file actions
149 lines (136 loc) · 4.73 KB
/
messageService.ts
File metadata and controls
149 lines (136 loc) · 4.73 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import {runSafePromise} from '@lib/effectErrorHandler';
import {decodeWithBadRequest} from '@lib/schemaUtils';
import {
finalizeGetMessagesRequest,
type GetMessagesRequest,
getMessagesRequestSchema,
} from '@models/requests/messages/getMessagesRequest';
import {
finalizeGetStatisticsRequest,
type GetStatisticsRequest,
getStatisticsRequestSchema,
} from '@models/requests/messages/getStatisticsRequest';
import {
SendRequestConfigSchema,
sendRequestConfigSchema,
} from '@models/requests/messages/requestConfig';
import {
type MultipleMessageSendingRequestSchema,
multipleMessageSendingRequestSchema,
type RequestSendMessagesSchema,
requestSendMessageSchema,
} from '@models/requests/messages/sendMessage';
import {
GetMessagesResponse,
GetStatisticsResponse,
getMessagesResponseSchema,
getStatisticsResponseSchema,
} from '@models/responses/messageResponses';
import {DetailGroupMessageResponse} from '@models/responses/sendManyDetailResponse';
import * as Effect from 'effect/Effect';
import {
BadRequestError,
MessageNotReceivedError,
} from '../../errors/defaultError';
import DefaultService from '../defaultService';
export default class MessageService extends DefaultService {
/**
* 메시지 발송 기능, sendMany 함수보다 개선된 오류 표시 기능등을 제공합니다.
* 한번의 요청으로 최대 10,000건까지 발송할 수 있습니다.
* @param messages 발송 요청할 메시지 파라미터(문자, 알림톡 등)
* @param requestConfigParameter request시 필요한 파라미터 오브젝트
* @throws MessageNotReceivedError 모든 메시지 접수건이 실패건으로 진행되는 경우 반환되는 에러
* @throws BadRequestError 잘못된 파라미터를 기입했거나, 데이터가 아예 없는 경우 반환되는 에러
*/
async send(
messages: RequestSendMessagesSchema,
requestConfigParameter?: SendRequestConfigSchema,
): Promise<DetailGroupMessageResponse> {
const reqEffect = this.requestEffect.bind(this);
return runSafePromise(
Effect.gen(function* () {
const messageSchema = yield* decodeWithBadRequest(
requestSendMessageSchema,
messages,
);
const messageParameters = Array.isArray(messageSchema)
? messageSchema
: [messageSchema];
if (messageParameters.length === 0) {
return yield* new BadRequestError({
message: '데이터가 반드시 1건 이상 기입되어 있어야 합니다.',
});
}
const decodedConfig = yield* decodeWithBadRequest(
sendRequestConfigSchema,
requestConfigParameter ?? {},
);
const parameterObject = {
messages: messageParameters,
allowDuplicates: decodedConfig.allowDuplicates,
...(decodedConfig.appId ? {agent: {appId: decodedConfig.appId}} : {}),
scheduledDate: decodedConfig.scheduledDate,
showMessageList: decodedConfig.showMessageList,
};
const parameter = yield* decodeWithBadRequest(
multipleMessageSendingRequestSchema,
parameterObject,
);
const response = yield* reqEffect<
MultipleMessageSendingRequestSchema,
DetailGroupMessageResponse
>({
httpMethod: 'POST',
url: 'messages/v4/send-many/detail',
body: parameter,
});
const {count} = response.groupInfo;
const failedAll =
response.failedMessageList.length > 0 &&
count.total === count.registeredFailed;
if (failedAll) {
return yield* new MessageNotReceivedError({
failedMessageList: response.failedMessageList,
totalCount: response.failedMessageList.length,
});
}
return response;
}),
);
}
/**
* 메시지 목록 조회
* @param data 목록 조회 상세조건 파라미터
*/
async getMessages(
data?: Readonly<GetMessagesRequest>,
): Promise<GetMessagesResponse> {
return runSafePromise(
this.getWithQuery({
schema: getMessagesRequestSchema,
finalize: finalizeGetMessagesRequest,
url: 'messages/v4/list',
data,
responseSchema: getMessagesResponseSchema,
}),
);
}
/**
* 통계 조회
* @param data 통계 상세 조건 파라미터
* @returns GetStatisticsResponse 통계 결과
*/
async getStatistics(
data?: Readonly<GetStatisticsRequest>,
): Promise<GetStatisticsResponse> {
return runSafePromise(
this.getWithQuery({
schema: getStatisticsRequestSchema,
finalize: finalizeGetStatisticsRequest,
url: 'messages/v4/statistics',
data,
responseSchema: getStatisticsResponseSchema,
}),
);
}
}