@@ -168,11 +168,10 @@ public function caseCreate(array $caseData): CaseFile
168168
169169 public function caseFileUpdate (CaseFile $ caseFile , CaseFile $ updatedCaseFile ): bool
170170 {
171- $ url = $ caseFile ->links ->getLinkUrl ('self ' );
171+ $ url = $ caseFile ->links ->getUrl ('self ' );
172172 $ diff = new JsonDiff (
173173 $ caseFile ->jsonSerialize (),
174174 $ updatedCaseFile ->jsonSerialize (),
175- // The F2 API does not support "test" in JSON Patch
176175 options: JsonDiff::SKIP_TEST_OPS ,
177176 );
178177 $ response = $ this ->request (Request::METHOD_PATCH , $ url , [
@@ -234,7 +233,7 @@ public function matterByMatterNumber(string $matterNumber): Matter
234233 public function matterCreate (array $ matterData , ?CaseFile $ case = null ): Matter
235234 {
236235 $ linkName = 'http://cbrain.com/casefile/rel/create-matter ' ;
237- $ url = null !== $ case ? $ case ->links ->getLinkUrl ($ linkName ) : $ this ->getRequestUrl ($ linkName );
236+ $ url = null !== $ case ? $ case ->links ->getUrl ($ linkName ) : $ this ->getRequestUrl ($ linkName );
238237
239238 // The documentation is unclear on this POE stuff. Does it return 303 or 201?
240239 // resources/f2-rest-docs/f2-rest-docs-v13s.html#11
@@ -270,19 +269,17 @@ public function matterCreate(array $matterData, ?CaseFile $case = null): Matter
270269
271270 public function matterUpdate (Matter $ matter , Matter $ updatedMatter ): bool
272271 {
273- $ url = $ matter ->links ->getLinkUrl ('self ' );
274- $ diff = new JsonDiff (
275- $ matter ->jsonSerialize (),
276- $ updatedMatter ->jsonSerialize (),
277- options: JsonDiff::SKIP_TEST_OPS ,
278- );
279- $ response = $ this ->request (Request::METHOD_PATCH , $ url , [
280- 'json ' => $ diff ->getPatch ()->jsonSerialize (),
281- ]);
272+ $ url = $ matter ->links ->getUrl ('self ' );
273+ $ diff = $ this ->computeDiff ($ matter , $ updatedMatter );
274+ if ($ diff ->getDiffCnt () > 0 ) {
275+ $ response = $ this ->request (Request::METHOD_PATCH , $ url , [
276+ 'json ' => $ diff ->getPatch ()->jsonSerialize (),
277+ ]);
282278
283- if (Response::HTTP_OK !== $ response ->getStatusCode ()) {
284- $ message = sprintf ('Cannot update matter %s ' , $ matter );
285- throw $ this ->createRuntimeException ($ message , response: $ response );
279+ if (Response::HTTP_OK !== $ response ->getStatusCode ()) {
280+ $ message = sprintf ('Cannot update matter %s ' , $ matter );
281+ throw $ this ->createRuntimeException ($ message , response: $ response );
282+ }
286283 }
287284
288285 return true ;
@@ -302,22 +299,10 @@ public function documentById(int $id): Document
302299 return $ this ->createItemResult ($ response , Document::class);
303300 }
304301
305- public function getDocumentContent (Document $ document ): ResponseInterface
306- {
307- $ url = $ document ->links ->getLinkUrl ('http://cbrain.com/casefile/rel/content ' );
308- $ response = $ this ->request (Request::METHOD_GET , $ url );
309-
310- if (Response::HTTP_OK !== $ response ->getStatusCode ()) {
311- throw $ this ->createApiException ($ response );
312- }
313-
314- return $ response ;
315- }
316-
317- public function documentCreate (string $ filename , array $ documentData , Matter $ matter ): Document
302+ public function documentCreate (array $ documentData , string $ filename , Matter $ matter ): Document
318303 {
319304 $ linkName = 'http://cbrain.com/casefile/rel/create-document ' ;
320- $ url = $ matter ->links ->getLinkUrl ($ linkName );
305+ $ url = $ matter ->links ->getUrl ($ linkName );
321306
322307 // The documentation is unclear on this POE stuff. Does it return 303 or 201?
323308 // resources/f2-rest-docs/f2-rest-docs-v13s.html#11
@@ -358,6 +343,61 @@ public function documentCreate(string $filename, array $documentData, Matter $ma
358343 return $ this ->createItemResult ($ response , Document::class);
359344 }
360345
346+ public function documentUpdate (Document $ document , Document $ updatedDocument , ?string $ filename = null ): bool
347+ {
348+ $ url = $ document ->links ->getUrl ('self ' );
349+ $ diff = $ this ->computeDiff ($ document , $ updatedDocument );
350+ if ($ diff ->getDiffCnt () > 0 ) {
351+ $ response = $ this ->request (Request::METHOD_PATCH , $ url , [
352+ 'json ' => $ diff ->getPatch ()->jsonSerialize (),
353+ ]);
354+
355+ if (Response::HTTP_OK !== $ response ->getStatusCode ()) {
356+ $ message = sprintf ('Cannot update document %s ' , $ document );
357+ throw $ this ->createRuntimeException ($ message , response: $ response );
358+ }
359+ }
360+
361+ if (null !== $ filename ) {
362+ $ fileHandle = fopen ($ filename , 'r ' );
363+ if (false === $ fileHandle ) {
364+ $ message = sprintf ('Cannot open document file %s ' , $ filename );
365+ throw $ this ->createRuntimeException ($ message );
366+ }
367+
368+ $ url = $ document ->links ->getUrl ('http://cbrain.com/casefile/rel/content ' );
369+
370+ try {
371+ $ response = $ this ->request (Request::METHOD_PUT , $ url , [
372+ 'body ' => [
373+ 'File ' => $ fileHandle ,
374+ ],
375+ ]);
376+ } finally {
377+ fclose ($ fileHandle );
378+ }
379+
380+ if (Response::HTTP_NO_CONTENT !== $ response ->getStatusCode ()) {
381+ $ message = sprintf ('Cannot update file on document %s ' , $ document );
382+ throw $ this ->createRuntimeException ($ message , response: $ response );
383+ }
384+ }
385+
386+ return true ;
387+ }
388+
389+ public function getDocumentContent (Document $ document ): ResponseInterface
390+ {
391+ $ url = $ document ->links ->getUrl ('http://cbrain.com/casefile/rel/content ' );
392+ $ response = $ this ->request (Request::METHOD_GET , $ url );
393+
394+ if (Response::HTTP_OK !== $ response ->getStatusCode ()) {
395+ throw $ this ->createApiException ($ response );
396+ }
397+
398+ return $ response ;
399+ }
400+
361401 /**
362402 * @return AccessToken
363403 */
@@ -619,13 +659,23 @@ private function logException(RuntimeException $exception): RuntimeException
619659 return $ exception ;
620660 }
621661
622- public function getDown (AbstractF2Item $ item ): Collection
662+ public function getLinkCollection (AbstractF2Item $ item, string $ rel ): Collection
623663 {
624- $ url = $ item ->links ->getLinkUrl ( ' down ' );
664+ $ url = $ item ->links ->getUrl ( $ rel );
625665 $ response = $ this ->request (Request::METHOD_GET , $ url );
626666
627667 $ sxe = new \SimpleXMLElement ($ response ->getContent ());
628668
629669 return Collection::fromSimpleXMLElement ($ sxe );
630670 }
671+
672+ private function computeDiff (AbstractF2Item $ old , AbstractF2Item $ new ): JsonDiff
673+ {
674+ $ oldValues = $ old ->jsonSerialize ();
675+ $ newValues = $ new ->jsonSerialize ();
676+
677+ // @todo Filter out some values, e.g. timestamps.
678+
679+ return new JsonDiff ($ oldValues , $ newValues , options: JsonDiff::SKIP_TEST_OPS );
680+ }
631681}
0 commit comments