Merge branch 'develop' into eventdispatcher-part3

This commit is contained in:
Art4 2025-04-10 11:14:16 +00:00
commit 8ebbe8141a
7 changed files with 190 additions and 32 deletions

View file

@ -1097,9 +1097,9 @@ class Item
}
if ($update_commented) {
$fields = ['commented' => DateTimeFormat::utcNow(), 'changed' => DateTimeFormat::utcNow()];
$fields = ['commented' => $posted_item['received'], 'changed' => $posted_item['received']];
} else {
$fields = ['changed' => DateTimeFormat::utcNow()];
$fields = ['changed' => $posted_item['received']];
}
Post::update($fields, ['uri-id' => $posted_item['parent-uri-id'], 'uid' => $posted_item['uid']]);

View file

@ -205,13 +205,25 @@ final class ItemHelper
$item['file'] = trim($item['file'] ?? '');
// Items cannot be stored before they happen ...
if ($item['created'] > DateTimeFormat::utcNow()) {
$item['created'] = DateTimeFormat::utcNow();
if ($item['received'] > DateTimeFormat::utcNow()) {
$item['received'] = DateTimeFormat::utcNow();
}
if ($item['created'] > $item['received']) {
$item['created'] = $item['received'];
}
// We haven't invented time travel by now.
if ($item['edited'] > DateTimeFormat::utcNow()) {
$item['edited'] = DateTimeFormat::utcNow();
if ($item['edited'] > $item['received'] ) {
$item['edited'] = $item['received'] ;
}
if ($item['changed'] > $item['received'] ) {
$item['changed'] = $item['received'] ;
}
if ($item['commented'] > $item['received'] ) {
$item['commented'] = $item['received'] ;
}
$item['plink'] = ($item['plink'] ?? '') ?: $this->baseUrl . '/display/' . urlencode($item['guid']);

View file

@ -130,6 +130,7 @@ class Photo extends BaseApi
$photo = MPhoto::getPhoto($photoid, $scale, self::getCurrentUserID());
if ($photo === false) {
$this->logger->notice('Photo was not loaded', ['parameters' => $this->parameters, 'id' => $photoid]);
throw new HTTPException\NotFoundException(DI::l10n()->t('The Photo with id %s is not available.', $photoid));
}
}
@ -137,6 +138,7 @@ class Photo extends BaseApi
$fetch = microtime(true) - $stamp;
if ($photo === false) {
$this->logger->notice('Photo was not loaded', ['parameters' => $this->parameters]);
throw new HTTPException\NotFoundException();
}
@ -151,6 +153,7 @@ class Photo extends BaseApi
$mimetype = $photo['type'];
}
if (empty($imgdata) && empty($photo['blurhash'])) {
$this->logger->notice('Image data was not loaded', ['parameters' => $this->parameters, 'class' => $photo['backend-class'], 'ref' => $photo['backend-ref']]);
throw new HTTPException\NotFoundException();
}
@ -317,7 +320,11 @@ class Photo extends BaseApi
$photo = MPhoto::selectFirst([], ['scale' => $scale, 'uid' => $contact['uid'], 'profile' => 1]);
if (!empty($photo)) {
return $photo;
} else {
$this->logger->notice('Profile photo was not loaded', ['scale' => $scale, 'uid' => $contact['uid']]);
}
} else {
$this->logger->notice('Local Contact was not found', ['url' => $contact['nurl']]);
}
}
@ -333,6 +340,7 @@ class Photo extends BaseApi
if (!empty($photo)) {
return $photo;
} else {
$this->logger->notice('Photo was not loaded', ['resource-id' => $resourceid]);
$url = $contact['avatar'];
}
} else {
@ -340,6 +348,8 @@ class Photo extends BaseApi
}
} elseif (!empty($contact['avatar'])) {
$url = $contact['avatar'];
} else {
$url = '';
}
// If it is a local link, we save resources by just redirecting to it.
@ -381,8 +391,6 @@ class Photo extends BaseApi
}
}
$url = '';
if (empty($mimetext) && !empty($contact['blurhash'])) {
$image = new Image('', image_type_to_mime_type(IMAGETYPE_WEBP));
$image->getFromBlurHash($contact['blurhash'], $customsize, $customsize);

View file

@ -117,7 +117,7 @@ class DateTimeFormat
$tz_to = 'UTC';
}
if (($s === '') || (!is_string($s))) {
if ($s === '') {
$s = 'now';
}
@ -135,7 +135,8 @@ class DateTimeFormat
}
try {
$d = new DateTime($s, $from_obj);
$d = DateTime::createFromFormat('U', $s, $from_obj)
?: new DateTime($s, $from_obj);
} catch (Exception $e) {
try {
$d = new DateTime(self::fix($s), $from_obj);
@ -176,6 +177,7 @@ class DateTimeFormat
$pregPatterns = [
['#(\w+), (\d+ \w+ \d+) (\d+:\d+:\d+) (.+)#', '$2 $3 $4'],
['#(\d+:\d+) (\w+), (\w+) (\d+), (\d+)#', '$1 $2 $3 $4 $5'],
['#\[[^\]]*\]#', ''], // 2025-03-07T08:54:14.341+01:00[Europe/Berlin]
];
foreach ($pregPatterns as $pattern) {

View file

@ -121,6 +121,9 @@ class Cron
Worker::add(Worker::PRIORITY_LOW, 'UpdateAllSuggestions');
// add missing public contacts and account-user entries
Worker::add(Worker::PRIORITY_LOW, 'FixContacts');
if (DI::config()->get('system', 'optimize_tables')) {
Worker::add(Worker::PRIORITY_LOW, 'OptimizeTables');
}

View file

@ -0,0 +1,51 @@
<?php
// Copyright (C) 2010-2024, the Friendica project
// SPDX-FileCopyrightText: 2010-2024 the Friendica project
//
// SPDX-License-Identifier: AGPL-3.0-or-later
namespace Friendica\Worker;
use Friendica\Database\DBA;
use Friendica\DI;
use Friendica\Model\Contact;
/**
* add missing public contacts and account-user entries
*/
class FixContacts
{
public static function execute()
{
$added = 0;
DI::logger()->info('Add missing public contacts');
$contacts = DBA::p("SELECT `contact`.`id` FROM `contact` LEFT JOIN `contact` AS `pcontact` ON `contact`.`uri-id` = `pcontact`.`uri-id` WHERE `pcontact`.`id` IS NULL");
while ($contact = DBA::fetch($contacts)) {
Contact::selectAccountUserById($contact['id'], ['id']);
$added++;
}
DBA::close($contacts);
if ($added == 0) {
DI::logger()->info('No public contacts have been added');
} else {
DI::logger()->info('Missing public contacts have been added', ['added' => $added]);
}
$added = 0;
DI::logger()->info('Add missing account-user entries');
$contacts = DBA::p("SELECT `contact`.`id`, `contact`.`uid`, `contact`.`uri-id`, `contact`.`url` FROM `contact` LEFT JOIN `account-user` ON `contact`.`id` = `account-user`.`id` WHERE `contact`.`id` > ? AND `account-user`.`id` IS NULL", 0);
while ($contact = DBA::fetch($contacts)) {
Contact::setAccountUser($contact['id'], $contact['uid'], $contact['uri-id'], $contact['url']);
$added++;
}
DBA::close($contacts);
if ($added == 0) {
DI::logger()->info('No account-user entries have been added');
} else {
DI::logger()->info('Missing account-user entries have been added', ['added' => $added]);
}
}
}

View file

@ -125,6 +125,10 @@ class DateTimeFormatTest extends MockedTestCase
'expectedDate' => '2023-04-02T17:22:42+05:30',
'dateString' => '2023-04-02\T17:22:42+05:30'
],
'2025-03-07T08:54:14.341+01:00[Europe/Berlin]' => [
'expectedDate' => '2025-03-07T08:54:14+01:00',
'dateString' => '2025-03-07T08:54:14.341+01:00[Europe/Berlin]'
],
];
}
@ -156,4 +160,82 @@ class DateTimeFormatTest extends MockedTestCase
$this->assertEquals(259200, $now - $date);
}
public function dataConvert()
{
return [
'unix timestamp' => [
'expected' => '2025-03-12 16:18:27',
's' => '1741796307',
],
'ATOM' => [
'expected' => '2022-06-02 15:58:35',
's' => '2022-06-02T16:58:35+01:00',
],
'COOKIE' => [
'expected' => '2022-06-02 14:58:35',
's' => 'Thursday, 02-Jun-2022 16:58:35 Africa/Cairo',
],
'ISO 8601/RFC 3339' => [
'expected' => '2022-06-02 13:58:35',
's' => '2022-06-02T16:58:35+0300',
],
'RFC 822/RFC 1036' => [
'expected' => '2022-06-02 12:58:35',
's' => 'Thu, 02 Jun 22 16:58:35 +0400',
],
'RFC 850' => [
'expected' => '2022-06-02 11:58:35',
's' => 'Thursday, 02-Jun-22 16:58:35 Indian/Kerguelen',
],
'RFC 1123/RFC 2822/RSS' => [
'expected' => '2022-06-02 10:58:35',
's' => 'Thu, 02 Jun 2022 16:58:35 +0600',
],
'RFC 3339/W3C' => [
'expected' => '2025-03-07 01:54:14',
's' => '2025-03-07T08:54:14+07:00',
],
'RFC 3339 extended' => [
'expected' => '2025-03-07 00:54:14',
's' => '2025-03-07T08:54:14.341+08:00',
],
'RFC 7231' => [
'expected' => '2022-06-02 07:58:35',
's' => 'Thu, 02 Jun 2022 16:58:35 Asia/Tokyo',
],
];
}
/**
* @dataProvider dataConvert
*/
public function testConvert($expected, string $s = 'now', string $tz_to = 'UTC', string $tz_from = 'UTC', string $format = DateTimeFormat::MYSQL)
{
$this->assertSame($expected, DateTimeFormat::convert($s, $tz_to, $tz_from, $format));
}
public function dataConvertNow()
{
return [
'now missing' => [
],
'now empty' => [
's' => '',
],
'now now' => [
's' => 'now',
],
];
}
/**
* @dataProvider dataConvertNow
*/
public function testConvertNow(string $s = 'now', string $tz_to = 'UTC', string $tz_from = 'UTC', string $format = DateTimeFormat::MYSQL)
{
$this->assertSame(date(DateTimeFormat::MYSQL), DateTimeFormat::convert($s, $tz_to, $tz_from, $format));
}
}