🗑️ Remove unused Livewire components and Blade views related to elections, member management, changelog, project support, and meetups.

This commit is contained in:
HolgerHatGarKeineNode
2026-01-18 01:33:24 +01:00
parent 087b7a4997
commit 00216409b4
37 changed files with 1055 additions and 1670 deletions

View File

@@ -1,171 +0,0 @@
<?php
namespace App\Livewire\Association\Election;
use App\Models\Election;
use Livewire\Component;
use swentel\nostr\Filter\Filter;
use swentel\nostr\Message\RequestMessage;
use swentel\nostr\Relay\Relay;
use swentel\nostr\Relay\RelaySet;
use swentel\nostr\Request\Request;
use swentel\nostr\Subscription\Subscription;
final class Admin extends Component
{
public bool $isAllowed = false;
public ?string $currentPubkey = null;
public ?array $votes = null;
public ?array $boardVotes = null;
public ?array $events = null;
public ?array $boardEvents = null;
public ?Election $election = null;
public string $signThisEvent = '';
public array $plebs = [];
public array $electionConfig = [];
protected $listeners = [
'nostrLoggedOut' => 'handleNostrLoggedOut',
'nostrLoggedIn' => 'handleNostrLoggedIn',
'echo:votes,.newVote' => 'handleNewVote',
];
public function mount(Election $election): void
{
$this->election = $election;
$this->loadEvents();
$this->loadBoardEvents();
$this->loadVotes();
$this->loadBoardVotes();
}
public function handleNostrLoggedOut(): void
{
$this->currentPubkey = null;
$this->currentPleb = null;
}
public function handleNostrLoggedIn($pubkey): void
{
$this->currentPubkey = $pubkey;
$allowedPubkeys = [
'0adf67475ccc5ca456fd3022e46f5d526eb0af6284bf85494c0dd7847f3e5033',
'430169631f2f0682c60cebb4f902d68f0c71c498fd1711fd982f052cf1fd4279',
];
if (in_array($this->currentPubkey, $allowedPubkeys, true)) {
$this->isAllowed = true;
}
dd($this->isAllowed);
}
public function handleNewVote(): void
{
$this->loadEvents();
$this->loadBoardEvents();
$this->loadVotes();
$this->loadBoardVotes();
}
public function loadVotes(): void
{
$this->votes = collect($this->events)
->map(fn ($event) => [
'created_at' => $event['created_at'],
'pubkey' => $event['pubkey'],
'forpubkey' => $this->fetchProfile($event['content']),
'type' => str($event['content'])->after(',')->toString(),
])
->sortByDesc('created_at')
->unique(fn ($event) => $event['pubkey'].$event['type'])
->values()
->groupBy('type')
->map(fn ($votes) => [
'type' => $votes[0]['type'],
'votes' => $votes->groupBy('forpubkey')->map(fn ($group) => ['count' => $group->count()])->toArray(),
])
->values()
->toArray();
}
public function loadBoardVotes(): void
{
$this->boardVotes = collect($this->boardEvents)
->map(fn ($event) => [
'created_at' => $event['created_at'],
'pubkey' => $event['pubkey'],
'forpubkey' => $this->fetchProfile($event['content']),
'type' => str($event['content'])->after(',')->toString(),
])
->sortByDesc('created_at')
->values()
->groupBy('type')
->map(fn ($votes) => [
'type' => $votes[0]['type'],
'votes' => $votes->groupBy('forpubkey')->map(fn ($group) => ['count' => $group->count()])->toArray(),
])
->values()
->toArray();
}
public function loadEvents(): void
{
$this->events = $this->loadNostrEvents([32122]);
}
public function loadBoardEvents(): void
{
$this->boardEvents = $this->loadNostrEvents([2121]);
}
public function fetchProfile($content): string
{
$pubkey = str($content)->before(',')->toString();
$profile = \App\Models\Profile::query()->where('pubkey', $pubkey)->first();
if (! $profile) {
\Artisan::call(\App\Console\Commands\Nostr\FetchProfile::class, ['--pubkey' => $pubkey]);
$profile = \App\Models\Profile::query()->where('pubkey', $pubkey)->first();
}
return $profile->pubkey;
}
public function loadNostrEvents($kinds): array
{
$subscription = new Subscription;
$subscriptionId = $subscription->setId();
$filter = new Filter;
$filter->setKinds($kinds);
$requestMessage = new RequestMessage($subscriptionId, [$filter]);
$relaySet = new RelaySet;
$relaySet->setRelays([new Relay(config('services.relay'))]);
$request = new Request($relaySet, $requestMessage);
$response = $request->send();
return collect($response[config('services.relay')])
->map(function ($event) {
if (! isset($event->event)) {
return false;
}
return [
'id' => $event->event->id,
'kind' => $event->event->kind,
'content' => $event->event->content,
'pubkey' => $event->event->pubkey,
'tags' => $event->event->tags,
'created_at' => $event->event->created_at,
];
})
->filter()
->toArray();
}
}

View File

