<?php namespace App\Http\Controllers; use App\Models\Announcement; use App\Models\ClassGroup; use App\Models\ClassSchool; use App\Models\Faq; use App\Models\Feature; use App\Models\FeatureSection; use App\Models\Gallery; use App\Models\Language; use App\Models\Package; use App\Models\School; use App\Models\SchoolSetting; use App\Models\SessionYear; use App\Models\Slider; use App\Models\Stream; use App\Models\Students; use App\Models\User; use App\Repositories\ExtraFormField\ExtraFormFieldsInterface; use App\Repositories\Guidance\GuidanceInterface; use App\Repositories\SystemSetting\SystemSettingInterface; use App\Services\CachingService; use App\Services\GeneralFunctionService; use App\Services\ResponseService; use App\Services\SubscriptionService; use App\Services\UploadService; use App\Services\FeaturesService; use Carbon\Carbon; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Http\Request; use Illuminate\Routing\Controller as BaseController; use Illuminate\Support\Facades\Artisan; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Facades\Config; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Mail; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Hash; use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Validator; use Str; use Throwable; use App\Repositories\FormField\FormFieldsInterface; use App\Repositories\ContactInquiry\ContactInquiryInterface; class Controller extends BaseController { use AuthorizesRequests, DispatchesJobs, ValidatesRequests; private SystemSettingInterface $systemSettings; private GuidanceInterface $guidance; private SubscriptionService $subscriptionService; private CachingService $cache; private FormFieldsInterface $formFields; private ExtraFormFieldsInterface $extraFormFields; private ContactInquiryInterface $contactInquiry; public function __construct(SystemSettingInterface $systemSettings, GuidanceInterface $guidance, SubscriptionService $subscriptionService, CachingService $cache, FormFieldsInterface $formFields, ExtraFormFieldsInterface $extraFormFields, ContactInquiryInterface $contactInquiry) { $this->systemSettings = $systemSettings; $this->guidance = $guidance; $this->subscriptionService = $subscriptionService; $this->cache = $cache; $this->formFields = $formFields; $this->extraFormFields = $extraFormFields; $this->contactInquiry = $contactInquiry; } public function makeParentPassword($mobile) { return $mobile; } public function makeStudentPassword($dob) { return str_replace('-', '', date('d-m-Y', strtotime($dob))); } public function index() { $connection = DB::getDefaultConnection(); if ($connection == 'school' && Auth::user()) { return redirect('/dashboard'); } DB::setDefaultConnection('mysql'); Session::forget('school_database_name'); Session::put('school_database_name', null); if (Auth::user() && (Auth::user()->two_factor_enabled == 1 && Auth::user()->two_factor_expires_at)) { return redirect('/dashboard'); } if (Auth::user()) { return redirect('/dashboard'); } $currentDatabaseName = DB::connection()->getDatabaseName(); // School website $fullDomain = $_SERVER['HTTP_HOST']; $fullDomain = str_replace("www.", "", $fullDomain); $parts = explode('.', $fullDomain); $subdomain = $parts[0]; $school = ''; $extraFields = []; $demoSchoolUrl = ''; $isDemoSchool = 0; try { $demoDomain = School::where('type', 'demo')->where('status', 1)->pluck('domain')->first(); if ($demoDomain) { $baseUrl = url('/'); $baseUrlParts = parse_url($baseUrl); $host = $baseUrlParts['host']; $host = str_replace("www.", "", $host); $hostParts = explode('.', $host); $isDemoSchool = 1; // Check if it's a subdomain or main domain if (count($hostParts) < 2) { $hostParts[0] = $demoDomain; } else { array_unshift($hostParts, $demoDomain); } $newHost = implode('.', $hostParts); $demoSchoolUrl = $baseUrlParts['scheme'] . '://' . $newHost; if (!empty($baseUrlParts['port'])) { $demoSchoolUrl .= ':' . $baseUrlParts['port']; } if (!empty($baseUrlParts['path'])) { $demoSchoolUrl .= $baseUrlParts['path']; } } } catch (\Throwable $th) { } try { $school = School::on('mysql')->where('domain', $fullDomain)->orwhere('domain', $subdomain)->where('installed', 1)->first(); } catch (\Throwable $th) { } if ($school) { // Get current subscription features $subscription = $this->subscriptionService->active_subscription($school->id); if ($subscription) { $features = $subscription->subscription_feature->pluck('feature.name')->toArray(); $addons = $subscription->addons->pluck('feature.name')->toArray(); $features = array_merge($features, $addons); // Check website management feature if (in_array('Website Management', $features)) { return $this->school_website($school); } } } if ($this->isSchoolWebsiteRequest()) { $features = $this->cache->getFeatures(); $settings = app(CachingService::class)->getSystemSettings(); $schoolSettings = SchoolSetting::where('name', 'horizontal_logo')->get(); $about_us_lists = $settings['about_us_points'] ?? 'Affordable price, Easy to manage admin panel, Data Security'; $about_us_lists = explode(",", $about_us_lists); $faqs = $this->cache->getSystemFaqs(); $featureSections = FeatureSection::with('feature_section_list')->orderBy('rank', 'ASC')->get(); $guidances = $this->cache->getGuidances(); $languages = $this->cache->getLanguages(); $school = School::count(); $allSchools = School::all(); try { $student = User::role('Student')->whereHas('school', function ($q) { $q->whereNull('deleted_at')->where('status', 1); })->count(); $teacher = User::role('Teacher')->whereHas('school', function ($q) { $q->whereNull('deleted_at')->where('status', 1); })->count(); } catch (Throwable) { // If role does not exist in fresh installation then set the counter to 0 $student = 0; $teacher = 0; } $counter = [ 'school' => $school, 'student' => $student, 'teacher' => $teacher, ]; $packages = Package::where('status', 1)->with('package_feature.feature')->where('status', 1)->orderBy('rank', 'ASC')->get(); $trail_package = $packages->where('is_trial', 1)->first(); if ($trail_package) { $trail_package = $trail_package->id; } $extraFields = $this->cache->getSchoolExtraFields(); // // try { // $demoSchool = School::where('type', 'demo')->withTrashed()->first() !== null ? 1 : 0; // } catch (\Exception $e) { // $demoSchool = 0; // } return view('home', compact('features', 'packages', 'settings', 'faqs', 'guidances', 'languages', 'schoolSettings', 'featureSections', 'about_us_lists', 'counter', 'trail_package', 'extraFields', 'demoSchoolUrl', 'allSchools', 'isDemoSchool')); } else { if ($school && $school->status == 1) { return redirect()->route('login')->with('error', trans("Your current subscription does not include the Website Management Feature. To continue, you'll need to: 1) Upgrade to a plan that includes this Website Management Feature, or 2) Purchase the Website Management Feature Add-On")); } else { return redirect()->to(config('app.url')); } } // End school website } public function school_website($school) { Config::set('database.connections.school.database', $school->database_name); DB::purge('school'); DB::connection('school')->reconnect(); DB::setDefaultConnection('school'); $schoolSettings = $this->cache->getSchoolSettings('*', $school->id); $sliders = Slider::where('school_id', $school->id)->whereIn('type', [2, 3])->get(); if (!count($sliders)) { $sliders = [ url('assets/school/images/heroImg1.jpg'), url('assets/school/images/heroImg2.jpg'), ]; } $faqs = Faq::where('school_id', $school->id)->get(); $students = Students::where('school_id', $school->id)->whereHas('user', function ($q) { $q->where('status', 1); })->count(); $classes = ClassSchool::where('school_id', $school->id)->count(); $streams = Stream::where('school_id', $school->id)->count(); $counters = [ 'students' => $students, 'classes' => $classes, 'streams' => $streams, ]; $announcements = Announcement::where('school_id', $school->id)->whereHas('announcement_class', function ($q) { $q->where('class_subject_id', null); })->with('announcement_class.class_section.class.stream', 'announcement_class.class_section.section', 'announcement_class.class_section.medium', 'file')->where('session_year_id', $schoolSettings['session_year'] ?? null)->orderBy('id', 'DESC')->take(10)->get(); $class_groups = ClassGroup::where('school_id', $school->id)->get(); $slider_management = true; $features = app(FeaturesService::class)->getFeatures($school->id); if (!in_array('Slider Management', $features)) { $slider_management = false; } return view('school-website.index', compact('sliders', 'faqs', 'counters', 'announcements', 'class_groups', 'slider_management')); } public function isSchoolWebsiteRequest() { $host = request()->getHost(); $host = str_replace('www.', '', $host); $appUrlHost = parse_url(env('APP_URL'), PHP_URL_HOST); $appUrlHost = str_replace('www.', '', $appUrlHost); $isLocal = in_array(request()->ip(), ['127.0.0.1', '::1']); // Dump to see results // dd([ // 'Request Host' => $host, // 'App URL Host' => $appUrlHost, // 'Is Local' => $isLocal, // 'Matches' => ($host === $appUrlHost) // ]); // Check if the host is the same as the app URL host if ($host === $appUrlHost) { return true; }; if ($isLocal) { return true; } return false; } public function contact(Request $request) { try { $admin_email = app(CachingService::class)->getSystemSettings('mail_username'); $data = [ 'name' => $request->name, 'email' => $request->email, 'description' => $request->message, 'admin_email' => $admin_email ]; if (env('RECAPTCHA_SECRET_KEY') ?? '') { $validator = Validator::make( $request->all(), [ 'g-recaptcha-response' => 'required', ], [ 'g-recaptcha-response.required' => 'Please complete the human verification to proceed.', ] ); if ($validator->fails()) { ResponseService::errorResponse($validator->errors()->first()); } $googleCaptcha = app(GeneralFunctionService::class)->reCaptcha($request); if (!$googleCaptcha) { ResponseService::errorResponse('reCAPTCHA verification failed. Please try again.'); } } $this->contactInquiry->create($request->only(['name', 'email', 'message'])); Mail::send('contact', $data, static function ($message) use ($data) { $message->to($data['admin_email'])->subject('Get In Touch'); }); ResponseService::successResponse('Message send successfully'); } catch (Throwable $e) { if (Str::contains($e->getMessage(), ['Failed', 'Mail', 'Mailer', 'MailManager'])) { ResponseService::warningResponse("Data has been stored successfully, but the email could not be sent."); } else { ResponseService::errorResponse('Apologies for the Inconvenience: Please Try Again Later'); } } } public function cron_job() { Artisan::call('schedule:run'); } public function relatedDataIndex($table, $id) { $databaseName = config('database.connections.mysql.database'); //Fetch all the tables in which current table's id used as foreign key $relatedTables = DB::select("SELECT TABLE_NAME,COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE REFERENCED_TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $databaseName]); $data = []; foreach ($relatedTables as $relatedTable) { $q = DB::table($relatedTable->TABLE_NAME)->where($relatedTable->TABLE_NAME . "." . $relatedTable->COLUMN_NAME, $id); $data[$relatedTable->TABLE_NAME] = $this->buildRelatedJoinStatement($q, $relatedTable->TABLE_NAME)->get()->toArray(); } $currentDataQuery = DB::table($table); $currentData = $this->buildRelatedJoinStatement($currentDataQuery, $table)->first(); return view('related-data.index', compact('data', 'currentData', 'table')); } private function buildSelectStatement($query, $table) { $select = [ "classes" => "classes.*,CONCAT(classes.name,'(',mediums.name,')') as name,streams.name as stream_name,shifts.name as shift_name", "class_sections" => "class_sections.*,CONCAT(classes.name,' ',sections.name,'(',mediums.name,')') as class_section", "users" => "users.first_name,users.last_name", // "student_subjects" => "student_subjects.*,CONCAT(users.first_name,' ',users.last_name) as student," ]; return $query->select(DB::raw($select[$table] ?? "*," . $table . ".id as id")); } private function buildRelatedJoinStatement($query, $table) { $databaseName = config('database.connections.mysql.database'); // If all the child tables further have foreign keys than fetch that table also $getTableSchema = DB::select("SELECT CONSTRAINT_NAME, COLUMN_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM information_schema.KEY_COLUMN_USAGE WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ? AND REFERENCED_TABLE_NAME IS NOT NULL", [$table, $databaseName]); $tableAlias = []; //Build Join query for all the foreign key using the Table Schema foreach ($getTableSchema as $foreignKey) { //, 'edited_by', 'created_by', 'guardian_id' if ($foreignKey->REFERENCED_TABLE_NAME == $table) { //If Related table has foreign key of the same table then no need to add that in join to reduce the query load continue; } // Sometimes there will be same table is used in multiple foreign key at that time alias of the table should be different if (in_array($foreignKey->REFERENCED_TABLE_NAME, $tableAlias)) { $count = array_count_values($tableAlias)[$foreignKey->REFERENCED_TABLE_NAME] + 1; $currentAlias = $foreignKey->REFERENCED_TABLE_NAME . $count; } else { $currentAlias = $foreignKey->REFERENCED_TABLE_NAME; } $tableAlias[] = $foreignKey->REFERENCED_TABLE_NAME; if (!in_array($foreignKey->COLUMN_NAME, ['school_id', 'session_year_id'])) { $query->leftJoin($foreignKey->REFERENCED_TABLE_NAME . " as " . $currentAlias, $foreignKey->REFERENCED_TABLE_NAME . "." . $foreignKey->REFERENCED_COLUMN_NAME, '=', $table . "." . $foreignKey->COLUMN_NAME); } } return $this->buildSelectStatement($query, $table); } public function relatedDataDestroy($table, $id) { try { DB::table($table)->where('id', $id)->delete(); ResponseService::successResponse("Data Deleted Permanently"); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Controller -> relatedDataDestroy Method", 'cannot_delete_because_data_is_associated_with_other_data'); ResponseService::errorResponse(); } } public function about_us() { return view('school-website.about_us'); } public function contact_us() { $status = $this->checkPageStatus('contact_us_status'); if ($status['status'] == 0) { return redirect()->route('index'); } return view('school-website.contact'); } public function checkPageStatus($page) { $fullDomain = $_SERVER['HTTP_HOST']; $parts = explode('.', $fullDomain); $subdomain = $parts[0]; $fullDomain = str_replace('www.', '', $fullDomain); $subdomain = str_replace('www.', '', $subdomain); $school = School::on('mysql')->where('domain', $fullDomain)->orwhere('domain', $subdomain)->first(); Config::set('database.connections.school.database', $school->database_name); DB::purge('school'); DB::connection('school')->reconnect(); DB::setDefaultConnection('school'); $schoolSettings = $this->cache->getSchoolSettings('*', $school->id); $status = ''; if (($schoolSettings[$page] ?? 0) == 0 || ($schoolSettings[$page] ?? '') == null) { $status = 0; } else { $status = 1; } return [ 'school' => $school, 'status' => $status ]; } public function contact_form(Request $request) { $fullDomain = $_SERVER['HTTP_HOST']; $parts = explode('.', $fullDomain); $subdomain = $parts[0]; $fullDomain = str_replace('www.', '', $fullDomain); $subdomain = str_replace('www.', '', $subdomain); $school = School::on('mysql')->where('domain', $fullDomain)->orwhere('domain', $subdomain)->first(); // Verify google captcha $schoolSettings = $this->cache->getSchoolSettings('*', $school->id); if ($schoolSettings['SCHOOL_RECAPTCHA_SITE_KEY'] ?? '') { $validator = Validator::make( $request->all(), [ 'g-recaptcha-response' => 'required', ], [ 'g-recaptcha-response.required' => 'Please complete the human verification to proceed.', ] ); if ($validator->fails()) { ResponseService::errorResponse($validator->errors()->first()); } $googleCaptcha = app(GeneralFunctionService::class)->schoolreCaptcha($request, $schoolSettings); if (!$googleCaptcha) { ResponseService::errorResponse('reCAPTCHA verification failed. Please try again.'); } } try { $admin_email = app(CachingService::class)->getSystemSettings('mail_username'); $data = [ 'name' => $request->name, 'email' => $request->email, 'subject' => $request->subject, 'description' => $request->message, 'admin_email' => $admin_email, 'school_email' => $request->school_email ]; try { Config::set('database.connections.school.database', $school->database_name); DB::purge('school'); DB::connection('school')->reconnect(); DB::setDefaultConnection('school'); $this->contactInquiry->create($request->only(['name', 'email', 'subject', 'message'])); } catch (Throwable $e) { ResponseService::logErrorResponse($e, "Contact Form Controller -> contact_form Method"); } Mail::send('contact', $data, static function ($message) use ($data) { $message->to($data['school_email'])->subject($data['subject']); }); ResponseService::successResponse('Your message has been sent successfully. We will get back to you soon.'); } catch (Throwable $e) { if (Str::contains($e->getMessage(), ['Failed', 'Mail', 'Mailer', 'MailManager'])) { ResponseService::warningResponse("Data has been stored successfully, but the email could not be sent."); } else { ResponseService::errorResponse('Apologies for the Inconvenience: Please Try Again Later'); } } } public function photo() { $status = $this->checkPageStatus('gallery_status'); if ($status['status'] == 0) { return redirect()->route('index'); } return view('school-website.photo'); } public function photo_file($id) { try { $status = $this->checkPageStatus('gallery_status'); if ($status['status'] == 0) { return redirect()->route('index'); } $photos = Gallery::with([ 'file' => function ($q) { $q->where('type', 1); } ])->find($id); if ($photos) { return view('school-website.photo_file', compact('photos')); } else { return redirect('school/photos'); } } catch (\Throwable $th) { return redirect('school/photos'); } } public function video() { return view('school-website.video'); } public function video_file($id) { try { $videos = Gallery::with([ 'file' => function ($q) { $q->where('type', 2); } ])->find($id); if ($videos) { return view('school-website.video_file', compact('videos')); } else { return redirect('school/videos'); } } catch (\Throwable $th) { return redirect('school/videos'); } } public function terms_conditions() { return view('school-website.terms_conditions'); } public function privacy_policy() { return view('school-website.privacy_policy'); } public function refund_cancellation() { return view('school-website.refund_cancellation'); } public function systemLinks($type = null) { if ($type) { $faqs = Faq::where('school_id', null)->get(); $guidances = $this->guidance->builder()->get(); $languages = Language::get(); $settings = app(CachingService::class)->getSystemSettings(); $packages = Package::where('status', 1)->with('package_feature.feature')->where('status', 1)->orderBy('rank', 'ASC')->get(); $trail_package = $packages->where('is_trial', 1)->first(); if ($trail_package) { $trail_package = $trail_package->id; } $extraFields = $this->formFields->defaultModel()->orderBy('rank')->get(); return view('terms_conditions', compact('faqs', 'guidances', 'languages', 'settings', 'type', 'trail_package', 'extraFields')); } return redirect()->back(); } public function admission() { // School website $status = $this->checkPageStatus('online_registration_status'); if ($status['status'] == 0) { return redirect()->route('index'); } $school = $status['school']; // $schoolId = $school->id; $classes = ClassSchool::with('medium', 'stream', 'shift')->where('school_id', $school->id)->get(); if ($school) { $extraFields = $this->formFields->defaultModel()->where('user_type', 1)->orderBy('rank')->get(); } else { $extraFields = $this->formFields->defaultModel()->orderBy('rank')->get(); } return view('school-website.admission', compact('classes', 'extraFields')); } public function registerStudent(Request $request) { $status = $this->checkPageStatus('online_registration_status'); if ($status['status'] == 0) { return redirect()->route('index'); } $school = $status['school']; if ($school) { $extraFields = $this->formFields->defaultModel()->where('user_type', 1)->orderBy('rank')->get(); } else { $extraFields = $this->formFields->defaultModel()->orderBy('rank')->get(); } $request->validate([ 'first_name' => 'required', 'last_name' => 'required', 'mobile' => 'nullable|digits_between:6,15|regex:/^([0-9\s\-\+\(\)]*)$/', 'image' => 'nullable|mimes:jpeg,png,jpg,svg|image|max:2048', 'dob' => 'required', 'class_id' => 'required|numeric', /*NOTE : Unique constraint is used because it's not school specific*/ 'guardian_email' => 'required|email|max:255|regex:/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/', 'guardian_first_name' => 'required|string', 'guardian_last_name' => 'required|string', 'guardian_mobile' => 'required|numeric|digits_between:6,15', 'guardian_gender' => 'required|in:male,female', 'guardian_image' => 'nullable|mimes:jpg,jpeg,png|max:4096', 'status' => 'nullable|in:0,1', ], [ 'guardian_email.regex' => 'Please enter a valid guardian email (e.g. user@example.com).', ]); $rules = []; $messages = []; foreach ($extraFields as $key => $field) { if ($field->is_required) { $rules["extra_fields.$key.data"] = 'required'; // Type-specific rules switch ($field->type) { case 'number': $rules["extra_fields.$key.data"] .= '|numeric'; break; case 'email': $rules["extra_fields.$key.data"] .= '|email'; break; case 'file': $rules["extra_fields.$key.data"] .= '|file|mimes:jpg,png,pdf|max:2048'; break; } // Custom message $messages["extra_fields.$key.data.required"] = "{$field->name} is required."; } } $request->validate($rules, $messages); try { DB::beginTransaction(); $admission_date = Carbon::now()->format('Y-m-d'); $fullDomain = $_SERVER['HTTP_HOST']; $parts = explode('.', $fullDomain); $subdomain = $parts[0]; // remove www $fullDomain = str_replace('www.', '', $fullDomain); $subdomain = str_replace('www.', '', $subdomain); $school = School::on('mysql')->where('domain', $fullDomain)->orwhere('domain', $subdomain)->first(); Config::set('database.connections.school.database', $school->database_name); DB::purge('school'); DB::connection('school')->reconnect(); DB::setDefaultConnection('school'); // $defaultSessionYear = SessionYear::where('school_id',$school->id)->where('default', 1)->first(); $sessionYear = $this->cache->getDefaultSessionYear($school->id); $sessionYearId = $sessionYear->id; $get_student = Students::where('school_id', $school->id)->latest('id')->withTrashed()->pluck('id')->first(); $admission_no = $sessionYear->name . '0' . $school->id . '0' . ($get_student + 1); // Verify google captcha $schoolSettings = $this->cache->getSchoolSettings('*', $school->id); if ($schoolSettings['SCHOOL_RECAPTCHA_SITE_KEY'] ?? '') { $validator = Validator::make( $request->all(), [ 'g-recaptcha-response' => 'required', ], [ 'g-recaptcha-response.required' => 'Please complete the human verification to proceed.', ] ); if ($validator->fails()) { ResponseService::errorResponse($validator->errors()->first()); } $googleCaptcha = app(GeneralFunctionService::class)->schoolreCaptcha($request, $schoolSettings); if (!$googleCaptcha) { ResponseService::errorResponse('reCAPTCHA verification failed. Please try again.'); } } // Get the user details from the guardian details & identify whether that user is guardian or not. if not the guardian and has some other role then show appropriate message in response $guardianUser = User::whereHas('roles', function ($q) { $q->where('name', '!=', 'Guardian'); })->where('email', $request->guardian_email)->withTrashed()->first(); if ($guardianUser) { ResponseService::errorResponse("Email ID is already taken for Other Role"); } $password = $this->makeParentPassword($request->guardian_mobile); $parent = array( 'first_name' => $request->guardian_first_name, 'last_name' => $request->guardian_last_name, 'mobile' => $request->guardian_mobile, 'gender' => $request->guardian_gender, 'school_id' => $school->id ); //NOTE : This line will return the old values if the user is already exists $parentUser = User::where('email', $request->guardian_email)->first(); if (!empty($request->guardian_image)) { $parent['image'] = UploadService::upload($request->guardian_image, 'guardian'); } if (!empty($parentUser)) { if (isset($parent['image'])) { if ($parentUser->getRawOriginal('image') && Storage::disk('public')->exists($parentUser->getRawOriginal('image'))) { Storage::disk('public')->delete($parentUser->getRawOriginal('image')); } } $parentUser->update($parent); } else { $parent['password'] = Hash::make($password); $parent['email'] = $request->guardian_email; $parentUser = User::create($parent); $parentUser->assignRole('Guardian'); } $image = null; if ($request->hasFile('image')) { $image = UploadService::upload($request->image, 'user'); } $password = $this->makeStudentPassword($request->dob); //Create Student User First $user = User::create([ 'first_name' => $request->first_name, 'last_name' => $request->last_name, 'email' => $admission_no, 'mobile' => $request->mobile, 'dob' => date('Y-m-d', strtotime($request->dob)), 'gender' => $request->gender, 'password' => Hash::make($password), 'school_id' => $school->id, 'image' => $image, 'status' => 0, 'current_address' => $request->current_address, 'permanent_address' => $request->permanent_address, 'deleted_at' => $request->status == 1 ? null : '1970-01-01 01:00:00' ]); $user->assignRole('Student'); $student = Students::create([ 'user_id' => $user->id, 'class_section_id' => null, 'admission_no' => $admission_no, 'roll_number' => null, 'admission_date' => date('Y-m-d', strtotime($admission_date)), 'guardian_id' => $parentUser->id, 'session_year_id' => $sessionYearId, 'class_id' => $request->class_id ?? null, 'application_type' => "online", 'application_status' => 0, 'school_id' => $school->id, ]); $extraDetails = array(); foreach ($request->extra_fields ?? [] as $fields) { $data = null; if (isset($fields['data'])) { $data = (is_array($fields['data']) ? json_encode($fields['data'], JSON_THROW_ON_ERROR) : $fields['data']); } $extraDetails[] = array( 'user_id' => $user->id, 'form_field_id' => $fields['form_field_id'], 'data' => $data, 'school_id' => $school->id, ); } if (!empty($extraDetails)) { $this->extraFormFields->createBulk($extraDetails); } DB::commit(); ResponseService::successResponse('Student Registered successfully'); } catch (Throwable $e) { DB::rollBack(); ResponseService::logErrorResponse($e, "Student Controller -> Store method"); ResponseService::errorResponse(); } } public function school_db_test() { // return 1; // return $request; // Config::set('database.connections.school.database', 'eschool_saas_2_school'); // DB::purge('school'); // DB::connection('school')->reconnect(); // DB::setDefaultConnection('school'); return Auth::user(); } public function emailVerify() { try { $user = Auth::user(); if (!$user) { return redirect()->route('login')->with('error', trans('Please login to verify your email')); } DB::setDefaultConnection('mysql'); $mainUser = User::on('mysql')->where('id', $user->id)->first(); if (!$mainUser->hasVerifiedEmail()) { // Check if already verified in main MySQL database and sync if ($mainUser && $mainUser->email_verified_at) { // Already verified in main DB - sync to school database if ($user->school_id) { $school = School::where('id', $user->school_id)->first(); if ($school) { Config::set('database.connections.school.database', $school->database_name); DB::purge('school'); DB::connection('school')->reconnect(); DB::setDefaultConnection('school'); $user->email_verified_at = $mainUser->email_verified_at; $user->save(); } } } else { Auth::logout(); return redirect()->route('login'); } // Rate limit verification email sending (every 2 hours) $now = Carbon::now(); if ($now->diffInHours($user->updated_at) >= 2) { $user->sendEmailVerificationNotification(); $user->touch(); } // Show the verification notice view - keep user logged in // return view('auth.verify'); } // User is verified - sync to both databases if ($mainUser->email_verified_at) { DB::setDefaultConnection('mysql'); DB::connection('mysql')->table('users')->where('id', $user->id)->update(['email_verified_at' => $user->email_verified_at]); if ($user->school_id) { $school = School::where('id', $user->school_id)->first(); if ($school) { Config::set('database.connections.school.database', $school->database_name); DB::purge('school'); DB::connection('school')->reconnect(); DB::setDefaultConnection('school'); User::on('school')->where('id', $user->id)->update(['email_verified_at' => $user->email_verified_at]); } } } return redirect()->route('home'); } catch (\Throwable $th) { Auth::logout(); return redirect()->route('login')->with('error', trans('An error occurred Please try again later')); } } public function cacheFlush() { $school_database_name = Session::get('school_database_name'); if ($school_database_name) { DB::setDefaultConnection('school'); Config::set('database.connections.school.database', $school_database_name); DB::purge('school'); DB::connection('school')->reconnect(); DB::setDefaultConnection('school'); if (Auth::user()) { $this->cache->removeSchoolCache(config('constants.CACHE.SCHOOL.SETTINGS')); } } else { DB::purge('school'); DB::connection('mysql')->reconnect(); DB::setDefaultConnection('mysql'); $this->cache->removeSystemCache(config('constants.CACHE.SYSTEM.SETTINGS')); } // return DB::getDatabaseName(); Cache::flush(); Session::put('landing_locale', null); Session::save(); return redirect()->back(); } }