first commit
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\OldPurchase;
|
||||
use App\Models\PackageName;
|
||||
use App\Models\Product;
|
||||
use App\Models\User;
|
||||
use App\Rules\MobileNumber;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class AdminController extends Controller
|
||||
{
|
||||
public function users(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'per_page' => 'integer',
|
||||
'mobile' => 'string',
|
||||
'package_name' => 'string',
|
||||
]);
|
||||
|
||||
$users = User::when(isset($data['package_name']), fn ($q) => $q->whereHas('packageNames', fn ($q2) => $q2->where('name', $data['package_name'])))
|
||||
->when(isset($data['mobile']), fn ($q) => $q->where('mobile', $data['mobile']))
|
||||
->paginate($data['per_page'] ?? 30);
|
||||
|
||||
return $users;
|
||||
}
|
||||
|
||||
public function getUserTransactions(Request $request, $mobile)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'per_page' => 'integer'
|
||||
]);
|
||||
|
||||
if (!$user = User::where('mobile', $mobile)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$transactions = $user->transactions()->paginate($data['per_page'] ?? 30);
|
||||
|
||||
return $transactions;
|
||||
}
|
||||
|
||||
public function getUserStatus(Request $request, $mobile)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'package_name' => 'string'
|
||||
]);
|
||||
|
||||
if (isset($data['package_name']) && !$packageName = PackageName::with('products')->where('name', $data['package_name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!$user = User::with([
|
||||
'products' => fn ($q) => $q->when(isset($data['package_name']), fn ($q1) => $q1->where('package_name_id', $packageName->id)),
|
||||
'products.packageName'
|
||||
])->where('mobile', $mobile)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
public function getUserStatusV1(Request $request, $mobile)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'package_name' => 'string'
|
||||
]);
|
||||
|
||||
$userMobile = $mobile;
|
||||
if (isset($data['package_name']) && !$packageName = PackageName::with('products')
|
||||
->where('name', $data['package_name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!OldPurchase::when(isset($data['package_name']), fn ($q) => $q->where('package_name', $data['package_name']))
|
||||
->where('mobile', preg_replace('/09/', '989', $userMobile, 1))->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user is not paid'
|
||||
], 400);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => 'user is paid'
|
||||
]);
|
||||
}
|
||||
|
||||
public function subscribeUser(Request $request, $mobile)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'product_id' => 'integer|required'
|
||||
]);
|
||||
|
||||
if (!$user = User::where('mobile', $mobile)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!$product = Product::where('id', $data['product_id'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'product not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$product->buy($user);
|
||||
|
||||
return response()->json([
|
||||
'message' => 'subscribed successfuly'
|
||||
]);
|
||||
}
|
||||
|
||||
public function unsubscribeUser(Request $request, $mobile)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'product_id' => 'integer|required'
|
||||
]);
|
||||
|
||||
if (!$user = User::where('mobile', $mobile)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!$product = Product::where('id', $data['product_id'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'product not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$user->products()->updateExistingPivot($product, ['expire_at' => now()->format('Y-m-d H:i:s')]);
|
||||
|
||||
return response()->json([
|
||||
'message' => 'unsubscribed successfuly'
|
||||
]);
|
||||
}
|
||||
|
||||
public function deleteUser(Request $request, $mobile)
|
||||
{
|
||||
if (!$user = User::where('mobile', $mobile)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$user->delete();
|
||||
|
||||
return response()->json([
|
||||
'message' => 'user deleted'
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateUserProfile(Request $request, $mobile)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'first_name' => 'string',
|
||||
'last_name' => 'string',
|
||||
'email' => 'email',
|
||||
'mobile' => [new MobileNumber, 'string'],
|
||||
'avatar' => 'image'
|
||||
]);
|
||||
|
||||
if (!$subjectUser = User::where('mobile', $mobile)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (isset($data['email'])) {
|
||||
$user = User::where('email', $data['email'])->first();
|
||||
if ($user && $data['email'] != $subjectUser->email) {
|
||||
return response()->json([
|
||||
'message' => 'user with given email exists'
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($data['mobile'])) {
|
||||
$user = User::where('mobile', $data['mobile'])->first();
|
||||
if ($user && $data['mobile'] != $subjectUser->mobile) {
|
||||
return response()->json([
|
||||
'message' => 'user with given email exists'
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($data['avatar'])) {
|
||||
Storage::disk('public')->put("avatars/$user->uuid.png", file_get_contents($data['avatar']->path()));
|
||||
$data['avatar'] = "storage/avatars/$user->uuid.png";
|
||||
}
|
||||
|
||||
$subjectUser->update($data);
|
||||
|
||||
return response()->json([
|
||||
'message' => 'user updated'
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Helpers\RedirectLinkHelper;
|
||||
use App\Models\Transaction;
|
||||
use App\Modules\Gateway\AsanPardakht\AsanPardakhtApi;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class AsanPardakhtController extends Controller
|
||||
{
|
||||
public function pay(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'token' => 'string|required',
|
||||
'mobile' => 'string',
|
||||
]);
|
||||
|
||||
return view('ap-form', ['token' => $data['token'], 'mobile' => $data['mobile']]);
|
||||
}
|
||||
|
||||
public function checkTransaction(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'localInvoiceId' => 'string|required',
|
||||
'platform' => 'string'
|
||||
]);
|
||||
|
||||
if (!$transaction = Transaction::with(['product.packageName', 'user'])->where('status', Transaction::STATUSES['pending'])->where('id', $data['localInvoiceId'])->first()) {
|
||||
return view('status', [
|
||||
'status' => false,
|
||||
'redirect_link' => '#'
|
||||
]);
|
||||
}
|
||||
$redirectLink = RedirectLinkHelper::get($transaction->product->packageName->name, $data['platform'] ?? null);
|
||||
$response = AsanPardakhtApi::checkTransaction($transaction);
|
||||
|
||||
if (!$response['status']) {
|
||||
return view('status', [
|
||||
'status' => false,
|
||||
'redirect_link' => $redirectLink
|
||||
]);
|
||||
}
|
||||
|
||||
$transaction->update(['status' => Transaction::STATUSES['success']]);
|
||||
|
||||
$transaction->product->buy($transaction->user, $transaction['authority'], Transaction::GATEWAYS['asanpardakht']);
|
||||
|
||||
return view('status', [
|
||||
'status' => true,
|
||||
'redirect_link' => $redirectLink
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\CafeConfig;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class CafeController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
return CafeConfig::get();
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'client_id' => 'required|string',
|
||||
'client_secret' => 'required|string',
|
||||
'access_token' => 'required|string',
|
||||
'refresh_token' => 'required|string',
|
||||
]);
|
||||
|
||||
$CafeConfig = CafeConfig::create($data);
|
||||
|
||||
return $CafeConfig;
|
||||
}
|
||||
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'client_id' => 'required|string',
|
||||
'client_secret' => 'required|string',
|
||||
'access_token' => 'required|string',
|
||||
'refresh_token' => 'required|string',
|
||||
]);
|
||||
|
||||
if (!$cafeConfig = CafeConfig::where('id', $id)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'cafe config not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$cafeConfig->update($data);
|
||||
|
||||
return $cafeConfig;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
|
||||
use Illuminate\Foundation\Validation\ValidatesRequests;
|
||||
use Illuminate\Routing\Controller as BaseController;
|
||||
|
||||
class Controller extends BaseController
|
||||
{
|
||||
use AuthorizesRequests, ValidatesRequests;
|
||||
}
|
||||
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Helpers\RedirectLinkHelper;
|
||||
use App\Models\Transaction;
|
||||
use App\Modules\Gateway\Digipay\DigiPayApi;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class DigiPayController extends Controller
|
||||
{
|
||||
public function checkTransaction(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'providerId' => 'string|required',
|
||||
'result' => 'string|required',
|
||||
'trackingCode' => 'string|required',
|
||||
'amount' => 'string|required',
|
||||
]);
|
||||
|
||||
if (!$transaction = Transaction::with(['product.packageName', 'user'])->where('uuid', $data['providerId'])->first()) {
|
||||
return view('status', [
|
||||
'status' => false,
|
||||
'redirect_link' => '#'
|
||||
]);
|
||||
}
|
||||
|
||||
if ($data['result'] != 'SUCCESS') {
|
||||
return view('status', [
|
||||
'status' => false,
|
||||
'redirect_link' => RedirectLinkHelper::get($transaction->product->packageName->name)
|
||||
]);
|
||||
}
|
||||
|
||||
$response = DigiPayApi::checkTransaction($data['trackingCode']);
|
||||
|
||||
if (!$response['status']) {
|
||||
return view('status', [
|
||||
'status' => false,
|
||||
'redirect_link' => RedirectLinkHelper::get($transaction->product->packageName->name)
|
||||
]);
|
||||
}
|
||||
|
||||
$transaction->update(['status' => Transaction::STATUSES['success']]);
|
||||
|
||||
$transaction->product->buy($transaction->user, $transaction['authority'], Transaction::GATEWAYS['asanpardakht']);
|
||||
|
||||
return view('status', [
|
||||
'status' => true,
|
||||
'redirect_link' => RedirectLinkHelper::get($transaction->product->packageName->name)
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\OldPurchase;
|
||||
use App\Models\PackageName;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
|
||||
class OldApprooController extends Controller
|
||||
{
|
||||
|
||||
public function getUserUnConsumedPurchases(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'package_name' => 'string|required'
|
||||
]);
|
||||
|
||||
$userMobile = auth()->user()->mobile;
|
||||
if (!$packageName = PackageName::with('products')->where('name', $data['package_name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!OldPurchase::where('package_name', $data['package_name'])->where('mobile', preg_replace('/09/', '989', $userMobile, 1))->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user is not paid'
|
||||
], 400);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => 'user is paid'
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\CafeConfig;
|
||||
use App\Models\PackageName;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
class PackageNameController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$packageNames = PackageName::get();
|
||||
return $packageNames;
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'name' => 'string|required',
|
||||
'title' => 'string|required',
|
||||
'avatar' => 'image',
|
||||
'v1_identifier' => 'string|nullable',
|
||||
'myket_access_token' => 'string|nullable',
|
||||
'cafe_config_id' => 'integer|nullable',
|
||||
'web_app_url' => 'string|nullable',
|
||||
'tries' => 'integer',
|
||||
]);
|
||||
|
||||
$otherData = $request->validate([
|
||||
'firebase_json' => 'file'
|
||||
]);
|
||||
|
||||
if ($packageName = PackageName::where('name', $data['name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package exists'
|
||||
], 400);
|
||||
}
|
||||
|
||||
if (isset($data['avatar'])) {
|
||||
Storage::disk('public')->put("package-names/{$data['name']}.png", file_get_contents($data['avatar']->path()));
|
||||
$data['image'] = "storage/package-names/{$data['name']}.png";
|
||||
unset($data['avatar']);
|
||||
}
|
||||
|
||||
if (isset($data['cafe_config_id']) && !$CafeConfig = CafeConfig::where('id', $data['cafe_config_id'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'cafe config not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (isset($otherData['firebase_json'])) {
|
||||
$packageName->addMedia($otherData['firebase_json']->path())
|
||||
->usingName($otherData['firebase_json'] ?? '')
|
||||
->usingFileName($otherData['firebase_json']->getClientOriginalName())
|
||||
->toMediaCollection('firebase_json');
|
||||
}
|
||||
|
||||
$packageName = PackageName::create($data);
|
||||
return $packageName;
|
||||
}
|
||||
|
||||
public function update(Request $request, $name)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'string|required',
|
||||
'avatar' => 'image',
|
||||
'v1_identifier' => 'string|nullable',
|
||||
'myket_access_token' => 'string|nullable',
|
||||
'cafe_config_id' => 'integer|nullable',
|
||||
'web_app_url' => 'string|nullable',
|
||||
'tries' => 'integer'
|
||||
]);
|
||||
$otherData = $request->validate([
|
||||
'firebase_json' => 'file'
|
||||
]);
|
||||
|
||||
if (isset($data['avatar'])) {
|
||||
Storage::disk('public')->put("package-names/{$name}.png", file_get_contents($data['avatar']->path()));
|
||||
$data['image'] = "storage/package-names/{$name}.png";
|
||||
unset($data['avatar']);
|
||||
}
|
||||
|
||||
if (isset($data['cafe_config_id']) && !$CafeConfig = CafeConfig::where('id', $data['cafe_config_id'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'cafe config not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!$packageName = PackageName::where('name', $name)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$packageName->update($data);
|
||||
|
||||
if (isset($otherData['firebase_json'])) {
|
||||
$packageName->addMedia($otherData['firebase_json']->path())
|
||||
->usingName($otherData['firebase_json'] ?? '')
|
||||
->usingFileName($otherData['firebase_json']->getClientOriginalName())
|
||||
->toMediaCollection('firebase_json');
|
||||
}
|
||||
|
||||
return $packageName;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,177 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\PackageName;
|
||||
use App\Models\Product;
|
||||
use App\Models\Transaction;
|
||||
use App\Services\CafeService;
|
||||
use App\Services\MyketService;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
class ProductController extends Controller
|
||||
{
|
||||
public function index(Request $request, $packageName)
|
||||
{
|
||||
if (!$packageName = PackageName::with('products')->where('name', $packageName)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
$products = $packageName->products;
|
||||
return $products;
|
||||
}
|
||||
|
||||
public function store(Request $request, $packageName)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'string|required',
|
||||
'price' => 'integer|required',
|
||||
'type' => ['integer', Rule::in(Product::TYPES)],
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::with('products')->where('name', $packageName)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$product = $packageName->products()->create($data);
|
||||
return $product;
|
||||
}
|
||||
|
||||
public function update(Request $request, $packageName, $productId)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'string|required',
|
||||
'price' => 'integer|required',
|
||||
'type' => ['integer', Rule::in(Product::TYPES)],
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::with('products')->where('name', $packageName)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!$product = Product::where('id', $productId)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'product not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$product->update($data);
|
||||
return $product;
|
||||
}
|
||||
|
||||
public function delete($packageName, $productId)
|
||||
{
|
||||
if (!$packageName = PackageName::with('products')->where('name', $packageName)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!$product = Product::where('id', $productId)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'product not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$product->delete();
|
||||
return response()->json([
|
||||
'message' => 'product deleted'
|
||||
]);
|
||||
}
|
||||
|
||||
public function subscribe(Request $request, $packageName, $productId)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'gateway' => 'string|required|in:cafe,myket',
|
||||
'purchase_token' => 'string|required',
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::where('name', $packageName)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$user = auth()->user();
|
||||
if (!$product = Product::with(['packageName.cafeConfig'])->where('id', $productId)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'product not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if ($data['gateway'] == 'zarinpal') {
|
||||
if (!$transaction = Transaction::where('authority', $data['authority'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'transaction not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if ($transaction->status == Transaction::STATUSES['consumed']) {
|
||||
return response()->json([
|
||||
'message' => 'already consumed'
|
||||
], 400);
|
||||
}
|
||||
$merchantId = config('zarinpal.merchant_id');
|
||||
$response = Http::retry(3, 100, throw: false)->post(config('zarinpal.url.verify'), [
|
||||
'merchant_id' => $merchantId,
|
||||
'amount' => $product['price'] * 10,
|
||||
'authority' => $data['authority'],
|
||||
]);
|
||||
if ($response['data'] == [] || $response['data']['code'] == 101) {
|
||||
return response()->json([
|
||||
"message" => "failed",
|
||||
"code" => strval($response['errors']['code'] ?? 101),
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
if ($data['gateway'] == 'cafe') {
|
||||
// $service = new CafeService($product->packageName->cafeConfig);
|
||||
// $purchaseStatus = $service->checkPurchase($product, $data['purchase_token']);
|
||||
// if (!$purchaseStatus['status']) {
|
||||
// return response()->json([
|
||||
// 'message' => $purchaseStatus['message'],
|
||||
// ], 400);
|
||||
// }
|
||||
// $service->consumePurchase($product, $data['purchase_token']);
|
||||
$user->transactions()->create([
|
||||
'amount' => $product->price,
|
||||
'authority' => $data['purchase_token'],
|
||||
'product_id' => $product->id,
|
||||
'status' => Transaction::STATUSES['consumed'],
|
||||
'gateway' => Transaction::GATEWAYS[$data['gateway']],
|
||||
]);
|
||||
}
|
||||
|
||||
if ($data['gateway'] == 'myket') {
|
||||
$service = new MyketService($product->packageName->cafeConfig);
|
||||
$purchaseStatus = $service->checkPurchase($product, $data['purchase_token']);
|
||||
if (!$purchaseStatus['status']) {
|
||||
return response()->json([
|
||||
'message' => $purchaseStatus['message'],
|
||||
], 400);
|
||||
}
|
||||
$user->transactions()->create([
|
||||
'amount' => $product->price,
|
||||
'authority' => $data['purchase_token'],
|
||||
'product_id' => $product->id,
|
||||
'status' => Transaction::STATUSES['consumed'],
|
||||
'gateway' => Transaction::GATEWAYS[$data['gateway']],
|
||||
]);
|
||||
}
|
||||
|
||||
$product->buy($user, $data['purchase_token'], Transaction::GATEWAYS[$data['gateway']]);
|
||||
|
||||
return response()->json([
|
||||
'message' => 'subscribed successfuly'
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\PackageName;
|
||||
use App\Models\Reminder;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
class ReminderController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
$reminders = Reminder::where('user_id', Auth::id())
|
||||
->orderBy('time')
|
||||
->get();
|
||||
|
||||
return response()->json($reminders);
|
||||
}
|
||||
|
||||
public function store(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'title' => 'required|string|max:255',
|
||||
'description' => 'nullable|string|max:500',
|
||||
'time' => 'required|date',
|
||||
'repeatable' => 'boolean',
|
||||
'repeat_days' => 'nullable|integer|min:1',
|
||||
'data' => 'nullable|array',
|
||||
]);
|
||||
$packageNameData = $request->validate([
|
||||
'package_name' => 'required|exists:package_names,name',
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::with('products')->where('name', $packageNameData['package_name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$reminder = Reminder::create([...$data, 'package_name_id' => $packageName->id, 'user_id' => auth()->user()->id]);
|
||||
|
||||
return $reminder;
|
||||
}
|
||||
|
||||
public function show(Reminder $reminder)
|
||||
{
|
||||
$this->authorizeReminder($reminder);
|
||||
|
||||
return response()->json($reminder);
|
||||
}
|
||||
|
||||
public function update(Request $request, Reminder $reminder)
|
||||
{
|
||||
$this->authorizeReminder($reminder);
|
||||
|
||||
$data = $request->validate([
|
||||
'title' => 'sometimes|string|max:255',
|
||||
'description' => 'nullable|string|max:500',
|
||||
'time' => 'sometimes|date',
|
||||
'repeatable' => 'boolean',
|
||||
'repeat_days' => 'nullable|integer|min:1',
|
||||
'data' => 'nullable|array',
|
||||
]);
|
||||
$packageNameData = $request->validate([
|
||||
'package_name' => 'required|exists:package_names,name',
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::with('products')->where('name', $packageNameData['package_name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$reminder->update([...$data, 'package_name_id' => $packageName->id]);
|
||||
|
||||
return response()->json($reminder);
|
||||
}
|
||||
|
||||
public function destroy(Reminder $reminder)
|
||||
{
|
||||
$this->authorizeReminder($reminder);
|
||||
|
||||
$reminder->delete();
|
||||
|
||||
return response()->json(null, 204);
|
||||
}
|
||||
|
||||
private function authorizeReminder(Reminder $reminder)
|
||||
{
|
||||
if ($reminder->user_id !== Auth::id()) {
|
||||
abort(403, 'Unauthorized action.');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,75 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Product;
|
||||
use App\Models\Transaction;
|
||||
use App\Modules\Gateway\AsanPardakht\AsanPardakhtApi;
|
||||
use App\Modules\Gateway\Digipay\DigiPayApi;
|
||||
use App\Modules\Gateway\Zarinpal\ZarinpalApi;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class TransactionController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'per_page' => 'integer'
|
||||
]);
|
||||
|
||||
$transactions = auth()->user()->transactions()->paginate($data['per_page'] ?? 30);
|
||||
|
||||
return $transactions;
|
||||
}
|
||||
|
||||
public function getGateway(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'description' => 'required|string',
|
||||
'product_id' => 'nullable|string',
|
||||
'platform' => 'in:mobile,web,bot'
|
||||
]);
|
||||
|
||||
if (isset($data['product_id']) && !$product = Product::where('id', $data['product_id'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'product not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$user = auth()->user();
|
||||
if ($user->products()->where('products.id', $data['product_id'])->where('type', Product::TYPES['permanent'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'already have product'
|
||||
], 400);
|
||||
}
|
||||
|
||||
$transaction = $user->transactions()->create([
|
||||
'amount' => floor($product->price * 1.1),
|
||||
'product_id' => $data['product_id'],
|
||||
'uuid' => Str::uuid()->toString()
|
||||
]);
|
||||
|
||||
$gateway = Transaction::GATEWAYS['asanpardakht'];
|
||||
$response = AsanPardakhtApi::getGateway($transaction);
|
||||
if (!($response['status'] ?? false)) {
|
||||
$response = ZarinpalApi::getGateway($transaction, $data['description']);
|
||||
$gateway = Transaction::GATEWAYS['zarinpal'];
|
||||
if (!($response['status'] ?? false)) {
|
||||
$response = DigiPayApi::getGateway($transaction);
|
||||
$gateway = Transaction::GATEWAYS['digipay'];
|
||||
if (!($response['status'] ?? false)) {
|
||||
return response()->json(["message" => "failed"], 400);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$transaction->gateway = $gateway;
|
||||
$transaction->authority = $response['data']['authority'];
|
||||
$transaction->save();
|
||||
|
||||
return response()->json([
|
||||
'url' => $response['data']['url']
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,467 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Helpers\MobileNumberHelper;
|
||||
use App\Jobs\SendSMSJob;
|
||||
use App\Models\PackageName;
|
||||
use App\Models\Product;
|
||||
use App\Models\Transaction;
|
||||
use App\Models\User;
|
||||
use App\Rules\MobileNumber;
|
||||
use App\Services\CafeService;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Laravel\Socialite\Facades\Socialite;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
|
||||
class UserController extends Controller
|
||||
{
|
||||
public function login(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'auth' => 'string|required',
|
||||
'password' => 'string|required',
|
||||
'package_name' => 'string|required',
|
||||
'fcm_token' => 'string|nullable'
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::where('name', $data['package_name'])->first()) {
|
||||
return response()->json(['message' => 'package name not found'], 404);
|
||||
}
|
||||
|
||||
$authType = filter_var($data['auth'], FILTER_VALIDATE_EMAIL) ? 'email' : 'mobile';
|
||||
if ($authType == 'mobile') {
|
||||
$data['auth'] = MobileNumberHelper::formatMobile($data['auth']);
|
||||
}
|
||||
|
||||
$user = User::where($authType, $data['auth'])->first();
|
||||
|
||||
if (!$user || !Hash::check($data['password'], $user->password)) {
|
||||
return response()->json(['message' => 'رمز عبور اشتباه است'], 404);
|
||||
}
|
||||
|
||||
// Attach package if not exists
|
||||
if (!$user->packageNames()->where('package_names.id', $packageName->id)->exists()) {
|
||||
$user->packageNames()->attach($packageName->id, [
|
||||
'tries' => $packageName->tries,
|
||||
'fcm_token' => $data['fcm_token'] ?? null,
|
||||
]);
|
||||
} else {
|
||||
$user->packageNames()->updateExistingPivot($packageName->id, [
|
||||
'fcm_token' => $data['fcm_token'] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
$token = $user->createToken('token', $user->is_admin ? ['admin'] : ['user'])->plainTextToken;
|
||||
|
||||
return response()->json([
|
||||
'user' => $user,
|
||||
'token' => $token,
|
||||
]);
|
||||
}
|
||||
public function resendEmailVerification(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|email',
|
||||
]);
|
||||
|
||||
$user = User::where('email', $request->email)->first();
|
||||
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'User not found'], 404);
|
||||
}
|
||||
|
||||
if ($user->email_verified_at) {
|
||||
return response()->json(['message' => 'Email is already verified'], 400);
|
||||
}
|
||||
|
||||
// Generate new code
|
||||
$code = rand(1000, 9999);
|
||||
|
||||
// Delete previous codes
|
||||
\DB::table('email_verifications')->where('user_id', $user->id)->delete();
|
||||
|
||||
// Insert new verification code
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
'expires_at' => now()->addMinutes(15),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
|
||||
// Send email
|
||||
\Mail::to($user->email)->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
|
||||
return response()->json([
|
||||
'message' => 'Verification email resent successfully'
|
||||
]);
|
||||
}
|
||||
public function register(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'first_name' => 'string|nullable',
|
||||
'last_name' => 'string|nullable',
|
||||
'email' => 'email|required_without:mobile',
|
||||
'password' => 'string|nullable|required_with:email',
|
||||
'mobile' => ['string', new MobileNumber, 'nullable', 'required_without:email'],
|
||||
'fcm_token' => 'string|nullable',
|
||||
'package_name' => 'string|required'
|
||||
]);
|
||||
|
||||
$packageNameValue = $data['package_name'];
|
||||
unset($data['package_name']);
|
||||
|
||||
if (isset($data['mobile'])) {
|
||||
$data['mobile'] = MobileNumberHelper::formatMobile($data['mobile']);
|
||||
if (User::where('mobile', $data['mobile'])->exists()) {
|
||||
return response()->json(['message' => 'Mobile number already exists'], 400);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($data['email']) && User::where('email', $data['email'])->exists()) {
|
||||
return response()->json(['message' => 'Email already exists'], 400);
|
||||
}
|
||||
|
||||
// ✅ Check if email can receive a message before creating the user
|
||||
if (isset($data['email'])) {
|
||||
$code = rand(1000, 9999);
|
||||
|
||||
try {
|
||||
// Try sending email
|
||||
\Mail::to($data['email'])->send(new \App\Mail\VerifyEmailCodeMail($code));
|
||||
} catch (\Exception $e) {
|
||||
return response()->json([
|
||||
'code' => $e->getCode(),
|
||||
'error' => $e->getMessage(),
|
||||
'message' => 'لطفا آدرس ایمیل خود را بررسی کنید و مجدد تلاش کنید',
|
||||
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
// Hash password
|
||||
$data['password'] = isset($data['password'])
|
||||
? $data['password']
|
||||
: Str::random(8);
|
||||
|
||||
// Create user only if email sending didn't fail
|
||||
$user = User::create($data);
|
||||
|
||||
// Attach package
|
||||
if ($packageName = PackageName::where('name', $packageNameValue)->first()) {
|
||||
$user->packageNames()->attach($packageName->id, [
|
||||
'tries' => $packageName->tries,
|
||||
'fcm_token' => $data['fcm_token'] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
// Save email verification code after user is created
|
||||
if (isset($data['email'])) {
|
||||
\DB::table('email_verifications')->insert([
|
||||
'user_id' => $user->id,
|
||||
'code' => $code,
|
||||
'expires_at' => now()->addMinutes(15),
|
||||
'created_at' => now(),
|
||||
'updated_at' => now(),
|
||||
]);
|
||||
}
|
||||
|
||||
// Create token
|
||||
$token = $user->createToken('token', $user->is_admin ? ['admin'] : ['user'])->plainTextToken;
|
||||
|
||||
return response()->json([
|
||||
'message' => 'User registered successfully.',
|
||||
'user' => $user,
|
||||
'token' => $token
|
||||
]);
|
||||
}
|
||||
public function verifyEmailCode(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'email' => 'required|email',
|
||||
'code' => 'required|string',
|
||||
]);
|
||||
|
||||
$user = User::where('email', $request->email)->first();
|
||||
if (!$user) {
|
||||
return response()->json(['message' => 'User not found'], 404);
|
||||
}
|
||||
|
||||
$record = \DB::table('email_verifications')
|
||||
->where('user_id', $user->id)
|
||||
->where('code', $request->code)
|
||||
->where('expires_at', '>', now())
|
||||
->first();
|
||||
|
||||
if (!$record) {
|
||||
return response()->json(['message' => 'Invalid or expired code'], 400);
|
||||
}
|
||||
|
||||
// Mark email as verified
|
||||
$user->update(['email_verified_at' => now()]);
|
||||
|
||||
// Delete verification record
|
||||
\DB::table('email_verifications')->where('id', $record->id)->delete();
|
||||
$token = $user->createToken('token', $user->is_admin ? ['admin'] : ['user'])->plainTextToken;
|
||||
return response()->json(['message' => 'Email verified successfully', 'token' => $token]);
|
||||
}
|
||||
public function loginOTP(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'mobile' => ['string', new MobileNumber, 'required'],
|
||||
'package_name' => 'string|required',
|
||||
'source' => [Rule::in(PackageName::SOURCES), 'integer'],
|
||||
'fcm_token' => 'string',
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::where('name', $data['package_name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if (!$user = User::where('mobile', $data['mobile'])->first()) {
|
||||
$user = User::create([
|
||||
'mobile' => MobileNumberHelper::formatMobile($data['mobile']),
|
||||
'password' => config('app.default_password'),
|
||||
]);
|
||||
}
|
||||
if ($data['mobile'] != config('approo.admin_mobile')) {
|
||||
$otpToken = rand(pow(10, 4), pow(10, 5) - 1);
|
||||
$user->otpTokens()->create([
|
||||
'token' => $otpToken
|
||||
]);
|
||||
|
||||
$verify = Str::random(8);
|
||||
SendSMSJob::dispatch([
|
||||
'mobile' => $data['mobile'],
|
||||
'message' => "کد ورود به برنامه: $otpToken
|
||||
@{$packageName->web_app_url} #$otpToken
|
||||
لغو 11"
|
||||
]);
|
||||
}
|
||||
|
||||
if (!$user->packageNames()->where('package_names.id', $packageName->id)->exists()) {
|
||||
$user->packageNames()->attach($packageName->id, [
|
||||
'tries' => $packageName->tries,
|
||||
'source' => $data['source'] ?? 0,
|
||||
'fcm_token' => $data['fcm_token'] ?? null,
|
||||
]);
|
||||
} else {
|
||||
$user->packageNames()->updateExistingPivot($packageName->id, [
|
||||
'fcm_token' => $data['fcm_token'] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'message' => 'otp sent',
|
||||
'verify_code' => $verify ?? null
|
||||
]);
|
||||
}
|
||||
|
||||
public function checkOTP(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'mobile' => ['string', new MobileNumber, 'required'],
|
||||
'token' => 'string|required',
|
||||
]);
|
||||
|
||||
if (!$user = User::where('mobile', $data['mobile'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'user not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$otpToken = $user->otpTokens()->where('token', $data['token'])->where('created_at', '>', now()->subMinutes(15))->first();
|
||||
if (!$otpToken && !($data['mobile'] == config('approo.admin_mobile') && $data['token'] == config('approo.admin_otp'))) {
|
||||
return response()->json([
|
||||
'message' => 'token not valid'
|
||||
], 400);
|
||||
}
|
||||
$otpToken?->delete();
|
||||
|
||||
$token = '';
|
||||
if ($user->is_admin) {
|
||||
$token = $user->createToken('token', ['admin'])->plainTextToken;
|
||||
} else {
|
||||
$token = $user->createToken('token', ['user'])->plainTextToken;
|
||||
}
|
||||
|
||||
return response()->json([
|
||||
'user' => $user,
|
||||
'token' => $token,
|
||||
]);
|
||||
}
|
||||
|
||||
public function updateProfile(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'first_name' => 'string|nullable',
|
||||
'last_name' => 'string|nullable',
|
||||
'birthday' => 'date|nullable',
|
||||
'gender' => ['integer', 'nullable', Rule::in(User::GENDERS)],
|
||||
'email' => 'email|nullable',
|
||||
'mobile' => [new MobileNumber, 'string'],
|
||||
'avatar' => 'image'
|
||||
]);
|
||||
|
||||
if (isset($data['email'])) {
|
||||
$user = User::where('email', $data['email'])->first();
|
||||
if ($user && $data['email'] != auth()->user()->email) {
|
||||
return response()->json([
|
||||
'message' => 'user with given email exists'
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
if (isset($data['mobile'])) {
|
||||
$user = User::where('mobile', $data['mobile'])->first();
|
||||
if ($user && $data['mobile'] != auth()->user()->mobile) {
|
||||
return response()->json([
|
||||
'message' => 'user with given email exists'
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
$user = auth()->user();
|
||||
if (isset($data['avatar'])) {
|
||||
Storage::disk('public')->put("avatars/$user->uuid.png", file_get_contents($data['avatar']->path()));
|
||||
$data['avatar'] = "storage/avatars/$user->uuid.png";
|
||||
}
|
||||
|
||||
$user->update($data);
|
||||
|
||||
return response()->json([
|
||||
'user' => $user,
|
||||
'message' => 'user updated'
|
||||
]);
|
||||
}
|
||||
|
||||
public function logout(Request $request)
|
||||
{
|
||||
$request->user()->currentAccessToken()->delete();
|
||||
|
||||
return response()->json([
|
||||
'message' => 'user logged out'
|
||||
]);
|
||||
}
|
||||
|
||||
public function status(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'package_name' => 'string|required'
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::with('cafeConfig')->where('name', $data['package_name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$user = auth()->user();
|
||||
if ($user->mobile == config('approo.admin_mobile')) {
|
||||
$user['products'] = Product::where('package_name_id', $packageName->id)->get();
|
||||
} else {
|
||||
// if ($packageName->cafeConfig) {
|
||||
// $user['products'] = $user->products()->where('package_name_id', $packageName->id)->get();
|
||||
// foreach ($user['products'] as $key => $product) {
|
||||
// $service = new CafeService($packageName->cafeConfig);
|
||||
// if ($product->pivot->gateway == Transaction::GATEWAYS['cafe'] && $product->pivot->purchase_token && $product->type != Product::TYPES['permanent']) {
|
||||
// $activeSubscriptions = $service->checkSubscription($product, $product->pivot->purchase_token);
|
||||
// if ($activeSubscriptions) {
|
||||
// $expire = Carbon::createFromTimestamp($activeSubscriptions[0]['validUntilTimestampMsec'] / 1000);
|
||||
// $user->products()->updateExistingPivot($product, ['expire_at' => $expire->format('Y-m-d H:i:s')]);
|
||||
// } else {
|
||||
// $user->products()->updateExistingPivot($product, ['expire_at' => now()->format('Y-m-d H:i:s')]);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
$user['products'] = $user->products()
|
||||
->where('package_name_id', $packageName->id)
|
||||
->where(fn($q) => $q->where('user_product.expire_at', '>', now()->addHour())->orWhere('user_product.expire_at', null))
|
||||
->get();
|
||||
|
||||
$user['package_name'] = $user->packageNames()
|
||||
->where('package_names.id', $packageName->id)
|
||||
->first();
|
||||
}
|
||||
|
||||
return $user;
|
||||
}
|
||||
|
||||
public function try(Request $request, $name)
|
||||
{
|
||||
$user = auth()->user();
|
||||
|
||||
if (!$packageName = $user->packageNames()->where('name', $name)->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
if ($packageName->pivot->tries <= 0) {
|
||||
return response()->json([
|
||||
'message' => 'no more tries'
|
||||
], 400);
|
||||
}
|
||||
|
||||
$packageName->pivot->tries->decrement();
|
||||
|
||||
return response()->json([
|
||||
'message' => 'success'
|
||||
]);
|
||||
}
|
||||
|
||||
public function googleLogin(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'access_token' => 'string|required',
|
||||
'package_name' => 'string|required',
|
||||
'source' => [Rule::in(PackageName::SOURCES), 'integer']
|
||||
]);
|
||||
|
||||
if (!$packageName = PackageName::where('name', $data['package_name'])->first()) {
|
||||
return response()->json([
|
||||
'message' => 'package name not found'
|
||||
], 404);
|
||||
}
|
||||
|
||||
$response = Http::get("https://www.googleapis.com/oauth2/v3/userinfo", [
|
||||
'access_token' => $data['access_token']
|
||||
])->json();
|
||||
|
||||
if (!isset($response['email'])) {
|
||||
return response()->json([
|
||||
'message' => 'invalid token'
|
||||
], 400);
|
||||
}
|
||||
if (!$user = User::where('email', $response['email'])->first()) {
|
||||
$user = User::create([
|
||||
'email' => $response['email'],
|
||||
'password' => config('app.default_password'),
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
if (!$user->packageNames()->where('package_names.id', $packageName->id)->exists()) {
|
||||
$user->packageNames()->attach($packageName->id, [
|
||||
'tries' => $packageName->tries,
|
||||
'source' => $data['source'] ?? 0,
|
||||
]);
|
||||
}
|
||||
|
||||
$token = $user->createToken('token', ['user'])->plainTextToken;
|
||||
|
||||
return response()->json([
|
||||
'user' => $user,
|
||||
'token' => $token,
|
||||
]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,81 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\Transaction;
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
|
||||
class WalletController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return response()->json(["wallet" => auth()->user()->wallet ?? 0]);
|
||||
}
|
||||
|
||||
public function charge(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'amount' => 'required|integer',
|
||||
'authority' => 'string|required',
|
||||
]);
|
||||
|
||||
if ($data['authority'] != 'test') {
|
||||
$merchantId = config('zarinpal.merchant_id');
|
||||
$response = Http::retry(3, 100, throw: false)->post(config('zarinpal.url.verify'), [
|
||||
'merchant_id' => $merchantId,
|
||||
'amount' => $data['amount'] * 10,
|
||||
'authority' => $data['authority'],
|
||||
]);
|
||||
if ($response['data'] == [] || $response['data']['code'] == 101) {
|
||||
return response()->json([
|
||||
"message" => "failed",
|
||||
"code" => strval($response['errors']['code'] ?? 101),
|
||||
], 400);
|
||||
}
|
||||
}
|
||||
|
||||
$user = auth()->user();
|
||||
$user->wallet = ($user->wallet ?? 0) + $data['amount'];
|
||||
$user->save();
|
||||
|
||||
$user->transactions()->where('authority', $data['authority'])->update(['status' => Transaction::STATUSES['success']]);
|
||||
|
||||
return response()->json([
|
||||
"wallet" => $user->wallet,
|
||||
"message" => "wallet charged succesfully",
|
||||
'ref_id' => $response['data']['ref_id'] ?? null,
|
||||
]);
|
||||
}
|
||||
|
||||
public function getWalletAdmin(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'mobile' => 'required'
|
||||
]);
|
||||
|
||||
if (!$user = User::where('mobile', $data['mobile'])->first()) {
|
||||
return response()->json(["message" => 'user not found'], 404);
|
||||
}
|
||||
|
||||
return response()->json(["wallet" => $user->wallet ?? 0]);
|
||||
}
|
||||
|
||||
public function chargeWalletAdmin(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'amount' => 'required|integer',
|
||||
'mobile' => 'required'
|
||||
]);
|
||||
|
||||
if (!$user = User::where('mobile', $data['mobile'])->first()) {
|
||||
return response()->json(["message" => 'user not found'], 404);
|
||||
}
|
||||
|
||||
$user->wallet = ($user->wallet ?? 0) + $data['amount'];
|
||||
$user->save();
|
||||
|
||||
return response()->json(["wallet" => $user->wallet, "message" => "wallet charged succesfully"]);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Helpers\RedirectLinkHelper;
|
||||
use App\Models\Transaction;
|
||||
use App\Modules\Gateway\Zarinpal\ZarinpalApi;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class ZarinpalController extends Controller
|
||||
{
|
||||
public function checkTransaction(Request $request)
|
||||
{
|
||||
$data = $request->validate([
|
||||
'Authority' => 'string|required',
|
||||
'Status' => 'string|required',
|
||||
]);
|
||||
|
||||
if (!$transaction = Transaction::with(['product.packageName', 'user'])->where('authority', $data['Authority'])->first()) {
|
||||
return view('status', [
|
||||
'status' => false,
|
||||
'redirect_link' => '#'
|
||||
]);
|
||||
}
|
||||
|
||||
if ($data['Status'] != 'OK') {
|
||||
return view('status', [
|
||||
'status' => false,
|
||||
'redirect_link' => RedirectLinkHelper::get($transaction->product->packageName->name)
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
$response = ZarinpalApi::checkTransaction($transaction);
|
||||
|
||||
if (!$response['status']) {
|
||||
return view('status', [
|
||||
'status' => false,
|
||||
'redirect_link' => RedirectLinkHelper::get($transaction->product->packageName->name)
|
||||
]);
|
||||
}
|
||||
|
||||
$transaction->update(['status' => Transaction::STATUSES['success']]);
|
||||
|
||||
$transaction->product->buy($transaction->user, $transaction['authority'], Transaction::GATEWAYS['asanpardakht']);
|
||||
|
||||
return view('status', [
|
||||
'status' => true,
|
||||
'redirect_link' => RedirectLinkHelper::get($transaction->product->packageName->name)
|
||||
]);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user