@@ -1,71 +0,0 @@
<?php
namespace App\Livewire\Association\Election;
use App\Models\EinundzwanzigPleb;
use App\Models\Election;
use App\Support\NostrAuth;
use Livewire\Component;
final class Index extends Component
{
public bool $isAllowed = false;
public ?string $currentPubkey = null;
public ?EinundzwanzigPleb $currentPleb = null;
public array $elections = [];
protected $listeners = [
'nostrLoggedOut' => 'handleNostrLoggedOut',
'nostrLoggedIn' => 'handleNostrLoggedIn',
];
public function mount(): void
{
$this->elections = Election::query()
->get()
->toArray();
if (NostrAuth::check()) {
$this->currentPubkey = NostrAuth::pubkey();
$logPubkeys = [
'0adf67475ccc5ca456fd3022e46f5d526eb0af6284bf85494c0dd7847f3e5033',
'430169631f2f0682c60cebb4f902d68f0c71c498fd1711fd982f052cf1fd4279',
];
if (in_array($this->currentPubkey, $logPubkeys, true)) {
$this->isAllowed = true;
}
}
}
public function handleNostrLoggedOut(): void
{
$this->isAllowed = false;
$this->currentPubkey = null;
$this->currentPleb = null;
}
public function handleNostrLoggedIn($pubkey): void
{
NostrAuth::login($pubkey);
$this->currentPubkey = $pubkey;
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()
->where('pubkey', $pubkey)->first();
$logPubkeys = [
'0adf67475ccc5ca456fd3022e46f5d526eb0af6284bf85494c0dd7847f3e5033',
'430169631f2f0682c60cebb4f902d68f0c71c498fd1711fd982f052cf1fd4279',
];
if (in_array($this->currentPubkey, $logPubkeys, true)) {
$this->isAllowed = true;
}
}
public function saveElection($index): void
{
$election = $this->elections[$index];
$electionModel = Election::find($election['id']);
$electionModel->candidates = $election['candidates'];
$electionModel->save();
}
}

View File

