File: /mnt/data/ghayatcom/ghayatcom-api/app/Http/Controllers/Api/FamilyTreeController.php
<?php
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\UserMedicalhistory;
use App\FamilyTree;
use Illuminate\Support\Facades\Validator;
use App\Http\Requests\UserIdRequest;
use Illuminate\Support\Carbon;
use DB;
use Auth;
class FamilyTreeController extends Controller
{
public function index(Request $request)
{
}
public function show(UserIdRequest $request)
{
try {
$tree = FamilyTree::where('user_id', $request->user_id)->first();
if($tree) {
return self::sentResponse(200, $tree, __('digimed_validation.success_response.data_fetch_success'));
} else {
return self::sentResponse(201, [], __('digimed_validation.error_response.user_not_found'));
}
} catch (Exception | Throwable | QueryException $e) {
return self::sentResponse(500, [], $e->getMessage());
}
}
public function store(UserIdRequest $request)
{
try {
$tree = FamilyTree::where('user_id', $request->user_id)->first();
if($tree) {
$tree->updated_by = auth()->user()->id;
} else {
$tree = new FamilyTree();
$tree->user_id = $request->user_id;
$tree->created_by = auth()->user()->id;
}
$tree->tree_data = $request->tree_data;
$tree->save();
return self::sentResponse(200, [], __('digimed_validation.success_response.data_store_success'));
} catch (Exception | Throwable | QueryException $e) {
return self::sentResponse(500, [], $e->getMessage());
}
}
public function updateStatus(UserIdRequest $request)
{
try {
$tree = FamilyTree::where('user_id', $request->user_id)->first();
if($tree) {
$tree->updated_by = auth()->user()->id;
$tree->status = $request->status;
$tree->save();
return self::sentResponse(200, [], __('digimed_validation.success_response.data_update_success'));
} else {
return self::sentResponse(404, [], __('digimed_validation.error_response.user_not_found'));
}
} catch (Exception | Throwable | QueryException $e) {
return self::sentResponse(500, [], $e->getMessage());
}
}
public function familyTree(Request $request)
{
try {
$rules = [
// 'medical_history_id' => 'required',
'user_id' => 'required',
];
$messages = [
// 'medical_history_id.required' => __('digimed_validation.form_validation_error.medical_history_id_req'),
'user_id.required' => __('digimed_validation.form_validation_error.user_id_req'),
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return self::sentResponse(422, [], $validator->errors());
}
DB::beginTransaction();
$user_id = $request->user_id;
// $medical_history_id = $request->medical_history_id;
$medicalHistory = UserMedicalhistory::where('user_id',$user_id)->first()->toArray();
if(!$medicalHistory) {
return self::sentResponse(404, [], __('digimed_validation.form_validation_error.medical_history_not_found'));
}
$data = json_decode($medicalHistory['medical_history'], true);
$familyTree = $this->createFamilyTree($data);
return self::sentResponse(200, ['family_tree' => $familyTree], __('digimed_validation.success_response.family_tree_fetch_success'));
} catch (Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
//family tree web
public function familyTreeWeb(Request $request)
{
try {
$rules = [
'user_id' => 'required',
];
$messages = [
'user_id.in'=> __('digimed_validation.form_validation_error.user_id_req'),
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return self::sentResponse(422, [], $validator->errors());
}
DB::beginTransaction();
$user_id = $request->user_id;
$medicalHistory = UserMedicalhistory::where('user_id',$user_id)->first();
$familyTree = $medicalHistory->toArray();
if($medicalHistory){
$data['display_status'] = $medicalHistory['display_status'];
$data['medical_history_id'] = $medicalHistory['id'];
} else{
$data['display_status'] = 2;
}
if(!$medicalHistory) {
return response()->json([
'code' => '404',
'message' => __('digimed_validation.form_validation_error.medical_history_not_found'),
], 404);
}
$data['familyTree'] = json_decode($familyTree['medical_history'], true);
return self::sentResponse(200, ['family_tree' => $data], __('digimed_validation.success_response.family_tree_fetch_success'));
} catch (Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function statusUpdate(Request $request)
{
try{
$rules = [
'medical_history_id' => 'required',
'user_id' => 'required',
'display_status' => 'required|in:0,1',
];
$messages = [
'medical_history_id.required' => __('digimed_validation.form_validation_error.medical_history_id_req'),
'user_id.required' => __('digimed_validation.form_validation_error.user_id_req'),
'display_status.required' => __('digimed_validation.form_validation_error.display_status_required'),
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return self::sentResponse(422, [], $validator->errors());
}
$userMedicalHistory = UserMedicalhistory::find($request->medical_history_id);
if(!$userMedicalHistory) {
return response()->json([
'code' => '404',
'message' => __('digimed_validation.form_validation_error.medical_history_not_found'),
], 404);
}
$userMedicalHistory->display_status = $request->display_status;
$userMedicalHistory->reviewed_by = Auth::id();
if( $userMedicalHistory->save()){
return self::sentResponse(200, [], __('digimed_validation.success_response.medical_history_success'));
} else{
return response()->json([
'code' => '404',
'message' => __('digimed_validation.form_validation_error.medical_history_status_not_update'),
], 404);
}
} catch (Exception | Throwable | QueryException $e) {
return self::sentResponse(500, [], $e->getMessage());
}
}
//based on level
// private function createFamilyTree($data)
// {
// $familyTree = [
// 'level_1' => [],
// 'level_2' => [],
// 'level_3' => [],
// 'level_4' => []
// ];
// // Level 1
// if (isset($data['you']) && !empty($data['you'])) {
// $familyTree['level_1'][] = [
// 'relation' => 'You',
// 'details' => $data['you'][0]
// ];
// }
// // Level 2
// if (isset($data['mother']) && !empty($data['mother'])) {
// $familyTree['level_2'][] = [
// 'relation' => 'Mother',
// 'details' => $data['mother'][0]
// ];
// }
// if (isset($data['father']) && !empty($data['father'])) {
// $familyTree['level_2'][] = [
// 'relation' => 'Father',
// 'details' => $data['father'][0]
// ];
// }
// // Level 3
// if (isset($data['siblings']) && !empty($data['siblings'])) {
// foreach ($data['siblings'] as $sibling) {
// $familyTree['level_3'][] = [
// 'relation' => 'Sibling',
// 'details' => $sibling
// ];
// }
// }
// if (isset($data['sisters']) && !empty($data['sisters'])) {
// foreach ($data['sisters'] as $sister) {
// $familyTree['level_3'][] = [
// 'relation' => 'Sister',
// 'details' => $sister
// ];
// }
// }
// if (isset($data['wife']) && !empty($data['wife'])) {
// $familyTree['level_3'][] = [
// 'relation' => 'Wife',
// 'details' => $data['wife'][0]
// ];
// }
// if (isset($data['husband']) && !empty($data['husband'])) {
// $familyTree['level_3'][] = [
// 'relation' => 'Husband',
// 'details' => $data['husband'][0]
// ];
// }
// return $familyTree;
// }
//based on parent children
private function createFamilyTree($inputData)
{
function mapMember($name, $attributes, $children = [])
{
return [
'name' => $name,
'attributes' => $attributes,
'children' => $children,
];
}
// Utility function to calculate age from DOB
function calculateAge($dob)
{
return Carbon::now()->diffInYears(Carbon::parse($dob));
}
// Build the family tree dynamically based on input
$familyTree = mapMember(
'Grandfather',
[
'age' => calculateAge($inputData['grand_father'][0]['dob']),
'dob' => $inputData['grand_father'][0]['dob'],
'common_disease' => $inputData['grand_father'][0]['common_disease'] ?? null,
'ethnicity' => $inputData['grand_father'][0]['ethnicity'] ?? null,
],
[
mapMember(
'Father',
[
'age' => calculateAge($inputData['father'][0]['dob']),
'dob' => $inputData['father'][0]['dob'],
'common_disease' => $inputData['father'][0]['common_disease'] ?? null,
'ethnicity' => $inputData['father'][0]['ethnicity'] ?? null,
],
[
mapMember(
'You',
[
'preventive_scan' => $inputData['you'][0]['preventive_scan'], // Add dynamic calculation if needed
'hereditary_disease' => $inputData['you'][0]['hereditary_disease'],
'chronic_diseases' => $inputData['you'][0]['chronic_diseases'], // Add dynamic calculation if needed
'disease_name' => $inputData['you'][0]['disease_name'],
'common_disease' => $inputData['you'][0]['common_disease'], // Add dynamic calculation if needed
'isCancer_diagnised' => $inputData['you'][0]['isCancer_diagnised'],
'famiy_diagonised' => $inputData['you'][0]['famiy_diagonised'], // Add dynamic calculation if needed
'cancer_type' => $inputData['you'][0]['cancer_type'],
'heredity_carrier' => $inputData['you'][0]['heredity_carrier'], // Add dynamic calculation if needed
'carrier_disease_name' => $inputData['you'][0]['carrier_disease_name'],
'is_geneticVariant' => $inputData['you'][0]['is_geneticVariant'], // Add dynamic calculation if needed
'genetic_variant' => $inputData['you'][0]['genetic_variant'],
],
[
mapMember(
'wife',
[
'age' => 3, // Add dynamic calculation if needed
'dob' => '2021-11-20',
'job' => 'Toddler',
]
),
]
),
]
),
mapMember(
'Grandmother',
[
'age' => calculateAge($inputData['grand_mother'][0]['dob']),
'dob' => $inputData['grand_mother'][0]['dob'],
'common_disease' => $inputData['grand_mother'][0]['common_disease'] ?? null,
'ethnicity' => $inputData['grand_mother'][0]['ethnicity'] ?? null,
]
),
]
);
return $familyTree;
}
}