pixelfed/pixelfed

View on GitHub
app/Http/Controllers/Settings/ExportSettings.php

Summary

Maintainability
C
1 day
Test Coverage
<?php

namespace App\Http\Controllers\Settings;

use App\AccountLog;
use App\Following;
use App\Report;
use App\Status;
use App\UserFilter;
use Auth, Cookie, DB, Cache, Purify;
use Carbon\Carbon;
use Illuminate\Http\Request;
use App\Transformer\ActivityPub\{
    ProfileTransformer,
    StatusTransformer
};
use App\Transformer\Api\StatusTransformer as StatusApiTransformer;
use League\Fractal;
use League\Fractal\Serializer\ArraySerializer;
use League\Fractal\Pagination\IlluminatePaginatorAdapter;

trait ExportSettings
{
    public function __construct()
    {
        $this->middleware('auth');
    }

    public function dataExport()
    {
        return view('settings.dataexport');
    }

    public function exportAccount()
    {
        $data = Cache::remember('account:export:profile:actor:'.Auth::user()->profile->id, now()->addMinutes(60), function() {
            $profile = Auth::user()->profile;
            $fractal = new Fractal\Manager();
            $fractal->setSerializer(new ArraySerializer());
            $resource = new Fractal\Resource\Item($profile, new ProfileTransformer());
            return $fractal->createData($resource)->toArray();
        });

        return response()->streamDownload(function () use ($data) {
            echo json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
        }, 'account.json', [
            'Content-Type' => 'application/json'
        ]);
    }

    public function exportFollowing()
    {
        $data = Cache::remember('account:export:profile:following:'.Auth::user()->profile->id, now()->addMinutes(60), function() {
            return Auth::user()->profile->following()->get()->map(function($i) {
                return $i->url();
            });
        });
        return response()->streamDownload(function () use($data) {
            echo $data;
        }, 'following.json', [
            'Content-Type' => 'application/json'
        ]);
    }

    public function exportFollowers()
    {
        $data = Cache::remember('account:export:profile:followers:'.Auth::user()->profile->id, now()->addMinutes(60), function() {
            return Auth::user()->profile->followers()->get()->map(function($i) {
                return $i->url();
            });
        });
        return response()->streamDownload(function () use($data) {
            echo $data;
        }, 'followers.json', [
            'Content-Type' => 'application/json'
        ]);
    }

    public function exportMuteBlockList()
    {
        $profile = Auth::user()->profile;
        $exists = UserFilter::select('id')
            ->whereUserId($profile->id)
            ->exists();
        if(!$exists) {
            return redirect()->back();
        }
        $data = Cache::remember('account:export:profile:muteblocklist:'.Auth::user()->profile->id, now()->addMinutes(60), function() use($profile) {
            return json_encode([
                'muted' => $profile->mutedProfileUrls(),
                'blocked' => $profile->blockedProfileUrls()
            ], JSON_PRETTY_PRINT);
        });
        return response()->streamDownload(function () use($data) {
            echo $data;
        }, 'muted-and-blocked-accounts.json', [
            'Content-Type' => 'application/json'
        ]);
    }

    public function exportStatuses(Request $request)
    {
        $this->validate($request, [
            'type' => 'required|string|in:ap,api'
        ]);
        $limit = 500;

        $profile = Auth::user()->profile;
        $type = 'ap';

        $count = Status::select('id')->whereProfileId($profile->id)->count();
        if($count > $limit) {
            // fire background job
            return redirect('/settings/data-export')->with(['status' => 'You have more than '.$limit.' statuses, we do not support full account export yet.']);
        }

        $filename = 'outbox.json';
        if($type == 'ap') {
            $data = Cache::remember('account:export:profile:statuses:ap:'.Auth::user()->profile->id, now()->addHours(1), function() {
                $profile = Auth::user()->profile->statuses;
                $fractal = new Fractal\Manager();
                $fractal->setSerializer(new ArraySerializer());
                $resource = new Fractal\Resource\Collection($profile, new StatusTransformer());
                return $fractal->createData($resource)->toArray();
            });
        } else {
            $filename = 'api-statuses.json';
            $data = Cache::remember('account:export:profile:statuses:api:'.Auth::user()->profile->id, now()->addHours(1), function() {
                $profile = Auth::user()->profile->statuses;
                $fractal = new Fractal\Manager();
                $fractal->setSerializer(new ArraySerializer());
                $resource = new Fractal\Resource\Collection($profile, new StatusApiTransformer());
                return $fractal->createData($resource)->toArray();
            });
        }

        return response()->streamDownload(function () use ($data, $filename) {
            echo json_encode($data, JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
        }, $filename, [
            'Content-Type' => 'application/json'
        ]);
    }

}