@@ -1,325 +0,0 @@
<?php
namespace App\Livewire\Association\Election;
use App\Models\EinundzwanzigPleb;
use App\Models\Election;
use App\Models\Profile;
use App\Support\NostrAuth;
use Livewire\Attributes\Computed;
use Livewire\Component;
use swentel\nostr\Event\Event as NostrEvent;
use swentel\nostr\Filter\Filter;
use swentel\nostr\Message\EventMessage;
use swentel\nostr\Message\RequestMessage;
use swentel\nostr\Relay\Relay;
use swentel\nostr\Relay\RelaySet;
use swentel\nostr\Request\Request;
use swentel\nostr\Subscription\Subscription;
final class Show extends Component
{
public bool $isAllowed = false;
public bool $showLog = false;
public ?string $currentPubkey = null;
public ?EinundzwanzigPleb $currentPleb = null;
public array $events = [];
public array $boardEvents = [];
public Election $election;
public array $plebs = [];
public string $search = '';
public string $signThisEvent = '';
public bool $isNotClosed = true;
public array $positions = [
'presidency' => ['icon' => 'fa-crown', 'title' => 'Präsidium'],
'board' => ['icon' => 'fa-users', 'title' => 'Vizepräsidium'],
];
protected $listeners = [
'nostrLoggedIn' => 'handleNostrLoggedIn',
'nostrLoggedOut' => 'handleNostrLoggedOut',
'echo:votes,.newVote' => 'handleNewVote',
];
#[Computed]
public function loadedEvents(): array
{
return collect($this->events)
->map(function ($event) {
$profile = Profile::query()
->where('pubkey', $event['pubkey'])
->first()
?->toArray();
$votedFor = Profile::query()
->where('pubkey', str($event['content'])->before(',')->toString())
->first()
?->toArray();
return [
'id' => $event['id'],
'kind' => $event['kind'],
'content' => $event['content'],
'pubkey' => $event['pubkey'],
'tags' => $event['tags'],
'created_at' => $event['created_at'],
'profile' => $profile,
'votedFor' => $votedFor,
'type' => str($event['content'])->after(',')->toString(),
];
})
->sortByDesc('created_at')
->unique(fn ($event) => $event['pubkey'].$event['type'])
->values()
->toArray();
}
#[Computed]
public function loadedBoardEvents(): array
{
return collect($this->boardEvents)
->map(function ($event) {
$profile = Profile::query()
->where('pubkey', $event['pubkey'])
->first()
?->toArray();
$votedFor = Profile::query()
->where('pubkey', str($event['content'])->before(',')->toString())
->first()
?->toArray();
return [
'id' => $event['id'],
'kind' => $event['kind'],
'content' => $event['content'],
'pubkey' => $event['pubkey'],
'tags' => $event['tags'],
'created_at' => $event['created_at'],
'profile' => $profile,
'votedFor' => $votedFor,
'type' => str($event['content'])->after(',')->toString(),
];
})
->sortByDesc('created_at')
->values()
->toArray();
}
#[Computed]
public function electionConfig(): array
{
$loadedEvents = $this->loadedEvents();
return collect(json_decode($this->election->candidates, true, 512, JSON_THROW_ON_ERROR))
->map(function ($c) use ($loadedEvents) {
$candidates = Profile::query()
->whereIn('pubkey', $c['c'])
->get()
->map(function ($p) use ($loadedEvents, $c) {
$votedClass = ' bg-green-500/20 text-green-700';
$notVotedClass = ' bg-gray-500/20 text-gray-100';
$hasVoted = $loadedEvents
->filter(fn ($e) => $e['type'] === $c['type'] && $e['pubkey'] === $this->currentPubkey)
->firstWhere('votedFor.pubkey', $p->pubkey);
return [
'pubkey' => $p->pubkey,
'name' => $p->name,
'picture' => $p->picture,
'votedClass' => $hasVoted ? $votedClass : $notVotedClass,
];
});
return [
'type' => $c['type'],
'c' => $c['c'],
'candidates' => $candidates,
];
})
->toArray();
}
#[Computed]
public function electionConfigBoard(): array
{
$loadedBoardEvents = $this->loadedBoardEvents();
return collect(json_decode($this->election->candidates, true, 512, JSON_THROW_ON_ERROR))
->map(function ($c) use ($loadedBoardEvents) {
$candidates = Profile::query()
->whereIn('pubkey', $c['c'])
->get()
->map(function ($p) use ($loadedBoardEvents, $c) {
$votedClass = ' bg-green-500/20 text-green-700';
$notVotedClass = ' bg-gray-500/20 text-gray-100';
$hasVoted = $loadedBoardEvents
->filter(fn ($e) => $e['type'] === $c['type'] && $e['pubkey'] === $this->currentPubkey)
->firstWhere('votedFor.pubkey', $p->pubkey);
return [
'pubkey' => $p->pubkey,
'name' => $p->name,
'picture' => $p->picture,
'votedClass' => $hasVoted ? $votedClass : $notVotedClass,
'hasVoted' => $hasVoted,
];
});
return [
'type' => $c['type'],
'c' => $c['c'],
'candidates' => $candidates,
];
})
->toArray();
}
public function mount(Election $election): void
{
$this->election = $election;
$this->plebs = EinundzwanzigPleb::query()
->with(['profile'])
->whereIn('association_status', [3, 4])
->orderBy('association_status', 'desc')
->get()
->toArray();
$this->loadEvents();
$this->loadBoardEvents();
if ($this->election->end_time?->isPast() || ! config('services.voting')) {
$this->isNotClosed = false;
}
}
public function updatedSearch($value): void
{
$this->plebs = EinundzwanzigPleb::query()
->with(['profile'])
->whereIn('association_status', [3, 4])
->where(fn ($query) => $query
->where('pubkey', 'like', "%$value%")
->orWhereHas('profile', fn ($query) => $query->where('name', 'ilike', "%$value%")))
->orderBy('association_status', 'desc')
->get()
->toArray();
}
public function handleNostrLoggedIn($pubkey): void
{
NostrAuth::login($pubkey);
$this->currentPubkey = $pubkey;
$this->currentPleb = EinundzwanzigPleb::query()->where('pubkey', $pubkey)->first();
$logPubkeys = [
'0adf67475ccc5ca456fd3022e46f5d526eb0af6284bf85494c0dd7847f3e5033',
'430169631f2f0682c60cebb4f902d68f0c71c498fd1711fd982f052cf1fd4279',
];
if (in_array($this->currentPubkey, $logPubkeys, true)) {
$this->showLog = true;
$this->isAllowed = true;
}
}
public function handleNostrLoggedOut(): void
{
$this->isAllowed = false;
$this->currentPubkey = null;
$this->currentPleb = null;
}
public function handleNewVote(): void
{
$this->loadEvents();
$this->loadBoardEvents();
}
public function loadEvents(): void
{
$this->events = $this->loadNostrEvents([32122]);
}
public function loadBoardEvents(): void
{
$this->boardEvents = $this->loadNostrEvents([2121]);
}
public function loadNostrEvents($kinds): array
{
$subscription = new Subscription;
$subscriptionId = $subscription->setId();
$filter = new Filter;
$filter->setKinds($kinds);
$requestMessage = new RequestMessage($subscriptionId, [$filter]);
$relaySet = new RelaySet;
$relaySet->setRelays([new Relay(config('services.relay'))]);
$request = new Request($relaySet, $requestMessage);
$response = $request->send();
return collect($response[config('services.relay')])
->map(function ($event) {
if (! isset($event->event)) {
return false;
}
return [
'id' => $event->event->id,
'kind' => $event->event->kind,
'content' => $event->event->content,
'pubkey' => $event->event->pubkey,
'tags' => $event->event->tags,
'created_at' => $event->event->created_at,
];
})
->filter()
->toArray();
}
public function vote($pubkey, $type, $board = false): void
{
if ($this->election->end_time?->isPast()) {
$this->isNotClosed = false;
return;
}
$note = new NostrEvent;
$note->setKind($board ? 2121 : 32122);
if (! $board) {
$dTag = sprintf('%s,%s,%s', $this->currentPleb->pubkey, date('Y'), $type);
$note->setTags([['d', $dTag]]);
}
$note->setContent("$pubkey,$type");
$this->signThisEvent = $note->toJson();
}
public function checkElection(): void
{
if ($this->election->end_time?->isPast()) {
$this->isNotClosed = false;
}
}
public function signEvent($event): void
{
$note = new NostrEvent;
$note->setId($event['id']);
$note->setSignature($event['sig']);
$note->setKind($event['kind']);
$note->setContent($event['content']);
$note->setPublicKey($event['pubkey']);
$note->setTags($event['tags']);
$note->setCreatedAt($event['created_at']);
$eventMessage = new EventMessage($note);
$relay = new Relay(config('services.relay'));
$relay->setMessage($eventMessage);
$relay->send();
\App\Support\Broadcast::on('votes')->as('newVote')->sendNow();
}
}

View File

