initial: bootstrap from BukidBountyApp base
This commit is contained in:
219
app/Http/Controllers/Pages/AccountSettingsPageController.php
Normal file
219
app/Http/Controllers/Pages/AccountSettingsPageController.php
Normal file
@@ -0,0 +1,219 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Pages;
|
||||
|
||||
use Hypervel\Http\Request;
|
||||
use App\Models\User;
|
||||
|
||||
use Hypervel\Support\Facades\Auth;
|
||||
use Hypervel\Support\Facades\Log;
|
||||
use Hypervel\Support\Facades\Redis;
|
||||
use Hypervel\Support\Facades\Response;
|
||||
|
||||
use Hypervel\Support\Facades\Hash;
|
||||
use Hypervel\Support\Facades\Session;
|
||||
|
||||
use App\Http\Controllers\Pages\PageController;
|
||||
|
||||
class AccountSettingsPageController
|
||||
{
|
||||
|
||||
public $JSCommands = [
|
||||
'SetDarkMode' => "UISetDarkMode();"
|
||||
];
|
||||
|
||||
public function listDetails()
|
||||
{
|
||||
$currentuser = User::findOrFail(Auth::id());
|
||||
$res = [];
|
||||
|
||||
$res['photourl'] = $currentuser->photourl[0] ?? '';
|
||||
$res['mobile'] = $currentuser->mobile_number ?? '';
|
||||
$res['name'] = $currentuser->name ?? $currentuser->nickname ?? $currentuser->fullname ?? $currentuser->username ?? '';
|
||||
$res['fullname'] = $currentuser->fullname ?? $currentuser->name ?? '';
|
||||
$res['nickname'] = $currentuser->nickname ?? $currentuser->username ?? '';
|
||||
$res['joined'] = $currentuser->created_at ?? '';
|
||||
$res['referralcode'] = $currentuser->referralcode ?? '';
|
||||
$res['email'] = $currentuser->email ?? '';
|
||||
$res['landline'] = $currentuser->landline ?? '';
|
||||
$res['hashkey'] = $currentuser->hashkey ?? '';
|
||||
$res['total_balance'] = $currentuser->total_balance ?? 0;
|
||||
$res['settings'] = $currentuser->settings ?? [];
|
||||
|
||||
|
||||
return Response::json($res ?: []);
|
||||
}
|
||||
|
||||
public function listSettings()
|
||||
{
|
||||
return Response::json(Auth::user()->settings);
|
||||
}
|
||||
|
||||
|
||||
public function listRunScripts()
|
||||
{
|
||||
$scripts = '';
|
||||
$settings = Auth::user()->settings;
|
||||
$darkmode = $settings['dark_mode'] ?? $settings['darkmode'] ?? false;
|
||||
|
||||
|
||||
|
||||
if ($darkmode) {
|
||||
$scripts .= $this->JSCommands['SetDarkMode'];
|
||||
}
|
||||
|
||||
Response::raw($scripts);
|
||||
}
|
||||
|
||||
public function changepassword(Request $request)
|
||||
{
|
||||
|
||||
$validated = $request->validate([
|
||||
'current_password' => 'required|string',
|
||||
'new_password' => 'required|string|min:6',
|
||||
'new_confirm_password' => 'required|string|same:new_password',
|
||||
]);
|
||||
|
||||
if (!$validated['current_password'] or !$validated['new_password'] or !$validated['new_confirm_password']) {
|
||||
return Response::json(['message' => 'Enter Old Password, New Password and Password Confirmation.'], 400);
|
||||
}
|
||||
|
||||
try {
|
||||
$user = User::findOrFail(Auth::id());
|
||||
} catch (\Throwable $th) {
|
||||
return Response::json(['message' => 'Internal server error during credit transfer'], 500);
|
||||
}
|
||||
|
||||
$newhash = Hash::make($validated['current_password']);
|
||||
if (!Hash::check($validated['current_password'], $user->password)) {
|
||||
return Response::json(['message' => 'Your current password is incorrect.'], 400);
|
||||
}
|
||||
|
||||
$user->password = Hash::make($validated['new_password']);
|
||||
$user->save();
|
||||
return Response::json(['message' => 'Password changed successfully'], 200);
|
||||
}
|
||||
|
||||
public function getUserNotes()
|
||||
{
|
||||
try {
|
||||
$user = User::findOrFail(Auth::id());
|
||||
return Response::json($user->notes, 200);
|
||||
} catch (\Throwable $th) {
|
||||
return Response::json(['message' => 'User Not Found!'], 404);
|
||||
}
|
||||
}
|
||||
|
||||
public function clearUserNotes()
|
||||
{
|
||||
try {
|
||||
$user = User::findOrFail(Auth::id());
|
||||
$user->notes='';
|
||||
$user->save();
|
||||
return Response::json(['success' => true], 200);
|
||||
} catch (\Throwable $th) {
|
||||
return Response::json(['message' => 'User Not Found!'], 404);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function logoutnow()
|
||||
{
|
||||
$sessionId = session()?->getId();
|
||||
$user = Auth::user();
|
||||
|
||||
Log::info('[Logout] Attempting logout for session: ' . $sessionId);
|
||||
|
||||
if ($user && isset($user->hashkey)) {
|
||||
// Signal SSE streams to terminate
|
||||
Redis::setex("forced_logout:{$user->hashkey}", 60, "1");
|
||||
Log::info('[Logout] Forced logout signal set for user: ' . $user->hashkey);
|
||||
}
|
||||
|
||||
// Logout from all possible guards
|
||||
Auth::logout();
|
||||
try {
|
||||
if (Auth::guard('jwt')->check()) {
|
||||
Auth::guard('jwt')->logout();
|
||||
}
|
||||
} catch (\Throwable $th) {
|
||||
// Ignore if JWT guard is not properly configured
|
||||
}
|
||||
|
||||
if (session()) {
|
||||
session()->flush();
|
||||
session()->invalidate();
|
||||
Log::info('[Logout] Session invalidated. New ID: ' . session()->getId());
|
||||
}
|
||||
|
||||
// Forced Redis destruction for THIS session ID (covers multiple prefix formats)
|
||||
if ($sessionId) {
|
||||
$prefix = config('cache.prefix', 'bukidbountyapp_cache');
|
||||
|
||||
// Try idiomatic Cache forget first (handles prefixing automatically)
|
||||
\Hypervel\Support\Facades\Cache::forget($sessionId);
|
||||
|
||||
// Try manual Redis deletion for both common prefix patterns (with and without colon)
|
||||
Redis::del(($prefix ? $prefix . ':' : '') . $sessionId);
|
||||
Redis::del(($prefix ? $prefix : '') . $sessionId);
|
||||
|
||||
Log::info('[Logout] Forced Redis/Cache deletion for session: ' . $sessionId);
|
||||
}
|
||||
|
||||
return redirect('/login?logged_out=1');
|
||||
}
|
||||
|
||||
|
||||
public function updatePhoto(Request $request)
|
||||
{
|
||||
if (!$request->hasFile('photo')) {
|
||||
return Response::json(['success' => false, 'message' => 'No photo uploaded'], 400);
|
||||
}
|
||||
|
||||
try {
|
||||
$user = User::findOrFail(Auth::id());
|
||||
$file = $request->file('photo');
|
||||
$filename = $file->getClientFilename();
|
||||
|
||||
// Upload the file using FilesMainController
|
||||
$result = \App\Http\Controllers\FilesMainController::uploadFileList(
|
||||
$file,
|
||||
'User Profile Photo: ' . $user->username,
|
||||
$filename ?? 'profile_photo.jpg',
|
||||
'Uploaded by ' . $user->username,
|
||||
['user_id' => $user->id, 'type' => 'profile_photo'],
|
||||
'user_photos',
|
||||
['profile_photo'],
|
||||
0,
|
||||
'profile_photo',
|
||||
);
|
||||
|
||||
// If it's a response object, it might be an error response from uploadFileList
|
||||
if (is_object($result) && method_exists($result, 'getStatusCode')) {
|
||||
return $result;
|
||||
}
|
||||
|
||||
if ($result && isset($result->hashkey)) {
|
||||
$photoUrl = $result->resolvedUrl();
|
||||
|
||||
// Update user photoUrl array
|
||||
$user->photourl = [$photoUrl];
|
||||
$user->save();
|
||||
|
||||
return Response::json([
|
||||
'success' => true,
|
||||
'message' => 'Photo updated successfully',
|
||||
'url' => $photoUrl
|
||||
]);
|
||||
}
|
||||
|
||||
return Response::json(['success' => false, 'message' => 'Failed to process file upload: No result hashkey.'], 500);
|
||||
|
||||
} catch (\Throwable $th) {
|
||||
return Response::json(['success' => false, 'message' => $th->getMessage()], 500);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
34
app/Http/Controllers/Pages/Core/ApplicationController.php
Normal file
34
app/Http/Controllers/Pages/Core/ApplicationController.php
Normal file
@@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Pages;
|
||||
|
||||
use Hypervel\Http\Request;
|
||||
use App\Models\User;
|
||||
|
||||
use Hypervel\Support\Facades\Auth;
|
||||
use Hypervel\Support\Facades\Response;
|
||||
|
||||
use Hypervel\Support\Facades\Hash;
|
||||
use Hypervel\Support\Facades\Session;
|
||||
|
||||
use App\Http\Controllers\Pages\Core;
|
||||
|
||||
class ApplicationController
|
||||
{
|
||||
|
||||
public $JSCommands = [
|
||||
'SetDarkMode' => "UISetDarkMode();"
|
||||
];
|
||||
|
||||
public function logout()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
28
app/Http/Controllers/Pages/Core/HomeController.php
Normal file
28
app/Http/Controllers/Pages/Core/HomeController.php
Normal file
@@ -0,0 +1,28 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Pages;
|
||||
|
||||
use Hypervel\Http\Request;
|
||||
use App\Models\User;
|
||||
|
||||
use Hypervel\Support\Facades\Auth;
|
||||
use Hypervel\Support\Facades\Response;
|
||||
|
||||
use Hypervel\Support\Facades\Hash;
|
||||
use Hypervel\Support\Facades\Session;
|
||||
|
||||
use App\Http\Controllers\Pages\Core;
|
||||
|
||||
class HomeController
|
||||
{
|
||||
|
||||
public function index()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
20
app/Http/Controllers/Pages/PageController.php
Normal file
20
app/Http/Controllers/Pages/PageController.php
Normal file
@@ -0,0 +1,20 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Pages;
|
||||
|
||||
use Hypervel\Http\Request;
|
||||
use Hypervel\Support\Facades\Response;
|
||||
|
||||
class PageController
|
||||
{
|
||||
public static function PageResponse($data)
|
||||
{
|
||||
if ($data) {
|
||||
return Response::json($data, 200);
|
||||
} else {
|
||||
return Response::json(false, 404);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Pages;
|
||||
|
||||
use Hypervel\Http\Request;
|
||||
use Hypervel\Support\Facades\Auth;
|
||||
use App\Models\User;
|
||||
use App\Enums\UserTypes;
|
||||
use App\Http\Controllers\Helpers\Permissions\UserPermissions;
|
||||
|
||||
class TransferMyCreditPageController
|
||||
{
|
||||
use PageResponses_TransferMyCredit;
|
||||
|
||||
public static function TransferMyCredit(string $hashkey, float $amount)
|
||||
{
|
||||
$currentuser = Auth::id();
|
||||
$currentuser = User::findOrFail($currentuser);
|
||||
if ($amount <= 0) {
|
||||
throw new \Exception('Invalid amount');
|
||||
}
|
||||
|
||||
try {
|
||||
$target_user = User::where('hashkey', $hashkey)->first();
|
||||
$currentUserBalance = $currentuser->total_balance;
|
||||
|
||||
if ($currentuser->acct_type !== UserTypes::ULTIMATE && $currentUserBalance < $amount) {
|
||||
throw new \Exception('Insufficient balance');
|
||||
}
|
||||
|
||||
if (!$target_user) {
|
||||
throw new \Exception('User not found');
|
||||
}
|
||||
|
||||
if ($target_user->id === $currentuser->id) {
|
||||
throw new \Exception('You cannot transfer points to yourself');
|
||||
}
|
||||
|
||||
if (!UserPermissions::isDirectCreditTransfertoUserAllowed($hashkey)) {
|
||||
throw new \Exception('Permission Denied');
|
||||
}
|
||||
|
||||
|
||||
//Add function to subtract from current user
|
||||
if ($currentuser->acct_type !== UserTypes::ULTIMATE) {
|
||||
$currentuser->total_balance -= $amount;
|
||||
$currentuser->save();
|
||||
}
|
||||
|
||||
$target_user->total_balance += $amount;
|
||||
$target_user->save();
|
||||
|
||||
return true;
|
||||
|
||||
} catch (\Throwable $th) {
|
||||
throw new \Exception( $th->getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
trait PageResponses_TransferMyCredit
|
||||
{
|
||||
public function Response_TransferMyCredit(Request $request)
|
||||
{
|
||||
$target_user = $request->input('target_user');
|
||||
$amount = $request->input('amount');
|
||||
if (!$target_user || !is_string($target_user) || !$amount || !is_numeric($amount)) {
|
||||
return Response::json(false, 404);
|
||||
}
|
||||
try {
|
||||
$success = self::TransferMyCredit($target_user, (float) $amount);
|
||||
} catch (\Throwable $th) {
|
||||
return response()->json($th->getMessage(), 500);
|
||||
}
|
||||
|
||||
if (!$success) {
|
||||
return response()->json('User not found or transfer failed', 400);
|
||||
}
|
||||
|
||||
return response()->json(true, 200);
|
||||
}
|
||||
}
|
||||
89
app/Http/Controllers/Pages/UserListPageController.php
Normal file
89
app/Http/Controllers/Pages/UserListPageController.php
Normal file
@@ -0,0 +1,89 @@
|
||||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace App\Http\Controllers\Pages;
|
||||
|
||||
use Hypervel\Http\Request;
|
||||
use App\Models\User;
|
||||
use Hypervel\Support\Facades\Auth;
|
||||
|
||||
use Hypervel\Support\Facades\Response;
|
||||
use App\Enums\UserTypes;
|
||||
|
||||
use App\Http\Controllers\Pages\PageController;
|
||||
|
||||
class UserListPageController
|
||||
{
|
||||
public static function ListChildren($id)
|
||||
{
|
||||
$users = User::findOrFail($id);
|
||||
$children = $users->getAllDescendants()->map(function ($child) {
|
||||
$store_hashkey = null;
|
||||
if ($child->hasRole(['store owner', 'store manager'])) {
|
||||
$store = \App\Models\Market\Store::where('owner_id', $child->id)
|
||||
->orWhere('manager_id', $child->id)
|
||||
->first();
|
||||
$store_hashkey = $store?->hashkey;
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $child->id,
|
||||
'hashkey' => $child->hashkey,
|
||||
'mobile_number' => $child->mobile_number,
|
||||
'total_balance' => $child->total_balance,
|
||||
'acct_type' => $child->acct_type,
|
||||
'is_active' => (bool)$child->active,
|
||||
'name' => $child->name,
|
||||
'fullname' => $child->fullname,
|
||||
'nickname' => $child->nickname,
|
||||
'username' => $child->username,
|
||||
'store_hashkey' => $store_hashkey,
|
||||
];
|
||||
});
|
||||
|
||||
return $children;
|
||||
}
|
||||
|
||||
public static function ListChildrenofCurrentUser()
|
||||
{
|
||||
if (Auth::user()->acct_type === UserTypes::ULTIMATE) {
|
||||
return User::all()->map(function ($user) {
|
||||
$store_hashkey = null;
|
||||
if ($user->hasRole(['store owner', 'store manager'])) {
|
||||
$store = \App\Models\Market\Store::where('owner_id', $user->id)
|
||||
->orWhere('manager_id', $user->id)
|
||||
->first();
|
||||
$store_hashkey = $store?->hashkey;
|
||||
}
|
||||
|
||||
return [
|
||||
'id' => $user->id,
|
||||
'hashkey' => $user->hashkey,
|
||||
'mobile_number' => $user->mobile_number,
|
||||
'total_balance' => $user->total_balance,
|
||||
'acct_type' => $user->acct_type,
|
||||
'is_active' => (bool)$user->active,
|
||||
'name' => $user->name,
|
||||
'fullname' => $user->fullname,
|
||||
'nickname' => $user->nickname,
|
||||
'username' => $user->username,
|
||||
'store_hashkey' => $store_hashkey,
|
||||
];
|
||||
});
|
||||
} else {
|
||||
return self::ListChildren(Auth::id());
|
||||
}
|
||||
}
|
||||
|
||||
public static function Response_ListChildrenofCurrentUser()
|
||||
{
|
||||
$currentuser_children = self::ListChildrenofCurrentUser();
|
||||
|
||||
return Response::json([
|
||||
'success' => true,
|
||||
'users' => $currentuser_children
|
||||
], 200);
|
||||
}
|
||||
|
||||
}
|
||||
1031
app/Http/Controllers/Pages/UserModifyAdminPageController.php
Normal file
1031
app/Http/Controllers/Pages/UserModifyAdminPageController.php
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user