@@ -142,6 +142,55 @@ public function matterByMatterNumber(string $matterNumber): Matter
142142 return $ this ->createItemResult ($ response , Matter::class);
143143 }
144144
145+ public function matterCreate (array $ matterData , ?CaseFile $ case = null ): Matter
146+ {
147+ $ linkName = 'http://cbrain.com/casefile/rel/create-matter ' ;
148+ $ url = null !== $ case ? $ case ->links ->getLinkUrl ($ linkName ) : $ this ->getRequestUrl ($ linkName );
149+
150+ // The documentation is unclear on this POE stuff. Does it return 303 or 201?
151+ // resources/f2-rest-docs/f2-rest-docs-v13s.html#11
152+ $ response = $ this ->request (Request::METHOD_POST , $ url );
153+ if (Response::HTTP_CREATED !== $ response ->getStatusCode ()) {
154+ $ message = null !== $ case
155+ ? sprintf ('Cannot get matter create POE URL for case %s ' , $ case )
156+ : 'Cannot get matter create POE URLs ' ;
157+ throw new RuntimeException ($ message );
158+ }
159+ try {
160+ $ location = $ this ->getHeader ('location ' , $ response );
161+ } catch (\Exception $ e ) {
162+ $ message = null !== $ case
163+ ? sprintf ('Cannot get matter create POE URL for case %s ' , $ case )
164+ : 'Cannot get matter create POE URLs ' ;
165+ throw new RuntimeException ($ message , previous: $ e );
166+ }
167+
168+ $ response = $ this ->request (Request::METHOD_POST , $ location , [
169+ 'json ' => $ matterData ,
170+ ]);
171+
172+ if (Response::HTTP_CREATED !== $ response ->getStatusCode ()) {
173+ $ message = null !== $ case ? sprintf ('Cannot create matter for case %s ' , $ case ) : 'Cannot create matter ' ;
174+ throw new RuntimeException ($ message );
175+ }
176+
177+ return $ this ->createItemResult ($ response , Matter::class);
178+ }
179+
180+ /**
181+ * Get header value.
182+ */
183+ private function getHeader (string $ name , ResponseInterface $ response ): string
184+ {
185+ $ headers = $ response ->getHeaders ();
186+ $ name = strtolower ($ name );
187+ if (!array_key_exists ($ name , $ headers )) {
188+ throw new RuntimeException (sprintf ('Header "%s" not found. ' , $ name ));
189+ }
190+
191+ return reset ($ headers [$ name ]);
192+ }
193+
145194 public function documentById (int $ id ): Document
146195 {
147196 $ url = $ this ->getRequestUrl ('http://cbrain.com/casefile/rel/document-by-id ' , [
0 commit comments