@@ -1,66 +0,0 @@
<?php
namespace App\Livewire\Association\Members;
use App\Models\EinundzwanzigPleb;
use App\Support\NostrAuth;
use Livewire\Component;
final class Admin extends Component
{
public bool $isAllowed = false;
public ?string $currentPubkey = null;
public ?EinundzwanzigPleb $currentPleb = null;
protected $listeners = [
'nostrLoggedOut' => 'handleNostrLoggedOut',
'nostrLoggedIn' => 'handleNostrLoggedIn',
];
public function mount(): void
{
if (NostrAuth::check()) {
$this->currentPubkey = NostrAuth::pubkey();
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()
->where('pubkey', $this->currentPubkey)->first();
$allowedPubkeys = [
'0adf67475ccc5ca456fd3022e46f5d526eb0af6284bf85494c0dd7847f3e5033',
'430169631f2f0682c60cebb4f902d68f0c71c498fd1711fd982f052cf1fd4279',
'7acf30cf60b85c62b8f654556cc21e4016df8f5604b3b6892794f88bb80d7a1d',
'f240be2b684f85cc81566f2081386af81d7427ea86250c8bde6b7a8500c761ba',
'19e358b8011f5f4fc653c565c6d4c2f33f32661f4f90982c9eedc292a8774ec3',
'acbcec475a1a4f9481939ecfbd1c3d111f5b5a474a39ae039bbc720fdd305bec',
];
if (in_array($this->currentPubkey, $allowedPubkeys, true)) {
$this->isAllowed = true;
}
}
}
public function handleNostrLoggedOut(): void
{
$this->isAllowed = false;
$this->currentPubkey = null;
}
public function handleNostrLoggedIn($pubkey): void
{
NostrAuth::login($pubkey);
$this->currentPubkey = $pubkey;
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()
->where('pubkey', $pubkey)->first();
$allowedPubkeys = [
'0adf67475ccc5ca456fd3022e46f5d526eb0af6284bf85494c0dd7847f3e5033',
'430169631f2f0682c60cebb4f902d68f0c71c498fd1711fd982f052cf1fd4279',
'7acf30cf60b85c62b8f654556cc21e4016df8f5604b3b6892794f88bb80d7a1d',
'f240be2b684f85cc81566f2081386af81d7427ea86250c8bde6b7a8500c761ba',
'19e358b8011f5f4fc653c565c6d4c2f33f32661f4f90982c9eedc292a8774ec3',
'acbcec475a1a4f9481939ecfbd1c3d111f5b5a474a39ae039bbc720fdd305bec',
];
if (in_array($this->currentPubkey, $allowedPubkeys, true)) {
$this->isAllowed = true;
}
}
}

View File

@@ -1,122 +0,0 @@
<?php
namespace App\Livewire\Association\News;
use App\Livewire\Forms\NotificationForm;
use App\Models\EinundzwanzigPleb;
use App\Models\Notification;
use App\Support\NostrAuth;
use Livewire\Component;
use Livewire\WithFileUploads;
use WireUi\Actions\Notification as WireNotification;
final class Index extends Component
{
use WithFileUploads;
public NotificationForm $form;
public ?\Illuminate\Http\UploadedFile $file = null;
public \Illuminate\Database\Eloquent\Collection $news;
public bool $isAllowed = false;
public bool $canEdit = false;
public ?string $currentPubkey = null;
public ?EinundzwanzigPleb $currentPleb = null;
protected $listeners = [
'nostrLoggedIn' => 'handleNostrLoggedIn',
'nostrLoggedOut' => 'handleNostrLoggedOut',
];
public function mount(): void
{
if (NostrAuth::check()) {
$this->currentPubkey = NostrAuth::pubkey();
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $this->currentPubkey)->first();
if (in_array($this->currentPleb->npub, config('einundzwanzig.config.current_board'), true)) {
$this->canEdit = true;
}
$this->isAllowed = true;
}
$this->refreshNews();
}
public function refreshNews(): void
{
$this->news = Notification::query()
->orderBy('created_at', 'desc')
->get();
}
public function handleNostrLoggedIn($pubkey): void
{
NostrAuth::login($pubkey);
$this->currentPubkey = $pubkey;
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $pubkey)->first();
if (in_array($this->currentPleb->npub, config('einundzwanzig.config.current_board'), true)) {
$this->canEdit = true;
}
$this->isAllowed = true;
}
public function handleNostrLoggedOut(): void
{
$this->isAllowed = false;
$this->currentPubkey = null;
$this->currentPleb = null;
}
public function save(): void
{
$this->form->validate();
$this->validate([
'file' => 'required|file|mimes:pdf|max:1024',
]);
$notification = Notification::query()
->orderBy('created_at', 'desc')
->create([
'einundzwanzig_pleb_id' => $this->currentPleb->id,
'category' => $this->form->category,
'name' => $this->form->name,
'description' => $this->form->description,
]);
$notification
->addMedia($this->file->getRealPath())
->usingName($this->file->getClientOriginalName())
->toMediaCollection('pdf');
$this->form->reset();
$this->file = null;
$this->refreshNews();
}
public function delete($id): void
{
$notification = new WireNotification($this);
$notification->confirm([
'title' => 'Post löschen',
'message' => 'Bist du sicher, dass du diesen Post löschen möchtest?',
'accept' => [
'label' => 'Ja, löschen',
'method' => 'deleteNow',
'params' => $id,
],
]);
}
public function deleteNow($id): void
{
$notification = Notification::query()->find($id);
$notification->delete();
$this->refreshNews();
}
}

View File

