pixelfed/pixelfed

View on GitHub
app/Services/UserRoleService.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

namespace App\Services;

use App\Models\UserRoles;

class UserRoleService
{
    public static function can($action, $id, $useDefaultFallback = true)
    {
        $default = self::defaultRoles();
        $roles = self::get($id);
        return
            in_array($action, array_keys($roles)) ?
                $roles[$action] :
                (
                    $useDefaultFallback ?
                        $default[$action] :
                        false
                );
        }

    public static function get($id)
    {
        if($roles = UserRoles::whereUserId($id)->first()) {
            return $roles->roles;
        }

        return self::defaultRoles();
    }

    public static function roleKeys()
    {
        return array_keys(self::defaultRoles());
    }

    public static function defaultRoles()
    {
        return [
            'account-force-private' => true,
            'account-ignore-follow-requests' => true,

            'can-view-public-feed' => true,
            'can-view-network-feed' => true,
            'can-view-discover' => true,
            'can-view-hashtag-feed' => false,

            'can-post' => true,
            'can-comment' => true,
            'can-like' => true,
            'can-share' => true,

            'can-follow' => false,
            'can-make-public' => false,

            'can-direct-message' => false,
            'can-use-stories' => false,
            'can-view-sensitive' => false,
            'can-bookmark' => false,
            'can-collections' => false,
            'can-federation' => false,
        ];
    }

    public static function getRoles($id)
    {
        $myRoles = self::get($id);
        $roleData = collect(self::roleData())
            ->map(function($role, $k) use($myRoles) {
                $role['value'] = $myRoles[$k];
                return $role;
            })
            ->toArray();
        return $roleData;
    }

    public static function roleData()
    {
        return [
            'account-force-private' => [
                'title' => 'Force Private Account',
                'action' => 'Prevent changing account from private'
            ],
            'account-ignore-follow-requests' => [
                'title' => 'Ignore Follow Requests',
                'action' => 'Hide follow requests and associated notifications'
            ],
            'can-view-public-feed' => [
                'title' => 'Hide Public Feed',
                'action' => 'Hide the public feed timeline'
            ],
            'can-view-network-feed' => [
                'title' => 'Hide Network Feed',
                'action' => 'Hide the network feed timeline'
            ],
            'can-view-discover' => [
                'title' => 'Hide Discover',
                'action' => 'Hide the discover feature'
            ],
            'can-post' => [
                'title' => 'Can post',
                'action' => 'Allows new posts to be shared'
            ],
            'can-comment' => [
                'title' => 'Can comment',
                'action' => 'Allows new comments to be posted'
            ],
            'can-like' => [
                'title' => 'Can Like',
                'action' => 'Allows the ability to like posts and comments'
            ],
            'can-share' => [
                'title' => 'Can Share',
                'action' => 'Allows the ability to share posts and comments'
            ],
            'can-follow' => [
                'title' => 'Can Follow',
                'action' => 'Allows the ability to follow accounts'
            ],
            'can-make-public' => [
                'title' => 'Can make account public',
                'action' => 'Allows the ability to make account public'
            ],

            'can-direct-message' => [
                'title' => '',
                'action' => ''
            ],
            'can-use-stories' => [
                'title' => '',
                'action' => ''
            ],
            'can-view-sensitive' => [
                'title' => '',
                'action' => ''
            ],
            'can-bookmark' => [
                'title' => '',
                'action' => ''
            ],
            'can-collections' => [
                'title' => '',
                'action' => ''
            ],
            'can-federation' => [
                'title' => '',
                'action' => ''
            ],
        ];
    }

    public static function mapInvite($id, $data = [])
    {
        $roles = self::get($id);

        $map = [
            'account-force-private' => 'private',
            'account-ignore-follow-requests' => 'private',

            'can-view-public-feed' => 'discovery_feeds',
            'can-view-network-feed' => 'discovery_feeds',
            'can-view-discover' => 'discovery_feeds',
            'can-view-hashtag-feed' => 'discovery_feeds',

            'can-post' => 'post',
            'can-comment' => 'comment',
            'can-like' => 'like',
            'can-share' => 'share',

            'can-follow' => 'follow',
            'can-make-public' => '!private',

            'can-direct-message' => 'dms',
            'can-use-stories' => 'story',
            'can-view-sensitive' => '!hide_cw',
            'can-bookmark' => 'bookmark',
            'can-collections' => 'collection',
            'can-federation' => 'federation',
        ];

        foreach ($map as $key => $value) {
            if(!isset($data[$value]) && !isset($data[substr($value, 1)])) {
                $map[$key] = false;
                continue;
            }
            $map[$key] = str_starts_with($value, '!') ? !$data[substr($value, 1)] : $data[$value];
        }

        return $map;
    }

    public static function mapActions($id, $data = [])
    {
        $res = [];
        $map = [
            'account-force-private' => 'private',
            'account-ignore-follow-requests' => 'private',

            'can-view-public-feed' => 'discovery_feeds',
            'can-view-network-feed' => 'discovery_feeds',
            'can-view-discover' => 'discovery_feeds',
            'can-view-hashtag-feed' => 'discovery_feeds',

            'can-post' => 'post',
            'can-comment' => 'comment',
            'can-like' => 'like',
            'can-share' => 'share',

            'can-follow' => 'follow',
            'can-make-public' => '!private',

            'can-direct-message' => 'dms',
            'can-use-stories' => 'story',
            'can-view-sensitive' => '!hide_cw',
            'can-bookmark' => 'bookmark',
            'can-collections' => 'collection',
            'can-federation' => 'federation',
        ];

        foreach ($map as $key => $value) {
            if(!isset($data[$value]) && !isset($data[substr($value, 1)])) {
                $res[$key] = false;
                continue;
            }
            $res[$key] = str_starts_with($value, '!') ? !$data[substr($value, 1)] : $data[$value];
        }

        return $res;
    }
}