[CORE][VisibilityScope] Use enum type instead of Bitmap
This commit is contained in:
parent
6f0d9add08
commit
a1d9909379
@ -66,7 +66,7 @@ abstract class FeedController extends Controller
|
|||||||
foreach ($notes as $note) {
|
foreach ($notes as $note) {
|
||||||
switch ($note->getScope()) {
|
switch ($note->getScope()) {
|
||||||
case VisibilityScope::LOCAL: // The controller handles it if private
|
case VisibilityScope::LOCAL: // The controller handles it if private
|
||||||
case VisibilityScope::PUBLIC:
|
case VisibilityScope::EVERYWHERE:
|
||||||
$filtered_notes[] = $note;
|
$filtered_notes[] = $note;
|
||||||
break;
|
break;
|
||||||
case VisibilityScope::ADDRESSEE:
|
case VisibilityScope::ADDRESSEE:
|
||||||
|
@ -102,9 +102,9 @@ class Posting extends Component
|
|||||||
|
|
||||||
// TODO: if in group page, add GROUP visibility to the choices.
|
// TODO: if in group page, add GROUP visibility to the choices.
|
||||||
$form_params[] = ['visibility', ChoiceType::class, ['label' => _m('Visibility:'), 'multiple' => false, 'expanded' => false, 'data' => 'public', 'choices' => [
|
$form_params[] = ['visibility', ChoiceType::class, ['label' => _m('Visibility:'), 'multiple' => false, 'expanded' => false, 'data' => 'public', 'choices' => [
|
||||||
_m('Public') => VisibilityScope::PUBLIC,
|
_m('Public') => VisibilityScope::EVERYWHERE->value,
|
||||||
_m('Local') => VisibilityScope::LOCAL,
|
_m('Local') => VisibilityScope::LOCAL->value,
|
||||||
_m('Addressee') => VisibilityScope::ADDRESSEE,
|
_m('Addressee') => VisibilityScope::ADDRESSEE->value,
|
||||||
]]];
|
]]];
|
||||||
$form_params[] = ['content', TextareaType::class, ['label' => _m('Content:'), 'data' => $initial_content, 'attr' => ['placeholder' => _m($placeholder)], 'constraints' => [new Length(['max' => Common::config('site', 'text_limit')])]]];
|
$form_params[] = ['content', TextareaType::class, ['label' => _m('Content:'), 'data' => $initial_content, 'attr' => ['placeholder' => _m($placeholder)], 'constraints' => [new Length(['max' => Common::config('site', 'text_limit')])]]];
|
||||||
$form_params[] = ['attachments', FileType::class, ['label' => _m('Attachments:'), 'multiple' => true, 'required' => false, 'invalid_message' => _m('Attachment not valid.')]];
|
$form_params[] = ['attachments', FileType::class, ['label' => _m('Attachments:'), 'multiple' => true, 'required' => false, 'invalid_message' => _m('Attachment not valid.')]];
|
||||||
@ -135,7 +135,7 @@ class Posting extends Component
|
|||||||
throw new ClientException(_m('You must enter content or provide at least one attachment to post a note.'));
|
throw new ClientException(_m('You must enter content or provide at least one attachment to post a note.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!VisibilityScope::isValue($data['visibility'])) {
|
if (\is_null(VisibilityScope::tryFrom($data['visibility']))) {
|
||||||
throw new ClientException(_m('You have selected an impossible visibility.'));
|
throw new ClientException(_m('You have selected an impossible visibility.'));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -148,7 +148,7 @@ class Posting extends Component
|
|||||||
content: $data['content'],
|
content: $data['content'],
|
||||||
content_type: $content_type,
|
content_type: $content_type,
|
||||||
language: $data['language'],
|
language: $data['language'],
|
||||||
scope: $data['visibility'],
|
scope: VisibilityScope::from($data['visibility']),
|
||||||
target: $data['in'] ?? null,
|
target: $data['in'] ?? null,
|
||||||
attachments: $data['attachments'],
|
attachments: $data['attachments'],
|
||||||
process_note_content_extra_args: $extra_args,
|
process_note_content_extra_args: $extra_args,
|
||||||
@ -185,13 +185,13 @@ class Posting extends Component
|
|||||||
?string $content,
|
?string $content,
|
||||||
string $content_type,
|
string $content_type,
|
||||||
?string $language = null,
|
?string $language = null,
|
||||||
?int $scope = null,
|
?VisibilityScope $scope = null,
|
||||||
?string $target = null,
|
?string $target = null,
|
||||||
array $attachments = [],
|
array $attachments = [],
|
||||||
array $processed_attachments = [],
|
array $processed_attachments = [],
|
||||||
array $process_note_content_extra_args = [],
|
array $process_note_content_extra_args = [],
|
||||||
): Note {
|
): Note {
|
||||||
$scope ??= VisibilityScope::PUBLIC; // TODO: If site is private, default to LOCAL
|
$scope ??= VisibilityScope::EVERYWHERE; // TODO: If site is private, default to LOCAL
|
||||||
$rendered = null;
|
$rendered = null;
|
||||||
$mentions = [];
|
$mentions = [];
|
||||||
if (!empty($content)) {
|
if (!empty($content)) {
|
||||||
|
@ -170,11 +170,11 @@ class Note extends Model
|
|||||||
// Scope
|
// Scope
|
||||||
if (\in_array('https://www.w3.org/ns/activitystreams#Public', $type_note->get('to'))) {
|
if (\in_array('https://www.w3.org/ns/activitystreams#Public', $type_note->get('to'))) {
|
||||||
// Public: Visible for all, shown in public feeds
|
// Public: Visible for all, shown in public feeds
|
||||||
$map['scope'] = VisibilityScope::PUBLIC;
|
$map['scope'] = VisibilityScope::EVERYWHERE;
|
||||||
} elseif (\in_array('https://www.w3.org/ns/activitystreams#Public', $type_note->get('cc'))) {
|
} elseif (\in_array('https://www.w3.org/ns/activitystreams#Public', $type_note->get('cc'))) {
|
||||||
// Unlisted: Visible for all but not shown in public feeds
|
// Unlisted: Visible for all but not shown in public feeds
|
||||||
// It isn't the note that dictates what feed is shown in but the feed, it only dictates who can access it.
|
// It isn't the note that dictates what feed is shown in but the feed, it only dictates who can access it.
|
||||||
$map['scope'] = VisibilityScope::PUBLIC;
|
$map['scope'] = VisibilityScope::EVERYWHERE;
|
||||||
} else {
|
} else {
|
||||||
// Either Followers-only or Direct
|
// Either Followers-only or Direct
|
||||||
if ($type_note->get('directMessage') ?? false // Is DM explicitly?
|
if ($type_note->get('directMessage') ?? false // Is DM explicitly?
|
||||||
@ -327,7 +327,7 @@ class Note extends Model
|
|||||||
|
|
||||||
// Target scope
|
// Target scope
|
||||||
switch ($object->getScope()) {
|
switch ($object->getScope()) {
|
||||||
case VisibilityScope::PUBLIC:
|
case VisibilityScope::EVERYWHERE:
|
||||||
$attr['to'] = ['https://www.w3.org/ns/activitystreams#Public'];
|
$attr['to'] = ['https://www.w3.org/ns/activitystreams#Public'];
|
||||||
$attr['cc'] = [Router::url('actor_subscribers_id', ['id' => $object->getActor()->getId()], Router::ABSOLUTE_URL)];
|
$attr['cc'] = [Router::url('actor_subscribers_id', ['id' => $object->getActor()->getId()], Router::ABSOLUTE_URL)];
|
||||||
break;
|
break;
|
||||||
|
@ -21,14 +21,12 @@ declare(strict_types = 1);
|
|||||||
|
|
||||||
namespace App\Core;
|
namespace App\Core;
|
||||||
|
|
||||||
use App\Util\Bitmap;
|
enum VisibilityScope: int // having an int is just convenient
|
||||||
|
|
||||||
class VisibilityScope extends Bitmap
|
|
||||||
{
|
{
|
||||||
public const PUBLIC = 1; // Can be shown everywhere (default)
|
case EVERYWHERE = 1; // Can be shown everywhere (default)
|
||||||
public const LOCAL = 2; // Non-public and non-federated (default in private sites)
|
case LOCAL = 2; // Non-public and non-federated (default in private sites)
|
||||||
public const ADDRESSEE = 4; // Only if the actor is the author or one of the targets
|
case ADDRESSEE = 4; // Only if the actor is the author or one of the targets
|
||||||
public const GROUP = 8; // Only in the Group feed
|
case GROUP = 8; // Only in the Group feed
|
||||||
public const COLLECTION = 16; // Only for the collection to see (same as addressee but not available in feeds, notifications only)
|
case COLLECTION = 16; // Only for the collection to see (same as addressee but not available in feeds, notifications only)
|
||||||
public const MESSAGE = 32; // Direct Message (same as Collection, but also with dedicated plugin)
|
case MESSAGE = 32; // Direct Message (same as Collection, but also with dedicated plugin)
|
||||||
}
|
}
|
||||||
|
@ -58,7 +58,7 @@ class Note extends Entity
|
|||||||
private ?int $reply_to = null;
|
private ?int $reply_to = null;
|
||||||
private bool $is_local;
|
private bool $is_local;
|
||||||
private ?string $source;
|
private ?string $source;
|
||||||
private int $scope = 1;
|
private int $scope = 1; //VisibilityScope::EVERYWHERE->value;
|
||||||
private ?string $url;
|
private ?string $url;
|
||||||
private ?int $language_id;
|
private ?int $language_id;
|
||||||
private \DateTimeInterface $created;
|
private \DateTimeInterface $created;
|
||||||
@ -163,15 +163,15 @@ class Note extends Entity
|
|||||||
return $this->source;
|
return $this->source;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setScope(int $scope): self
|
public function setScope(VisibilityScope|int $scope): self
|
||||||
{
|
{
|
||||||
$this->scope = $scope;
|
$this->scope = is_int($scope) ? $scope : $scope->value;
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getScope(): int
|
public function getScope(): VisibilityScope
|
||||||
{
|
{
|
||||||
return $this->scope;
|
return VisibilityScope::from($this->scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setUrl(?string $url): self
|
public function setUrl(?string $url): self
|
||||||
@ -484,7 +484,7 @@ class Note extends Entity
|
|||||||
'reply_to' => ['type' => 'int', 'not null' => false, 'default' => null, 'foreign key' => true, 'target' => 'Note.id', 'multiplicity' => 'one to one', 'description' => 'note replied to, null if root of a conversation'],
|
'reply_to' => ['type' => 'int', 'not null' => false, 'default' => null, 'foreign key' => true, 'target' => 'Note.id', 'multiplicity' => 'one to one', 'description' => 'note replied to, null if root of a conversation'],
|
||||||
'is_local' => ['type' => 'bool', 'not null' => true, 'description' => 'was this note generated by a local actor'],
|
'is_local' => ['type' => 'bool', 'not null' => true, 'description' => 'was this note generated by a local actor'],
|
||||||
'source' => ['type' => 'varchar', 'foreign key' => true, 'length' => 32, 'target' => 'NoteSource.code', 'multiplicity' => 'many to one', 'description' => 'fkey to source of note, like "web", "im", or "clientname"'],
|
'source' => ['type' => 'varchar', 'foreign key' => true, 'length' => 32, 'target' => 'NoteSource.code', 'multiplicity' => 'many to one', 'description' => 'fkey to source of note, like "web", "im", or "clientname"'],
|
||||||
'scope' => ['type' => 'int', 'not null' => true, 'default' => VisibilityScope::PUBLIC, 'description' => 'bit map for distribution scope; 1 = everywhere; 2 = this server only; 4 = addressees; 8 = groups; 16 = collection; 32 = messages'],
|
'scope' => ['type' => 'int', 'not null' => true, 'default' => VisibilityScope::EVERYWHERE->value, 'description' => 'bit map for distribution scope; 1 = everywhere; 2 = this server only; 4 = addressees; 8 = groups; 16 = collection; 32 = messages'],
|
||||||
'url' => ['type' => 'text', 'description' => 'Permalink to Note'],
|
'url' => ['type' => 'text', 'description' => 'Permalink to Note'],
|
||||||
'language_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Language.id', 'multiplicity' => 'one to many', 'description' => 'The language for this note'],
|
'language_id' => ['type' => 'int', 'foreign key' => true, 'target' => 'Language.id', 'multiplicity' => 'one to many', 'description' => 'The language for this note'],
|
||||||
'created' => ['type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was created'],
|
'created' => ['type' => 'datetime', 'not null' => true, 'default' => 'CURRENT_TIMESTAMP', 'description' => 'date this record was created'],
|
||||||
|
Loading…
Reference in New Issue
Block a user