@@ -1,304 +0,0 @@
<?php
namespace App\Livewire\Association;
use App\Enums\AssociationStatus;
use App\Livewire\Forms\ApplicationForm;
use App\Models\EinundzwanzigPleb;
use App\Support\NostrAuth;
use Livewire\Component;
use swentel\nostr\Event\Event as NostrEvent;
use swentel\nostr\Filter\Filter;
use swentel\nostr\Message\EventMessage;
use swentel\nostr\Message\RequestMessage;
use swentel\nostr\Relay\Relay;
use swentel\nostr\Relay\RelaySet;
use swentel\nostr\Request\Request;
use swentel\nostr\Sign\Sign;
use swentel\nostr\Subscription\Subscription;
use WireUi\Actions\Notification;
final class Profile extends Component
{
public ApplicationForm $form;
public bool $no = false;
public bool $showEmail = true;
public string $fax = '';
public string $email = '';
public array $yearsPaid = [];
public array $events = [];
public \Illuminate\Database\Eloquent\Collection $payments;
public int $amountToPay;
public bool $currentYearIsPaid = false;
public ?string $currentPubkey = null;
public ?EinundzwanzigPleb $currentPleb = null;
protected $listeners = [
'nostrLoggedIn' => 'handleNostrLoggedIn',
'nostrLoggedOut' => 'handleNostrLoggedOut',
];
public function mount(): void
{
if (NostrAuth::check()) {
$this->currentPubkey = NostrAuth::pubkey();
$this->currentPleb = EinundzwanzigPleb::query()
->with([
'paymentEvents' => fn ($query) => $query->where('year', date('Y')),
])
->where('pubkey', $this->currentPubkey)->first();
$this->email = $this->currentPleb->email;
$this->no = $this->currentPleb->no_email;
$this->showEmail = ! $this->no;
if ($this->currentPleb->association_status === AssociationStatus::ACTIVE) {
$this->amountToPay = config('app.env') === 'production' ? 21000 : 1;
}
if ($this->currentPleb->paymentEvents->count() < 1) {
$this->createPaymentEvent();
$this->currentPleb->load('paymentEvents');
}
$this->loadEvents();
$this->listenForPayment();
}
}
public function handleNostrLoggedIn($pubkey): void
{
NostrAuth::login($pubkey);
$this->currentPubkey = $pubkey;
$this->currentPleb = EinundzwanzigPleb::query()
->with([
'paymentEvents' => fn ($query) => $query->where('year', date('Y')),
])
->where('pubkey', $pubkey)->first();
$this->email = $this->currentPleb->email;
$this->no = $this->currentPleb->no_email;
$this->showEmail = ! $this->no;
if ($this->currentPleb->association_status === AssociationStatus::ACTIVE) {
$this->amountToPay = config('app.env') === 'production' ? 21000 : 1;
}
if ($this->currentPleb->paymentEvents->count() < 1) {
$this->createPaymentEvent();
$this->currentPleb->load('paymentEvents');
}
$this->loadEvents();
$this->listenForPayment();
}
public function handleNostrLoggedOut(): void
{
NostrAuth::logout();
$this->currentPubkey = null;
$this->currentPleb = null;
$this->yearsPaid = [];
$this->events = [];
$this->payments = [];
$this->qrCode = null;
$this->amountToPay = config('app.env') === 'production' ? 21000 : 1;
$this->currentYearIsPaid = false;
}
public function updatedNo(): void
{
$this->showEmail = ! $this->no;
$this->currentPleb->update([
'no_email' => $this->no,
]);
}
public function updatedFax(): void
{
$this->js('alert("Markus Turm wird sich per Fax melden!")');
}
public function saveEmail(): void
{
$this->validate([
'email' => 'required|email',
]);
$this->currentPleb->update([
'email' => $this->email,
]);
$notification = new Notification($this);
$notification->success('E-Mail Adresse gespeichert.');
}
public function pay($comment): \Illuminate\Http\RedirectResponse
{
$paymentEvent = $this->currentPleb
->paymentEvents()
->where('year', date('Y'))
->first();
if ($paymentEvent->btc_pay_invoice) {
return redirect('https://pay.einundzwanzig.space/i/'.$paymentEvent->btc_pay_invoice);
}
try {
$response = \Illuminate\Support\Facades\Http::withHeaders([
'Authorization' => 'token '.config('services.btc_pay.api_key'),
])->post(
'https://pay.einundzwanzig.space/api/v1/stores/98PF86BoMd3C8P1nHHyFdoeznCwtcm5yehcAgoCYDQ2a/invoices',
[
'amount' => $this->amountToPay,
'metadata' => [
'orderId' => $comment,
'orderUrl' => url()->route('association.profile'),
'itemDesc' => 'Mitgliedsbeitrag '.date('Y').' von nostr:'.$this->currentPleb->npub,
'posData' => [
'event' => $paymentEvent->event_id,
'pubkey' => $this->currentPleb->pubkey,
'npub' => $this->currentPleb->npub,
],
],
'checkout' => [
'expirationMinutes' => 60 * 24,
'redirectURL' => url()->route('association.profile'),
'redirectAutomatically' => true,
'defaultLanguage' => 'de',
],
],
)->throw();
$paymentEvent->btc_pay_invoice = $response->json()['id'];
$paymentEvent->save();
return redirect($response->json()['checkoutLink']);
} catch (\Exception $e) {
$notification = new Notification($this);
$notification->error(
'Fehler beim Erstellen der Rechnung. Bitte versuche es später erneut: '.$e->getMessage(),
);
}
}
public function listenForPayment(): void
{
$paymentEvent = $this->currentPleb
->paymentEvents()
->where('year', date('Y'))
->first();
if ($paymentEvent->btc_pay_invoice) {
$response = \Illuminate\Support\Facades\Http::withHeaders([
'Authorization' => 'token '.config('services.btc_pay.api_key'),
])
->get(
'https://pay.einundzwanzig.space/api/v1/stores/98PF86BoMd3C8P1nHHyFdoeznCwtcm5yehcAgoCYDQ2a/invoices/'.$paymentEvent->btc_pay_invoice,
);
if ($response->json()['status'] === 'Expired') {
$paymentEvent->btc_pay_invoice = null;
$paymentEvent->paid = false;
$paymentEvent->save();
}
if ($response->json()['status'] === 'Settled') {
$paymentEvent->paid = true;
$paymentEvent->save();
$this->currentYearIsPaid = true;
}
}
if ($paymentEvent->paid) {
$this->currentYearIsPaid = true;
}
$paymentEvent = $paymentEvent->refresh();
$this->payments = $this->currentPleb
->paymentEvents()
->where('paid', true)
->get();
}
public function save($type): void
{
$this->form->validate();
if (! $this->form->check) {
$this->js('alert("Du musst den Statuten zustimmen.")');
return;
}
$this->currentPleb
->update([
'association_status' => $type,
]);
}
public function createPaymentEvent(): void
{
$note = new NostrEvent;
$note->setKind(32121);
$note->setContent(
'Dieses Event dient der Zahlung des Mitgliedsbeitrags für das Jahr '.date(
'Y',
).'. Bitte bezahle den Betrag von '.number_format($this->amountToPay, 0, ',', '.').' Satoshis.',
);
$note->setTags([
['d', $this->currentPleb->pubkey.','.date('Y')],
['zap', 'daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6', config('services.relay'), '1'],
]);
$signer = new Sign;
$signer->signEvent($note, config('services.nostr'));
$eventMessage = new EventMessage($note);
$relayUrl = config('services.relay');
$relay = new Relay($relayUrl);
$relay->setMessage($eventMessage);
$result = $relay->send();
$this->currentPleb->paymentEvents()->create([
'year' => date('Y'),
'event_id' => $result->eventId,
'amount' => $this->amountToPay,
]);
}
public function loadEvents(): void
{
$subscription = new Subscription;
$subscriptionId = $subscription->setId();
$filter1 = new Filter;
$filter1->setKinds([32121]);
$filter1->setAuthors(['daf83d92768b5d0005373f83e30d4203c0b747c170449e02fea611a0da125ee6']);
$filters = [$filter1];
$requestMessage = new RequestMessage($subscriptionId, $filters);
$relays = [
new Relay(config('services.relay')),
];
$relaySet = new RelaySet;
$relaySet->setRelays($relays);
$request = new Request($relaySet, $requestMessage);
$response = $request->send();
$this->events = collect($response[config('services.relay')])
->map(function ($event) {
if (! isset($event->event)) {
return false;
}
return [
'id' => $event->event->id,
'kind' => $event->event->kind,
'content' => $event->event->content,
'pubkey' => $event->event->pubkey,
'tags' => $event->event->tags,
'created_at' => $event->event->created_at,
];
})
->filter()
->unique('id')
->toArray();
}
}

