Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
66 changes: 66 additions & 0 deletions src/models/requests/messages/getMessagesRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,45 @@ import {messageTypeSchema} from '../../base/messages/message';
export const dateTypeSchema = Schema.Literal('CREATED', 'UPDATED');
export type DateType = Schema.Schema.Type<typeof dateTypeSchema>;

export const messageSearchCriteriaSchema = Schema.Literal(
'messageId',
'groupId',
'to',
'from',
'type',
'statusCode',
'dateCreated',
'dateUpdated',
'replacement',
'coolsmsMessageId',
'coolsmsGroupId',
'status',
'kakaoTemplateId',
);
export type MessageSearchCriteria = Schema.Schema.Type<
typeof messageSearchCriteriaSchema
>;

export const messageSearchConditionSchema = Schema.Literal(
'eq',
'ne',
'gte',
'gt',
'lt',
'lte',
);
export type MessageSearchCondition = Schema.Schema.Type<
typeof messageSearchConditionSchema
>;

const oneOrMany = <A, I>(item: Schema.Schema<A, I>) =>
Schema.Union(item, Schema.Array(item));

const toList = <T>(
input: T | ReadonlyArray<T> | undefined,
): ReadonlyArray<T> =>
input == null ? [] : Array.isArray(input) ? input : [input as T];

const baseGetMessagesRequestSchema = Schema.Struct({
startKey: Schema.optional(Schema.String),
limit: Schema.optional(Schema.Number),
Expand All @@ -18,6 +57,9 @@ const baseGetMessagesRequestSchema = Schema.Struct({
dateType: Schema.optional(dateTypeSchema),
startDate: Schema.optional(Schema.Union(Schema.String, Schema.DateFromSelf)),
endDate: Schema.optional(Schema.Union(Schema.String, Schema.DateFromSelf)),
criteria: Schema.optional(oneOrMany(messageSearchCriteriaSchema)),
cond: Schema.optional(oneOrMany(messageSearchConditionSchema)),
value: Schema.optional(oneOrMany(Schema.String)),
});

export const getMessagesRequestSchema = baseGetMessagesRequestSchema.pipe(
Expand All @@ -27,6 +69,20 @@ export const getMessagesRequestSchema = baseGetMessagesRequestSchema.pipe(
if (hasDateType && !hasDate) {
return 'dateType은 startDate 또는 endDate와 함께 사용해야 합니다.';
}
const criteria = toList(data.criteria);
const cond = toList(data.cond);
const value = toList(data.value);
const used = [criteria, cond, value].filter(list => list.length > 0);
if (used.length === 0) return true;
if (used.length < 3) {
return 'criteria, cond, value는 함께 지정해야 합니다.';
}
if (criteria.length !== cond.length || cond.length !== value.length) {
return 'criteria, cond, value의 개수가 같아야 합니다.';
}
if (value.some(v => v.includes(','))) {
return 'value에는 쉼표(,)를 포함할 수 없습니다.';
}
return true;
}),
);
Expand Down Expand Up @@ -75,6 +131,9 @@ export type GetMessagesFinalizedPayload = {
statusCode?: string;
startDate?: string;
endDate?: string;
criteria?: string;
cond?: string;
value?: string;
};

export function finalizeGetMessagesRequest(
Expand All @@ -98,6 +157,13 @@ export function finalizeGetMessagesRequest(
statusCode: data.statusCode,
};

const criteria = toList(data.criteria);
if (criteria.length > 0) {
payload.criteria = criteria.join(',');
payload.cond = toList(data.cond).join(',');
payload.value = toList(data.value).join(',');
}

if (data.startDate != null) {
payload.startDate = formatWithTransfer(data.startDate);
}
Expand Down
35 changes: 26 additions & 9 deletions src/models/responses/messageResponses.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ export type GetGroupsResponse = Schema.Schema.Type<
typeof getGroupsResponseSchema
>;

const statisticsPeriodResultSchema = Schema.Struct({
const statisticsPeriodResultFields = {
total: Schema.Number,
sms: Schema.Number,
lms: Schema.Number,
Expand All @@ -121,7 +121,21 @@ const statisticsPeriodResultSchema = Schema.Struct({
bms_commerce: Schema.optional(Schema.Number),
bms_carousel_commerce: Schema.optional(Schema.Number),
bms_free: Schema.optional(Schema.Number),
};
const statisticsPeriodResultSchema = Schema.Struct(
statisticsPeriodResultFields,
);
type StatisticsPeriodResult = Schema.Schema.Type<
typeof statisticsPeriodResultSchema
>;
const emptyStatisticsPeriodResult = (): StatisticsPeriodResult =>
Object.fromEntries(
Object.keys(statisticsPeriodResultFields).map(key => [key, 0]),
) as StatisticsPeriodResult;
const optionalPeriodResult = Schema.optionalWith(statisticsPeriodResultSchema, {
default: emptyStatisticsPeriodResult,
});
const optionalZero = Schema.optionalWith(Schema.Number, {default: () => 0});

const refundSchema = Schema.Struct({
balance: Schema.Number,
Expand Down Expand Up @@ -170,17 +184,20 @@ const monthPeriodSchema = Schema.Struct({
failed: statisticsPeriodResultSchema,
});

// 통계 문서가 없는 계정·기간은 서버가 빈 객체 {} 를 돌려주므로 모든 필드를 기본값으로 채운다
export const getStatisticsResponseSchema = Schema.Struct({
balance: Schema.Number,
point: Schema.Number,
balance: optionalZero,
point: optionalZero,
deposit: Schema.optional(Schema.Number),
monthlyBalanceAvg: Schema.Number,
monthlyPointAvg: Schema.Number,
monthlyBalanceAvg: optionalZero,
monthlyPointAvg: optionalZero,
monthlyDepositAvg: Schema.optional(Schema.Number),
monthPeriod: Schema.Array(monthPeriodSchema),
total: statisticsPeriodResultSchema,
successed: statisticsPeriodResultSchema,
failed: statisticsPeriodResultSchema,
monthPeriod: Schema.optionalWith(Schema.Array(monthPeriodSchema), {
default: () => [],
}),
total: optionalPeriodResult,
successed: optionalPeriodResult,
failed: optionalPeriodResult,
dailyBalanceAvg: Schema.optional(Schema.Number),
dailyPointAvg: Schema.optional(Schema.Number),
dailyTotalCountAvg: Schema.optional(Schema.Number),
Expand Down
Loading
Loading