Последняя версия с сервера прошлого разработчика

This commit is contained in:
2025-07-10 04:35:51 +00:00
commit c731570032
1174 changed files with 134314 additions and 0 deletions

View File

@@ -0,0 +1,494 @@
<?php
namespace App\Http\Controllers;
use DB;
use Hash;
use Carbon\Carbon;
use App\Models\User;
use Inertia\Inertia;
use Illuminate\Support\Str;
use App\Domain\Tags\Models\Tag;
use Illuminate\Validation\Rule;
use App\Domain\Feeds\Models\Feed;
use App\Notifications\Subscribed;
use App\Domain\Points\Models\Point;
use App\Notifications\LeaderChoice;
use Illuminate\Support\Facades\App;
use App\Domain\Feeds\Service\LiveFeed;
use Illuminate\Support\Facades\Request;
use Illuminate\Support\Facades\Redirect;
use Illuminate\Database\Eloquent\Builder;
use App\Domain\Points\Enums\DirectionEnum;
use App\Domain\Votes\Services\VoteService;
use Illuminate\Http\Request as HttpRequest;
use App\Domain\Subscriptions\Models\Package;
use App\Domain\Subscriptions\Models\Subscription;
use App\Domain\Users\DataTransferObjects\UserData;
use Spatie\MediaLibrary\MediaCollections\Models\Media;
use App\Domain\Subscriptions\Service\SubscriptionService;
class UsersController extends Controller
{
public function __construct()
{
$this->middleware('subs.paid')->except('update', 'plan', 'postsCount', 'searchUserTag', 'testPaid');
}
public function index()
{
$users = User::filter(Request::only('search', 'sex'))
->where('id', '<>', auth()->user()->id)
->where('username', '<>', 'inner_systemuser_api')
->withCount(['subscriber_reverse as is_sub' => function (Builder $query) {
$query->where('user_id', auth()->user()->id);
}])
->withCasts(['is_sub' => 'boolean'])
->orderBy('id', 'desc')
->cursorPaginate(User::PAGINATE);
$nextCursor = get_cursor_hash($users);
$users->transform(function ($user) {
return array_merge([
'is_sub' => $user->is_sub,
], UserData::fromModel($user)->toArray());
});
if(request()->wantsJson()){
return ['collections' => $users->items(), 'next' => $nextCursor];
}
return Inertia::render('User/Index', [
'filters' => Request::all('search', 'sex'),
'nextCursor' => $nextCursor,
'users' => $users->items(),
'per_page' => User::PAGINATE,
]);
}
public function testing()
{
// $leaders = collect(SubscriptionService::leaders());
$vote = (object) ['procent_site' => 10, 'procent_top' => 60];
$t = (new VoteService($vote))->freeMode();
dd($t);
// $ids = $leaders->pluck('user_id');
// $users = User::whereIn('id', $ids)->get();
// $leaderUsers = $leaders->map(function($item) use($users) {
// $item->user = $users->where('id', $item->user_id)->first()->only(['id', 'first_name', 'last_name', 'username']);
// return $item;
// });
// dd($leaderUsers);
// dd(Str::uuid());
// $user = new \App\Models\User();
// $user->password = \Illuminate\Support\Facades\Hash::make('sysSDFGtemuser345345');
// $user->email = 'system@systemuser_api.com';
// $user->first_name = 'systemuser_api';
// $user->username = 'inner_systemuser_api';
// $user->save();
//dd($user);
// $needArray = [
// 1 => ['time' => true],
// 2 => ['time' => true],
// 3 => ['time' => true],
// ];
// $user = User::find(4);
// $plucks = $user->feeds()->pluck('created_at', 'id')->transform(function ($item) {
// return ['time' => $item->getTimestamp()];
// })->toArray();
// dd($plucks);
// DB::table('videos')->truncate();
// DB::table('musics')->truncate();
// DB::table('images')->truncate();
// DB::table('user_feed_purchase')->truncate();
// DB::table('users_feeds_like')->truncate();
// DB::table('points')->truncate();
// DB::table('notifications')->truncate();
// DB::table('feed_tags')->truncate();
// DB::table('feeds_comments')->truncate();
// DB::table('complaints')->truncate();
// DB::table('comments')->truncate();
// DB::table('feeds')->truncate();
//$feeds = Feed::all();
//foreach ($feeds as $feed) {
// $enity = $feed->feedable;
// $uuid = (string) Str::uuid();
// $feed->title = $enity->title;
// $feed->body = $enity->body;
// $feed->price = $enity->price;
// $feed->is_paid = $enity->is_paid;
// $feed->type = $feed->type;
// $feed->slug = $uuid . '_' . $feed->type;
// $feed->save();
// $medias = $enity->getMedia('common');
// $medias_paid = $enity->getMedia('paid');
// $medias_preview = $enity->getMedia('preview');
// foreach ($medias as $media) {
// if(file_exists($media->getPath())){
// $feed->addMedia($media->getPath())->toMediaCollection('common');
// }
// }
// foreach ($medias_paid as $media) {
// if(file_exists($media->getPath())){
// $feed->addMedia($media->getPath())->toMediaCollection('paid');
// }
// }
// foreach ($medias_preview as $media) {
// if(file_exists($media->getPath())){
// $feed->addMedia($media->getPath())->toMediaCollection('preview');
// }
// }
//}
}
public function update(User $user)
{
Request::validate([
'first_name' => ['required', 'max:80'],
'last_name' => ['required', 'max:80'],
'username' => ['required', 'max:80', Rule::unique('users')->ignore($user->id)],
'email' => ['required', 'max:50', 'email', Rule::unique('users')->ignore($user->id)],
'password' => ['nullable'],
'phone' => ['nullable'],
'date_of_birth' => ['nullable'],
'sex' => ['nullable'],
'type' => ['nullable'],
'private' => ['nullable'],
'inn' => ['nullable'],
'checking_account' => ['nullable'],
'bik' => ['nullable'],
// 'allow_adult_content' => ['nullable'],
'about' => ['nullable', 'max:180'],
]);
$user->update(Request::only('first_name', 'last_name', 'email', 'username', 'phone', 'date_of_birth', 'sex', 'about', 'private', 'inn', 'checking_account', 'bik', 'type'));
if (Request::get('password')) {
$user->update(['password' => Request::get('password')]);
}
return Redirect::back()->with('success', 'Профиль обновлен!');
}
public function destroy(User $user)
{
if (App::environment('demo') && $user->isDemoUser()) {
return Redirect::back()->with('error', 'Deleting the demo user is not allowed.');
}
$user->delete();
return Redirect::back()->with('success', 'User deleted.');
}
public function restore(User $user)
{
$user->restore();
return Redirect::back()->with('success', 'User restored.');
}
public function subs(User $user)
{
if($user->private){
return Redirect::back()->with('error', 'Закрытый аккаунт');
}
$check = \DB::table('users_subscribers')
->where('user_id', auth()->user()->id)
->where('subscriber_id', $user->id)
->first();
auth()->user()->subscribers()->toggle([$user->id]);
if(!$check){
$message = [
'user_id' => auth()->user()->id,
'node_id' => null,
];
$user->notify(new Subscribed($message));
LiveFeed::addBySub($user);
}else{
LiveFeed::removeBySub($user);
}
return Redirect::back()->with('success', 'Success');
}
public function removePaidSubs(User $user)
{
auth()->user()->subscribers()->toggle([$user->id]);
DB::table('users_package_customers')
->where('user_id', $user->id)
->where('customer_id', auth()->user()->id)
->delete();
LiveFeed::removeBySub($user);
return Redirect::back()->with('success', 'Успешно отписались от пользователя');
}
public function settingsAutoSubsPaidUser(User $user)
{
DB::table('users_subscribers')
->where('user_id', auth()->user()->id)
->where('subscriber_id', $user->id)
->update(['autosubscription' => DB::raw('NOT autosubscription')]);
return Redirect::back()->with('success', 'Успешно выполнено');
}
public function settingsAutoSubs(User $user)
{
$auto = $user->autosubscription_site;
if($auto){
$msg = 'Автоматическое списание отключено!';
$user->autosubscription_site = false;
}else{
$msg = 'Автоматическое списание включено!';
$user->autosubscription_site = true;
}
$user->save();
return Redirect::back()->with('success', $msg);
}
public function vote(User $user, HttpRequest $request)
{
$authUserActiveSubscription = nova_get_setting('vote_paid_mode') ? SubscriptionService::activeSubscription() : true;
if(!$authUserActiveSubscription){
return Redirect::back()->with('error', 'Только пользователи с подпиской могут выбрать лидера!');
}
$count_leader = nova_get_setting('vote_leader_count');
if(!$request->vote && auth()->user()->subscribers()->where('leader', 1)->count() >= $count_leader){
return Redirect::back()->with('error', "Можно выбрать {$count_leader} лидеров");
}
if(!$request->vote){
$message = [
'user_id' => auth()->user()->id,
'node_id' => null,
];
$user->notify(new LeaderChoice($message));
}
auth()->user()->subscribers()->updateExistingPivot($user->id, [
'leader' => ! $request->vote,
]);
return Redirect::back()->with('success', 'Success Vote!');
}
public function plan($plan_id)
{
$user = auth()->user();
$active_subscription = SubscriptionService::activeSubscription();
if ($active_subscription) {
return Redirect::back()->with('error', 'Подписка уже активирована');
}
$balance = SubscriptionService::calculate($user->id);
$plan = Package::findOrFail($plan_id);
$plan_type = $plan->type;
if ($plan_type === 'month3') {
$ends_at = Carbon::now()->addMonths(3);
} else {
$ends_at = Carbon::now()->addMonths();
}
$price = $plan->price;
if ($price > $balance) {
return Redirect::back()->with('error', 'Недостаточно средств!');
}
$sub = new Subscription;
$sub->user_id = $user->id;
$sub->package_id = $plan->id;
$sub->price = $price;
$sub->ends_at = $ends_at;
$sub->status = 'complete'; //YSV ENUM!
$sub->save();
$point = new Point;
$point->user_id = $user->id;
$point->point = $price;
$point->type = 'Оплата за подписку'; //YSV ENUM!
$point->direction = DirectionEnum::EXPENSE();
$point->save();
return Redirect::back()->with('success', 'Вы успешо подписались!');
}
public function testPaid()
{
// $price = 50;
// $user = auth()->user();
// $point = new Point;
// $point->user_id = $user->id;
// $point->point = $price;
// $point->type = 'Пополнение баланса по кнопки'; //YSV ENUM!
// $point->direction = DirectionEnum::COMING();
// $point->save();
// return Redirect::back()->with('success', 'Баланс успешно пополнен!');
}
public function postsCount($user_id)
{
$user = User::findOrFail($user_id);
return $user->feeds()->count();
}
public function searchUserTag()
{
$search = Request::input('search');
if(empty($search)){
return [
'users' => [],
'tags' => [],
];
}
$sanitize_search = Str::slug($search);
$users = User::where('username', '%'.$search.'%')
->where('username', '<>', 'inner_systemuser_api')
->orWhere('first_name', 'ilike', '%'.$search.'%')
->orWhere('last_name', 'ilike', '%'.$search.'%')->get();
$users->each(function ($item) {
$item->name = $item->name;
return $item;
});
$sanitize_search = '%'.$sanitize_search.'%';
$tags = Tag::where('slug', 'ilike', $sanitize_search)->withCount('feeds')->get();
return [
'users' => $users,
'tags' => $tags,
];
}
public function friend() {
$user = auth()->user();
$readers = $user->subscribers()->filter(Request::only('search'))
->orderBy('id', 'desc')
->cursorPaginate(50);
$users = [];
$nextCursor = get_cursor_hash($readers);
$readers->each(function ($item) use(&$users) {
$users[] = UserData::fromModel($item)->toArray();
});
return ['records' => $users, 'cursor' => $nextCursor];
}
public function updatePassword(HttpRequest $request)
{
# Validation
$request->validate([
'old_password' => 'required',
'new_password' => 'required|string|min:6',
]);
#Match The Old Password
if(!Hash::check($request->old_password, auth()->user()->password)){
return back()->with("error", "Old Password Doesn't match!");
}
#Update the new Password
User::whereId(auth()->user()->id)->update([
'password' => Hash::make($request->new_password)
]);
return back()->with("success", "Password changed successfully!");
}
public function addDocument(HttpRequest $request)
{
$this->validate($request, [
'docs' => 'required|file|image',
]);
$documents = $request->user()->getMedia('documents');
if($documents->count()){
foreach ($documents as $document) {
$document->delete();
}
}
$file = $request->file('docs');
auth()->user()->addMedia($file)->toMediaCollection('documents', 'local');
return back()->with("success", "Документ успешно загружен");
}
public function readDocument(string $uuid)
{
$media = Media::where('uuid', $uuid)->first();
return response()->download($media->getPath(), $media->file_name);
}
public function verifyPhoneRequest(Carbon $now)
{
$user = auth()->user();
if(empty($user->phone)){
return back()->with("error", "Нужно ввести телефон");
}
if (!empty($user->phone_verify_token) && $user->phone_verify_token_expire && $user->phone_verify_token_expire->gt($now)) {
return back()->with("error", "Токен уже запрошен.");
}
$user->phone_verified = false;
$user->phone_verify_token = (string)random_int(10000, 99999);
$user->phone_verify_token_expire = $now->copy()->addSeconds(300);
$user->saveOrFail();
return back()->with("success", "Верификация номера телефона успешно запрошена, ожидайте");
}
public function verifyPhone(HttpRequest $request, Carbon $now)
{
$user = auth()->user();
$token = $request->input('token');
if ($token !== $user->phone_verify_token) {
return back()->with("error", "Токен уже запрошен.");
}
if ($user->phone_verify_token_expire->lt($now)) {
return back()->with("error", "Срок действия токена истек.");
}
$user->phone_verified = true;
$user->phone_verify_token = null;
$user->phone_verify_token_expire = null;
$user->saveOrFail();
return back()->with("success", "Верификация номера телефона успешно завершена");
}
}