Strimoid/Strimoid

View on GitHub
app/Api/Controllers/AuthController.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Strimoid\Api\Controllers;

use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Strimoid\Models\Notification;

class AuthController extends BaseController
{
    public function login(Request $request): JsonResponse
    {
        $remember = $request->input('remember') === 'true';

        if (auth()->attempt(['name' => $request->input('username'),
            'password' => $request->input('password'), 'is_activated' => true, ], $remember)) {
            if (user()->removed_at || user()->blocked_at) {
                auth()->logout();

                return response()->json(['error' => 'Account blocked or removed'], 400);
            }

            $data = $this->getUserData();

            return response()->json($data);
        }

        return response()->json(['error' => 'Invalid login or password'], 400);
    }

    public function logout(): void
    {
        auth()->logout();
    }

    public function sync(): array
    {
        return $this->getUserData();
    }

    private function getUserData(): array
    {
        $notifications = Notification::with([
                'user' => function ($q): void {
                    $q->select('avatar');
                },
            ])
            ->target(auth()->id())
            ->orderBy('created_at', 'desc')
            ->take(15)->get();

        $data = array_merge(user()->toArray(), [
            'subscribed_groups' => user()->subscribedGroups(),
            'blocked_groups' => user()->blockedGroups(),
            'moderated_groups' => user()->moderatedGroups(),
            'folders' => user()->folders(),
            'notifications' => $notifications,
        ]);

        return ['user' => $data];
    }
}