123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- <?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;
- }
- }
|