diff --git a/.ddev/commands/redis/redis-cli b/.ddev/commands/redis/redis-cli new file mode 100755 index 00000000..27bf575b --- /dev/null +++ b/.ddev/commands/redis/redis-cli @@ -0,0 +1,7 @@ +#!/bin/bash +#ddev-generated +## Description: Run redis-cli inside the redis container +## Usage: redis-cli [flags] [args] +## Example: "redis-cli KEYS *" or "ddev redis-cli INFO" or "ddev redis-cli --version" + +redis-cli -p 6379 -h redis $@ diff --git a/.ddev/config.yaml b/.ddev/config.yaml new file mode 100644 index 00000000..0ca08a26 --- /dev/null +++ b/.ddev/config.yaml @@ -0,0 +1,32 @@ +type: laravel +docroot: public +php_version: "8.1" +webserver_type: nginx-fpm +database: + type: mariadb + version: "10.4" +disable_settings_management: true +web_environment: + - DB_CONNECTION=mysql + - DB_HOST=ddev-pixelfed-db + - DB_DATABASE=db + - DB_USERNAME=db + - DB_PASSWORD=db + - REDIS_HOST=ddev-pixelfed-redis + - MAIL_DRIVER=smtp + - MAIL_HOST=localhost + - MAIL_PORT=1025 + - MAIL_USERNAME=null + - MAIL_PASSWORD=null + - MAIL_ENCRYPTION=null + - APP_KEY=placeholder + - APP_NAME=PixelfedTest + - APP_ENV=local + - APP_KEY=base64:lwX95GbNWX3XsucdMe0XwtOKECta3h/B+p9NbH2jd0E= + - APP_DEBUG=true + - APP_URL=https://pixelfed.ddev.site + - APP_DOMAIN=pixelfed.ddev.site + - ADMIN_DOMAIN=pixelfed.ddev.site + - SESSION_DOMAIN=pixelfed.ddev.site + - "TRUST_PROXIES=*" + - LOG_CHANNEL=stack diff --git a/.ddev/docker-compose.redis.yaml b/.ddev/docker-compose.redis.yaml new file mode 100644 index 00000000..fab05033 --- /dev/null +++ b/.ddev/docker-compose.redis.yaml @@ -0,0 +1,14 @@ +#ddev-generated +version: '3.6' +services: + redis: + container_name: ddev-${DDEV_SITENAME}-redis + image: redis:6 + # These labels ensure this service is discoverable by ddev. + labels: + com.ddev.site-name: ${DDEV_SITENAME} + com.ddev.approot: $DDEV_APPROOT + volumes: + - ".:/mnt/ddev_config" + - "./redis:/usr/local/etc/redis" + command: ["redis-server", "/usr/local/etc/redis/redis.conf"] diff --git a/.ddev/redis/redis.conf b/.ddev/redis/redis.conf new file mode 100644 index 00000000..0b5216eb --- /dev/null +++ b/.ddev/redis/redis.conf @@ -0,0 +1,8 @@ +# Redis configuration. +# #ddev-generated +# Example configuration files for reference: +# http://download.redis.io/redis-stable/redis.conf +# http://download.redis.io/redis-stable/sentinel.conf + +maxmemory 2048mb +maxmemory-policy allkeys-lfu diff --git a/CHANGELOG.md b/CHANGELOG.md index 7084245b..b526d5ad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -64,6 +64,7 @@ - Update StatusReplyPipeline, remove expensive reply count re-calculation query ([a2f8aad1](https://github.com/pixelfed/pixelfed/commit/a2f8aad1)) - Update CommentPipeline, remove expensive reply count re-calculation query ([b457a446](https://github.com/pixelfed/pixelfed/commit/b457a446)) - Update FederationController, improve inbox/sharedInbox delete handling ([2180a2de](https://github.com/pixelfed/pixelfed/commit/2180a2de)) +- Update HashtagController, improve trending hashtag endpoint ([4873c7dd](https://github.com/pixelfed/pixelfed/commit/4873c7dd)) - ([](https://github.com/pixelfed/pixelfed/commit/)) ## [v0.11.4 (2022-10-04)](https://github.com/pixelfed/pixelfed/compare/v0.11.3...v0.11.4) diff --git a/app/Http/Controllers/DiscoverController.php b/app/Http/Controllers/DiscoverController.php index 4fa370be..eb33c2ef 100644 --- a/app/Http/Controllers/DiscoverController.php +++ b/app/Http/Controllers/DiscoverController.php @@ -181,22 +181,32 @@ class DiscoverController extends Controller { abort_if(!$request->user(), 403); - $res = Cache::remember('api:discover:v1.1:trending:hashtags', 3600, function() { + $res = Cache::remember('api:discover:v1.1:trending:hashtags', 43200, function() { + $minId = StatusHashtag::where('created_at', '>', now()->subDays(14))->first(); + if(!$minId) { + return []; + } return StatusHashtag::select('hashtag_id', \DB::raw('count(*) as total')) + ->where('id', '>', $minId->id) ->groupBy('hashtag_id') ->orderBy('total','desc') - ->where('created_at', '>', now()->subDays(90)) - ->take(9) + ->take(20) ->get() ->map(function($h) { - $hashtag = $h->hashtag; + $hashtag = Hashtag::find($h->hashtag_id); + if(!$hashtag) { + return; + } return [ - 'id' => $hashtag->id, + 'id' => $h->hashtag_id, 'total' => $h->total, 'name' => '#'.$hashtag->name, + 'hashtag' => $hashtag->name, 'url' => $hashtag->url() ]; - }); + }) + ->filter() + ->values(); }); return $res; } diff --git a/app/Http/Controllers/FederationController.php b/app/Http/Controllers/FederationController.php index f498c731..42988ec9 100644 --- a/app/Http/Controllers/FederationController.php +++ b/app/Http/Controllers/FederationController.php @@ -131,7 +131,7 @@ class FederationController extends Controller 'orderedItems' => [] ]; - return response(json_encode($res, JSON_UNESCAPED_SLASHES))->header('Content-Type', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'); + return response(json_encode($res, JSON_UNESCAPED_SLASHES))->header('Content-Type', 'application/activity+json'); } public function userInbox(Request $request, $username) diff --git a/app/Http/Controllers/InstanceActorController.php b/app/Http/Controllers/InstanceActorController.php index 93215542..0eb79673 100644 --- a/app/Http/Controllers/InstanceActorController.php +++ b/app/Http/Controllers/InstanceActorController.php @@ -14,7 +14,7 @@ class InstanceActorController extends Controller $res = (new InstanceActor())->first()->getActor(); return json_encode($res, JSON_UNESCAPED_SLASHES); }); - return response($res)->header('Content-Type', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'); + return response($res)->header('Content-Type', 'application/activity+json'); } public function inbox() @@ -32,6 +32,6 @@ class InstanceActorController extends Controller 'first' => config('app.url') . '/i/actor/outbox?page=true', 'last' => config('app.url') . '/i/actor/outbox?min_id=0page=true' ], JSON_UNESCAPED_SLASHES); - return response($res)->header('Content-Type', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'); + return response($res)->header('Content-Type', 'application/activity+json'); } } diff --git a/app/Http/Controllers/ProfileController.php b/app/Http/Controllers/ProfileController.php index 0810956b..3f6795d5 100644 --- a/app/Http/Controllers/ProfileController.php +++ b/app/Http/Controllers/ProfileController.php @@ -191,7 +191,7 @@ class ProfileController extends Controller $fractal = new Fractal\Manager(); $resource = new Fractal\Resource\Item($user, new ProfileTransformer); $res = $fractal->createData($resource)->toArray(); - return response(json_encode($res['data']))->header('Content-Type', 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'); + return response(json_encode($res['data']))->header('Content-Type', 'application/activity+json'); }); } diff --git a/app/Http/Controllers/StatusController.php b/app/Http/Controllers/StatusController.php index 040f2fdb..117124bb 100644 --- a/app/Http/Controllers/StatusController.php +++ b/app/Http/Controllers/StatusController.php @@ -293,7 +293,7 @@ class StatusController extends Controller $resource = new Fractal\Resource\Item($status, $object); $res = $fractal->createData($resource)->toArray(); - return response()->json($res['data'], 200, ['Content-Type' => 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES); + return response()->json($res['data'], 200, ['Content-Type' => 'application/activity+json'], JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES); } public function edit(Request $request, $username, $id) diff --git a/app/Services/ActivityPubFetchService.php b/app/Services/ActivityPubFetchService.php index 49e1e7cf..5c0d48c7 100644 --- a/app/Services/ActivityPubFetchService.php +++ b/app/Services/ActivityPubFetchService.php @@ -17,7 +17,7 @@ class ActivityPubFetchService } $headers = HttpSignature::instanceActorSign($url, false); - $headers['Accept'] = 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"'; + $headers['Accept'] = 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'; $headers['User-Agent'] = '(Pixelfed/'.config('pixelfed.version').'; +'.config('app.url').')'; try { diff --git a/app/Services/WebfingerService.php b/app/Services/WebfingerService.php index 80791466..78a0008b 100644 --- a/app/Services/WebfingerService.php +++ b/app/Services/WebfingerService.php @@ -48,9 +48,11 @@ class WebfingerService $link = collect($webfinger['links']) ->filter(function($link) { return $link && + isset($link['rel']) && isset($link['type']) && isset($link['href']) && - $link['type'] == 'application/activity+json'; + $link['rel'] == 'self' && + $link['type'] == 'application/activity+json' || $link['type'] == 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"'; }) ->pluck('href') ->first(); diff --git a/app/Util/ActivityPub/HttpSignature.php b/app/Util/ActivityPub/HttpSignature.php index 5204a5f4..8c8dad99 100644 --- a/app/Util/ActivityPub/HttpSignature.php +++ b/app/Util/ActivityPub/HttpSignature.php @@ -132,7 +132,6 @@ class HttpSignature { '(request-target)' => 'post '.parse_url($url, PHP_URL_PATH), 'Date' => $date->format('D, d M Y H:i:s \G\M\T'), 'Host' => parse_url($url, PHP_URL_HOST), - 'Accept' => 'application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"', ]; if($digest) {