Files
wticreatorstudio/Modules/StudioPlus/Http/Controllers/StudioPlusController.php
T
Leonard Biano 0d9e1b4b12 StudioPlus Module Update
Fix invoice generation for downline bonus
2024-06-05 23:21:50 +08:00

332 lines
12 KiB
PHP

<?php
namespace Modules\StudioPlus\Http\Controllers;
use App\Models\User;
use Carbon\Carbon;
use Illuminate\Contracts\Support\Renderable;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller;
use Illuminate\Support\Str;
use Modules\StudioPlus\Entities\ColumnPreset;
use Modules\StudioPlus\Entities\StudioPlusChannel;
use Modules\StudioPlus\Entities\StudioPlusVideo;
use Modules\StudioPlus\Services\AmazonProductService;
use Modules\StudioPlus\Services\AugmentationService;
use Modules\StudioPlus\Services\ProductBarcodeService;
use Modules\Language\Repositories\LanguageRepository;
class StudioPlusController extends Controller
{
protected $languagesRepository;
public function __construct(LanguageRepository $languagesRepository)
{
(new AugmentationService);
$this->languagesRepository = $languagesRepository;
}
/**
* Display a listing of the resource.
* @return Renderable
*/
public function index(Request $request)
{
$studioPlusChannel = StudioPlusChannel::query()
->where('user_id', auth()->id())
->first();
if (!$studioPlusChannel) {
$studioPlusChannel = StudioPlusChannel::create([
'user_id' => auth()->id(),
'name' => Str::random(30)
]);
}
return redirect()->route('studio-plus.channel', [
'studioPlusChannel' => $studioPlusChannel->name
]);
}
public function show(StudioPlusChannel $studioPlusChannel)
{
$videos = $this->getInitialVideos();
return view('studioplus::show', [
'channel' => $studioPlusChannel,
'videos' => $videos
]);
}
public function studio(StudioPlusChannel $studioPlusChannel)
{
$columns = ColumnPreset::where('user_id', auth()->id())->first();
$videos = [];//$this->getInitialVideos();
$start_date = null;
$end_date = null;
$filters = json_decode(\Cache::get('creator_studio_filters_'.auth()->id()));
if($filters && isset($filters->start_date) && isset($filters->end_date) && strtotime($filters->start_date) && strtotime($filters->end_date)){
$start_date = Carbon::createFromFormat('Y-m-d', $filters->start_date)->startOfDay()->format('Y-m-d');
$end_date = Carbon::createFromFormat('Y-m-d', $filters->end_date)->endOfDay()->format('Y-m-d');
}
$languages = $this->languagesRepository->getActiveAll();
return view('studioplus::studio', [
'channel' => $studioPlusChannel,
'videos' => $videos,
'columns' => $columns,
'start_date' => $start_date,
'end_date' => $end_date,
'languages' => $languages
]);
}
public function videos()
{
return view('studioplus::video');
}
public function watch(Request $request, StudioPlusVideo $video)
{
$original = false;
if ($request->has('original')) {
$original = true;
}
return view('studioplus::watch', [
'video' => $video->load('comments'),
'channel' => $video->channel,
'original' => $original
]);
}
public function getProductDetails(Request $request)
{
$code = $request->asin;
if (preg_match('/^[A-Z0-9]{10}$/', $code)) {
$service = new AmazonProductService();
}
else {
$service = new ProductBarcodeService();
}
return $service->getProductDetails($request->asin);
}
public function getInitialVideos($user_id = null)
{
$studioPlusChannel = StudioPlusChannel::query()
->where('user_id', auth()->id())
->first();
$query = auth()->user()->role->type === 'superadmin' || permissionCheck('studioplus.manage.videos')
? StudioPlusVideo::query()
: StudioPlusVideo::query()
->where(
fn ($query) =>
$query->where('studio_plus_channel_id', $studioPlusChannel->id)
);
$filters = json_decode(\Cache::get('creator_studio_filters_'.auth()->id()));
$videos = $query->with([
'thumbnail',
'category',
'asinData',
'videoType',
'otts.links',
'channel.user.staff',
'urls',
])
//->filter($filters)
->when(isset($filters->category_id), fn ($query) => $query->where('studio_plus_category_id', $filters->category_id))
->when(isset($filters->status) && $filters->status !== 'All' && $filters->status !== 'MVL', fn ($query) => $query->where('status', $filters->status))
->when(isset($filters->start_date) && strtotime($filters->start_date) && isset($filters->end_date) && strtotime($filters->end_date), function($query) use($filters) {
$startDate = Carbon::createFromFormat('Y-m-d', $filters->start_date)->startOfDay();
$endDate = Carbon::createFromFormat('Y-m-d', $filters->end_date)->endOfDay();
if(isset($filters->tracks)){
$query->whereHas('tracks', function($query) use($startDate,$endDate) {
$query->where('name', $filters->tracks);
$query->whereBetween('created_at', [$startDate, $endDate]);
});
} else {
$query->whereBetween('created_at', [$startDate, $endDate]);
}
})
->when(isset($filters->user_id), function($query) use($filters) {
$query->whereHas('channel.user', function($query) use($filters) {
$query->where('id', $filters->user_id);
});
})
->when(isset($filters->team_leader_id), fn ($query) =>
$query->whereHas('channel.user', fn ($query) =>
$query->where('parent_id', $filters->team_leader_id)->orWhere('id', $filters->team_leader_id)
)
)
->when(isset($filters->keyword) && !empty($filters->keyword), function($query) use($filters) {
$keyword = $filters->keyword;
$query->where(function($query) use($keyword) {
$query
->where('title', 'LIKE', "%{$keyword}%")
->orWhere('description', 'LIKE', "%{$keyword}%")
->orWhere('asin', 'LIKE', "%{$keyword}%")
->orWhere('product_name', 'LIKE', "%{$keyword}%")
->orWhere('brand', 'LIKE', "%{$keyword}%")
->orWhere('id', $keyword);
});
})
->when(isset($filters->leaders), function($query) use($filters) {
$query->whereHas('channel.user', function($query) use($filters) {
$query->whereIn('parent_id', $filters->leaders);
});
})
->when(isset($filters->users), function($query) use($filters) {
$query->whereHas('channel.user', function($query) use($filters) {
$query->whereIn('id', $filters->users);
});
})
->when(isset($filters->categories), function($query) use($filters) {
$query->whereIn('studio_plus_category_id', $filters->categories);
})
->when(isset($filters->types), function($query) use($filters) {
$query->whereIn('studio_plus_video_type_id', $filters->types);
})
->when(isset($filters->tracks), function($query) use($filters) {
$query->whereHas('tracks', function($query) use($filters) {
$query->where('name', $filters->tracks);
});
})
->when(isset($filters->asins), function($query) use($filters) {
$query->whereIn('studio_plus_asin_id', $filters->asins);
})
->when(isset($filters->labels), function($query) use($filters) {
$labels = $filters->labels;
foreach ($labels as $item) {
if ($item['include'] == 'true') {
$query->whereHas('urls', function ($query) use ($item) {
$query->where('label', $item['label']);
});
} else if ($item['include'] == 'false') {
$query->whereDoesntHave('urls', function ($query) use ($item) {
$query->where('label', $item['label']);
});
}
}
})
->when(isset($filters->ratings), function($query) use($filters) {
$ratings = $filters->ratings;
$min = $ratings[0]['min'];
$max = 0;
foreach ($ratings as $rating) {
if ($rating['min'] < $min) {
$min = $rating['min'];
}
if ($rating['max'] > $max) {
$max = $rating['max'];
}
}
$query->whereBetween('amazon_total_reviews', [$min, $max]);
})
->when(isset($filters->type), function($query) use($filters) {
if ($filters->type == 'SHORTS') {
$query->where('is_short', true);
} else {
$query->whereJsonContains('types', [$filters->type]);
}
})
->when(isset($filters->tags), function($query) use($filters) {
$tags = $filters->tags;
$query->where(function($query) use($tags) {
for ($i = 0; $i < count($tags); $i++) {
$tag = $tags[$i];
switch ($tag['code']) {
case 'has-youtube':
$query->where('in_youtube', true)->whereHas('urls', function ($query) {
$query->where('label', 'Youtube');
});
break;
case 'has-ott':
$query->where('in_ott', true)->whereHas('urls', function ($query) {
$query->where('label', 'OTT');
});
break;
case 'no-youtube':
$query->where('in_youtube', false);
break;
case 'no-ott':
$query->where('in_ott', false);
break;
case 'has-watermark':
$query->where('upload_status', 'COMPLETE');
break;
case 'no-watermark':
$query->where('upload_status', '<>', 'COMPLETE');
break;
}
}
});
})
->when(isset($filters->customTags), function ($query) use ($filters) {
$tags = $filters->customTags;
$query->where('tags', '<>', 'null')->whereNotNull('tags')->where(function ($query) use ($tags) {
foreach ($tags as $tag) {
$query->orWhereJsonContains('tags', $tag);
}
});
})
->orderBy('id','DESC')
->take(25)
->get();
return $videos;
}
public function viewUserChannel(Request $request, StudioPlusChannel $channel)
{
$columns = ColumnPreset::where('user_id', auth()->id())->first();
$videos = [];
$current_month = Carbon::now()->month;
$current_year = Carbon::now()->year;
$start_date = Carbon::create($current_year, $current_month, 1)->startOfDay();
$end_date = $start_date->copy()->endOfMonth();
$languages = $this->languagesRepository->getActiveAll();
return view('studioplus::studio', [
'channel' => $channel,
'videos' => $videos,
'columns' => $columns,
'start_date' => $start_date,
'end_date' => $end_date,
'user_id' => $request->has('user_id') ? $request->user_id : null,
'languages' => $languages
]);
}
public function studioSettings()
{
return view('studioplus::settings');
}
public function urlLabelsManager()
{
return view('studioplus::studio-url-labels-manager');
}
public function resolutionsManager()
{
return view('studioplus::studio-video-resolutions-manager');
}
}