View File

@@ -1,70 +0,0 @@
<?php
namespace App\Livewire\Association\ProjectSupport\Form;
use App\Livewire\Forms\ProjectProposalForm;
use App\Support\NostrAuth;
use Livewire\Component;
use Livewire\WithFileUploads;
final class Create extends Component
{
use WithFileUploads;
public ProjectProposalForm $form;
public ?\Illuminate\Http\UploadedFile $image = null;
public bool $isAllowed = false;
public ?string $currentPubkey = null;
protected $listeners = [
'nostrLoggedIn' => 'handleNostrLoggedIn',
'nostrLoggedOut' => 'handleNostrLoggedOut',
];
public function mount(): void
{
if (NostrAuth::check()) {
$this->currentPubkey = NostrAuth::pubkey();
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $this->currentPubkey)->first();
$this->isAllowed = true;
}
}
public function handleNostrLoggedIn($pubkey): void
{
NostrAuth::login($pubkey);
$this->currentPubkey = $pubkey;
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $pubkey)->first();
$this->isAllowed = true;
}
public function handleNostrLoggedOut(): void
{
$this->isAllowed = false;
$this->currentPubkey = null;
$this->currentPleb = null;
}
public function save(): \Illuminate\Http\RedirectResponse
{
$this->form->validate();
$projectProposal = \App\Models\ProjectProposal::query()->create([
...$this->form->all(),
'einundzwanzig_pleb_id' => $this->currentPleb->id,
]);
if ($this->image) {
$this->validate([
'image' => 'image|max:1024',
]);
$projectProposal
->addMedia($this->image->getRealPath())
->toMediaCollection('main');
}
return redirect()->route('association.projectSupport');
}
}

View File

@@ -1,75 +0,0 @@
<?php
namespace App\Livewire\Association\ProjectSupport\Form;
use App\Livewire\Forms\ProjectProposalForm;
use App\Models\ProjectProposal;
use App\Support\NostrAuth;
use Livewire\Component;
use Livewire\WithFileUploads;
final class Edit extends Component
{
use WithFileUploads;
public ProjectProposalForm $form;
public ?ProjectProposal $projectProposal = null;
public ?\Illuminate\Http\UploadedFile $image = null;
public bool $isAllowed = false;
public ?string $currentPubkey = null;
protected $listeners = [
'nostrLoggedIn' => 'handleNostrLoggedIn',
'nostrLoggedOut' => 'handleNostrLoggedOut',
];
public function mount(ProjectProposal $projectProposal): void
{
if (NostrAuth::check()) {
$this->currentPubkey = NostrAuth::pubkey();
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $this->currentPubkey)->first();
$this->isAllowed = true;
$this->form->fill($projectProposal->toArray());
$this->projectProposal = $projectProposal;
$this->image = $projectProposal->getFirstMedia('main');
}
}
public function handleNostrLoggedIn($pubkey): void
{
NostrAuth::login($pubkey);
$this->currentPubkey = $pubkey;
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $pubkey)->first();
$this->isAllowed = true;
}
public function handleNostrLoggedOut(): void
{
$this->isAllowed = false;
$this->currentPubkey = null;
$this->currentPleb = null;
}
public function save(): \Illuminate\Http\RedirectResponse
{
$this->form->validate();
if ($this->image && method_exists($this->image, 'temporaryUrl')) {
$this->validate([
'image' => 'nullable|image|max:1024',
]);
$this->projectProposal
->addMedia($this->image->getRealPath())
->toMediaCollection('main');
}
$this->projectProposal->update([
...$this->form->except('id', 'slug'),
]);
return redirect()->route('association.projectSupport');
}
}

