jira = new ZenithJira(); $this->event = model(EventModel::class); } /* public function getCode() { $url = $this->jira->getCode(); return redirect()->to($url); } public function callback() { $code = $this->request->getGet('code'); if (empty($code)) { throw new \Exception('No authorization code provided'); } $result = $this->jira->getToken($code); dd($result); } */ public function testRequest() { $result = $this->jira->testRequest(); dd($result); } public function getProjects() { $result = $this->jira->getProjects(); dd($result); } public function getIssue() { /* $result = $this->jira->getIssue(); dd($result); */ } public function getIssueEventData() { $events = $this->event->getInformationAll(); $developIssues = $this->jira->getDevelopIssues("Done"); if(!empty($events)){ foreach ($developIssues as $issue) { $type = $issue->fields->customfield_10172->value ?? null; if(isset($type) && ($type == '1.1 신규 랜딩제작' || $type == '1.3 랜딩 복사')){ $designer = $issue->fields->customfield_10179[0]->displayName ?? null; $developer = $issue->fields->assignee->displayName ?? null; $eventUrls = $issue->fields->customfield_10188 ?? null; if(!empty($eventUrls) && (!empty($designer) || !empty($developer))){ preg_match_all('/\/([a-z]{2})?(\d+)\b/i', $eventUrls, $matches); foreach ($matches[2] as $eventSeq) { $data = [ 'designer' => $designer, 'developer' => $developer ]; foreach ($events as $event) { if($eventSeq == $event['seq']){ $result = $this->event->updateEventWorker($data, $event['seq']); if(isset($result)){print_r($event['seq']." 완료".PHP_EOL);} } } } } } } } } public function getIssuePreparing() { $developIssues = $this->jira->getDevelopIssues("요청 준비 중"); if(!empty($developIssues)){ foreach ($developIssues as $issue) { $created = $issue->fields->created; $subject = $issue->fields->summary; $now = new DateTime(); $interval = $now->diff($created); $passHour = $interval->h; $passMinute = $interval->i; $passTime = $passHour."시간 ".$passMinute."분"; if ($interval->h >= 1) { $creator = $issue->fields->creator->displayName; $issueKey = $issue->key ?? null; $issueLink = 'https://carelabs-dm.atlassian.net/jira/core/projects/DEV/board?selectedIssue=' . $issueKey; $text = sprintf('[개발요청판]<%s|[%s:%s]> "요청 준비중" 상태로 %s 경과하였습니다.'.PHP_EOL.'해당 이슈를 확인하신 후 자료가 준비되었으면 "요청" 상태로 변경해주십시오.', $issueLink, $issueKey, $subject, $passTime); $this->sendSlackMessage($creator, $text); } } } } public function getIssueAction() { try { $this->writeLog($this->request, null, 'issue_complete_log2'); if (strtolower($this->request->getMethod()) === 'post') { $param = json_decode($this->request->getBody()); if (!$param) { throw new Exception("JSON 디코딩 실패"); } $changeItems = $param->changelog->items ?? []; $issueFields = $param->issue->fields ?? null; $issueKey = $param->issue->key ?? ''; $actionUser = $param->user->displayName ?? ''; $reporterName = $issueFields->reporter->displayName ?? null; $designerName = $issueFields->customfield_10179[0]->displayName ?? null; $projectName = $issueFields->project->name ?? ''; $projectKey = $issueFields->project->key ?? ''; $issueSummary = $issueFields->summary ?? ''; foreach ($changeItems as $item) { $changeField = $item->field ?? ''; $changeStatus = $item->to ?? ''; if($projectKey == 'DEV' && $changeField == 'status'){ $issueLink = 'https://carelabs-dm.atlassian.net/jira/core/projects/' . $projectKey . '/board?selectedIssue=' . $issueKey; if($changeStatus == '1'){//요청 }else if($changeStatus == '10131'){//진행중 $sendText = sprintf('[%s][%s] <%s|%s> %s님이 요청하신 작업을 시작합니다.', $projectName, $issueSummary, $issueLink, $issueKey, $actionUser); $this->sendSlackMessage($reporterName, $sendText); if(!empty($designerName) && $reporterName != $designerName){ $this->sendSlackMessage($designerName, $sendText); } }else if($changeStatus == '10136'){//검수중 $completeLink = 'https://carezenith.co.kr/jira/updateComplete?issue='.$issueKey; $sendText = sprintf('[%s][%s] <%s|%s> %s님이 작업이 완료되어 %s님께 최종 검수를 요청하였습니다.'.PHP_EOL.'링크로 이동하셔서 *댓글로 확인 여부 및 피드백* 남겨주세요.(*보고자 확인 후 완료로 처리*됩니다.)'.PHP_EOL.'*<%s|여기를 클릭하시면 바로 완료처리 됩니다.>*', $projectName, $issueSummary, $issueLink, $issueKey, $actionUser, $reporterName, $completeLink); $this->sendSlackMessage($reporterName, $sendText); if(!empty($designerName) && $reporterName != $designerName){ $sendText = sprintf('[%s][%s] <%s|%s> %s님이 작업이 완료되어 %s님께 디자인 검수를 요청하였습니다.'.PHP_EOL.'링크로 이동하셔서 *댓글로 확인 여부 및 피드백* 남겨주세요.', $projectName, $issueSummary, $issueLink, $issueKey, $actionUser, $designerName); $this->sendSlackMessage($designerName, $sendText); } }else if($changeStatus == '10132'){//완료됨 $sendText = sprintf('[%s][%s] <%s|%s> 요청하신 작업이 검수가 완료되어 해당 이슈가 종료되었습니다.', $projectName, $issueSummary, $issueLink, $issueKey, $actionUser); $this->sendSlackMessage($reporterName, $sendText); } } } }else{ throw new Exception("요청 메소드 오류"); } } catch (Exception $e) { $logText = "오류 메세지: ".$e->getMessage(); $this->writeLog($this->request, $logText, 'issue_complete_log'); } } public function updateComplete() { if(preg_match('/Slackbot/', $_SERVER['HTTP_USER_AGENT'])) return; $issueKey = $this->request->getGet('issue'); if(empty($issueKey)){throw new Exception("이슈키가 존재하지 않습니다.");} $result = $this->jira->setIssueStatus($issueKey); echo ''; } public function sendSlackMessage($username, $text) { $userModel = new UserModel(); $slack = new SlackChat(); $slackMessage = [ 'channel' => $slack->config['UserID'][$username], 'blocks' => [ [ 'type' => 'section', 'text' => [ 'type' => 'mrkdwn', 'text' => $text, ], "block_id" => "text1" ], ], ]; $slack->sendMessage($slackMessage); } public function writeLog($request = null, $addLog = null, $filename = null) { if(is_null($request)){ $request = $this->request; } if(is_null($filename)){ $filename = 'jira_test_log'; } $headers = $request->headers(); array_walk($headers, function(&$value, $key) { $value = $value->getValue(); }); $logText = '---------------------------'."\n"; $logText .= '요청 시간: '.date('Y-m-d H:i:s')."\n"; $logText .= '요청 헤더: '.json_encode($headers, JSON_UNESCAPED_UNICODE)."\n"; $logText .= '요청 메소드: '.$request->getMethod()."\n"; $logText .= '요청 본문: '.json_encode($request->getBody(), JSON_UNESCAPED_UNICODE)."\n"; if(!is_null($addLog)){ $logText .= $addLog; } $fp = fopen(WRITEPATH.'/logs/'.$filename, 'a+'); $fw = fwrite($fp, print_r($logText,true).PHP_EOL); fclose($fp); } public function jsonFormatTest() { $data = '{"statuscategorychangedate":"2023-12-18T17:20:45.889+0900","issuetype":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/issuetype\/10119","id":"10119","description":"\uc18c\uaddc\ubaa8 \uac1c\ubcc4 \uc5c5\ubb34\uc785\ub2c8\ub2e4.","iconUrl":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/universal_avatar\/view\/type\/issuetype\/avatar\/10318?size=medium","name":"\uc791\uc5c5","subtask":false,"avatarId":10318,"hierarchyLevel":0},"customfield_10190":null,"timespent":null,"customfield_10193":null,"customfield_10194":null,"customfield_10195":null,"customfield_10030":null,"project":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/project\/10114","id":"10114","key":"VDO","name":"\uc601\uc0c1\uc694\uccad\ud310","projectTypeKey":"business","simplified":false,"avatarUrls":{"48x48":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/universal_avatar\/view\/type\/project\/avatar\/10400","24x24":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/universal_avatar\/view\/type\/project\/avatar\/10400?size=small","16x16":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/universal_avatar\/view\/type\/project\/avatar\/10400?size=xsmall","32x32":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/universal_avatar\/view\/type\/project\/avatar\/10400?size=medium"},"projectCategory":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/projectCategory\/10000","id":"10000","description":"","name":"\uc5c5\ubb34\uc694\uccad"}},"customfield_10032":null,"fixVersions":[],"aggregatetimespent":null,"resolution":null,"customfield_10027":null,"customfield_10028":null,"customfield_10029":null,"resolutiondate":null,"workratio":-1,"lastViewed":"2023-12-18T17:21:30.671+0900","issuerestriction":{"issuerestrictions":[],"shouldDisplay":false},"watches":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/issue\/VDO-1986\/watchers","watchCount":1,"isWatching":false},"customfield_10180":null,"customfield_10181":null,"created":"2023-12-18T17:20:45.489+0900","customfield_10182":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/customFieldOption\/10203","value":"5\ub4f1\uae09","id":"10203"},"customfield_10183":null,"customfield_10184":null,"customfield_10020":null,"customfield_10185":null,"customfield_10186":null,"customfield_10021":null,"customfield_10187":null,"customfield_10022":null,"customfield_10188":null,"priority":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/priority\/3","iconUrl":"https:\/\/carelabs-dm.atlassian.net\/images\/icons\/priorities\/medium.svg","name":"\ubcf4\ud1b5","id":"3"},"customfield_10023":null,"customfield_10024":null,"customfield_10025":null,"customfield_10026":null,"labels":[],"customfield_10016":null,"customfield_10017":null,"customfield_10018":{"hasEpicLinkFieldDependency":false,"showField":false,"nonEditableReason":{"reason":"PLUGIN_LICENSE_ERROR","message":"\uc0c1\uc704 \ub9c1\ud06c\ub294 Jira Premium \uc0ac\uc6a9\uc790\ub9cc \uc774\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4."}},"customfield_10019":"1|i00hgr:","timeestimate":null,"aggregatetimeoriginalestimate":null,"versions":[],"issuelinks":[],"assignee":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/user?accountId=712020%3Aa897c4ef-6626-4f23-a44c-d6c3442a6e04","accountId":"712020:a897c4ef-6626-4f23-a44c-d6c3442a6e04","avatarUrls":{"48x48":"https:\/\/avatar-management--avatars.us-west-2.prod.public.atl-paas.net\/default-avatar-3.png","24x24":"https:\/\/avatar-management--avatars.us-west-2.prod.public.atl-paas.net\/default-avatar-3.png","16x16":"https:\/\/avatar-management--avatars.us-west-2.prod.public.atl-paas.net\/default-avatar-3.png","32x32":"https:\/\/avatar-management--avatars.us-west-2.prod.public.atl-paas.net\/default-avatar-3.png"},"displayName":"\uc774\ud6a8\uc6d0","active":true,"timeZone":"Asia\/Seoul","accountType":"atlassian"},"updated":"2023-12-18T17:21:31.105+0900","status":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/status\/10137","iconUrl":"https:\/\/carelabs-dm.atlassian.net\/images\/icons\/status_generic.gif","name":"\ud574\uc57c \ud560 \uc77c","id":"10137","statusCategory":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/statuscategory\/2","id":2,"key":"new","colorName":"blue-gray","name":"New"}},"components":[],"customfield_10172":null,"timeoriginalestimate":null,"customfield_10173":null,"description":"\ud50c\ub780\uce58\uacfc\uc758\uc6d0 \uc601\uc0c1 \uc218\uc815 \uc694\uccad\ub4dc\ub9bd\ub2c8\ub2e4.\n\n\uac10\uc0ac\ud569\ub2c8\ub2e4.","customfield_10174":null,"customfield_10010":null,"customfield_10175":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/customFieldOption\/10200","value":"2. \uc601\uc0c1 \uc218\uc815","id":"10200"},"customfield_10176":30000,"customfield_10177":1,"customfield_10014":null,"customfield_10179":null,"timetracking":[],"customfield_10015":null,"customfield_10005":null,"customfield_10006":null,"customfield_10007":null,"security":null,"attachment":[],"aggregatetimeestimate":null,"summary":"\ud50c\ub780\uce58\uacfc\uc758\uc6d0 \ub79c\ub529 \uc601\uc0c1 \uc218\uc815 \uc694\uccad","creator":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/user?accountId=712020%3A401972cb-14b1-47fd-ae34-842cf03fbc52","accountId":"712020:401972cb-14b1-47fd-ae34-842cf03fbc52","avatarUrls":{"48x48":"https:\/\/secure.gravatar.com\/avatar\/0b8d06ca8c8aeebaf49dd11a5f152e29?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Fdefault-avatar-2.png","24x24":"https:\/\/secure.gravatar.com\/avatar\/0b8d06ca8c8aeebaf49dd11a5f152e29?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Fdefault-avatar-2.png","16x16":"https:\/\/secure.gravatar.com\/avatar\/0b8d06ca8c8aeebaf49dd11a5f152e29?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Fdefault-avatar-2.png","32x32":"https:\/\/secure.gravatar.com\/avatar\/0b8d06ca8c8aeebaf49dd11a5f152e29?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Fdefault-avatar-2.png"},"displayName":"\uc815\ucc2c\uc601","active":true,"timeZone":"Asia\/Seoul","accountType":"atlassian"},"subtasks":[],"customfield_10163":"\\\\10.10.40.10\\\ubc14\uc774\ube0c\uc54c\uc528\\\ub514\uc790\uc778\uc694\uccad\\\uc815\ucc2c\uc601\\\ud50c\ub780\uce58\uacfc\\231218 \ub79c\ub529 \uc601\uc0c1 \uc218\uc815 \uc694\uccad","customfield_10120":["GDN"],"reporter":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/user?accountId=712020%3A401972cb-14b1-47fd-ae34-842cf03fbc52","accountId":"712020:401972cb-14b1-47fd-ae34-842cf03fbc52","avatarUrls":{"48x48":"https:\/\/secure.gravatar.com\/avatar\/0b8d06ca8c8aeebaf49dd11a5f152e29?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Fdefault-avatar-2.png","24x24":"https:\/\/secure.gravatar.com\/avatar\/0b8d06ca8c8aeebaf49dd11a5f152e29?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Fdefault-avatar-2.png","16x16":"https:\/\/secure.gravatar.com\/avatar\/0b8d06ca8c8aeebaf49dd11a5f152e29?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Fdefault-avatar-2.png","32x32":"https:\/\/secure.gravatar.com\/avatar\/0b8d06ca8c8aeebaf49dd11a5f152e29?d=https%3A%2F%2Favatar-management--avatars.us-west-2.prod.public.atl-paas.net%2Fdefault-avatar-2.png"},"displayName":"\uc815\ucc2c\uc601","active":true,"timeZone":"Asia\/Seoul","accountType":"atlassian"},"customfield_10000":"{}","aggregateprogress":{"progress":0,"total":0},"customfield_10001":null,"customfield_10002":null,"customfield_10003":null,"customfield_10004":null,"customfield_10169":null,"environment":null,"customfield_10119":["\ud50c\ub780\uce58\uacfc\uc758\uc6d0"],"duedate":null,"progress":{"progress":0,"total":0},"votes":{"self":"https:\/\/carelabs-dm.atlassian.net\/rest\/api\/2\/issue\/VDO-1986\/votes","votes":0,"hasVoted":false}}'; dd(json_decode(preg_replace('/[\x00-\x1F\x7F]/u', '', $data), true)); } }