Files
sam-api/app/Http/Controllers/Api/V1/BarobillKakaotalkController.php

380 lines
12 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers\Api\V1;
use App\Helpers\ApiResponse;
use App\Http\Controllers\Controller;
use App\Models\Barobill\BarobillMember;
use App\Services\Barobill\BarobillSoapService;
use Illuminate\Http\Request;
class BarobillKakaotalkController extends Controller
{
public function __construct(
private BarobillSoapService $soapService,
) {}
/**
* 카카오톡 채널 목록
*/
public function channels()
{
return ApiResponse::handle(function () {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->getKakaotalkChannels($corpNum);
return $this->formatResult($result, 'channels');
}, __('message.fetched'));
}
/**
* 카카오톡 채널 관리 URL
*/
public function channelManagementUrl()
{
return ApiResponse::handle(function () {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->getKakaotalkChannelManagementUrl($corpNum, $member->barobill_id);
return $this->formatResult($result, 'url');
}, __('message.fetched'));
}
/**
* 카카오톡 템플릿 목록
*/
public function templates(Request $request)
{
$data = $request->validate([
'channel_id' => 'required|string',
]);
return ApiResponse::handle(function () use ($data) {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->getKakaotalkTemplates($corpNum, $data['channel_id']);
return $this->formatResult($result, 'templates');
}, __('message.fetched'));
}
/**
* 카카오톡 템플릿 관리 URL
*/
public function templateManagementUrl()
{
return ApiResponse::handle(function () {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->getKakaotalkTemplateManagementUrl($corpNum, $member->barobill_id);
return $this->formatResult($result, 'url');
}, __('message.fetched'));
}
/**
* 알림톡 발송
*/
public function sendAlimtalk(Request $request)
{
$data = $request->validate([
'sender_id' => 'required|string',
'template_name' => 'required|string',
'receiver_name' => 'required|string',
'receiver_num' => 'required|string',
'title' => 'nullable|string',
'message' => 'required|string',
'buttons' => 'nullable|array',
'buttons.*.Name' => 'required_with:buttons|string',
'buttons.*.ButtonType' => 'required_with:buttons|string',
'buttons.*.Url1' => 'nullable|string',
'buttons.*.Url2' => 'nullable|string',
'sms_message' => 'nullable|string',
'sms_subject' => 'nullable|string',
'reserve_dt' => 'nullable|string',
]);
return ApiResponse::handle(function () use ($data) {
[$member, $corpNum] = $this->initSoap();
$buttons = $data['buttons'] ?? [];
if (! empty($buttons)) {
$result = $this->soapService->sendATKakaotalkEx(
$corpNum,
$data['sender_id'],
$data['sender_id'],
$data['template_name'],
$data['receiver_name'],
$data['receiver_num'],
$data['title'] ?? '',
$data['message'],
$buttons,
$data['sms_message'] ?? '',
$data['sms_subject'] ?? '',
'',
$data['reserve_dt'] ?? ''
);
} else {
$result = $this->soapService->sendATKakaotalk(
$corpNum,
$data['sender_id'],
$data['sender_id'],
$data['template_name'],
$data['receiver_name'],
$data['receiver_num'],
$data['title'] ?? '',
$data['message'],
$data['sms_message'] ?? '',
$data['sms_subject'] ?? '',
'',
$data['reserve_dt'] ?? ''
);
}
return $this->formatResult($result, 'send_key');
}, __('message.created'));
}
/**
* 알림톡 대량 발송
*/
public function sendAlimtalkBulk(Request $request)
{
$data = $request->validate([
'sender_id' => 'required|string',
'template_name' => 'required|string',
'messages' => 'required|array|min:1',
'messages.*.ReceiverName' => 'required|string',
'messages.*.ReceiverNum' => 'required|string',
'messages.*.Title' => 'nullable|string',
'messages.*.Message' => 'required|string',
'messages.*.SmsMessage' => 'nullable|string',
'messages.*.SmsSubject' => 'nullable|string',
'reserve_dt' => 'nullable|string',
]);
return ApiResponse::handle(function () use ($data) {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->sendATKakaotalks(
$corpNum,
$data['sender_id'],
$data['sender_id'],
$data['template_name'],
$data['messages'],
$data['reserve_dt'] ?? ''
);
return $this->formatResult($result, 'send_key');
}, __('message.created'));
}
/**
* 친구톡 텍스트 발송
*/
public function sendFriendtalk(Request $request)
{
$data = $request->validate([
'sender_id' => 'required|string',
'channel_id' => 'required|string',
'receiver_name' => 'required|string',
'receiver_num' => 'required|string',
'message' => 'required|string',
'buttons' => 'nullable|array',
'sms_message' => 'nullable|string',
'sms_subject' => 'nullable|string',
'ad_yn' => 'nullable|boolean',
'reserve_dt' => 'nullable|string',
]);
return ApiResponse::handle(function () use ($data) {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->sendFTKakaotalk(
$corpNum,
$data['sender_id'],
$data['channel_id'],
$data['receiver_name'],
$data['receiver_num'],
$data['message'],
$data['buttons'] ?? [],
$data['sms_message'] ?? '',
$data['sms_subject'] ?? '',
$data['ad_yn'] ?? false,
$data['reserve_dt'] ?? ''
);
return $this->formatResult($result, 'send_key');
}, __('message.created'));
}
/**
* 친구톡 이미지 발송
*/
public function sendFriendtalkImage(Request $request)
{
$data = $request->validate([
'sender_id' => 'required|string',
'channel_id' => 'required|string',
'receiver_name' => 'required|string',
'receiver_num' => 'required|string',
'message' => 'required|string',
'image_url' => 'required|string',
'buttons' => 'nullable|array',
'sms_message' => 'nullable|string',
'sms_subject' => 'nullable|string',
'ad_yn' => 'nullable|boolean',
'reserve_dt' => 'nullable|string',
]);
return ApiResponse::handle(function () use ($data) {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->sendFIKakaotalk(
$corpNum,
$data['sender_id'],
$data['channel_id'],
$data['receiver_name'],
$data['receiver_num'],
$data['message'],
$data['image_url'],
$data['buttons'] ?? [],
$data['sms_message'] ?? '',
$data['sms_subject'] ?? '',
$data['ad_yn'] ?? false,
$data['reserve_dt'] ?? ''
);
return $this->formatResult($result, 'send_key');
}, __('message.created'));
}
/**
* 친구톡 와이드 이미지 발송
*/
public function sendFriendtalkWide(Request $request)
{
$data = $request->validate([
'sender_id' => 'required|string',
'channel_id' => 'required|string',
'receiver_name' => 'required|string',
'receiver_num' => 'required|string',
'message' => 'required|string',
'image_url' => 'required|string',
'buttons' => 'nullable|array',
'sms_message' => 'nullable|string',
'sms_subject' => 'nullable|string',
'ad_yn' => 'nullable|boolean',
'reserve_dt' => 'nullable|string',
]);
return ApiResponse::handle(function () use ($data) {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->sendFWKakaotalk(
$corpNum,
$data['sender_id'],
$data['channel_id'],
$data['receiver_name'],
$data['receiver_num'],
$data['message'],
$data['image_url'],
$data['buttons'] ?? [],
$data['sms_message'] ?? '',
$data['sms_subject'] ?? '',
$data['ad_yn'] ?? false,
$data['reserve_dt'] ?? ''
);
return $this->formatResult($result, 'send_key');
}, __('message.created'));
}
/**
* 전송 결과 조회 (단건)
*/
public function getSendResult(string $sendKey)
{
return ApiResponse::handle(function () use ($sendKey) {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->getSendKakaotalk($corpNum, $sendKey);
return $this->formatResult($result, 'result');
}, __('message.fetched'));
}
/**
* 전송 결과 조회 (다건)
*/
public function getSendResults(Request $request)
{
$data = $request->validate([
'send_keys' => 'required|array|min:1',
'send_keys.*' => 'required|string',
]);
return ApiResponse::handle(function () use ($data) {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->getSendKakaotalks($corpNum, $data['send_keys']);
return $this->formatResult($result, 'results');
}, __('message.fetched'));
}
/**
* 예약 발송 취소
*/
public function cancelReserved(string $sendKey)
{
return ApiResponse::handle(function () use ($sendKey) {
[$member, $corpNum] = $this->initSoap();
$result = $this->soapService->cancelReservedKakaotalk($corpNum, $sendKey);
return $this->formatResult($result, 'result');
}, __('message.deleted'));
}
/**
* 바로빌 회원 조회 SOAP 초기화
*/
private function initSoap(): array
{
$member = $this->getMember();
if (! $member) {
throw new \Symfony\Component\HttpKernel\Exception\NotFoundHttpException(
__('error.barobill.member_not_found', [], 'ko') ?: '바로빌 회원사가 등록되어 있지 않습니다.'
);
}
$this->soapService->initForMember($member);
return [$member, $member->biz_no];
}
private function getMember(): ?BarobillMember
{
$tenantId = app('tenant_id');
return BarobillMember::withoutGlobalScopes()
->where('tenant_id', $tenantId)
->first();
}
private function formatResult(array $result, string $key): array
{
if (! ($result['success'] ?? false)) {
throw new \Symfony\Component\HttpKernel\Exception\UnprocessableEntityHttpException(
$result['error'] ?? '바로빌 API 호출 실패'
);
}
return [$key => $result['data'] ?? null];
}
}