View File

@@ -1,102 +0,0 @@
<?php
namespace App\Livewire\Association\ProjectSupport;
use App\Models\ProjectProposal;
use App\Support\NostrAuth;
use Livewire\Component;
use WireUi\Actions\Notification;
final class Index extends Component
{
public string $activeFilter = 'all';
public string $search = '';
public \Illuminate\Database\Eloquent\Collection $projects;
public bool $isAllowed = false;
public ?string $currentPubkey = null;
public ?\App\Models\EinundzwanzigPleb $currentPleb = null;
protected $listeners = [
'nostrLoggedIn' => 'handleNostrLoggedIn',
'nostrLoggedOut' => 'handleNostrLoggedOut',
];
public function mount(): void
{
$this->loadProjects();
if (NostrAuth::check()) {
$this->currentPubkey = NostrAuth::pubkey();
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $this->currentPubkey)->first();
$this->isAllowed = true;
}
}
public function updatedSearch(): void
{
$this->loadProjects();
}
public function loadProjects(): void
{
$this->projects = ProjectProposal::query()
->with([
'einundzwanzigPleb.profile',
'votes',
])
->where(function ($query) {
$query
->where('name', 'ilike', '%'.$this->search.'%')
->orWhere('description', 'ilike', '%'.$this->search.'%')
->orWhereHas('einundzwanzigPleb.profile', function ($q) {
$q->where('name', 'ilike', '%'.$this->search.'%');
});
})
->orderBy('created_at', 'desc')
->get();
}
public function handleNostrLoggedIn($pubkey): void
{
NostrAuth::login($pubkey);
$this->currentPubkey = $pubkey;
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $pubkey)->first();
$this->isAllowed = true;
}
public function handleNostrLoggedOut(): void
{
$this->isAllowed = false;
$this->currentPubkey = null;
$this->currentPleb = null;
}
public function confirmDelete($id): void
{
$notification = new Notification($this);
$notification->confirm([
'title' => 'Projektunterstützung löschen',
'message' => 'Bist du sicher, dass du diese Projektunterstützung löschen möchtest?',
'accept' => [
'label' => 'Ja, löschen',
'method' => 'delete',
'params' => $id,
],
]);
}
public function setFilter($filter): void
{
$this->activeFilter = $filter;
}
public function delete($id): void
{
ProjectProposal::query()->findOrFail($id)->delete();
$this->loadProjects();
}
}

View File

@@ -1,109 +0,0 @@
<?php
namespace App\Livewire\Association\ProjectSupport;
use App\Livewire\Forms\VoteForm;
use App\Models\ProjectProposal;
use App\Models\Vote;
use App\Support\NostrAuth;
use Livewire\Component;
final class Show extends Component
{
public VoteForm $form;
public ?ProjectProposal $projectProposal = null;
public bool $isAllowed = false;
public ?string $currentPubkey = null;
public ?\App\Models\EinundzwanzigPleb $currentPleb = null;
public bool $ownVoteExists = false;
public \Illuminate\Database\Eloquent\Collection $boardVotes;
public \Illuminate\Database\Eloquent\Collection $otherVotes;
protected $listeners = [
'nostrLoggedIn' => 'handleNostrLoggedIn',
'nostrLoggedOut' => 'handleNostrLoggedOut',
];
public function mount(ProjectProposal $projectProposal): void
{
$this->projectProposal = $projectProposal;
if (NostrAuth::check()) {
$this->currentPubkey = NostrAuth::pubkey();
$this->handleNostrLoggedIn($this->currentPubkey);
}
$this->boardVotes = $this->getBoardVotes();
$this->otherVotes = $this->getOtherVotes();
}
public function handleNostrLoggedIn($pubkey): void
{
$this->currentPubkey = $pubkey;
$this->currentPleb = \App\Models\EinundzwanzigPleb::query()->where('pubkey', $pubkey)->first();
$this->isAllowed = true;
$this->ownVoteExists = Vote::query()
->where('project_proposal_id', $this->projectProposal->id)
->where('einundzwanzig_pleb_id', $this->currentPleb->id)
->exists();
}
public function handleNostrLoggedOut(): void
{
$this->isAllowed = false;
$this->currentPubkey = null;
$this->currentPleb = null;
}
public function getBoardVotes(): \Illuminate\Database\Eloquent\Collection
{
return Vote::query()
->where('project_proposal_id', $this->projectProposal->id)
->whereHas('einundzwanzigPleb', fn ($q) => $q->whereIn('npub', config('einundzwanzig.config.current_board')))
->get();
}
public function getOtherVotes(): \Illuminate\Database\Eloquent\Collection
{
return Vote::query()
->where('project_proposal_id', $this->projectProposal->id)
->whereDoesntHave(
'einundzwanzigPleb',
fn ($q) => $q->whereIn('npub', config('einundzwanzig.config.current_board'))
)
->get();
}
public function approve(): void
{
Vote::query()->updateOrCreate([
'project_proposal_id' => $this->projectProposal->id,
'einundzwanzig_pleb_id' => $this->currentPleb->id,
], [
'value' => true,
]);
$this->form->reset();
$this->ownVoteExists = true;
$this->boardVotes = $this->getBoardVotes();
$this->otherVotes = $this->getOtherVotes();
}
public function notApprove(): void
{
$this->form->validate();
Vote::query()->updateOrCreate([
'project_proposal_id' => $this->projectProposal->id,
'einundzwanzig_pleb_id' => $this->currentPleb->id,
], [
'value' => false,
]);
$this->form->reset();
$this->ownVoteExists = true;
}
}

