Отправка push-уведомлений пользователям, которые сменили пароль за 30 дней до - PullRequest
0 голосов
/ 14 ноября 2018

Это мой случай:

В моей базе данных у меня есть таблица users.Строки в таблице также имеют поле password_changed_at.Теперь я хотел бы выбрать всех пользователей, у которых поле password_changed_at старше 30 дней, и отправить push-уведомление. Но я застрял на том, как это сделать с Carbon.Мой код теперь выглядит так:

public function passwordExpired() {

    $dateTime = new DateTime();
    $currentDateTime = $dateTime->format('Y-m-d H:i');
    $users = User::where('password_changed_at', $currentDateTime)->get();

    // $user = $request->user();
    foreach ($users as $user) {

    $password_changed_at = new Carbon(($user->password_changed_at) ? $user->password_changed_at : "");

    if (Carbon::now()->diffInDays($password_changed_at) >= 30) {

        foreach ($password_changed_at as $password) 
        {
            // $user = $user->id;
            $user->notify(new ReminderPassword($user));

        $push = new PushNotification('apn');
        $push->setMessage([
            'aps' => [
                'alert' => 'Reminder for your password "'.$user->email.'"',
                'sound' => 'default',
                'badge' => $user->unreadNotifications->count()

            ],
            'extraPayLoad' => [
                'custom' => 'My custom data',
            ]
        ]);
        $push->setDevicesToken($user->deviceToken);
        $push->send();
        $feedback = $push->getFeedback();
        }

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

С помощью $users = User::where('password_changed_at', $currentDateTime)->get(); вы выбираете всех пользователей, которые изменили свою дату сегодня , но вы хотите выбрать всех пользователей, которые изменили свой пароль +30 дней назад.

Таким образом, вы можете просто выбрать их, используя область запроса. В вашем классе Users добавьте это:

class Users extends Authenticatable
{

    // ...

    public function scopePasswordOlderThan30Days(Builder $builder)
    {
        $expirationDate = Carbon::now()->subDays(30);

        return $builder->where('password_changed_at', '<=', $expirationDate);
    }
}

В вашей функции используйте это как:

public function passwordExpired()
{
    $users = User::passwordOlderThan30Days()->get();

    $users->each(function(User $user) {
        // notify the user
    })
}
0 голосов
/ 14 ноября 2018

Похоже, diffInDays работает в обратном направлении (то есть различие в более старом дне возвращает отрицательное значение). Смотри: https://carbon.nesbot.com/docs/#api-difference

Таким образом, вы можете изменить свой код следующим образом:

public function passwordExpired() {

$dateTime = new DateTime();
$currentDateTime = $dateTime->format('Y-m-d H:i');
$users = User::where('password_changed_at', $currentDateTime)->get();

foreach ($users as $user) {

    $password_changed_at = new Carbon(
      ($user->password_changed_at) ? $user->password_changed_at : ""
    );

    // DiffIndays works the other way round:

    if ($password_changed_at->diffInDays(Carbon::now()) >= 30) {

        $user->notify(new ReminderPassword($user));

        $push = new PushNotification('apn');
        $push->setMessage([
            'aps' => [
              'alert' => 'Reminder for your password "' . $user->email . '"', 
              'sound' => 'default', 'badge' => $user->unreadNotifications->count() 
             ], 
             'extraPayLoad' => ['custom' => 'My custom data', ]
        ]);
        $push->setDevicesToken($user->deviceToken);
        $push->send();

        $feedback = $push->getFeedback();
    }
}

}

...