initial commit

This commit is contained in:
2026-06-25 13:03:45 +06:00
commit 4589f4a8d0
3229 changed files with 941958 additions and 0 deletions

View File

@@ -0,0 +1,262 @@
<?php
App::uses('Component', 'Controller');
use GuzzleHttp\Client;
require_once(APP . 'Controller' . DS . 'Traits' . DS . 'ImageUploadTrait.php');
class ImageUploadComponent extends Component
{
use ImageUploadTrait;
private $total_image = NUMBER_OF_EXPENSE_IMAGES ?? 3;
public function AddImageBucket($imagesData, $id, $unique_url, $app_name)
{
$images = null;
$imageCount = count($imagesData);
$imageResponses = [];
if ($imageCount >= 1) {
$imageResponse = null;
$message = "It is not valid format.";
$firebasePath = $this->getRootFolder() . '/' . $app_name . '/' . $unique_url . '/' . $id . '/';
foreach ($imagesData as $key => $image) {
if ($key > ($this->total_image - 1)) {
break;
}
$message = "Image has not been provided.";
if (!empty($image['data'])) {
$base64Image = $image['data'];
$decodedImage = base64_decode($base64Image);
$isImage = $this->checkImageFromBase64EncodedString($base64Image) || $this->checkImageFromBase64DecodedString($decodedImage);
$message = "Image is not valid format.";
if ($isImage) {
$no = $key + 1;
$filename = 'img' . $no . '.jpg';
$result = $this->uploadBase64Image($base64Image, $firebasePath . $filename);
if ($result['status']) {
if ($no == 1) {
$images = $filename;
} else {
$images = $images . ',' . $filename;
}
}
$message = $result['message'];
}
}
$imageResponse["img" . $key] = $message;
}
$imageResponses[$unique_url] = $imageResponse;
}
return ["images" => $images, "response" => $imageResponses];
}
public function DeleteImageBucket($Expanses, $unique_url, $app_name)
{
$deleteResponses = [];
foreach ($Expanses as $item => $Expanse) {
$firebasePath = $this->getRootFolder() . '/' . $app_name . '/' . $unique_url . '/' . $Expanse['id'] . '/';
$response = $this->deleteFolder($firebasePath);
$deleteResponses[$item] = $response['message'];
}
return $deleteResponses;
}
public function DeleteSingleImageBucket($dbimages, $id, $unique_url, $app_name, $deletedimages)
{
$images = explode(',', $dbimages);
$firebasePath = $this->getRootFolder() . '/' . $app_name . '/' . $unique_url . '/' . $id . '/';
$delete_image_responses = null;
$message = "Image not found.";
foreach ($deletedimages as $key => $deletedimage) {
$image_name = $deletedimage['name'];
if (in_array($image_name, $images)) {
$result = $this->singleImageDelete($firebasePath . $image_name);
$images = array_diff($images, array($image_name));
// if image exist in db but not in firebase
if (!$result['status']) {
$images = array_filter($images, function ($item) use ($image_name) {
return $item !== $image_name;
});
}
$message = $result['message'];
}
$delete_image_responses[$image_name] = $message;
}
return ['images' => implode(',', $images), 'response' => $delete_image_responses];
}
public function ModifyImageBucket($dbimages, $id, $unique_url, $app_name, $expanse_images)
{
$images = [];
$imageResponse = null;
if (!empty($dbimages)) {
$images = explode(',', $dbimages);
}
if (!empty($expanse_images)) {
$firebasePath = $this->getRootFolder() . '/' . $app_name . '/' . $unique_url . '/' . $id . '/';
$image_count = count($expanse_images) + count($images);
if ($image_count <= $this->total_image) {
foreach ($expanse_images as $key => $image) {
$message = "Image has not been provided.";
$filename = $this->imageUniqueName($images);
if (!empty($image['data']) && !empty($filename)) {
$base64Image = $image['data'];
$result = $this->uploadBase64Image($base64Image, $firebasePath . $filename);
if ($result['status']) {
array_push($images, $filename);
}
$message = $result['message'];
}
$imageResponse["img" . $key] = $message;
}
}
if ($image_count > $this->total_image) {
$imageResponse['status'] = false;
$imageResponse['message'] = "Should be maximum 3 images. Given {$image_count}";
}
}
return ["images" => implode(',', $images), "response" => $imageResponse];
}
private function checkImageFromBase64EncodedString($base64String)
{
$result = false;
if (preg_match('/^data:(.*?);base64,/', $base64String, $match)) {
$mimeType = $match[1];
if (strpos($mimeType, 'image') !== false) {
$result = true;
}
}
return $result;
}
private function checkImageFromBase64DecodedString($decodedData)
{
$result = false;
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mimeType = $finfo->buffer($decodedData);
if (strpos($mimeType, 'image') !== false) {
$result = true;
}
return $result;
}
private function imageUniqueName($dbImages)
{
$image_name = null;
for ($i = 1; $i <= $this->total_image; $i++) {
$filename = 'img' . $i . '.jpg';
// check image exist or not
if (!in_array($filename, $dbImages)) {
$image_name = $filename;
break;
}
}
return $image_name;
}
public function getRootFolder()
{
if (strpos(HTTP_SITE_URL, "expensecount.com") !== false) {
return "prod";
} elseif (strpos(HTTP_SITE_URL, "localhost") !== false) {
return "local";
}
return "dev";
}
public function ExportImageBucket($unique_url, $app_name)
{
$firebasePath = $this->getRootFolder() . '/' . $app_name . '/' . $unique_url . '/' ;
$expire_time='+2 days';
$expiresAt = new DateTime($expire_time);
$savePath = $this->getRootFolder() . '/' . $app_name . '/zip/'.$expiresAt->format('Y-m-d H:i:s').'/' . $unique_url . '/report.zip' ;
return $this->downloadImage($firebasePath, $expire_time,$savePath);
}
public function ReceiptExportInsideFirebase($unique_url, $app_name) {
$url = 'https://us-central1-expensecount-312c7.cloudfunctions.net/generateGroupZip';
$data = [
"prefix"=> $this->getRootFolder() . '/' . $app_name . '/' ,
"unique_url"=> $unique_url,
"zip_file_prefix" => $this->getRootFolder() . '/' . $app_name . '/zip/'
];
$client = new Client();
try {
$response = $client->post($url, [
'headers' => [
'Content-Type' => 'application/json'
],
'body' => json_encode($data)
]);
$result = json_decode($response->getBody()->getContents(), true);
if(!empty($result['zip_path'])) {
$result['link'] = $this->downloadLink($result['zip_path']);
$result['expire_time'] = new DateTime('+2 days');
}
return $result;
} catch (\Exception $e) {
return ["message"=> "Error: " . $e->getMessage(),"success"=>false];
}
}
}