'datetime', ]; /** * Get the user's initials */ public function initials(): string { return Str::of($this->name) ->explode(' ') ->take(2) ->map(fn ($word) => Str::substr($word, 0, 1)) ->implode(''); } public static function configureCipherSweet(EncryptedRow $encryptedRow): void { $map = (new JsonFieldMap()) ->addTextField('url') ->addTextField('read_key') ->addTextField('wallet_id'); $encryptedRow ->addOptionalTextField('public_key') ->addOptionalTextField('lightning_address') ->addOptionalTextField('lnurl') ->addOptionalTextField('node_id') ->addOptionalTextField('email') ->addOptionalTextField('paynym') ->addJsonField('lnbits', $map) ->addBlindIndex('public_key', new BlindIndex('public_key_index')) ->addBlindIndex('lightning_address', new BlindIndex('lightning_address_index')) ->addBlindIndex('lnurl', new BlindIndex('lnurl_index')) ->addBlindIndex('node_id', new BlindIndex('node_id_index')) ->addBlindIndex('paynym', new BlindIndex('paynym_index')) ->addBlindIndex('email', new BlindIndex('email_index')); } public function orangePills() { return $this->hasMany(OrangePill::class); } public function meetups() { return $this->belongsToMany(Meetup::class); } public function reputations() { return $this->morphMany('QCod\Gamify\Reputation', 'subject'); } public function votes() { return $this->hasMany(Vote::class); } public function paidArticles() { return $this->belongsToMany(LibraryItem::class, 'library_item_user', 'user_id', 'library_item_id'); } public function updateProfilePhoto(UploadedFile $photo) { tap($this->profile_photo_path, function ($previous) use ($photo) { $this->forceFill([ 'profile_photo_path' => $photo->storePublicly( 'profile-photos', ['disk' => $this->profilePhotoDisk()] ), ])->save(); if ($previous) { Storage::disk($this->profilePhotoDisk())->delete($previous); } }); } /** * Delete the user's profile photo. * * @return void */ public function deleteProfilePhoto() { if (is_null($this->profile_photo_path)) { return; } Storage::disk($this->profilePhotoDisk())->delete($this->profile_photo_path); $this->forceFill([ 'profile_photo_path' => null, ])->save(); } /** * Get the URL to the user's profile photo. * * @return string */ public function getProfilePhotoUrlAttribute() { return $this->profile_photo_path ? Storage::disk($this->profilePhotoDisk())->url($this->profile_photo_path) : $this->defaultProfilePhotoUrl(); } /** * Get the default profile photo URL if no profile photo has been uploaded. * * @return string */ protected function defaultProfilePhotoUrl() { $name = trim(collect(explode(' ', $this->name))->map(function ($segment) { return mb_substr($segment, 0, 1); })->join(' ')); return 'https://ui-avatars.com/api/?name='.urlencode($name).'&color=7F9CF5&background=EBF4FF'; } /** * Get the disk that profile photos should be stored on. * * @return string */ protected function profilePhotoDisk() { return isset($_ENV['VAPOR_ARTIFACT_NAME']) ? 's3' : config('jetstream.profile_photo_disk', 'public'); } }