Pony.fm/app/Http/Controllers/Api/Web/NotificationsController.php
2021-02-14 19:45:51 +00:00

115 lines
3.4 KiB
PHP

<?php
/**
* Pony.fm - A community for pony fan music.
* Copyright (C) 2016 Feld0.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
namespace App\Http\Controllers\Api\Web;
use App\Http\Controllers\ApiControllerBase;
use App\Models\Notification;
use App\Models\Subscription;
use App\Models\Track;
use App\Models\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Request;
use Minishlink\WebPush\WebPush;
class NotificationsController extends ApiControllerBase
{
/**
* Returns the logged-in user's last 20 notifications.
*
* @return array
*/
public function getNotifications()
{
$notifications = Notification::forUser(Auth::user())
->take(20)
->get();
$outputArray = $notifications->toArray();
return ['notifications' => array_values(array_filter($outputArray))];
}
/**
* This action returns the number of notifications that were updated.
* Any notifications that were specified that don't belong to the logged-in
* user are ignored.
*
* @return array
*/
public function putMarkAsRead()
{
$notificationIds = Request::json('notification_ids');
$numberOfUpdatedRows = Auth::user()
->notifications()
->whereIn('id', $notificationIds)
->update(['is_read' => true]);
return ['notifications_updated' => $numberOfUpdatedRows];
}
/**
* Subscribe a user to native push notifications. Takes an endpoint and
* encryption keys from the client and stores them in the database
* for future use.
*
* @return string
*/
public function postSubscribe()
{
$input = json_decode(Request::json('subscription'));
if ($input != 'null') {
$existing = Subscription::where('endpoint', '=', $input->endpoint)
->where('user_id', '=', Auth::user()->id)
->first();
if ($existing === null) {
$subscription = Subscription::create([
'user_id' => Auth::user()->id,
'endpoint' => $input->endpoint,
'p256dh' => $input->keys->p256dh,
'auth' => $input->keys->auth,
]);
return ['id' => $subscription->id];
} else {
return ['id' => $existing->id];
}
} else {
return ['error' => 'No data'];
}
}
/**
* Removes a user's notification subscription.
*
* @return string
*/
public function postUnsubscribe()
{
$input = json_decode(Request::json('subscription'));
$existing = Subscription::where('endpoint', '=', $input->endpoint)
->where('user_id', '=', Auth::user()->id)
->delete();
return ['result' => 'success'];
}
}