Some code

This commit is contained in:
Floorb 2021-08-29 01:26:29 -04:00
parent 82c956d9e1
commit 7ef5f25137
27 changed files with 314 additions and 163 deletions

View file

@ -8389,8 +8389,8 @@
DataTable.settings = [];
/**
* Object models container, for the various models that DataTables has
* available to it. These models define the objects that are used to hold
* Object Models container, for the various Models that DataTables has
* available to it. These Models define the objects that are used to hold
* the active state and configuration of the table.
* @namespace
*/

View file

@ -19,5 +19,10 @@
"scrivo/highlight.php": "v9.18.1.7",
"erusev/parsedown": "^1.7",
"illuminate/database": "^8.56"
},
"autoload": {
"psr-4": {
"PonePaste\\": "includes/"
}
}
}

44
composer.lock generated
View file

@ -153,16 +153,16 @@
},
{
"name": "illuminate/collections",
"version": "v8.56.0",
"version": "v8.57.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/collections.git",
"reference": "dd68b267ada1893126d53792b6c57b19e95a9d04"
"reference": "673d71d9db2827b04c096c4fe9739edddea14ac4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/collections/zipball/dd68b267ada1893126d53792b6c57b19e95a9d04",
"reference": "dd68b267ada1893126d53792b6c57b19e95a9d04",
"url": "https://api.github.com/repos/illuminate/collections/zipball/673d71d9db2827b04c096c4fe9739edddea14ac4",
"reference": "673d71d9db2827b04c096c4fe9739edddea14ac4",
"shasum": ""
},
"require": {
@ -203,11 +203,11 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2021-08-23T08:57:48+00:00"
"time": "2021-08-25T13:02:21+00:00"
},
{
"name": "illuminate/container",
"version": "v8.56.0",
"version": "v8.57.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
@ -258,16 +258,16 @@
},
{
"name": "illuminate/contracts",
"version": "v8.56.0",
"version": "v8.57.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/contracts.git",
"reference": "e4fa45682e8b558ccca02829e8e6e521ff9458d2"
"reference": "7354badf7b57eae805a56d1163fb023e0f58a639"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/e4fa45682e8b558ccca02829e8e6e521ff9458d2",
"reference": "e4fa45682e8b558ccca02829e8e6e521ff9458d2",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/7354badf7b57eae805a56d1163fb023e0f58a639",
"reference": "7354badf7b57eae805a56d1163fb023e0f58a639",
"shasum": ""
},
"require": {
@ -302,20 +302,20 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2021-08-19T13:06:39+00:00"
"time": "2021-08-24T21:29:28+00:00"
},
{
"name": "illuminate/database",
"version": "v8.56.0",
"version": "v8.57.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/database.git",
"reference": "18c2660dd2d5398263907d5717f0a611b901a05a"
"reference": "828d1cd4ee824c405f6edc52ab3d333b549be4ee"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/database/zipball/18c2660dd2d5398263907d5717f0a611b901a05a",
"reference": "18c2660dd2d5398263907d5717f0a611b901a05a",
"url": "https://api.github.com/repos/illuminate/database/zipball/828d1cd4ee824c405f6edc52ab3d333b549be4ee",
"reference": "828d1cd4ee824c405f6edc52ab3d333b549be4ee",
"shasum": ""
},
"require": {
@ -370,11 +370,11 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2021-08-19T19:38:53+00:00"
"time": "2021-08-26T14:48:34+00:00"
},
{
"name": "illuminate/macroable",
"version": "v8.56.0",
"version": "v8.57.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/macroable.git",
@ -420,16 +420,16 @@
},
{
"name": "illuminate/support",
"version": "v8.56.0",
"version": "v8.57.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
"reference": "586f77ee7f8568ecc60866f171074dccfbe69db5"
"reference": "5e8f059a5d1f298324e847822b997778a3472128"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/support/zipball/586f77ee7f8568ecc60866f171074dccfbe69db5",
"reference": "586f77ee7f8568ecc60866f171074dccfbe69db5",
"url": "https://api.github.com/repos/illuminate/support/zipball/5e8f059a5d1f298324e847822b997778a3472128",
"reference": "5e8f059a5d1f298324e847822b997778a3472128",
"shasum": ""
},
"require": {
@ -484,7 +484,7 @@
"issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework"
},
"time": "2021-08-22T17:54:36+00:00"
"time": "2021-08-25T13:04:37+00:00"
},
{
"name": "nesbot/carbon",

View file

@ -3,6 +3,8 @@ define('IN_PONEPASTE', 1);
require_once('includes/common.php');
require_once('includes/functions.php');
use PonePaste\Models\Paste;
function transformPasteRow(Paste $row) : array {
return [
'id' => $row['id'],
@ -16,11 +18,11 @@ function transformPasteRow(Paste $row) : array {
];
}
$popular_pastes = Paste::getMostViewed()->map('transformPasteRow');
$monthly_popular_pastes = Paste::getMonthPopular()->map('transformPasteRow');
$recent_pastes = Paste::getRecent()->map('transformPasteRow');
$updated_pastes = Paste::getRecentlyUpdated()->map('transformPasteRow');
$random_pastes = Paste::getRandom()->map('transformPasteRow');
$popular_pastes = Paste::getMostViewed();//->map('transformPasteRow');
$monthly_popular_pastes = Paste::getMonthPopular();//->map('transformPasteRow');
$recent_pastes = Paste::getRecent();//->map('transformPasteRow');
$updated_pastes = Paste::getRecentlyUpdated();//->map('transformPasteRow');
$random_pastes = Paste::getRandom();//->map('transformPasteRow');
// Theme
$page_template = 'discover';

View file

@ -2,8 +2,8 @@
namespace PonePaste\Helpers;
use DateTime;
require_once(__DIR__ . '/models/UserSession.php');
use PonePaste\Models\User;
use PonePaste\Models\UserSession;
class SessionHelper {
public const REMEMBER_TOKEN_COOKIE = '_ponepaste_token';
@ -27,14 +27,14 @@ class SessionHelper {
public static function destroySession() {
$token = $_COOKIE[SessionHelper::REMEMBER_TOKEN_COOKIE];
\UserSession::where('token', $token)->delete();
UserSession::where('token', $token)->delete();
unset($_COOKIE[SessionHelper::REMEMBER_TOKEN_COOKIE]);
setcookie(SessionHelper::REMEMBER_TOKEN_COOKIE, null, time() - 3600);
}
private static function currentUserFromRememberToken(string $remember_token) {
$session = \UserSession
$session = UserSession
::with('user')
->where('token', $remember_token)
->first();
@ -61,6 +61,6 @@ class SessionHelper {
}
return \User::find(intval($_SESSION['user_id']));
return User::find(intval($_SESSION['user_id']));
}
}

View file

@ -1,13 +1,15 @@
<?php
namespace PonePaste\Models;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
require_once(__DIR__ . '/Tag.php');
use Watson\Validating\ValidatingTrait;
class Paste extends Model {
protected $table = 'pastes';
protected $guarded = [];
public function user() {
return $this->belongsTo(User::class);
}
@ -16,6 +18,19 @@ class Paste extends Model {
return $this->belongsToMany(Tag::class, 'paste_taggings');
}
public function replaceTags(array $tags) {
$this->tags()->detach();
foreach ($tags as $tagName) {
$tag = Tag::getOrCreateByName($tagName);
$this->tags()->attach($tag);
}
// FIXME: We need to get rid of tagsys.
$this->tagsys = implode(',', $tags);
$this->save();
}
public static function getRecent(int $count = 10) : Collection {
return Paste::with('user')
->orderBy('created_at', 'DESC')

View file

@ -1,34 +1,24 @@
<?php
namespace PonePaste\Models;
use Illuminate\Database\Eloquent\Model;
class Tag extends Model {
protected $table = 'tags';
public static function getOrCreateByName(DatabaseHandle $conn, string $name) : Tag {
public static function getOrCreateByName(string $name) : Tag {
$name = Tag::cleanTagName($name);
if ($row = $conn->querySelectOne('SELECT id, name, slug FROM tags WHERE name = ?', [$name])) {
return new Tag($row);
if ($tag = Tag::where('name', $name)->first()) {
return $tag;
}
$new_slug = Tag::encodeSlug($name);
$new_tag_id = $conn->queryInsert('INSERT INTO tags (name, slug) VALUES (?, ?)', [$name, $new_slug]);
return new Tag([
'id' => $new_tag_id,
return Tag::create([
'name' => $name,
'slug' => $new_slug
'slug' => Tag::encodeSlug($name)
]);
}
public static function findBySlug(DatabaseHandle $conn, string $slug) : Tag|null {
if ($row = $conn->querySelectOne('SELECT id, name, slug FROM tags WHERE slug = ?', [$slug])) {
return new Tag($row);
}
return null;
}
public static function replacePasteTags(DatabaseHandle $conn, int $pasteId, array $tags) {
$conn->query('DELETE FROM paste_taggings WHERE paste_id = ?', [$pasteId]);

View file

@ -1,6 +1,7 @@
<?php
namespace PonePaste\Models;
use Illuminate\Database\Eloquent\Model;
require_once(__DIR__ . '/Paste.php');
class User extends Model {
protected $table = 'users';
@ -13,8 +14,8 @@ class User extends Model {
return $this->belongsToMany(Paste::class, 'user_favourites');
}
/*public function pastes() {
public function pastes() {
return $this->hasMany(Paste::class);
}*/
}
}

View file

@ -1,4 +1,6 @@
<?php
namespace PonePaste\Models;
use Illuminate\Database\Eloquent\Model;
class UserSession extends Model {

View file

@ -6,13 +6,11 @@ require_once(__DIR__ . '/../vendor/autoload.php');
require_once(__DIR__ . '/config.php');
require_once(__DIR__ . '/functions.php');
require_once(__DIR__ . '/DatabaseHandle.class.php');
//require_once(__DIR__ . '/User.class.php');
require_once(__DIR__ . '/ViewBag.class.php');
require_once(__DIR__ . '/models/User.php');
require_once(__DIR__ . '/SessionManager.class.php');
use Illuminate\Database\Capsule\Manager as Capsule;
use PonePaste\Helpers\SessionHelper;
use PonePaste\Models\Paste;
use PonePaste\Models\User;
/* View functions */
function urlForPage($page = '') : string {
@ -23,15 +21,15 @@ function urlForPage($page = '') : string {
return (isset($_SERVER['HTTPS']) ? 'https://' : 'http://') . $_SERVER['HTTP_HOST'] . rtrim(dirname($_SERVER['PHP_SELF']), '/\\') . '/' . $page;
}
function urlForPaste($paste_id) : string {
function urlForPaste(Paste $paste) : string {
if (PP_MOD_REWRITE) {
return "/${paste_id}";
return "/{$paste->id}";
}
return "/paste.php?id=${paste_id}";
return "/paste.php?id={$paste->id}";
}
function urlForMember(string $member_name) : string {
function urlForMember(User $member_name) : string {
if (PP_MOD_REWRITE) {
return '/user/' . urlencode($member_name);
}

View file

@ -1,4 +1,9 @@
<?php
use PonePaste\Models\Paste;
use PonePaste\Models\Tag;
use PonePaste\Models\User;
define('IN_PONEPASTE', 1);
require_once('includes/common.php');
require_once('includes/captcha.php');
@ -89,32 +94,29 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$editing = isset($_POST['edit']);
$p_title = trim(htmlspecialchars($_POST['title']));
$paste_title = trim($_POST['title']);
if (empty($p_title)) {
$p_title = 'Untitled';
if (empty($paste_title)) {
$paste_title = 'Untitled';
}
$p_content = htmlspecialchars($_POST['paste_data']);
$p_visible = trim(htmlspecialchars($_POST['visibility']));
$p_code = trim(htmlspecialchars($_POST['format']));
$paste_content = $_POST['paste_data'];
$paste_visibility = $_POST['visibility'];
$paste_code = $_POST['format'];
$paste_password = $_POST['pass'];
$paste_encrypt = $_POST['encrypted'] === 'on'; // TODO: Make sure this works!
$p_expiry = trim(htmlspecialchars($_POST['paste_expire_date']));
$p_password = $_POST['pass'];
$tag_input = $_POST['tag_input'];
if (empty($p_password)) {
$p_password = null;
if (empty($paste_password)) {
$paste_password = null;
} else {
$p_password = password_hash($p_password, PASSWORD_DEFAULT);
$paste_password = password_hash($paste_password, PASSWORD_DEFAULT);
}
$p_encrypt = $_POST['encrypted'];
if ($p_encrypt == "" || $p_encrypt == null) {
$p_encrypt = "0";
} else {
// Encrypt option
$p_encrypt = "1";
$p_content = openssl_encrypt($p_content, PP_ENCRYPTION_ALGO, PP_ENCRYPTION_KEY);
if ($paste_encrypt) {
$paste_content = openssl_encrypt($paste_content, PP_ENCRYPTION_ALGO, PP_ENCRYPTION_KEY);
}
// Set expiry time
@ -126,26 +128,42 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$current_user->user_id === (int) $conn->querySelectOne('SELECT user_id FROM pastes WHERE id = ?', [$_POST['paste_id']])['user_id']) {
$paste_id = intval($_POST['paste_id']);
$conn->query(
"UPDATE pastes SET title = ?, content = ?, visible = ?, code = ?, expiry = ?, password = ?, encrypt = ?, ip = ?, updated_at = NOW()
WHERE id = ?",
[$p_title, $p_content, $p_visible, $p_code, $expires, $p_password, $p_encrypt, $ip, $paste_id]
);
$paste = Paste::find(intval($_POST['paste_id']));
$paste->update([
'title' => $paste_title,
'content' => $paste_content,
'visible' => $paste_visibility,
'code' => $paste_code,
'expiry' => $expires,
'password' => $paste_password,
'encrypt' => $paste_encrypt,
'ip' => $ip
]);
Tag::replacePasteTags($conn, $paste_id, Tag::parseTagInput($tag_input));
$paste->replaceTags(Tag::parseTagInput($tag_input));
} else {
$error = 'You must be logged in to do that.';
}
} else {
$paste_owner = $current_user ? $current_user->user_id : 1; /* 1 is the guest user's user ID */
$paste_owner = $current_user ?: User::find(1); /* 1 is the guest user's user ID */
$paste = new Paste([
'title' => $paste_title,
'code' => $paste_code,
'content' => $paste_content,
'visible' => $paste_visibility,
'expiry' => $expires,
'password' => $paste_password,
'encrypt' => $paste_encrypt,
'created_at' => date_create(),
'ip' => $ip
]);
$paste_id = $conn->queryInsert(
"INSERT INTO pastes (title, content, visible, code, expiry, password, encrypt, user_id, created_at, ip, views) VALUES
(?, ?, ?, ?, ?, ?, ?, ?, NOW(), ?, 0)",
[$p_title, $p_content, $p_visible, $p_code, $expires, $p_password, $p_encrypt, $paste_owner, $ip]
);
$paste->user()->associate($paste_owner);
$paste->save();
Tag::replacePasteTags($conn, $paste_id, Tag::parseTagInput($tag_input));
$paste->replaceTags(Tag::parseTagInput($tag_input));
$paste_id = $new_paste->id;
if ($p_visible == '0') {
addToSitemap($paste_id, $priority, $changefreq, $mod_rewrite);
@ -153,8 +171,8 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
}
// Redirect to paste on successful entry, or on successful edit redirect back to edited paste
if (isset($paste_id)) {
header('Location: ' . urlForPaste($paste_id));
if (isset($paste)) {
header('Location: ' . urlForPaste($paste));
die();
}
}

View file

@ -3,9 +3,9 @@ define('IN_PONEPASTE', 1);
require_once('includes/common.php');
require_once('includes/functions.php');
require_once('includes/passwords.php');
require_once('includes/models/Paste.php');
use Highlight\Highlighter;
use PonePaste\Models\Paste;
function rawView($content, $p_code) {
if ($p_code) {

View file

@ -93,7 +93,7 @@ $flashes = getFlashes();
<div class="navbar-item has-dropdown is-hoverable">
<a class="navbar-link" role="presentation"><?= pp_html_escape($current_user->username) ?></a>
<div class="navbar-dropdown">
<a class="navbar-item" href="<?= urlForMember($current_user->username) ?>">Pastes</a>
<a class="navbar-item" href="<?= urlForMember($current_user) ?>">Pastes</a>
<a class="navbar-item" href="<?= urlForPage('profile') ?>">Settings</a>
<hr class="navbar-divider"/>
<form action="<?= urlForPage('logout') ?>" method="POST">

View file

@ -30,11 +30,11 @@
<div class="media">
<div class="media-content" style="overflow: hidden">
<p class="title is-5">
<a href="<?= urlForPaste($paste['id']) ?>"
title="<?= $paste['title'] ?>"> <?= $paste['title'] ?> </a>
<a href="<?= urlForPaste($paste) ?>"
title="<?= pp_html_escape($paste->title) ?>"> <?= pp_html_escape($paste->title) ?> </a>
</p>
<p class="subtitle is-6">
<a href="<?= urlForMember($paste['member']) ?>"><?= $paste['member'] ?></a>
<a href="<?= urlForMember($paste->user) ?>"><?= pp_html_escape($paste->user->username) ?></a>
<br>
<time datetime="<?= $paste['time'] ?>"><?= $paste['friendly_time'] ?></time>
</p>

View file

@ -1,8 +1,13 @@
<?php
define('IN_PONEPASTE', 1);
require_once('includes/common.php');
require_once('includes/functions.php');
use PonePaste\Models\User;
if (empty($_GET['user'])) {
// No username provided
header("Location: ../error.php");

View file

@ -6,14 +6,14 @@ $vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => $vendorDir . '/symfony/polyfill-mbstring/bootstrap.php',
'a4a119a56e50fbb293281d9a48007e0e' => $vendorDir . '/symfony/polyfill-php80/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => $vendorDir . '/symfony/deprecation-contracts/function.php',
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => $vendorDir . '/symfony/polyfill-ctype/bootstrap.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
'8825ede83f2f289127722d4e842cf7e8' => $vendorDir . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'e69f7f6ee287b969198c3c9d6777bd38' => $vendorDir . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => $vendorDir . '/symfony/polyfill-php73/bootstrap.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => $vendorDir . '/symfony/string/Resources/functions.php',
'60799491728b879e74601d83e38b2cad' => $vendorDir . '/illuminate/collections/helpers.php',
'a1105708a18b76903365ca1c4aa61b02' => $vendorDir . '/symfony/translation/Resources/functions.php',
'72579e7bd17821bb1321b87411366eae' => $vendorDir . '/illuminate/support/helpers.php',

View file

@ -20,7 +20,8 @@ return array(
'Symfony\\Component\\Console\\' => array($vendorDir . '/symfony/console'),
'Psr\\SimpleCache\\' => array($vendorDir . '/psr/simple-cache/src'),
'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
'Illuminate\\Support\\' => array($vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/support'),
'PonePaste\\' => array($baseDir . '/includes'),
'Illuminate\\Support\\' => array($vendorDir . '/illuminate/collections', $vendorDir . '/illuminate/macroable', $vendorDir . '/illuminate/support'),
'Illuminate\\Database\\' => array($vendorDir . '/illuminate/database'),
'Illuminate\\Contracts\\' => array($vendorDir . '/illuminate/contracts'),
'Illuminate\\Container\\' => array($vendorDir . '/illuminate/container'),

View file

@ -7,14 +7,14 @@ namespace Composer\Autoload;
class ComposerStaticInit5bf95489f4eff2c10ec062bf7ba377da
{
public static $files = array (
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
'a4a119a56e50fbb293281d9a48007e0e' => __DIR__ . '/..' . '/symfony/polyfill-php80/bootstrap.php',
'6e3fae29631ef280660b3cdad06f25a8' => __DIR__ . '/..' . '/symfony/deprecation-contracts/function.php',
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'320cde22f66dd4f5d3fd621d3e88b98f' => __DIR__ . '/..' . '/symfony/polyfill-ctype/bootstrap.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
'8825ede83f2f289127722d4e842cf7e8' => __DIR__ . '/..' . '/symfony/polyfill-intl-grapheme/bootstrap.php',
'e69f7f6ee287b969198c3c9d6777bd38' => __DIR__ . '/..' . '/symfony/polyfill-intl-normalizer/bootstrap.php',
'0d59ee240a4cd96ddbb4ff164fccea4d' => __DIR__ . '/..' . '/symfony/polyfill-php73/bootstrap.php',
'b6b991a57620e2fb6b2f66f03fe9ddc2' => __DIR__ . '/..' . '/symfony/string/Resources/functions.php',
'60799491728b879e74601d83e38b2cad' => __DIR__ . '/..' . '/illuminate/collections/helpers.php',
'a1105708a18b76903365ca1c4aa61b02' => __DIR__ . '/..' . '/symfony/translation/Resources/functions.php',
'72579e7bd17821bb1321b87411366eae' => __DIR__ . '/..' . '/illuminate/support/helpers.php',
@ -44,6 +44,7 @@ class ComposerStaticInit5bf95489f4eff2c10ec062bf7ba377da
array (
'Psr\\SimpleCache\\' => 16,
'Psr\\Container\\' => 14,
'PonePaste\\' => 10,
),
'I' =>
array (
@ -119,10 +120,14 @@ class ComposerStaticInit5bf95489f4eff2c10ec062bf7ba377da
array (
0 => __DIR__ . '/..' . '/psr/container/src',
),
'PonePaste\\' =>
array (
0 => __DIR__ . '/../..' . '/includes',
),
'Illuminate\\Support\\' =>
array (
0 => __DIR__ . '/..' . '/illuminate/macroable',
1 => __DIR__ . '/..' . '/illuminate/collections',
0 => __DIR__ . '/..' . '/illuminate/collections',
1 => __DIR__ . '/..' . '/illuminate/macroable',
2 => __DIR__ . '/..' . '/illuminate/support',
),
'Illuminate\\Database\\' =>

View file

@ -153,17 +153,17 @@
},
{
"name": "illuminate/collections",
"version": "v8.56.0",
"version_normalized": "8.56.0.0",
"version": "v8.57.0",
"version_normalized": "8.57.0.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/collections.git",
"reference": "dd68b267ada1893126d53792b6c57b19e95a9d04"
"reference": "673d71d9db2827b04c096c4fe9739edddea14ac4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/collections/zipball/dd68b267ada1893126d53792b6c57b19e95a9d04",
"reference": "dd68b267ada1893126d53792b6c57b19e95a9d04",
"url": "https://api.github.com/repos/illuminate/collections/zipball/673d71d9db2827b04c096c4fe9739edddea14ac4",
"reference": "673d71d9db2827b04c096c4fe9739edddea14ac4",
"shasum": ""
},
"require": {
@ -174,7 +174,7 @@
"suggest": {
"symfony/var-dumper": "Required to use the dump method (^5.1.4)."
},
"time": "2021-08-23T08:57:48+00:00",
"time": "2021-08-25T13:02:21+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -210,8 +210,8 @@
},
{
"name": "illuminate/container",
"version": "v8.56.0",
"version_normalized": "8.56.0.0",
"version": "v8.57.0",
"version_normalized": "8.57.0.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/container.git",
@ -264,17 +264,17 @@
},
{
"name": "illuminate/contracts",
"version": "v8.56.0",
"version_normalized": "8.56.0.0",
"version": "v8.57.0",
"version_normalized": "8.57.0.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/contracts.git",
"reference": "e4fa45682e8b558ccca02829e8e6e521ff9458d2"
"reference": "7354badf7b57eae805a56d1163fb023e0f58a639"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/e4fa45682e8b558ccca02829e8e6e521ff9458d2",
"reference": "e4fa45682e8b558ccca02829e8e6e521ff9458d2",
"url": "https://api.github.com/repos/illuminate/contracts/zipball/7354badf7b57eae805a56d1163fb023e0f58a639",
"reference": "7354badf7b57eae805a56d1163fb023e0f58a639",
"shasum": ""
},
"require": {
@ -282,7 +282,7 @@
"psr/container": "^1.0",
"psr/simple-cache": "^1.0"
},
"time": "2021-08-19T13:06:39+00:00",
"time": "2021-08-24T21:29:28+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -315,17 +315,17 @@
},
{
"name": "illuminate/database",
"version": "v8.56.0",
"version_normalized": "8.56.0.0",
"version": "v8.57.0",
"version_normalized": "8.57.0.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/database.git",
"reference": "18c2660dd2d5398263907d5717f0a611b901a05a"
"reference": "828d1cd4ee824c405f6edc52ab3d333b549be4ee"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/database/zipball/18c2660dd2d5398263907d5717f0a611b901a05a",
"reference": "18c2660dd2d5398263907d5717f0a611b901a05a",
"url": "https://api.github.com/repos/illuminate/database/zipball/828d1cd4ee824c405f6edc52ab3d333b549be4ee",
"reference": "828d1cd4ee824c405f6edc52ab3d333b549be4ee",
"shasum": ""
},
"require": {
@ -347,7 +347,7 @@
"illuminate/pagination": "Required to paginate the result set (^8.0).",
"symfony/finder": "Required to use Eloquent model factories (^5.1.4)."
},
"time": "2021-08-19T19:38:53+00:00",
"time": "2021-08-26T14:48:34+00:00",
"type": "library",
"extra": {
"branch-alias": {
@ -386,8 +386,8 @@
},
{
"name": "illuminate/macroable",
"version": "v8.56.0",
"version_normalized": "8.56.0.0",
"version": "v8.57.0",
"version_normalized": "8.57.0.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/macroable.git",
@ -435,17 +435,17 @@
},
{
"name": "illuminate/support",
"version": "v8.56.0",
"version_normalized": "8.56.0.0",
"version": "v8.57.0",
"version_normalized": "8.57.0.0",
"source": {
"type": "git",
"url": "https://github.com/illuminate/support.git",
"reference": "586f77ee7f8568ecc60866f171074dccfbe69db5"
"reference": "5e8f059a5d1f298324e847822b997778a3472128"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/illuminate/support/zipball/586f77ee7f8568ecc60866f171074dccfbe69db5",
"reference": "586f77ee7f8568ecc60866f171074dccfbe69db5",
"url": "https://api.github.com/repos/illuminate/support/zipball/5e8f059a5d1f298324e847822b997778a3472128",
"reference": "5e8f059a5d1f298324e847822b997778a3472128",
"shasum": ""
},
"require": {
@ -470,7 +470,7 @@
"symfony/var-dumper": "Required to use the dd function (^5.1.4).",
"vlucas/phpdotenv": "Required to use the Env class and env helper (^5.2)."
},
"time": "2021-08-22T17:54:36+00:00",
"time": "2021-08-25T13:04:37+00:00",
"type": "library",
"extra": {
"branch-alias": {

View file

@ -5,7 +5,7 @@
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'reference' => '6eeb7f0a7e3ad263e25e78cc86e7f4027d0f1bbd',
'reference' => '070545e294d5191c315f4691080b63cd083955b1',
'name' => 'aftercase/ponepaste',
'dev' => true,
),
@ -16,7 +16,7 @@
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'reference' => '6eeb7f0a7e3ad263e25e78cc86e7f4027d0f1bbd',
'reference' => '070545e294d5191c315f4691080b63cd083955b1',
'dev_requirement' => false,
),
'doctrine/inflector' => array(
@ -38,17 +38,17 @@
'dev_requirement' => false,
),
'illuminate/collections' => array(
'pretty_version' => 'v8.56.0',
'version' => '8.56.0.0',
'pretty_version' => 'v8.57.0',
'version' => '8.57.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/collections',
'aliases' => array(),
'reference' => 'dd68b267ada1893126d53792b6c57b19e95a9d04',
'reference' => '673d71d9db2827b04c096c4fe9739edddea14ac4',
'dev_requirement' => false,
),
'illuminate/container' => array(
'pretty_version' => 'v8.56.0',
'version' => '8.56.0.0',
'pretty_version' => 'v8.57.0',
'version' => '8.57.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/container',
'aliases' => array(),
@ -56,26 +56,26 @@
'dev_requirement' => false,
),
'illuminate/contracts' => array(
'pretty_version' => 'v8.56.0',
'version' => '8.56.0.0',
'pretty_version' => 'v8.57.0',
'version' => '8.57.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/contracts',
'aliases' => array(),
'reference' => 'e4fa45682e8b558ccca02829e8e6e521ff9458d2',
'reference' => '7354badf7b57eae805a56d1163fb023e0f58a639',
'dev_requirement' => false,
),
'illuminate/database' => array(
'pretty_version' => 'v8.56.0',
'version' => '8.56.0.0',
'pretty_version' => 'v8.57.0',
'version' => '8.57.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/database',
'aliases' => array(),
'reference' => '18c2660dd2d5398263907d5717f0a611b901a05a',
'reference' => '828d1cd4ee824c405f6edc52ab3d333b549be4ee',
'dev_requirement' => false,
),
'illuminate/macroable' => array(
'pretty_version' => 'v8.56.0',
'version' => '8.56.0.0',
'pretty_version' => 'v8.57.0',
'version' => '8.57.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/macroable',
'aliases' => array(),
@ -83,12 +83,12 @@
'dev_requirement' => false,
),
'illuminate/support' => array(
'pretty_version' => 'v8.56.0',
'version' => '8.56.0.0',
'pretty_version' => 'v8.57.0',
'version' => '8.57.0.0',
'type' => 'library',
'install_path' => __DIR__ . '/../illuminate/support',
'aliases' => array(),
'reference' => '586f77ee7f8568ecc60866f171074dccfbe69db5',
'reference' => '5e8f059a5d1f298324e847822b997778a3472128',
'dev_requirement' => false,
),
'nesbot/carbon' => array(

View file

@ -1146,13 +1146,15 @@ class Collection implements ArrayAccess, Enumerable
? $this->operatorForWhere(...func_get_args())
: $key;
$items = $this->when($filter)->filter($filter);
$placeholder = new stdClass();
if ($items->isEmpty()) {
$item = $this->first($filter, $placeholder);
if ($item === $placeholder) {
throw new ItemNotFoundException;
}
return $items->first();
return $item;
}
/**

View file

@ -15,7 +15,7 @@ interface ContextualBindingBuilder
/**
* Define the implementation for the contextual binding.
*
* @param \Closure|string $implementation
* @param \Closure|string|array $implementation
* @return void
*/
public function give($implementation);

View file

@ -114,6 +114,17 @@ class BroadcastableModelEventOccurred implements ShouldBroadcast
return $this;
}
/**
* Determine if the event should be broadcast synchronously.
*
* @return bool
*/
public function shouldBroadcastNow()
{
return $this->event === 'deleted' &&
! method_exists($this->model, 'bootSoftDeletes');
}
/**
* Get the event name.
*

View file

@ -111,6 +111,10 @@ trait BroadcastsEvents
*/
protected function broadcastIfBroadcastChannelsExistForEvent($instance, $event, $channels = null)
{
if (! static::$isBroadcasting) {
return;
}
if (! empty($this->broadcastOn($event)) || ! empty($channels)) {
return broadcast($instance->onChannels(Arr::wrap($channels)));
}

View file

@ -348,6 +348,72 @@ trait QueriesRelationships
return $this->doesntHaveMorph($relation, $types, 'or', $callback);
}
/**
* Add a basic where clause to a relationship query.
*
* @param string $relation
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder|static
*/
public function whereRelation($relation, $column, $operator = null, $value = null)
{
return $this->whereHas($relation, function ($query) use ($column, $operator, $value) {
$query->where($column, $operator, $value);
});
}
/**
* Add an "or where" clause to a relationship query.
*
* @param string $relation
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder|static
*/
public function orWhereRelation($relation, $column, $operator = null, $value = null)
{
return $this->orWhereHas($relation, function ($query) use ($column, $operator, $value) {
$query->where($column, $operator, $value);
});
}
/**
* Add a polymorphic relationship condition to the query with a where clause.
*
* @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation
* @param string|array $types
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder|static
*/
public function whereMorphRelation($relation, $types, $column, $operator = null, $value = null)
{
return $this->whereHasMorph($relation, $types, function ($query) use ($column, $operator, $value) {
$query->where($column, $operator, $value);
});
}
/**
* Add a polymorphic relationship condition to the query with an "or where" clause.
*
* @param \Illuminate\Database\Eloquent\Relations\MorphTo|string $relation
* @param string|array $types
* @param \Closure|string|array|\Illuminate\Database\Query\Expression $column
* @param mixed $operator
* @param mixed $value
* @return \Illuminate\Database\Eloquent\Builder|static
*/
public function orWhereMorphRelation($relation, $types, $column, $operator = null, $value = null)
{
return $this->orWhereHasMorph($relation, $types, function ($query) use ($column, $operator, $value) {
$query->where($column, $operator, $value);
});
}
/**
* Add subselect queries to include an aggregate value for a relationship.
*

View file

@ -166,6 +166,13 @@ abstract class Model implements Arrayable, ArrayAccess, HasBroadcastChannel, Jso
*/
protected static $lazyLoadingViolationCallback;
/**
* Indicates if broadcasting is currently enabled.
*
* @var bool
*/
protected static $isBroadcasting = true;
/**
* The name of the "created at" column.
*
@ -377,6 +384,25 @@ abstract class Model implements Arrayable, ArrayAccess, HasBroadcastChannel, Jso
static::$lazyLoadingViolationCallback = $callback;
}
/**
* Execute a callback without broadcasting any model events for all model types.
*
* @param callable $callback
* @return mixed
*/
public static function withoutBroadcasting(callable $callback)
{
$isBroadcasting = static::$isBroadcasting;
static::$isBroadcasting = false;
try {
return $callback();
} finally {
static::$isBroadcasting = $isBroadcasting;
}
}
/**
* Fill the model with an array of attributes.
*

View file

@ -20,7 +20,7 @@ use Illuminate\Http\Client\Factory;
* @method static \Illuminate\Http\Client\PendingRequest contentType(string $contentType)
* @method static \Illuminate\Http\Client\PendingRequest dd()
* @method static \Illuminate\Http\Client\PendingRequest dump()
* @method static \Illuminate\Http\Client\PendingRequest retry(int $times, int $sleep = 0)
* @method static \Illuminate\Http\Client\PendingRequest retry(int $times, int $sleep = 0, ?callable $when = null)
* @method static \Illuminate\Http\Client\PendingRequest sink(string|resource $to)
* @method static \Illuminate\Http\Client\PendingRequest stub(callable $callback)
* @method static \Illuminate\Http\Client\PendingRequest timeout(int $seconds)