feat: add referral

This commit is contained in:
2026-06-06 13:10:53 +03:30
parent c930c26589
commit 9080cf866e
6 changed files with 144 additions and 7 deletions
+63 -3
View File
@@ -61,9 +61,10 @@ public function loginV2(Request $request)
'identifier' => $response['uuid'] ?? null,
'password' => config('app.default_password'),
// 'name' => trim(($response['first_name'] ?? '') . ' ' . ($response['last_name'] ?? '')),
'mobile' => $mobile,
'mobile' => $mobile,
'first_name' => $response['first_name'] ?? null,
'last_name' => $response['last_name'] ?? null
'last_name' => $response['last_name'] ?? null,
'referral_code' => $response['referral_code'] ?? null,
]);
} else {
// Only update name and mobile for existing user
@@ -71,10 +72,13 @@ public function loginV2(Request $request)
$user->last_name = $response['last_name'] ?? $user->last_name;
// $user->name = trim(($response['first_name'] ?? '') . ' ' . ($response['last_name'] ?? ''));
$user->mobile = $mobile ?? $user->mobile;
$user->referral_code = $response['referral_code'] ?? $user->referral_code;
$user->save();
}
// Link the referral relationship and reward the referrer (کد معرف)
$this->linkReferral($user, $response);
$access_token = $user->createToken('user')->plainTextToken;
return [
@@ -111,6 +115,7 @@ private function syncUserFromStatus(array $response, ?User $user = null): User
'mobile' => $mobile,
'first_name' => $response['first_name'] ?? null,
'last_name' => $response['last_name'] ?? null,
'referral_code' => $response['referral_code'] ?? null,
'email_verified_at' => $response['email_verified_at'] ?? null
]);
} else {
@@ -118,13 +123,68 @@ private function syncUserFromStatus(array $response, ?User $user = null): User
$user->first_name = $response['first_name'] ?? $user->first_name;
$user->last_name = $response['last_name'] ?? $user->last_name;
$user->mobile = $mobile ?? $user->mobile;
$user->referral_code = $response['referral_code'] ?? $user->referral_code;
$user->email_verified_at = $response['email_verified_at'] ?? $user->email_verified_at;
$user->save();
}
// Link the referral relationship and reward the referrer (کد معرف)
$this->linkReferral($user, $response);
return $user;
}
/**
* Resolve the approagency referrer (by uuid/identifier) to a local
* meditation user, record the relationship once, and grant the referrer
* their per-invite points. The free-month subscription milestone is
* handled in approagency, where products/plans/transactions are managed.
*/
private function linkReferral(User $user, array $response): void
{
if ($user->referred_by) {
return; // already linked — never reward twice
}
$referrerUuid = $response['referrer_uuid'] ?? null;
if (!$referrerUuid) {
return;
}
$referrer = User::where('identifier', $referrerUuid)->first();
if (!$referrer || $referrer->id === $user->id) {
return;
}
$user->referred_by = $referrer->id;
$user->save();
// 100 points per successful invite
$referrer->increment('referral_points', User::REFERRAL_POINTS_PER_INVITE);
}
/**
* Referral dashboard data (دعوت دوستان page).
*/
public function referral(Request $request)
{
$user = auth()->user();
$invites = $user->referrals()->count();
$target = User::REFERRAL_SUBSCRIPTION_TARGET;
return response()->json([
'referral_code' => $user->referral_code,
'referral_points' => (int) $user->referral_points,
'successful_invites' => $invites,
'subscription_target' => $target,
'remaining_to_subscription' => max(0, $target - $invites),
'rewards' => [
'points_per_invite' => User::REFERRAL_POINTS_PER_INVITE,
'friend_points_share_percent' => (int) (User::REFERRAL_SHARE * 100),
'subscription_invite_target' => $target,
],
]);
}
public function loginForeginer(Request $request)
{