Files
vedant-chavan/app/Http/Controllers/API/LeaderBordMasterContoller.php
vedant-chavan eff0228447 first commit
2024-06-12 20:29:05 +05:30

731 lines
29 KiB
PHP

<?php
namespace App\Http\Controllers\API;
use App\Http\Controllers\Controller;
use App\Models\LeaderboardMaster;
use App\Models\User;
use App\Models\UserDetail;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;
use App\Models\MonthlyPosition;
use Carbon\Carbon;
class LeaderBordMasterContoller extends Controller {
// public function get_user_ranking() {
// try {
// $token = readHeaderToken();
// if ($token) {
// $user_id = $token['sub'];
//
// // Retrieve the user's ranking and related user details
// $userRanking = LeaderboardMaster::with('user', 'user_details')
// ->get();
// return response()->json([
// 'success' => true,
// 'user_ranking' => $userRanking,
// 'message' => 'Data Fetch Successfully!.',
// ]);
// } else {
// return response()->json([
// 'success' => false,
// 'message' => 'Authentication failed.',
// ]);
// }
// } catch (\Exception $e) {
// \Log::error("User ranking retrieval failed: " . $e->getMessage());
// return response()->json([
// 'success' => false,
// 'message' => 'Something went wrong.',
// ]);
// }
// }
public function get_user_ranking($sortOrder = 'desc') {
try {
$token = readHeaderToken();
if ($token) {
$user_id = $token['sub'];
// Retrieve the user's ranking and related user details
$userRanking = LeaderboardMaster::with('user', 'user_data')
->orderBy('total_score', $sortOrder)
->get();
return response()->json([
'success' => true,
'user_ranking' => $userRanking,
'message' => 'Data Fetch Successfully!.',
]);
} else {
return response()->json([
'success' => false,
'message' => 'Authentication failed.',
]);
}
} catch (\Exception $e) {
\Log::error("User ranking retrieval failed: " . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Something went wrong.',
]);
}
}
public function get_user_gender(Request $request) {
try {
$token = readHeaderToken();
if ($token) {
$user_id = $token['sub'];
$filters = $request->gender;
$query = LeaderboardMaster::with(['user', 'user_data']);
// Apply filters
if ($filters && in_array($filters, ['male', 'female'])) {
$query->whereHas('user_data', function ($query) use ($filters) {
$query->where('gender', '=', $filters);
});
}
// Add more filter conditions if needed
$manage_activity = $query->get()->toArray();
return response()->json([
'success' => true,
'message' => 'Data fetched successfully.',
'result' => $manage_activity
]);
} else {
return response()->json([
'success' => false,
'message' => 'Authentication failed.',
]);
}
} catch (\Exception $e) {
\Log::error("Activity data listing failed: " . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Something went wrong.',
]);
}
}
public function get_user_group_level(Request $request) {
try {
$token = readHeaderToken();
if ($token) {
$user_id = $token['sub'];
$groupLevelFilter = $request->input('group_level');
$elites = null;
$gameChangers = null;
$underdogs = null;
$elites_user_id = [];
if ($groupLevelFilter === 'elites') {
$elites = GroupLevelElites();
// print_r($elites['elites_user_id']);
// exit;
} elseif ($groupLevelFilter === 'gameChangers') {
$gameChangers = GroupLevelGameChanger();
} elseif ($groupLevelFilter === 'underdogs') {
$underdogs_user_id = [];
$game_changer_data = GroupLevelGameChanger();
$users_id = $game_changer_data['all_top_users_id'];
$underdog = LeaderboardMaster::whereNotIn('user_id', $users_id)->orderBy('total_score', 'desc')->get();
foreach ($underdog as $k => $val){
$underdogs_user_id[] = $val->user_id;
}
// dd($underdogs_user_id);
$underdogs['underdogs'] = $underdog;
$underdogs['underdogs_user_id'] = $underdogs_user_id;
} else {
// Invalid group level filter
return response()->json([
'success' => false,
'message' => 'Invalid group level filter.',
]);
}
return [
'elites' => $elites,
'gameChangers' => $gameChangers,
'underdogs' => $underdogs,
];
}
} catch (\Exception $e) {
\Log::error("Activity data listing failed: " . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Something went wrong.',
]);
}
}
// public function filter_users(Request $request) {
// try {
// $token = readHeaderToken();
// if ($token) {
// $user_id = $token['sub'];
//
// $filters = $request->input('gender');
// $groupLevelFilter = $request->input('group_level');
//
// $query = LeaderboardMaster::with(['user', 'user_data']);
//
// // Apply gender filter
// if ($filters && in_array($filters, ['male', 'female'])) {
// $query->whereHas('user_data', function ($query) use ($filters) {
// $query->where('gender', '=', $filters);
// });
// } elseif ($filters !== null) {
// // Invalid gender filter
// return response()->json([
// 'success' => false,
// 'message' => 'Invalid gender filter.',
// ]);
// }
// // Apply group level filter
// $elites = null;
// $gameChangers = null;
// $underdogs = null;
// $elites_user_id = [];
//
// if ($groupLevelFilter === 'elites') {
// $elites = GroupLevelElites();
//
// // Filter by gender
// if ($filters && in_array($filters, ['male', 'female'])) {
// $elites = array_filter($elites, function ($elite) use ($filters) {
// return $elite['gender'] === $filters;
// });
// }
// } elseif ($groupLevelFilter === 'gameChangers') {
// $gameChangers = GroupLevelGameChanger();
//
// // Filter by gender
// if ($filters && in_array($filters, ['male', 'female'])) {
// $gameChangers = array_filter($gameChangers, function ($gameChanger) use ($filters) {
// return $gameChanger['gender'] === $filters;
// });
// }
// } elseif ($groupLevelFilter === 'underdogs') {
// $game_changer_data = GroupLevelGameChanger();
// $users_id = $game_changer_data['all_top_users_id'];
// $query->whereNotIn('user_id', $users_id)->orderBy('total_score', 'desc');
//
// // Apply gender filter
//if ($filters && in_array($filters, ['male', 'female'])) {
// $query->whereHas('user_data', function ($query) use ($filters) {
// $query->where('gender', '=', $filters);
// });
//} elseif ($filters !== null) {
// // Invalid gender filter
// return response()->json([
// 'success' => false,
// 'message' => 'Invalid gender filter.',
// ]);
//}
//
// $users = $query->get()->toArray();
//
// return response()->json([
// 'success' => true,
// 'message' => 'Data fetched successfully.',
// 'result' => [
// 'users' => $users,
// 'elites' => $elites,
// 'gameChangers' => $gameChangers,
// 'underdogs' => $underdogs,
// ],
// ]);
// } else {
// return response()->json([
// 'success' => false,
// 'message' => 'Authentication failed.',
// ]);
// }
// }
// }catch (\Exception $e) {
// \Log::error("User filtering failed: " . $e->getMessage());
// return response()->json([
// 'success' => false,
// 'message' => 'Something went wrong.',
// ]);
// }
// }
public function get_user_data(Request $request)
{
try {
$token = readHeaderToken();
if ($token) {
$user_id = $token['sub'];
//get user data for check gender and group level
$user = User::with('user_detail')->find($user_id);
//request inputs
$sortOrder = $request->input('sort_order');
$gender = "all";
// if($gender != "all"){
// $gender = $request->input('gender');
// }
// else{
// $gender = "all";
// }
$groupLevelFilter = $request->input('group_level');
// Retrieve the user's ranking and related user details
$query = LeaderboardMaster::with('user', 'user_data','user.stepCount');
// for gender
// $gender = "all";
if($request->has('gender')){
$gender = $request->input('gender');
// Apply gender filter
if ($gender != "all") {
$query->whereHas('user_data', function ($query) use ($gender) {
$query->where('gender', '=', $gender);
});
}
}
// else{
// $gender = $user->user_detail->gender;
// if($gender){
// if ($gender && in_array($gender, ['male', 'female'])) {
// $query->whereHas('user_data', function ($query) use ($gender) {
// $query->where('gender', '=', $gender);
// });
// }
// }
// }
//for group level
$elite = GroupLevelElites();
$game_changer = GroupLevelGameChanger();
$flattenedEliteArray = Arr::flatten($elite['elites_user_id']);
$flattenedGameChangerArray = Arr::flatten($game_changer['all_top_users_id']);
$filteredGameChangerArray = array_diff($flattenedGameChangerArray, $flattenedEliteArray);
if($request->has('group_level')){
if ($groupLevelFilter === 'elites') {
// Apply elites filter
$group_level = "elites";
$query->whereIn('user_id', $flattenedEliteArray);
} elseif ($groupLevelFilter === 'gameChangers') {
// Apply gameChangers filter
$group_level = "gameChangers";
$query->whereIn('user_id', $filteredGameChangerArray);
} elseif ($groupLevelFilter === 'underdogs') {
// Apply underdogs filter
$group_level = "underdogs";
$query->whereNotIn('user_id', $flattenedGameChangerArray);
} else {
return response()->json([
'success' => false,
'message' => 'Invalid group level filter.',
]);
}
}
else{
if (in_array($user_id, $flattenedEliteArray)) {
$group_level = "elites";
$query->whereIn('user_id', $flattenedEliteArray);
} elseif (in_array($user_id, $filteredGameChangerArray)) {
$group_level = "gameChangers";
$query->whereIn('user_id', $filteredGameChangerArray);
} else {
$group_level = "underdogs";
$query->whereNotIn('user_id', $flattenedGameChangerArray);
}
}
// Apply sorting
if ($sortOrder === 'asc') {
$query->orderBy('total_score', 'asc');
} else {
$query->orderBy('total_score', 'desc');
}
//final query
$user_data = $query->get()->toArray();
return response()->json([
'success' => true,
// 'user_data' => $user_data,
'message' => 'Data Fetch Successfully!.',
'user_data' => $user_data,
'gender' => $gender,
'group_level' => $group_level
]);
} else {
return response()->json([
'success' => false,
'message' => 'Authentication failed.',
]);
}
} catch (\Exception $e) {
\Log::error("Data retrieval failed: " . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Something went wrong.',
]);
}
}
public function get_user_data_home(Request $request)
{
try {
$token = readHeaderToken();
if ($token) {
$user_id = $token['sub'];
//get user data for check gender and group level
$user = User::with('user_detail')->find($user_id);
//request inputs
$sortOrder = $request->input('sort_order');
$gender = "all";
// if($gender != "all"){
// $gender = $request->input('gender');
// }
// else{
// $gender = "all";
// }
$groupLevelFilter = $request->input('group_level');
// Retrieve the user's ranking and related user details
$query = LeaderboardMaster::with('user', 'user_data');
// for gender
// $gender = "all";
if($request->has('gender')){
$gender = $request->input('gender');
// Apply gender filter
if ($gender != "all") {
$query->whereHas('user_data', function ($query) use ($gender) {
$query->where('gender', '=', $gender);
});
}
}
// else{
// $gender = $user->user_detail->gender;
// if($gender){
// if ($gender && in_array($gender, ['male', 'female'])) {
// $query->whereHas('user_data', function ($query) use ($gender) {
// $query->where('gender', '=', $gender);
// });
// }
// }
// }
//for group level
$elite = GroupLevelElites();
$game_changer = GroupLevelGameChanger();
$flattenedEliteArray = Arr::flatten($elite['elites_user_id']);
$flattenedGameChangerArray = Arr::flatten($game_changer['all_top_users_id']);
$filteredGameChangerArray = array_diff($flattenedGameChangerArray, $flattenedEliteArray);
if($request->has('group_level')){
if ($groupLevelFilter === 'elites') {
// Apply elites filter
$group_level = "elites";
$query->whereIn('user_id', $flattenedEliteArray);
} elseif ($groupLevelFilter === 'gameChangers') {
// Apply gameChangers filter
$group_level = "gameChangers";
$query->whereIn('user_id', $filteredGameChangerArray);
} elseif ($groupLevelFilter === 'underdogs') {
// Apply underdogs filter
$group_level = "underdogs";
$query->whereNotIn('user_id', $flattenedGameChangerArray);
} else {
return response()->json([
'success' => false,
'message' => 'Invalid group level filter.',
]);
}
}
else{
if (in_array($user_id, $flattenedEliteArray)) {
$group_level = "elites";
$query->whereIn('user_id', $flattenedEliteArray);
} elseif (in_array($user_id, $filteredGameChangerArray)) {
$group_level = "gameChangers";
$query->whereIn('user_id', $filteredGameChangerArray);
} else {
$group_level = "underdogs";
$query->whereNotIn('user_id', $flattenedGameChangerArray);
}
}
// Apply sorting
if ($sortOrder === 'asc') {
$query->orderBy('total_score', 'asc');
} else {
$query->orderBy('total_score', 'desc');
}
//final query
$user_data = $query->get()->toArray();
return response()->json([
'success' => true,
// 'user_data' => $user_data,
'message' => 'Data Fetch Successfully!.',
'user_data' => $user_data,
'gender' => $gender,
'group_level' => $group_level
]);
} else {
return response()->json([
'success' => false,
'message' => 'Authentication failed.',
]);
}
} catch (\Exception $e) {
\Log::error("Data retrieval failed: " . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Something went wrong.',
]);
}
}
public function ranking_position(){
try {
$token = readHeaderToken();
$currentYear = now()->format('Y');
// $currentYear = 2023;
$currentMonth = Carbon::now()->format('m');
// $currentMonth = 9;
$users = User::where('status','1')->get();
foreach ($users as $user) {
$userId = $user->id;
$user = User::with('user_detail')->find($userId);
$query = LeaderboardMaster::with('user', 'user_data');
//get gender
// $gender = $user->user_detail->gender ;
// if ($gender && in_array($gender, ['male', 'female'])) {
// $query->whereHas('user_data', function ($query) use ($gender) {
// $query->where('gender', '=', $gender);
// });
// }
//for group level
$elite = GroupLevelElites();
$game_changer = GroupLevelGameChanger();
$flattenedEliteArray = Arr::flatten($elite['elites_user_id']);
$flattenedGameChangerArray = Arr::flatten($game_changer['all_top_users_id']);
$filteredGameChangerArray = array_diff($flattenedGameChangerArray, $flattenedEliteArray);
if (in_array($userId, $flattenedEliteArray)) {
$group_level = 1;
$query->whereIn('user_id', $flattenedEliteArray);
$user_list = $query->orderBy('total_score', 'desc')->get();
} elseif (in_array($userId, $filteredGameChangerArray)) {
$group_level = 2;
$query->whereIn('user_id', $filteredGameChangerArray);
$user_list = $query->orderBy('total_score', 'desc')->get();
} else {
$group_level = 3;
$query->whereNotIn('user_id', $flattenedGameChangerArray);
$user_list = $query->orderBy('total_score', 'desc')->get();
}
$position = null;
foreach ($user_list as $index => $user){
if($user->user_id == $userId){
$position = $index + 1;
break;
}
}
$existingPositionRecord = MonthlyPosition::where([
'user_id' => $userId,
'month' => Carbon::createFromDate($currentYear, $currentMonth, 1)->format('Y-m'),
])->first();
if ($existingPositionRecord){
if($existingPositionRecord->group_level >= $group_level){
if($position < $existingPositionRecord->position || $group_level != $existingPositionRecord->group_level) {
$monthDate = Carbon::createFromDate($currentYear, $currentMonth, 1)->format('Y-m');
MonthlyPosition::updateOrCreate([
'user_id' => $userId,
'month' => $monthDate,
'position' => $position,
'group_levels' => $group_level,
]);
}
}
}else{
$monthDate = Carbon::createFromDate($currentYear, $currentMonth, 1)->format('Y-m');
MonthlyPosition::updateOrCreate([
'user_id' => $userId,
'month' => $monthDate,
'position' => $position,
'group_levels' => $group_level,
]);
}
}
return response()->json([
'success' => true,
'message' => 'Position Stored Successfully!.',
]);
} catch (Exception $ex) {
\Log::error("Data retrieval failed: " . $e->getMessage());
return response()->json([
'success' => false,
'message' => 'Something went wrong.',
]);
}
}
public function get_user_position(){
try {
$token = readHeaderToken();
if ($token) {
$user_id = $token['sub'];
$currentYear = now()->format('Y');
$yearStartDate = Carbon::createFromDate($currentYear, 1, 1)->format('Y-m-d');
$yearEndDate = Carbon::createFromDate($currentYear, 12, 31)->format('Y-m-d');
// Get all the data for the user for the entire current year
$user_monthly_positions = MonthlyPosition::whereBetween('month', [$yearStartDate, $yearEndDate])
->where('user_id', $user_id)
->orderBy('month', 'asc')
->get();
// Create empty records for missing months
$allMonths = collect([]);
$currentMonthDate = Carbon::createFromDate($currentYear, 1, 1);
for ($month = 1; $month <= 12; $month++) {
$allMonths->push($currentMonthDate->format('Y-m'));
$currentMonthDate->addMonth();
}
// Merge empty records for missing months into the original collection
$user_monthly_positions = $allMonths->map(function ($month) use ($user_monthly_positions, $user_id) {
return $user_monthly_positions->firstWhere('month', $month) ?? new MonthlyPosition([
'user_id' => $user_id,
'month' => $month,
'position' => null, // You can set a default value for the position here
]);
});
return response()->json([
'success' => true,
'message' => 'Data Fetch Successfully',
'monthly_positions' => $user_monthly_positions,
]);
}else {
return response()->json([
'success' => false,
'message' => 'Authentication failed.',
]);
}
} catch (Exception $ex) {
\Log::error("Data retrieval failed: " . $ex->getMessage());
return response()->json([
'success' => false,
'message' => 'Something went wrong.',
]);
}
}
public function get_daily_user_position(){
try {
$token = readHeaderToken();
if ($token) {
$userId = $token['sub'];
$user = User::with('user_detail')->find($userId);
// $user_list = LeaderboardMaster::orderBy('total_score', 'desc')->get();
$query = LeaderboardMaster::with('user', 'user_data');
//get gender
// $gender = $user->user_detail->gender;
// if($gender){
// if ($gender && in_array($gender, ['male', 'female'])) {
// $query->whereHas('user_data', function ($query) use ($gender) {
// $query->where('gender', '=', $gender);
// });
// }
// }
//for group level
$elite = GroupLevelElites();
$game_changer = GroupLevelGameChanger();
$flattenedEliteArray = Arr::flatten($elite['elites_user_id']);
$flattenedGameChangerArray = Arr::flatten($game_changer['all_top_users_id']);
$filteredGameChangerArray = array_diff($flattenedGameChangerArray, $flattenedEliteArray);
if (in_array($userId, $flattenedEliteArray)) {
$group_level = "elites";
$query->whereIn('user_id', $flattenedEliteArray);
} elseif (in_array($userId, $filteredGameChangerArray)) {
$group_level = "gameChangers";
$query->whereIn('user_id', $filteredGameChangerArray);
} else {
$group_level = "underdogs";
$query->whereNotIn('user_id', $flattenedGameChangerArray);
}
//final query
$user_list = $query->orderBy('total_score', 'desc')->get();
$position = null;
foreach ($user_list as $index => $user){
if($user->user_id == $userId){
$position = $index + 1;
break;
}
}
return response()->json([
'success' => true,
'message' => 'Data Fetch Successfully',
'daily_position' => $position,
]);
}else {
return response()->json([
'success' => false,
'message' => 'Authentication failed.',
]);
}
} catch (Exception $ex) {
\Log::error("Data retrieval failed: " . $ex->getMessage());
return response()->json([
'success' => false,
'message' => 'Something went wrong.',
]);
}
}
}