├── LICENSE ├── README.md ├── composer.json └── src ├── Backlog.php └── BacklogException.php /LICENSE: -------------------------------------------------------------------------------- 1 | GNU LESSER GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | 9 | This version of the GNU Lesser General Public License incorporates 10 | the terms and conditions of version 3 of the GNU General Public 11 | License, supplemented by the additional permissions listed below. 12 | 13 | 0. Additional Definitions. 14 | 15 | As used herein, "this License" refers to version 3 of the GNU Lesser 16 | General Public License, and the "GNU GPL" refers to version 3 of the GNU 17 | General Public License. 18 | 19 | "The Library" refers to a covered work governed by this License, 20 | other than an Application or a Combined Work as defined below. 21 | 22 | An "Application" is any work that makes use of an interface provided 23 | by the Library, but which is not otherwise based on the Library. 24 | Defining a subclass of a class defined by the Library is deemed a mode 25 | of using an interface provided by the Library. 26 | 27 | A "Combined Work" is a work produced by combining or linking an 28 | Application with the Library. The particular version of the Library 29 | with which the Combined Work was made is also called the "Linked 30 | Version". 31 | 32 | The "Minimal Corresponding Source" for a Combined Work means the 33 | Corresponding Source for the Combined Work, excluding any source code 34 | for portions of the Combined Work that, considered in isolation, are 35 | based on the Application, and not on the Linked Version. 36 | 37 | The "Corresponding Application Code" for a Combined Work means the 38 | object code and/or source code for the Application, including any data 39 | and utility programs needed for reproducing the Combined Work from the 40 | Application, but excluding the System Libraries of the Combined Work. 41 | 42 | 1. Exception to Section 3 of the GNU GPL. 43 | 44 | You may convey a covered work under sections 3 and 4 of this License 45 | without being bound by section 3 of the GNU GPL. 46 | 47 | 2. Conveying Modified Versions. 48 | 49 | If you modify a copy of the Library, and, in your modifications, a 50 | facility refers to a function or data to be supplied by an Application 51 | that uses the facility (other than as an argument passed when the 52 | facility is invoked), then you may convey a copy of the modified 53 | version: 54 | 55 | a) under this License, provided that you make a good faith effort to 56 | ensure that, in the event an Application does not supply the 57 | function or data, the facility still operates, and performs 58 | whatever part of its purpose remains meaningful, or 59 | 60 | b) under the GNU GPL, with none of the additional permissions of 61 | this License applicable to that copy. 62 | 63 | 3. Object Code Incorporating Material from Library Header Files. 64 | 65 | The object code form of an Application may incorporate material from 66 | a header file that is part of the Library. You may convey such object 67 | code under terms of your choice, provided that, if the incorporated 68 | material is not limited to numerical parameters, data structure 69 | layouts and accessors, or small macros, inline functions and templates 70 | (ten or fewer lines in length), you do both of the following: 71 | 72 | a) Give prominent notice with each copy of the object code that the 73 | Library is used in it and that the Library and its use are 74 | covered by this License. 75 | 76 | b) Accompany the object code with a copy of the GNU GPL and this license 77 | document. 78 | 79 | 4. Combined Works. 80 | 81 | You may convey a Combined Work under terms of your choice that, 82 | taken together, effectively do not restrict modification of the 83 | portions of the Library contained in the Combined Work and reverse 84 | engineering for debugging such modifications, if you also do each of 85 | the following: 86 | 87 | a) Give prominent notice with each copy of the Combined Work that 88 | the Library is used in it and that the Library and its use are 89 | covered by this License. 90 | 91 | b) Accompany the Combined Work with a copy of the GNU GPL and this license 92 | document. 93 | 94 | c) For a Combined Work that displays copyright notices during 95 | execution, include the copyright notice for the Library among 96 | these notices, as well as a reference directing the user to the 97 | copies of the GNU GPL and this license document. 98 | 99 | d) Do one of the following: 100 | 101 | 0) Convey the Minimal Corresponding Source under the terms of this 102 | License, and the Corresponding Application Code in a form 103 | suitable for, and under terms that permit, the user to 104 | recombine or relink the Application with a modified version of 105 | the Linked Version to produce a modified Combined Work, in the 106 | manner specified by section 6 of the GNU GPL for conveying 107 | Corresponding Source. 108 | 109 | 1) Use a suitable shared library mechanism for linking with the 110 | Library. A suitable mechanism is one that (a) uses at run time 111 | a copy of the Library already present on the user's computer 112 | system, and (b) will operate properly with a modified version 113 | of the Library that is interface-compatible with the Linked 114 | Version. 115 | 116 | e) Provide Installation Information, but only if you would otherwise 117 | be required to provide such information under section 6 of the 118 | GNU GPL, and only to the extent that such information is 119 | necessary to install and execute a modified version of the 120 | Combined Work produced by recombining or relinking the 121 | Application with a modified version of the Linked Version. (If 122 | you use option 4d0, the Installation Information must accompany 123 | the Minimal Corresponding Source and Corresponding Application 124 | Code. If you use option 4d1, you must provide the Installation 125 | Information in the manner specified by section 6 of the GNU GPL 126 | for conveying Corresponding Source.) 127 | 128 | 5. Combined Libraries. 129 | 130 | You may place library facilities that are a work based on the 131 | Library side by side in a single library together with other library 132 | facilities that are not Applications and are not covered by this 133 | License, and convey such a combined library under terms of your 134 | choice, if you do both of the following: 135 | 136 | a) Accompany the combined library with a copy of the same work based 137 | on the Library, uncombined with any other library facilities, 138 | conveyed under the terms of this License. 139 | 140 | b) Give prominent notice with the combined library that part of it 141 | is a work based on the Library, and explaining where to find the 142 | accompanying uncombined form of the same work. 143 | 144 | 6. Revised Versions of the GNU Lesser General Public License. 145 | 146 | The Free Software Foundation may publish revised and/or new versions 147 | of the GNU Lesser General Public License from time to time. Such new 148 | versions will be similar in spirit to the present version, but may 149 | differ in detail to address new problems or concerns. 150 | 151 | Each version is given a distinguishing version number. If the 152 | Library as you received it specifies that a certain numbered version 153 | of the GNU Lesser General Public License "or any later version" 154 | applies to it, you have the option of following the terms and 155 | conditions either of that published version or of any later version 156 | published by the Free Software Foundation. If the Library as you 157 | received it does not specify a version number of the GNU Lesser 158 | General Public License, you may choose any version of the GNU Lesser 159 | General Public License ever published by the Free Software Foundation. 160 | 161 | If the Library as you received it specifies that a proxy can decide 162 | whether future versions of the GNU Lesser General Public License shall 163 | apply, that proxy's public statement of acceptance of any version is 164 | permanent authorization for you to choose that version for the 165 | Library. 166 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Backlog-v2 2 | ========== 3 | 4 | this is [backlog api v2](https://developer.nulab.com/ja/docs/backlog/) wrapper with API Key. 5 | 6 | 7 | 8 | ## Get started 9 | 10 | Install the "atomita/backlog-v2" using the composer. 11 | 12 | ```php 13 | require {composer install dir} . "/vendor/autoload.php"; 14 | 15 | use \atomita\Backlog; 16 | use \atomita\BacklogException; 17 | 18 | $backlog = new Backlog('space-name', 'api-key'); 19 | try{ 20 | $space = $backlog->space->get(); 21 | var_dump($space); 22 | 23 | $comment = $backlog->issues->param('issue id')->comments->post(['content' => 'comment message'])); 24 | var_dump($comment); 25 | } 26 | catch(BacklogException $e){ 27 | // error 28 | } 29 | ``` 30 | 31 | 32 | This is released under the LGPLv3, see LICENSE. 33 | -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "atomita/backlog-v2", 3 | "description": "this is backlog api v2 library", 4 | "keywords": ["backlog", "api", "v2"], 5 | "license": "LGPL-3.0-only", 6 | "authors": [ 7 | { 8 | "name": "atomita" 9 | } 10 | ], 11 | "require": { 12 | }, 13 | "autoload": { 14 | "classmap": ["src/"] 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /src/Backlog.php: -------------------------------------------------------------------------------- 1 | space = $space_name; 15 | $this->apiKey = $api_key; 16 | } 17 | 18 | function param($api) 19 | { 20 | return $this->$api; 21 | } 22 | 23 | function __get($api) 24 | { 25 | $that = clone $this; 26 | $that->api[] = $api; 27 | return $that; 28 | } 29 | 30 | function __call($method, $args) 31 | { 32 | $this->api[] = $method; 33 | return call_user_func_array(array($this, 'get'), $args); 34 | } 35 | 36 | function get(array $data = array(), array $params = array(), array $option = array()) 37 | { 38 | return $this->request('GET', $data, $params, $option); 39 | } 40 | 41 | function post(array $data = array(), array $params = array(), array $option = array()) 42 | { 43 | return $this->request('POST', $data, $params, $option); 44 | } 45 | 46 | function patch(array $data = array(), array $params = array(), array $option = array()) 47 | { 48 | return $this->request('PATCH', $data, $params, $option); 49 | } 50 | 51 | function delete(array $data = array(), array $params = array(), array $option = array()) 52 | { 53 | return $this->request('DELETE', $data, $params, $option); 54 | } 55 | 56 | function request($http_method, array $data = array(), array $params = array(), array $option = array()) 57 | { 58 | static $key_colon_value = null; 59 | if (is_null($key_colon_value)){ 60 | $key_colon_value = function($k, $v){ 61 | return is_int($k) ? $v : "$k: $v"; 62 | }; 63 | } 64 | 65 | $opt = array_merge(array( 66 | 'space_name' => $this->space, 67 | 'header' => array(), 68 | ), $option); 69 | 70 | $query = array_merge(array( 71 | 'apiKey' => $this->apiKey, 72 | ), $data); 73 | 74 | $segments = array(); 75 | foreach($this->api as $api){ 76 | $segments[] = array_key_exists($api, $params) ? $params[$api] : $api; 77 | } 78 | $uri = implode('/', $segments); 79 | 80 | 81 | $http_method = strtoupper($http_method); 82 | switch ($http_method){ 83 | case 'POST': 84 | case 'PATCH': 85 | $header = array_merge(array( 86 | 'Content-Type' => 'application/x-www-form-urlencoded', // multipart/form-data, 87 | ), $opt['header']); 88 | break; 89 | 90 | case 'GET': 91 | $header = array_merge(array( 92 | ), $opt['header']); 93 | break; 94 | 95 | default: 96 | $header = array_merge(array( 97 | ), $opt['header']); 98 | } 99 | 100 | if (!isset($url)){ 101 | $url = sprintf(self::URL_TEMPLATE, $opt['space_name'], $uri, http_build_query($query, '', '&')); 102 | } 103 | 104 | $context = array( 105 | 'http' => array( 106 | 'method' => $http_method, 107 | 'header' => implode("\r\n", array_map($key_colon_value, array_keys($header), array_values($header))), 108 | 'ignore_errors' => true, 109 | ) 110 | ); 111 | // if (isset($content)){ 112 | // $context['html']['content'] = $content; 113 | // } 114 | 115 | 116 | $response = file_get_contents($url, false, stream_context_create($context)); 117 | 118 | $type = $this->responseContexType($http_response_header); 119 | switch ($type){ 120 | case 'application/json': 121 | $res = $json = json_decode($response, true); 122 | $json_error = json_last_error(); 123 | break; 124 | case 'application/octet-stream': 125 | $res = $response; 126 | break; 127 | default: 128 | $res = $response; 129 | } 130 | 131 | if (isset($json) and isset($json['errors'])){ 132 | // error 133 | throw new BacklogException($json['errors'][0]['message'], $json['errors'][0]['code'], null, $json); 134 | } 135 | elseif ('application/json' == $type and JSON_ERROR_NONE !== $json_error){ 136 | // error 137 | throw new BacklogException('json error.', $json_error, null, $response); 138 | } 139 | elseif (empty($response)){ 140 | // error 141 | throw new BacklogException('Not Found Content', 404); 142 | } 143 | 144 | return $res; 145 | } 146 | 147 | protected function responseContexType($http_response_header) 148 | { 149 | foreach ($http_response_header as $value) { 150 | if (preg_match('{^Content-Type:\s*(.*?)$}iu', $value, $m)) { 151 | $values = array_map('trim', explode(';', $m[1])); 152 | return reset($values); 153 | } 154 | } 155 | return false; 156 | } 157 | 158 | } 159 | -------------------------------------------------------------------------------- /src/BacklogException.php: -------------------------------------------------------------------------------- 1 | response = $response; 13 | } 14 | 15 | function getResponse() 16 | { 17 | return $this->response; 18 | } 19 | 20 | } 21 | --------------------------------------------------------------------------------