File: /mnt/data/ghayatcom/ghayatcom-api/app/Http/Controllers/Api/SubscriptionController.php
<?php
namespace App\Http\Controllers\api;
use App\Http\Controllers\Controller;
use App\SubscriptionPlan;
use App\SubscriptionPrice;
use App\SubscriptionDetail;
use App\Subscription;
use Illuminate\Support\Facades\Validator;
use Config;
use DB;
use Auth;
use Exception;
use Illuminate\Database\QueryException;
use Illuminate\Http\Request;
use Throwable;
class SubscriptionController extends Controller
{
/**
* @param Request $request
* @return string|null
**/
public function index(Request $request)
{
try {
$subscriptionLibrary = new \App\Library\SubscriptionLibrary;
$result = $subscriptionLibrary->list();
return self::sentResponse(200, $result, __('digimed_validation.success_response.data_fetch_success'));
} catch (Exception | Throwable | QueryException $e) {
DB::rollback();
return self::sentResponse(500, [], $e->getMessage());
}
}
public function subscriptionPlanCreate(Request $request)
{
try {
$rules = [
'name' => 'required|unique:subscription_plans,name,' . ($request->id ?? 'NULL') . ',id',
'description' => 'required',
'price' => 'required',
'currency_code' => 'required',
'interval' => 'required|in:month,year,day,week',
'isupdate' => 'required|in:0,1'
];
$messages = [
'name.required' => __('digimed_validation.form_validation_error.name_req'),
'description.required' => __('digimed_validation.form_validation_error.description_req'),
'price.required' => __('digimed_validation.form_validation_error.price_required'),
'currency_code.required' => __('digimed_validation.form_validation_error.currency_code_req'),
'interval.required' => __('digimed_validation.form_validation_error.interval_req'),
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return self::sentResponse(422, [], $validator->errors());
}
/** @var object $this */
$authRole = Auth::user();
$auth_id = auth()->user()->id;
$isUpdate = isset($request->id) ? true : false;
/**
* @var string $name
* @var string $description
*/
if($isUpdate){
// Update existing subscription
$subscription = SubscriptionPlan::find($request->id);
if (!$subscription) {
return self::sentResponse(404, [], __('digimed_validation.error_response.data_not_found'));
}
$subscription->name = $request->name;
$subscription->description = $request->description;
$subscription->updated_by = $auth_id;
$subscription->save();
$subscriptionPrice = SubscriptionPrice::where('plan_id', $subscription->id)->first();
if ($subscriptionPrice) {
$subscriptionPrice->amount = $request->price;
$subscriptionPrice->currency_code = $request->currency_code;
$subscriptionPrice->interval = $request->interval;
$subscriptionPrice->save();
}
return self::sentResponse(200, [], __('digimed_validation.success_response.subscription_edit_success'));
} else{
$subscription = new SubscriptionPlan();
$subscription->name = $request->name;
$subscription->description = $request->description;
$subscription->created_by = $auth_id;
$subscription->save();
$subscriptionPrice = new SubscriptionPrice();
$subscriptionPrice->plan_id = $subscription->id;
$subscriptionPrice->amount = $request->price;
$subscriptionPrice->currency_code = $request->currency_code;
$subscriptionPrice->interval = $request->interval;
$subscriptionPrice->save();
return self::sentResponse(200, [], __('digimed_validation.success_response.subscription_add_success'));
}
}catch(Exception | Throwable | QueryException $e){
return self::sentResponse(500, [], $e->getMessage());
}
}
//subscription details add/edit
public function subscriptionDetailsAddEdit(Request $request)
{
try {
$rules = [
'plan_id' => 'required',
'title' => 'required',
'content' => 'required',
'status' => 'required|in:0,1',
'important' => 'required|in:0,1'
];
$messages = [
'plan_id.required' => __('digimed_validation.form_validation_error.plan_id_req'),
'title.required' => __('digimed_validation.form_validation_error.title_required'),
'content.required' => __('digimed_validation.form_validation_error.content_required'),
'status.required' => __('digimed_validation.form_validation_error.status_required'),
'important.required' => __('digimed_validation.form_validation_error.important_required'),
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return self::sentResponse(422, [], $validator->errors());
}
/** @var object $this */
$authRole = Auth::user();
$auth_id = auth()->user()->id;
$isUpdate = isset($request->subscription_details_id) ? true : false;
/**
* @var string $name
* @var string $description
*/
if($isUpdate){
// Update existing subscription
$subscriptionDetail = SubscriptionDetail::find($request->subscription_details_id);
if (!$subscriptionDetail) {
return self::sentResponse(404, [], __('digimed_validation.error_response.data_not_found'));
}
$subscriptionDetail->plan_id = $request->plan_id;
$subscriptionDetail->title = $request->title;
$subscriptionDetail->content = $request->content;
$subscriptionDetail->status = $request->status;
$subscriptionDetail->important = $request->important;
$subscriptionDetail->updated_by = $auth_id;
$subscriptionDetail->save();
return self::sentResponse(200, [], __('digimed_validation.success_response.subscriptiondetails_edit_success'));
} else{
$subscriptionDetail = new SubscriptionDetail();
$subscriptionDetail->plan_id = $request->plan_id;
$subscriptionDetail->title = $request->title;
$subscriptionDetail->content = $request->content;
$subscriptionDetail->status = $request->status;
$subscriptionDetail->important = $request->important;
$subscriptionDetail->created_by = $auth_id;
$subscriptionDetail->save();
return self::sentResponse(200, [], __('digimed_validation.success_response.subscriptiondetails_add_success'));
}
}catch(Exception | Throwable | QueryException $e){
return self::sentResponse(500, [], $e->getMessage());
}
}
//fetch Sucbscription by ID
public function fetchSubscriptionPlan(Request $request)
{
try {
$rules = [
'subscription_id' => 'required'
];
$messages = [
'subscription_id.required' => __('digimed_validation.form_validation_error.name_req'),
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return self::sentResponse(422, [], $validator->errors());
}
$subscription_details = SubscriptionPlan::where('id',$request->subscription_id)->with(['subscriptionDetails','priceDetails' => function($q){
$q->where('status','active');
}])->get();
return self::sentResponse(200, $subscription_details, __('digimed_validation.success_response.data_fetch_success'));
}catch(Exception | Throwable | QueryException $e){
return self::sentResponse(500, [], $e->getMessage());
}
}
//subscription History
public function subscriptionHistory(Request $request)
{
try {
$subscription_history = Subscription::with(['subscriberDetails:id,first_name,last_name,profile_image','subscriptionPlanDetails' => function ($query) { // Specify fields from subscriptionPlanDetails
$query->select('id', 'name');
},'subscriptionPriceDetails'])->get();
return self::sentResponse(200, $subscription_history, __('digimed_validation.success_response.data_fetch_success'));
}catch(Exception | Throwable | QueryException $e){
return self::sentResponse(500, [], $e->getMessage());
}
}
//Patient Subscription
public function subscribe(Request $request){
try {
$rules = [
'plan_id' => 'required',
'price_id' => 'required'//0-Free Acount
];
$messages = [
'plan_id.required' => __('digimed_validation.form_validation_error.plan_id_req'),
'price_id.required' => __('digimed_validation.form_validation_error.price_id_req'),
];
$validator = Validator::make($request->all(), $rules, $messages);
if ($validator->fails()) {
return self::sentResponse(422, [], $validator->errors());
}
$auth_id = auth()->user()->id;
$checkSubscription = Subscription::where('user_id',$auth_id)->where('status','1')->first();
if($checkSubscription){
$checkSubscription->status = '0';
$checkSubscription->update();
}
$subscription = new Subscription();
$subscription->user_id = $auth_id;
$subscription->price_id = $request->price_id;
$subscription->plan_id = $request->plan_id;
$subscription->created_by = $auth_id;
$subscription->save();
return self::sentResponse(200, [], __('digimed_validation.error_response.user_subscribed_success'));
}
catch(Exception | Throwable | QueryException $e){
return self::sentResponse(500, [], $e->getMessage());
}
}
public function userSubscriptionDetails(Request $request){
try {
$auth_id = auth()->user()->id;
$subscription_history = Subscription::where('user_id',$auth_id)->where('status','1')->with(['subscriptionPlanDetails' => function ($query) { // Specify fields from subscriptionPlanDetails
$query->select('id', 'name');
},'subscriptionPriceDetails'])->get()->toArray();
if (empty($subscription_history)) {
$data[] = [
'subscription_plan_name' => "Free account",
'subscription_amount' => "-",
'currency_code' => "-",
'next_due' => "-"
];
return self::sentResponse(200, $data, __('digimed_validation.error_response.user_subscribed_details'));
}
$createdAt = $subscription_history[0]['created_at'];
$date = new \DateTime($createdAt);
$interval = $subscription_history[0]['subscription_price_details']['interval'] ?? null;
if ($interval === 'year') {
$date->modify('+365 days');
} elseif ($interval === 'month') {
$date->modify('+30 days');
} elseif ($interval === 'week') {
$date->modify('+7 days');
} elseif ($interval === 'day') {
$date->modify('+1 day');
} else {
return self::sentResponse(400, [], __('digimed_validation.error_response.invalid_interval'));
}
$nextDue = $date->format('Y-m-d');
// Populate subscription details
$data[] = [
'subscription_plan_name' => $subscription_history[0]['subscription_plan_details']['name'] ?? 'N/A',
'subscription_amount' => $subscription_history[0]['subscription_price_details']['amount'] ?? '-',
'currency_code' => $subscription_history[0]['subscription_price_details']['currency_code'] ?? '-',
'next_due' => $nextDue
];
return self::sentResponse(200, $data, __('digimed_validation.error_response.user_subscribed_details'));
}
catch(Exception | Throwable | QueryException $e){
return self::sentResponse(500, [], $e->getMessage());
}
}
public function subscriptionCancel(Request $request)
{
try {
/** @var object $this */
/** @var \App\User $authRole */
$authRole = Auth::user();
$auth_id = auth()->user()->id;
$data = Subscription::where('user_id',$auth_id)->where('status','1')->latest()->first();
if(!empty($data)) {
if($data['status'] == '1') {
$data->status = '0';
$data->save();
return self::sentResponse(200, [], __('digimed_validation.success_response.subscription_cancel_success'));
}
return self::sentResponse(401, [], __('digimed_validation.error_response.subscription_not_found'));
} else {
return self::sentResponse(401, [], __('digimed_validation.error_response.stripe_id_not_exist'));
}
} catch(Exception | Throwable | QueryException $e){
return self::sentResponse(500, [], $e->getMessage());
}
}
}