File: /home/imensosw/www/amanda/app/Http/Controllers/ProductController.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Product;
use App\Product_image;
use App\Product_price;
use App\Product_video;
use DB;
use App\Category;
use App\Tag;
use App\Product_tag;
use File;
class ProductController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$limit = config('constants.limit');
$productRs = Product::leftjoin('product_tag','product_tag.product_id','products.id')
->leftjoin('categories','categories.id','products.category_id')
->select('products.*','categories.name as category_name',
DB::raw("(select p1.price from product_price as p1 where p1.product_id=products.id) as price"),
DB::raw("(select p1.days from product_price as p1 where p1.product_id=products.id) as days")
,DB::raw("(GROUP_CONCAT(product_tag.tag_id SEPARATOR ',')) as tag_ids")
)
->orderBy('products.id','desc')
->groupBy('products.id')
->get();
// ->paginate(5);
$products=array();
foreach ($productRs as $quest) {
$quest->id=intval($quest->id);
$quest->showImages = $this->getProductImage($quest->id);
$quest->showVideos = $this->getProductVideo($quest->id);
// $quest->showPriceDay = $this->getProductPrice($quest->id);
$quest->showProductTag = $this->getProductTag($quest->id);
if($quest->image!=null){
if (file_exists(config('constants.imageFolderPath')."/images/".$quest->image)) {
$path = "/api/imagesView/".$quest->image;
} else {
$path = "/api/videoView/".$quest->image;
}
$ext = \File::extension($path);
if($ext=="jpg" || $ext=="jpeg" || $ext=="png" || $ext=="JPEG" || $ext=="JPG")
{
$fileType ="image";
$filePath = "/api/imagesView/".$quest->image;
}
else
{
$fileType="video";
$filePath = "/api/videoView/".$quest->image;
}
/* $data = [
'path'=>$filePath,
'imageType'=>'profile',
'fileType'=>$fileType
];*/
$data=array();
$data[0]['path']=$path;
$data[0]['imageType']='profile';
$data[0]['fileType']=$fileType;
$quest->profileShow = $data;
$quest->profile = $quest->image;
}
$products[]=$quest;
}
$category = Category::get();
$tags = Tag::get();
$data = ['products'=>$products,'category'=>$category,'tags'=>$tags];
return response()->json($data,200);
}
public function productSearch(Request $request)
{
$search = $request->search;
$limit = config('constants.limit');
$productRs = Product::leftjoin('product_tag','product_tag.product_id','products.id')
->leftjoin('categories','categories.id','products.category_id')
->where(function($q) use ($search)
{
$q->orWhere('products.name', 'like', '%' . $search . '%');
$q->orWhere('categories.name', 'like', '%' . $search . '%');
})
->select('products.*','categories.name as category_name',
DB::raw("(select p1.price from product_price as p1 where p1.product_id=products.id) as price"),
DB::raw("(select p1.days from product_price as p1 where p1.product_id=products.id) as days")
,DB::raw("(GROUP_CONCAT(product_tag.tag_id SEPARATOR ',')) as tag_ids")
)
->orderBy('products.id','desc')
->groupBy('products.id')
->get();
// ->paginate(5);
$products=array();
foreach ($productRs as $quest) {
$quest->id=intval($quest->id);
$quest->showImages = $this->getProductImage($quest->id);
$quest->showVideos = $this->getProductVideo($quest->id);
// $quest->showPriceDay = $this->getProductPrice($quest->id);
$quest->showProductTag = $this->getProductTag($quest->id);
if($quest->image!=null){
if (file_exists(config('constants.imageFolderPath')."/images/".$quest->image)) {
$path = "/api/imagesView/".$quest->image;
} else {
$path = "/api/videoView/".$quest->image;
}
$ext = \File::extension($path);
if($ext=="jpg" || $ext=="jpeg" || $ext=="png" || $ext=="JPEG" || $ext=="JPG")
{
$fileType ="image";
$filePath = "/api/imagesView/".$quest->image;
}
else
{
$fileType="video";
$filePath = "/api/videoView/".$quest->image;
}
$data = [
'path'=>$path,
'imageType'=>'profile',
'fileType'=>$fileType
];
/*$data = array();
$data[0]['path']=$path;
$data[0]['imageType']='profile';
$data[0]['fileType']=$fileType;*/
$quest->profileShow = $data;
$quest->profile = $quest->image;
}
$products[]=$quest;
}
$category = Category::get();
$tags = Tag::get();
$data = ['products'=>$products,'category'=>$category,'tags'=>$tags];
return response()->json($data,200);
}
public function getProductImage($id) {
$result = Product_image::where(array('product_id' => $id))->get();
$array =array();
foreach ($result as $value) {
$value->id=intval($value->id);
$value->path = "/api/imagesView/".$value->fileName;
$value->imageType="multiImage";
$array[]=$value;
}
return $array;
}
public function getProductVideo($id) {
$result = Product_video::where(array('product_id' => $id))->get();
$array =array();
foreach ($result as $value) {
$value->id=intval($value->id);
$value->path = "/api/videoView/".$value->fileName;
$array[]=$value;
}
return $array;
}
public function getProductPrice($id) {
$result = Product_price::where(array('product_id' => $id))->get();
return $result;
}
public function getProductTag($id) {
// $result = Product_tag::where(array('product_id' => $id))->select('product_tag.tag_id')->get();
$result = Product_tag::join('tags','product_tag.tag_id','tags.id')
->where(array('product_tag.product_id'=>$id))
->select('tags.*')
->get();
// $array =array();
/*foreach ($result as $value) {
$value->id=intval($value->id);
$value->tag_id=intval($value->tag_id);
$array[]=$value;
}*/
return $result;
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
$request->validate([
'name' => 'required|unique:products,name|max:30',
'description' => 'required|max:500',
'images' => 'image|mimes:jpeg,png,jpg|max:2048',
'videos' => 'mimes:mp4,m4v,mov,mpeg,webm|max:20000',
'price' => "required|numeric",
'profile' => 'required',
'days' => "required",
'category_id' => 'required|not_in:0',
'tag_ids' => 'required',
]);
DB::beginTransaction();
try {
$profile=null;
$fileType='image';
if(!empty($request->profile)){
foreach ($request->profile as $val) {
$profile = $val['name'];
$fileType = $val['fileType'];
}
}
$product = Product::create([
'name' => $request->name,
'description' => $request->description,
'units' => 1,
'price' => 1,
'image' => $profile,
'fileType'=>$fileType,
'type'=>"single",
'status'=>'active',
'category_id' => $request->category_id['id']
]);
if(!empty($product->id)){
if(!empty($request->multipleFiles)){
foreach ($request->multipleFiles as $val) {
if($val['filetype']=="image"){
$product_image = Product_image::create([
'fileName' => $val['name'],
'product_id'=> $product->id,
]);
}
else if($val['filetype']=="video"){
$product_video = Product_video::create([
'fileName' => $val['name'],
'product_id'=> $product->id,
]);
}
}
}
// if(!empty($request->days)){
$product_price = Product_price::create([
'price' => $request->price,
'days' => $request->days,
'status' => 'active',
'product_id'=> $product->id,
]);
// }
if(!empty($request->tag_ids)){
foreach ($request->tag_ids as $tagId) {
Product_tag::create([
'tag_id' => $tagId['id'],
'product_id'=> $product->id,
]);
}
}
}
DB::commit();
return response()->json([
'status' => (bool) $product,
'data' => $product,
'message' => $product ? 'Product Created!' : 'Error Creating Product'
]);
} catch (\Throwable $e) {
DB::rollback();
return response()->json(
[
'status' => 'error',
'message' => 'Error in product add',
'errors' => [],
],
422
);
}
}
/**
* Display the specified resource.
*
* @param \App\Product $product
* @return \Illuminate\Http\Response
*/
public function show()
{
$product = Product::get();
return response()->json($product,200);
}
public function uploadFile(Request $request)
{
$m=1;
$multiImage=array();
DB::beginTransaction();
try {
if(!empty($request->images)){
foreach ($request->images as $data) {
if(preg_match('/data:image\/(jpg|jpeg|png);base64,(.*)/i', $data, $matches)) {
$imageType = $matches[1];
$imageData = base64_decode($matches[2]);
$image = imagecreatefromstring($imageData);
$filename = time().'m'.$m. '.' . $imageType;
$filepath =config('constants.imageFolderPath')."/images/";
if(!File::exists($filepath)) {
mkdir($filepath, 0755, true);
}
$path =$filepath.$filename;
file_put_contents($path, $data);
$imageName = $filename;
file_put_contents($path, base64_decode(explode(',',$data)[1]));
$multiImage[]=array('name'=>$imageName,'path'=>$path,'filetype'=>'image','id'=>0);
}
if(preg_match('/data:video\/(mp4|m4v|mov|mpeg|webm);base64,(.*)/i', $data, $matches)) {
//mp4,m4v,webm,flv,mov,mpeg
$imageType = $matches[1];
$imageData = base64_decode($matches[2]);
// $image = imagecreatefromstring($imageData);
$filename = time().'v'.$m. '.' . $imageType;
$filepath =config('constants.imageFolderPath')."/video/";
if(!File::exists($filepath)) {
mkdir($filepath, 0755, true);
}
$path =$filepath.$filename;
file_put_contents($path, $data);
$imageName = $filename;
file_put_contents($path, base64_decode(explode(',',$data)[1]));
$multiImage[]=array('name'=>$imageName,'path'=>$path,'filetype'=>'video','id'=>0);
// $j++;
}
/*else {
throw new \Exception('did not match data URI with image data');
} */
$m++;
}
}
$profileImage = array();
if($request->profile!=null){
$data = $request->profile;
if(preg_match('/data:image\/(jpg|jpeg|png);base64,(.*)/i', $data, $matches)) {
$imageType = $matches[1];
$imageData = base64_decode($matches[2]);
$image = imagecreatefromstring($imageData);
$filename = time(). '.' . $imageType;
// $path = public_path("upload/images")."/".$filename;
$filepath =config('constants.imageFolderPath')."/images/";
if(!File::exists($filepath)) {
mkdir($filepath, 0755, true);
}
$path =$filepath.$filename;
file_put_contents($path, $data);
$imageName = $filename;
file_put_contents($path, base64_decode(explode(',',$data)[1]));
// $profileImage []= array('name'=>$imageName,'path'=>asset("upload/images/$filename"),'fileType'=>'image','imageType'=>'profile','id'=>0);
$profileImage []= array('name'=>$imageName,'path'=>$path,'fileType'=>'image','imageType'=>'profile','id'=>0);
}
else if(preg_match('/data:video\/(mp4|m4v|mov|mpeg|webm);base64,(.*)/i', $data, $matches)) {
//mp4,m4v,webm,flv,mov,mpeg
$imageType = $matches[1];
$imageData = base64_decode($matches[2]);
// $image = imagecreatefromstring($imageData);
$filename = time().'.' . $imageType;
$filepath =config('constants.imageFolderPath')."/video/";
if(!File::exists($filepath)) {
mkdir($filepath, 0755, true);
}
$path =$filepath.$filename;
// $path = public_path("upload/video")."/".$filename;
file_put_contents($path, $data);
$imageName = $filename;
file_put_contents($path, base64_decode(explode(',',$data)[1]));
$profileImage []= array('name'=>$imageName,'path'=>$path,'fileType'=>'video','imageType'=>'profile','id'=>0);
// $j++;
}
}
DB::commit();
return response()->json(['multiImage'=>$multiImage,'profileImage'=>$profileImage],201);
} catch (\Throwable $e) {
DB::rollback();
return response()->json(
[
'status' => 'error',
'message' => 'Error in file upload',
'errors' => [],
],
422
);
}
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param \App\Product $product
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
$request->validate([
'name' => 'required|max:30|unique:products,name,'.$id,
'description' => 'max:500',
'days' => "required",
'category_id' => 'required|not_in:0',
'tag_ids' => 'required',
// 'profile' => 'image|mimes:jpeg,png,jpg|max:2048',
]);
$productcheck = Product::find($id);
if(empty($request->profile) && ($productcheck->image==null || $productcheck->image=='')){
return response()->json(array('success' => false,"message"=>"The profile field is required"), 422);
// return response()->json(array('success' => false,"message"=>config('constants.permission')), 404);
}
DB::beginTransaction();
try {
$product = Product::find($id);
if(!empty($request->profile)){
foreach ($request->profile as $val) {
$product->image = $val['name'];
$product->fileType = $val['fileType'];
}
}
$status = $product->update(
$request->only(['name', 'description'])
);
// $product->image = $profile;
$product->category_id= $request->category_id['id'];
$product->save();
if(!empty($request->multipleFiles)){
// Product_image::where('product_id', $id)->delete();
// Product_video::where('product_id', $id)->delete();
foreach ($request->multipleFiles as $val) {
if($val['filetype']=="image"){
$product_image = Product_image::create([
'fileName' => $val['name'],
'product_id'=> $id,
]);
}
else if($val['filetype']=="video"){
$product_video = Product_video::create([
'fileName' => $val['name'],
'product_id'=> $id,
]);
}
}
}
/*if(!empty($request->days)){*/
Product_price::where('product_id', $id)->delete();
/* if(!empty($request->price)){
$request->price=0.00;
}*/
$product_price = Product_price::create([
'price' => $request->price,
'days' => $request->days,
'status' => 'active',
'product_id'=> $id,
]);
// }
if(!empty($request->tag_ids)){
Product_tag::where('product_id', $id)->delete();
foreach ($request->tag_ids as $tagId) {
Product_tag::create([
'tag_id' => $tagId['id'],
'product_id'=> $product->id,
]);
}
}
DB::commit();
return response()->json([
'status' => $status,
'message' => $status ? 'Product Updated!' : 'Error Updating Product'
]);
}
catch (\Throwable $e) {
DB::rollback();
return response()->json(
[
'status' => 'error',
'message' => 'Error in product update',
'errors' => [],
]);
}
}
public function updateUnits(Request $request, Product $product)
{
$product->units = $product->units + $request->get('units');
$status = $product->save();
return response()->json([
'status' => $status,
'message' => $status ? 'Units Added!' : 'Error Adding Product Units'
]);
}
/**
* Remove the specified resource from storage.
*
* @param \App\Product $product
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
// $status = $product->delete();
$status = Product::find($id);
/* $status->delete_product_at = 1;
$status->save();*/
/*if($status)
{
Product_image::where(array('product_id'=>$id))->delete();
Product_video::where(array('product_id'=>$id))->delete();
Product_price::where(array('product_id'=>$id))->delete();
}*/
$status->delete();
return response()->json([
'status' => $status,
'message' => $status ? 'Product Deleted!' : 'Error Deleting Product'
]);
}
public function deleteProductImage($id)
{
// $status= Product_image::where(array('id'=>$id))->delete();
$Product_image = Product_image::find($id);
if(!empty($Product_image)){
$image_path = config('constants.imageFolderPath')."/images/".$Product_image->fileName;
if (file_exists($image_path)) {
@unlink($image_path);
}
}
$status = $Product_image->delete();
return response()->json([
'status' => $status,
'message' => $status ? 'Product Image Deleted!' : 'Error Deleting Product Image'
]);
}
public function deleteProductVideo($id)
{
// $status= Product_video::where(array('id'=>$id))->delete();
$Product_video = Product_video::find($id);
if(!empty($Product_video)){
$image_path =config('constants.imageFolderPath')."/video/".$Product_video->fileName;
if (file_exists($image_path)) {
@unlink($image_path);
}
}
$status = $Product_video->delete();
return response()->json([
'status' => $status,
'message' => $status ? 'Product Video Deleted!' : 'Error Deleting Product Video'
]);
}
}