View File

@@ -1,31 +0,0 @@
<?php
namespace App\Livewire;
use Illuminate\Support\Facades\Process;
use Livewire\Component;
final class Changelog extends Component
{
public array $entries = [];
public function mount(): void
{
$process = Process::fromShellCommandline('git log -n1000 --pretty=format:"%H|%s|%an|%ad" --date=format:"%Y-%m-%d %H:%M:%S"');
$process->run();
$output = $process->getOutput();
$lines = explode("\n", trim($output));
$entries = [];
foreach ($lines as $line) {
[$hash, $message, $author, $date] = explode('|', $line);
$entries[] = [
'hash' => $hash,
'message' => $message,
'author' => $author,
'date' => $date,
];
}
$this->entries = $entries;
}
}

View File

@@ -1,51 +0,0 @@
<?php
namespace App\Livewire\EinundzwanzigFeed;
use App\Models\Event;
use Livewire\Component;
final class Index extends Component
{
public array $events = [];
public bool $newEvents = false;
public function mount(): void
{
$this->events = Event::query()
->where('type', 'root')
->orderBy('created_at', 'desc')
->with([
'renderedEvent',
])
->get()
->toArray();
}
public function hydrate(): void
{
if ($this->newEvents) {
$this->loadMore();
}
}
#[Rule('echo:events,.newEvents')]
public function updated(): void
{
$this->newEvents = true;
}
public function loadMore(): void
{
$this->newEvents = false;
$this->events = Event::query()
->where('type', 'root')
->orderBy('created_at', 'desc')
->with([
'renderedEvent',
])
->get()
->toArray();
}
}

View File

@@ -1,10 +0,0 @@
<?php
namespace App\Livewire\Meetups;
use Livewire\Component;
final class Grid extends Component
{
//
}

View File

@@ -1,102 +0,0 @@
<?php
namespace App\Livewire\Meetups;
use Livewire\Component;
use swentel\nostr\Event\Event as NostrEvent;
use swentel\nostr\Filter\Filter;
use swentel\nostr\Message\EventMessage;
use swentel\nostr\Message\RequestMessage;
use swentel\nostr\Relay\Relay;
use swentel\nostr\Relay\RelaySet;
use swentel\nostr\Request\Request;
use swentel\nostr\Subscription\Subscription;
final class Mockup extends Component
{
public array $events = [];
public string $title = '';
public string $description = '';
public string $signThisEvent = '';
public function mount(): void
{
$this->loadEvents();
}
public function loadEvents(): void
{
$subscription = new Subscription;
$subscriptionId = $subscription->setId();
$filter1 = new Filter;
$filter1->setKinds([31924]);
$filter1->setLimit(25);
$filters = [$filter1];
$requestMessage = new RequestMessage($subscriptionId, $filters);
$relays = [
new Relay('ws://nostream:8008'),
];
$relaySet = new RelaySet;
$relaySet->setRelays($relays);
$request = new Request($relaySet, $requestMessage);
$response = $request->send();
$this->events = collect($response['ws://nostream:8008'])
->map(function ($event) {
if (! isset($event->event)) {
return false;
}
return [
'id' => $event->event->id,
'kind' => $event->event->kind,
'content' => $event->event->content,
'pubkey' => $event->event->pubkey,
'tags' => $event->event->tags,
'created_at' => $event->event->created_at,
];
})
->filter()
->toArray();
}
public function save(): void
{
$note = new NostrEvent;
$note->setContent($this->description);
$note->setKind(31924);
$note->setTags([
['d', str()->uuid()->toString()],
['title', $this->title],
]);
$this->signThisEvent = $note->toJson();
}
public function signEvent($event): void
{
$note = new NostrEvent;
$note->setId($event['id']);
$note->setSignature($event['sig']);
$note->setKind($event['kind']);
$note->setContent($event['content']);
$note->setPublicKey($event['pubkey']);
$note->setTags($event['tags']);
$note->setCreatedAt($event['created_at']);
$eventMessage = new EventMessage($note);
$relayUrl = 'ws://nostream:8008';
$relay = new Relay($relayUrl);
$relay->setMessage($eventMessage);
$relay->send();
$this->title = '';
$this->description = '';
$this->loadEvents();
}
}

View File

@@ -1,10 +0,0 @@
<?php
namespace App\Livewire\Meetups;
use Livewire\Component;
final class Table extends Component
{
//
}

View File

@@ -1,20 +0,0 @@
<?php
namespace App\Livewire\Meetups;
use Livewire\Component;
final class Worldmap extends Component
{
public array $markers = [];
public function mount(): void
{
$this->markers = [];
}
public function filterByMarker($id): void
{
//
}
}

View File

@@ -1,10 +0,0 @@
<?php
namespace App\Livewire;
use Livewire\Component;
final class Welcome extends Component
{
//
}