/private/removeImage.php

https://github.com/ciniki/images · PHP · 190 lines · 128 code · 13 blank · 49 comment · 28 complexity · adc8a87c81e56bbb010809e099e6282d MD5 · raw file

  1. <?php
  2. //
  3. // Description
  4. // -----------
  5. // This function will return the image binary data in jpg format.
  6. //
  7. // Info
  8. // ----
  9. // Status: defined
  10. //
  11. // Arguments
  12. // ---------
  13. // user_id: The user making the request
  14. //
  15. //
  16. // Returns
  17. // -------
  18. //
  19. function ciniki_images_removeImage(&$ciniki, $tnid, $user_id, $image_id) {
  20. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'dbQuote');
  21. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'dbHashQuery');
  22. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'dbDelete');
  23. ciniki_core_loadMethod($ciniki, 'ciniki', 'core', 'private', 'dbAddModuleHistory');
  24. //
  25. // Get the tenant cache directory
  26. //
  27. ciniki_core_loadMethod($ciniki, 'ciniki', 'tenants', 'private', 'cacheDir');
  28. $rc = ciniki_tenants_cacheDir($ciniki, $tnid);
  29. if( $rc['stat'] != 'ok' ) {
  30. return $rc;
  31. }
  32. $tenant_cache_dir = $rc['cache_dir'];
  33. //
  34. // No transactions in here, it's assumed that the calling function is dealing with any integrity
  35. //
  36. //
  37. // Double check information before deleting.
  38. //
  39. $strsql = "SELECT ciniki_images.uuid, "
  40. . "ciniki_images.date_added, ciniki_images.last_updated "
  41. . "FROM ciniki_images "
  42. . "WHERE ciniki_images.id = '" . ciniki_core_dbQuote($ciniki, $image_id) . "' "
  43. . "AND ciniki_images.tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' ";
  44. if( $user_id > 0 ) {
  45. $strsql .= "AND ciniki_images.user_id = '" . ciniki_core_dbQuote($ciniki, $user_id) . "' ";
  46. }
  47. $rc = ciniki_core_dbHashQuery($ciniki, $strsql, 'ciniki.images', 'image');
  48. if( $rc['stat'] != 'ok' ) {
  49. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.images.114', 'msg'=>'Unable to remove image', 'err'=>$rc['err']));
  50. }
  51. if( count($rc['rows']) == 0 ) {
  52. return array('stat'=>'ok');
  53. }
  54. if( !isset($rc['image']) && count($rc['rows']) == 0 ) {
  55. // If the image is not found, then it was already deleted.
  56. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.images.115', 'msg'=>'Unable to remove image'));
  57. }
  58. $image = $rc['image'];
  59. $img_uuid = $rc['image']['uuid'];
  60. //
  61. // Check there are no references to the image before deleting
  62. //
  63. $strsql = "SELECT 'refs', COUNT(*) AS num "
  64. . "FROM ciniki_image_refs "
  65. . "WHERE ciniki_image_refs.tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  66. . "AND ciniki_image_refs.ref_id = '" . ciniki_core_dbQuote($ciniki, $image_id) . "' ";
  67. $rc = ciniki_core_dbHashQuery($ciniki, $strsql, 'ciniki.images', 'refs');
  68. if( $rc['stat'] != 'ok' ) {
  69. return $rc;
  70. }
  71. if( isset($rc['refs']) && $rc['refs']['num'] > 0 ) {
  72. return array('stat'=>'warn', 'err'=>array('code'=>'ciniki.images.116', 'msg'=>'Image still has references, will not be deleted'));
  73. }
  74. //
  75. // Remove all information about the image
  76. //
  77. $strsql = "DELETE FROM ciniki_images "
  78. . "WHERE tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  79. . "AND id = '" . ciniki_core_dbQuote($ciniki, $image_id) . "' ";
  80. $rc = ciniki_core_dbDelete($ciniki, $strsql, 'ciniki.images');
  81. if( $rc['stat'] != 'ok' ) {
  82. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.images.117', 'msg'=>'Unable to remove image', 'err'=>$rc['err']));
  83. }
  84. $strsql = "DELETE FROM ciniki_image_details "
  85. . "WHERE tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  86. . "AND image_id = '" . ciniki_core_dbQuote($ciniki, $image_id) . "' ";
  87. $rc = ciniki_core_dbDelete($ciniki, $strsql, 'ciniki.images');
  88. if( $rc['stat'] != 'ok' ) {
  89. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.images.118', 'msg'=>'Unable to remove image', 'err'=>$rc['err']));
  90. }
  91. //
  92. // Record delete in history and sync delete
  93. //
  94. ciniki_core_dbAddModuleHistory($ciniki, 'ciniki.images', 'ciniki_image_history',
  95. $tnid, 3, 'ciniki_images', $image_id, '*', '');
  96. $ciniki['syncqueue'][] = array('push'=>'ciniki.images.image',
  97. 'args'=>array('delete_uuid'=>$image['uuid'], 'delete_id'=>$image_id));
  98. //
  99. // Remove the image versions
  100. //
  101. $strsql = "SELECT id, uuid "
  102. . "FROM ciniki_image_versions "
  103. . "WHERE image_id = '" . ciniki_core_dbQuote($ciniki, $image_id) . "' "
  104. . "AND tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  105. . "";
  106. $rc = ciniki_core_dbHashQuery($ciniki, $strsql, 'ciniki.images', 'image');
  107. if( $rc['stat'] != 'ok' ) {
  108. return $rc;
  109. }
  110. $versions = $rc['rows'];
  111. foreach($versions as $row_id => $version) {
  112. $strsql = "DELETE FROM ciniki_image_versions "
  113. . "WHERE id = '" . ciniki_core_dbQuote($ciniki, $version['id']) . "' "
  114. . "AND tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  115. . "AND image_id = '" . ciniki_core_dbQuote($ciniki, $image_id) . "' "
  116. . "";
  117. $rc = ciniki_core_dbDelete($ciniki, $strsql, 'ciniki.images');
  118. if( $rc['stat'] != 'ok' ) {
  119. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.images.119', 'msg'=>'Unable to remove image', 'err'=>$rc['err']));
  120. }
  121. ciniki_core_dbAddModuleHistory($ciniki, 'ciniki.images', 'ciniki_image_history',
  122. $tnid, 3, 'ciniki_image_versions', $version['id'], '*', '');
  123. $ciniki['syncqueue'][] = array('push'=>'ciniki.images.version',
  124. 'args'=>array('delete_uuid'=>$version['uuid'], 'delete_id'=>$version['id']));
  125. }
  126. //
  127. // Remove the image actions
  128. //
  129. $strsql = "SELECT id, uuid "
  130. . "FROM ciniki_image_actions "
  131. . "WHERE image_id = '" . ciniki_core_dbQuote($ciniki, $image_id) . "' "
  132. . "AND tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  133. . "";
  134. $rc = ciniki_core_dbHashQuery($ciniki, $strsql, 'ciniki.images', 'image');
  135. if( $rc['stat'] != 'ok' ) {
  136. return $rc;
  137. }
  138. $actions = $rc['rows'];
  139. foreach($actions as $row_id => $action) {
  140. $strsql = "DELETE FROM ciniki_image_actions "
  141. . "WHERE id = '" . ciniki_core_dbQuote($ciniki, $action['id']) . "' "
  142. . "AND tnid = '" . ciniki_core_dbQuote($ciniki, $tnid) . "' "
  143. . "AND image_id = '" . ciniki_core_dbQuote($ciniki, $image_id) . "' "
  144. . "";
  145. $rc = ciniki_core_dbDelete($ciniki, $strsql, 'ciniki.images');
  146. if( $rc['stat'] != 'ok' ) {
  147. return array('stat'=>'fail', 'err'=>array('code'=>'ciniki.images.120', 'msg'=>'Unable to remove image', 'err'=>$rc['err']));
  148. }
  149. ciniki_core_dbAddModuleHistory($ciniki, 'ciniki.images', 'ciniki_image_history',
  150. $tnid, 3, 'ciniki_image_actions', $action['id'], '*', '');
  151. $ciniki['syncqueue'][] = array('push'=>'ciniki.images.action',
  152. 'args'=>array('delete_uuid'=>$action['uuid'], 'delete_id'=>$action['id']));
  153. }
  154. //
  155. // Remove any cache versions of the image
  156. //
  157. $cache_dir = $tenant_cache_dir . '/ciniki.images/'
  158. . $img_uuid[0] . '/' . $img_uuid;
  159. if( is_dir($cache_dir) ) {
  160. $files = array_diff(scandir($cache_dir), array('.','..'));
  161. foreach ($files as $file) {
  162. if( is_dir("$cache_dir/$file") ) {
  163. error_log("CACHE-ERR: Unable to remove cache files, directory exists: $cache_dir/$file");
  164. }
  165. unlink("$cache_dir/$file");
  166. }
  167. rmdir($cache_dir);
  168. }
  169. //
  170. // Update the last_change date in the tenant modules
  171. // Ignore the result, as we don't want to stop user updates if this fails.
  172. //
  173. ciniki_core_loadMethod($ciniki, 'ciniki', 'tenants', 'private', 'updateModuleChangeDate');
  174. ciniki_tenants_updateModuleChangeDate($ciniki, $tnid, 'ciniki', 'images');
  175. return array('stat'=>'ok');
  176. }
  177. ?>