Merge pull request #3272 from pixelfed/staging

Staging
pull/3293/head
daniel 3 years ago committed by GitHub
commit ac6922ab59
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -22,6 +22,7 @@
- Fix profile masonry layout on mobile. Fixes #3203 ([fdf90f2d](https://github.com/pixelfed/pixelfed/commit/fdf90f2d))
- Add search bar to mobile breakpoints and adjust avatar size when necessary ([77b9b6bd](https://github.com/pixelfed/pixelfed/commit/77b9b6bd))
- Improved profile layout on mobile breakpoints ([77b9b6bd](https://github.com/pixelfed/pixelfed/commit/77b9b6bd))
- New Discover layout with My Hashtags, My Memories, Account Insights, Find Friends and Server Timelines ([0b680099](https://github.com/pixelfed/pixelfed/commit/0b680099))
### Updated
- Updated MediaStorageService, fix remote avatar bug. ([1c20d696](https://github.com/pixelfed/pixelfed/commit/1c20d696))
@ -60,6 +61,8 @@
- Updated StatusController, redirect status view for authed users to Metro 2.0 UI. ([71dff472](https://github.com/pixelfed/pixelfed/commit/71dff472))
- Updated ProfileController, redirect profile view for authed users to Metro 2.0 UI. ([7f8129a7](https://github.com/pixelfed/pixelfed/commit/7f8129a7))
- Updated SpaController, fix variable typo. Fixes #3268. ([8d1af1d6](https://github.com/pixelfed/pixelfed/commit/8d1af1d6))
- Updated ComposeModal, fix post redirect on old UI. ([160e32a5](https://github.com/pixelfed/pixelfed/commit/160e32a5))
- ([](https://github.com/pixelfed/pixelfed/commit/))
- ([](https://github.com/pixelfed/pixelfed/commit/))
## [v0.11.2 (2022-01-09)](https://github.com/pixelfed/pixelfed/compare/v0.11.1...v0.11.2)

@ -7,6 +7,8 @@ use App\{
Follower,
Hashtag,
HashtagFollow,
Instance,
Like,
Profile,
Status,
StatusHashtag,
@ -14,13 +16,7 @@ use App\{
};
use Auth, DB, Cache;
use Illuminate\Http\Request;
use App\Transformer\Api\AccountTransformer;
use App\Transformer\Api\AccountWithStatusesTransformer;
use App\Transformer\Api\StatusTransformer;
use App\Transformer\Api\StatusStatelessTransformer;
use League\Fractal;
use League\Fractal\Serializer\ArraySerializer;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use App\Services\ConfigCacheService;
use App\Services\StatusHashtagService;
use App\Services\SnowflakeService;
use App\Services\StatusService;
@ -28,14 +24,6 @@ use App\Services\UserFilterService;
class DiscoverController extends Controller
{
protected $fractal;
public function __construct()
{
$this->fractal = new Fractal\Manager();
$this->fractal->setSerializer(new ArraySerializer());
}
public function home(Request $request)
{
abort_if(!Auth::check() && config('instance.discover.public') == false, 403);
@ -103,8 +91,7 @@ class DiscoverController extends Controller
public function profilesDirectory(Request $request)
{
return redirect('/')
->with('statusRedirect', 'The Profile Directory is unavailable at this time.');
return redirect('/')->with('statusRedirect', 'The Profile Directory is unavailable at this time.');
}
public function profilesDirectoryApi(Request $request)
@ -192,4 +179,167 @@ class DiscoverController extends Controller
{
return [];
}
public function myMemories(Request $request)
{
abort_if(!$request->user(), 404);
$pid = $request->user()->profile_id;
abort_if(!$this->config()['memories']['enabled'], 404);
$type = $request->input('type') ?? 'posts';
switch($type) {
case 'posts':
$res = Status::whereProfileId($pid)
->whereDay('created_at', date('d'))
->whereMonth('created_at', date('m'))
->whereYear('created_at', '!=', date('Y'))
->whereNull(['reblog_of_id', 'in_reply_to_id'])
->limit(20)
->pluck('id')
->map(function($id) {
return StatusService::get($id, false);
})
->filter(function($post) {
return $post && isset($post['account']);
})
->values();
break;
case 'liked':
$res = Like::whereProfileId($pid)
->whereDay('created_at', date('d'))
->whereMonth('created_at', date('m'))
->whereYear('created_at', '!=', date('Y'))
->orderByDesc('status_id')
->limit(20)
->pluck('status_id')
->map(function($id) {
return StatusService::get($id, false);
})
->filter(function($post) {
return $post && isset($post['account']);
})
->values();
break;
}
return $res;
}
public function accountInsightsPopularPosts(Request $request)
{
abort_if(!$request->user(), 404);
$pid = $request->user()->profile_id;
abort_if(!$this->config()['insights']['enabled'], 404);
$posts = Cache::remember('pf:discover:metro2:accinsights:popular:' . $pid, 43200, function() use ($pid) {
return Status::whereProfileId($pid)
->whereNotNull('likes_count')
->orderByDesc('likes_count')
->limit(12)
->pluck('id')
->map(function($id) {
return StatusService::get($id, false);
})
->filter(function($post) {
return $post && isset($post['account']);
})
->values();
});
return $posts;
}
public function config()
{
$cc = ConfigCacheService::get('config.discover.features');
if($cc) {
return is_string($cc) ? json_decode($cc, true) : $cc;
}
return [
'hashtags' => [
'enabled' => false,
],
'memories' => [
'enabled' => false,
],
'insights' => [
'enabled' => false,
],
'friends' => [
'enabled' => false,
],
'server' => [
'enabled' => false,
'mode' => 'allowlist',
'domains' => []
]
];
}
public function serverTimeline(Request $request)
{
abort_if(!$request->user(), 404);
abort_if(!$this->config()['server']['enabled'], 404);
$pid = $request->user()->profile_id;
$domain = $request->input('domain');
$config = $this->config();
$domains = explode(',', $config['server']['domains']);
abort_unless(in_array($domain, $domains), 400);
$res = Status::whereNotNull('uri')
->where('uri', 'like', 'https://' . $domain . '%')
->whereNull(['in_reply_to_id', 'reblog_of_id'])
->orderByDesc('id')
->limit(12)
->pluck('id')
->map(function($id) {
return StatusService::get($id);
})
->filter(function($post) {
return $post && isset($post['account']);
})
->values();
return $res;
}
public function enabledFeatures(Request $request)
{
abort_if(!$request->user(), 404);
return $this->config();
}
public function updateFeatures(Request $request)
{
abort_if(!$request->user(), 404);
abort_if(!$request->user()->is_admin, 404);
$pid = $request->user()->profile_id;
$this->validate($request, [
'features.friends.enabled' => 'boolean',
'features.hashtags.enabled' => 'boolean',
'features.insights.enabled' => 'boolean',
'features.memories.enabled' => 'boolean',
'features.server.enabled' => 'boolean',
]);
$res = $request->input('features');
if($res['server'] && isset($res['server']['domains']) && !empty($res['server']['domains'])) {
$parts = explode(',', $res['server']['domains']);
$parts = array_filter($parts, function($v) {
$len = strlen($v);
$pos = strpos($v, '.');
$domain = trim($v);
if($pos == false || $pos == ($len + 1)) {
return false;
}
if(!Instance::whereDomain($domain)->exists()) {
return false;
}
return true;
});
$parts = array_slice($parts, 0, 10);
$d = implode(',', array_map('trim', $parts));
$res['server']['domains'] = $d;
}
ConfigCacheService::put('config.discover.features', json_encode($res));
return $res;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1 +1 @@
(()=>{"use strict";var e,r,t,o={},n={};function a(e){var r=n[e];if(void 0!==r)return r.exports;var t=n[e]={id:e,loaded:!1,exports:{}};return o[e].call(t.exports,t,t.exports,a),t.loaded=!0,t.exports}a.m=o,e=[],a.O=(r,t,o,n)=>{if(!t){var i=1/0;for(u=0;u<e.length;u++){for(var[t,o,n]=e[u],s=!0,l=0;l<t.length;l++)(!1&n||i>=n)&&Object.keys(a.O).every((e=>a.O[e](t[l])))?t.splice(l--,1):(s=!1,n<i&&(i=n));if(s){e.splice(u--,1);var d=o();void 0!==d&&(r=d)}}return r}n=n||0;for(var u=e.length;u>0&&e[u-1][2]>n;u--)e[u]=e[u-1];e[u]=[t,o,n]},a.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return a.d(r,{a:r}),r},a.d=(e,r)=>{for(var t in r)a.o(r,t)&&!a.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},a.f={},a.e=e=>Promise.all(Object.keys(a.f).reduce(((r,t)=>(a.f[t](e,r),r)),[])),a.u=e=>489===e?"js/home-chunk.js":680===e?"js/compose-chunk.js":214===e?"js/post-chunk.js":177===e?"js/profile-chunk.js":void 0,a.miniCssF=e=>({138:"css/spa",170:"css/app",242:"css/appdark",703:"css/admin",994:"css/landing"}[e]+".css"),a.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),a.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="pixelfed:",a.l=(e,o,n,i)=>{if(r[e])r[e].push(o);else{var s,l;if(void 0!==n)for(var d=document.getElementsByTagName("script"),u=0;u<d.length;u++){var c=d[u];if(c.getAttribute("src")==e||c.getAttribute("data-webpack")==t+n){s=c;break}}s||(l=!0,(s=document.createElement("script")).charset="utf-8",s.timeout=120,a.nc&&s.setAttribute("nonce",a.nc),s.setAttribute("data-webpack",t+n),s.src=e),r[e]=[o];var p=(t,o)=>{s.onerror=s.onload=null,clearTimeout(f);var n=r[e];if(delete r[e],s.parentNode&&s.parentNode.removeChild(s),n&&n.forEach((e=>e(o))),t)return t(o)},f=setTimeout(p.bind(null,void 0,{type:"timeout",target:s}),12e4);s.onerror=p.bind(null,s.onerror),s.onload=p.bind(null,s.onload),l&&document.head.appendChild(s)}},a.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},a.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),a.p="/",(()=>{var e={929:0,242:0,170:0,138:0,703:0,994:0};a.f.j=(r,t)=>{var o=a.o(e,r)?e[r]:void 0;if(0!==o)if(o)t.push(o[2]);else if(/^(138|170|242|703|929|994)$/.test(r))e[r]=0;else{var n=new Promise(((t,n)=>o=e[r]=[t,n]));t.push(o[2]=n);var i=a.p+a.u(r),s=new Error;a.l(i,(t=>{if(a.o(e,r)&&(0!==(o=e[r])&&(e[r]=void 0),o)){var n=t&&("load"===t.type?"missing":t.type),i=t&&t.target&&t.target.src;s.message="Loading chunk "+r+" failed.\n("+n+": "+i+")",s.name="ChunkLoadError",s.type=n,s.request=i,o[1](s)}}),"chunk-"+r,r)}},a.O.j=r=>0===e[r];var r=(r,t)=>{var o,n,[i,s,l]=t,d=0;if(i.some((r=>0!==e[r]))){for(o in s)a.o(s,o)&&(a.m[o]=s[o]);if(l)var u=l(a)}for(r&&r(t);d<i.length;d++)n=i[d],a.o(e,n)&&e[n]&&e[n][0](),e[n]=0;return a.O(u)},t=self.webpackChunkpixelfed=self.webpackChunkpixelfed||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})()})();
(()=>{"use strict";var e,r,t,n={},o={};function s(e){var r=o[e];if(void 0!==r)return r.exports;var t=o[e]={id:e,loaded:!1,exports:{}};return n[e].call(t.exports,t,t.exports,s),t.loaded=!0,t.exports}s.m=n,e=[],s.O=(r,t,n,o)=>{if(!t){var a=1/0;for(c=0;c<e.length;c++){for(var[t,n,o]=e[c],i=!0,d=0;d<t.length;d++)(!1&o||a>=o)&&Object.keys(s.O).every((e=>s.O[e](t[d])))?t.splice(d--,1):(i=!1,o<a&&(a=o));if(i){e.splice(c--,1);var l=n();void 0!==l&&(r=l)}}return r}o=o||0;for(var c=e.length;c>0&&e[c-1][2]>o;c--)e[c]=e[c-1];e[c]=[t,n,o]},s.n=e=>{var r=e&&e.__esModule?()=>e.default:()=>e;return s.d(r,{a:r}),r},s.d=(e,r)=>{for(var t in r)s.o(r,t)&&!s.o(e,t)&&Object.defineProperty(e,t,{enumerable:!0,get:r[t]})},s.f={},s.e=e=>Promise.all(Object.keys(s.f).reduce(((r,t)=>(s.f[t](e,r),r)),[])),s.u=e=>489===e?"js/home-chunk.js":680===e?"js/compose-chunk.js":214===e?"js/post-chunk.js":177===e?"js/profile-chunk.js":202===e?"js/dmym-chunk.js":931===e?"js/dmyh-chunk.js":554===e?"js/daci-chunk.js":895===e?"js/dffc-chunk.js":996===e?"js/dsfc-chunk.js":98===e?"js/dssc-chunk.js":void 0,s.miniCssF=e=>({138:"css/spa",170:"css/app",242:"css/appdark",703:"css/admin",994:"css/landing"}[e]+".css"),s.g=function(){if("object"==typeof globalThis)return globalThis;try{return this||new Function("return this")()}catch(e){if("object"==typeof window)return window}}(),s.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),r={},t="pixelfed:",s.l=(e,n,o,a)=>{if(r[e])r[e].push(n);else{var i,d;if(void 0!==o)for(var l=document.getElementsByTagName("script"),c=0;c<l.length;c++){var u=l[c];if(u.getAttribute("src")==e||u.getAttribute("data-webpack")==t+o){i=u;break}}i||(d=!0,(i=document.createElement("script")).charset="utf-8",i.timeout=120,s.nc&&i.setAttribute("nonce",s.nc),i.setAttribute("data-webpack",t+o),i.src=e),r[e]=[n];var f=(t,n)=>{i.onerror=i.onload=null,clearTimeout(p);var o=r[e];if(delete r[e],i.parentNode&&i.parentNode.removeChild(i),o&&o.forEach((e=>e(n))),t)return t(n)},p=setTimeout(f.bind(null,void 0,{type:"timeout",target:i}),12e4);i.onerror=f.bind(null,i.onerror),i.onload=f.bind(null,i.onload),d&&document.head.appendChild(i)}},s.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.nmd=e=>(e.paths=[],e.children||(e.children=[]),e),s.p="/",(()=>{var e={929:0,242:0,170:0,138:0,703:0,994:0};s.f.j=(r,t)=>{var n=s.o(e,r)?e[r]:void 0;if(0!==n)if(n)t.push(n[2]);else if(/^(138|170|242|703|929|994)$/.test(r))e[r]=0;else{var o=new Promise(((t,o)=>n=e[r]=[t,o]));t.push(n[2]=o);var a=s.p+s.u(r),i=new Error;s.l(a,(t=>{if(s.o(e,r)&&(0!==(n=e[r])&&(e[r]=void 0),n)){var o=t&&("load"===t.type?"missing":t.type),a=t&&t.target&&t.target.src;i.message="Loading chunk "+r+" failed.\n("+o+": "+a+")",i.name="ChunkLoadError",i.type=o,i.request=a,n[1](i)}}),"chunk-"+r,r)}},s.O.j=r=>0===e[r];var r=(r,t)=>{var n,o,[a,i,d]=t,l=0;if(a.some((r=>0!==e[r]))){for(n in i)s.o(i,n)&&(s.m[n]=i[n]);if(d)var c=d(s)}for(r&&r(t);l<a.length;l++)o=a[l],s.o(e,o)&&e[o]&&e[o][0](),e[o]=0;return s.O(c)},t=self.webpackChunkpixelfed=self.webpackChunkpixelfed||[];t.forEach(r.bind(null,0)),t.push=r.bind(null,t.push.bind(t))})()})();

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

2
public/js/spa.js vendored

File diff suppressed because one or more lines are too long

@ -6,7 +6,7 @@
"/js/profile.js": "/js/profile.js?id=205015f18099f8ccfe59843dc5892624",
"/js/status.js": "/js/status.js?id=f0e2ad5d590f2f2d93327b134a1aae1a",
"/js/timeline.js": "/js/timeline.js?id=e1ef49a2bf4241f4353e2ee48ff965c5",
"/js/compose.js": "/js/compose.js?id=09edd510f7cb4878c176a9c0d51f09fb",
"/js/compose.js": "/js/compose.js?id=b9ffbd46ba09c30f5f23aea447b9a3f5",
"/js/compose-classic.js": "/js/compose-classic.js?id=cd528ed559170702655d497b469a905b",
"/js/search.js": "/js/search.js?id=1ad4af345d2c8a14541a03937ea4904b",
"/js/developers.js": "/js/developers.js?id=5789400f559a5329ce547f5eed0de929",
@ -20,13 +20,19 @@
"/js/admin.js": "/js/admin.js?id=84492883e1542f8438b48dcf187fc07b",
"/js/rempro.js": "/js/rempro.js?id=995a5afd9188be6ad2b41114d3a8e7ee",
"/js/rempos.js": "/js/rempos.js?id=0685e23f4bbfbcb99bb30ecabb837270",
"/js/spa.js": "/js/spa.js?id=fe1fa8c012ea5c2b15c9e4c10ebe1da5",
"/js/spa.js": "/js/spa.js?id=c081df0cc0db8c4388e298d579bd8183",
"/js/stories.js": "/js/stories.js?id=048de600ee6dfccaeaf06070999cb892",
"/js/manifest.js": "/js/manifest.js?id=408e0d9f96091e680f9aed91d8409161",
"/js/home-chunk.js": "/js/home-chunk.js?id=3b5da705db3a1ca342bbff3319dcd5f1",
"/js/compose-chunk.js": "/js/compose-chunk.js?id=cf39dd2fa64073fefd76ef2bb793ce9e",
"/js/post-chunk.js": "/js/post-chunk.js?id=083bb90731e5e1429822db7edb6a26ed",
"/js/profile-chunk.js": "/js/profile-chunk.js?id=aea66773b0837a32bd9b3f993107c1bd",
"/js/manifest.js": "/js/manifest.js?id=20ea2cd21e0b2ff06bad51215622a3c9",
"/js/home-chunk.js": "/js/home-chunk.js?id=993a77c1df59059d03e994a606925b73",
"/js/compose-chunk.js": "/js/compose-chunk.js?id=92c04b1086da61beb3e91a84ffc62341",
"/js/post-chunk.js": "/js/post-chunk.js?id=2da4520782ee4a1e2f20e52fa21da7a8",
"/js/profile-chunk.js": "/js/profile-chunk.js?id=d8c43c8d9128269b166dfc9ef652f764",
"/js/dmym-chunk.js": "/js/dmym-chunk.js?id=9c5dc1bf2f995b3da03280b0930277ee",
"/js/dmyh-chunk.js": "/js/dmyh-chunk.js?id=2be5a28f8fbf5aa619f5a4876046058a",
"/js/daci-chunk.js": "/js/daci-chunk.js?id=a897879b7f58261d387c991acd56d12b",
"/js/dffc-chunk.js": "/js/dffc-chunk.js?id=3a2f194ebeca7f85512441b842a418f7",
"/js/dsfc-chunk.js": "/js/dsfc-chunk.js?id=b02562d84709ef6933f39d1577161d2c",
"/js/dssc-chunk.js": "/js/dssc-chunk.js?id=8f415c9302c65ab132f6cb50fc26a13c",
"/css/appdark.css": "/css/appdark.css?id=a661085d048e4e6b953ba58086d34007",
"/css/app.css": "/css/app.css?id=ef378884d2b1cf81e12851d2aab5089a",
"/css/spa.css": "/css/spa.css?id=c1320213cd53b5dbb38057e8054bb0db",

@ -1262,7 +1262,7 @@ export default {
if(location.pathname === '/i/web/compose' && res.data && res.data.length) {
location.href = '/i/web/post/' + res.data.split('/').slice(-1)[0];
} else {
location.href = data;
location.href = res.data;
}
}).catch(err => {
if(err.response) {
@ -1330,6 +1330,7 @@ export default {
closeModal() {
$('#composeModal').modal('hide');
this.$emit('close');
},
goBack() {

@ -216,6 +216,11 @@ Route::domain(config('pixelfed.domain.app'))->middleware(['validemail', 'twofact
Route::post('status/{id}/archive', 'ApiController@archive');
Route::post('status/{id}/unarchive', 'ApiController@unarchive');
Route::get('statuses/archives', 'ApiController@archivedPosts');
Route::get('discover/memories', 'DiscoverController@myMemories');
Route::get('discover/account-insights', 'DiscoverController@accountInsightsPopularPosts');
Route::get('discover/server-timeline', 'DiscoverController@serverTimeline');
Route::get('discover/meta', 'DiscoverController@enabledFeatures');
Route::post('discover/admin/features', 'DiscoverController@updateFeatures');
});
Route::get('discover/accounts/popular', 'Api\ApiV1Controller@discoverAccountsPopular');

Loading…
Cancel
Save