From 94395be9c4f2c7b56f042a9a20a0291d32f868a8 Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Fri, 27 Jan 2023 19:29:44 -0700 Subject: [PATCH] Add archive api endpoints --- .../Controllers/Api/ApiV1Dot1Controller.php | 70 +++++++++++++++++ app/Http/Resources/StatusStateless.php | 76 +++++++++++++++++++ routes/api.php | 6 ++ 3 files changed, 152 insertions(+) create mode 100644 app/Http/Resources/StatusStateless.php diff --git a/app/Http/Controllers/Api/ApiV1Dot1Controller.php b/app/Http/Controllers/Api/ApiV1Dot1Controller.php index b46fd38cd..5de1bc54f 100644 --- a/app/Http/Controllers/Api/ApiV1Dot1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Dot1Controller.php @@ -14,6 +14,7 @@ use App\EmailVerification; use App\Status; use App\Report; use App\Profile; +use App\StatusArchived; use App\User; use App\Services\AccountService; use App\Services\StatusService; @@ -26,6 +27,7 @@ use Jenssegers\Agent\Agent; use Mail; use App\Mail\PasswordChange; use App\Mail\ConfirmAppEmail; +use App\Http\Resources\StatusStateless; class ApiV1Dot1Controller extends Controller { @@ -563,4 +565,72 @@ class ApiV1Dot1Controller extends Controller 'access_token' => $token->accessToken ]); } + + public function archive(Request $request, $id) + { + abort_if(!$request->user(), 403); + + $status = Status::whereNull('in_reply_to_id') + ->whereNull('reblog_of_id') + ->whereProfileId($request->user()->profile_id) + ->findOrFail($id); + + if($status->scope === 'archived') { + return [200]; + } + + $archive = new StatusArchived; + $archive->status_id = $status->id; + $archive->profile_id = $status->profile_id; + $archive->original_scope = $status->scope; + $archive->save(); + + $status->scope = 'archived'; + $status->visibility = 'draft'; + $status->save(); + StatusService::del($status->id, true); + AccountService::syncPostCount($status->profile_id); + + return [200]; + } + + + public function unarchive(Request $request, $id) + { + abort_if(!$request->user(), 403); + + $status = Status::whereNull('in_reply_to_id') + ->whereNull('reblog_of_id') + ->whereProfileId($request->user()->profile_id) + ->findOrFail($id); + + if($status->scope !== 'archived') { + return [200]; + } + + $archive = StatusArchived::whereStatusId($status->id) + ->whereProfileId($status->profile_id) + ->firstOrFail(); + + $status->scope = $archive->original_scope; + $status->visibility = $archive->original_scope; + $status->save(); + $archive->delete(); + StatusService::del($status->id, true); + AccountService::syncPostCount($status->profile_id); + + return [200]; + } + + public function archivedPosts(Request $request) + { + abort_if(!$request->user(), 403); + + $statuses = Status::whereProfileId($request->user()->profile_id) + ->whereScope('archived') + ->orderByDesc('id') + ->cursorPaginate(10); + + return StatusStateless::collection($statuses); + } } diff --git a/app/Http/Resources/StatusStateless.php b/app/Http/Resources/StatusStateless.php new file mode 100644 index 000000000..be39c1fed --- /dev/null +++ b/app/Http/Resources/StatusStateless.php @@ -0,0 +1,76 @@ +id); + $poll = $status->type === 'poll' ? PollService::get($status->id) : null; + + return [ + '_v' => 1, + 'id' => (string) $status->id, + //'gid' => $status->group_id ? (string) $status->group_id : null, + 'shortcode' => HashidService::encode($status->id), + 'uri' => $status->url(), + 'url' => $status->url(), + 'in_reply_to_id' => $status->in_reply_to_id ? (string) $status->in_reply_to_id : null, + 'in_reply_to_account_id' => $status->in_reply_to_profile_id ? (string) $status->in_reply_to_profile_id : null, + 'reblog' => null, + 'content' => $status->rendered ?? $status->caption, + 'content_text' => $status->caption, + // 'created_at' => str_replace('+00:00', 'Z', $status->created_at->format(DATE_RFC3339_EXTENDED)), + 'emojis' => CustomEmoji::scan($status->caption), + 'reblogs_count' => $status->reblogs_count ?? 0, + 'favourites_count' => $status->likes_count ?? 0, + 'reblogged' => null, + 'favourited' => null, + 'muted' => null, + 'sensitive' => (bool) $status->is_nsfw, + 'spoiler_text' => $status->cw_summary ?? '', + 'visibility' => $status->scope ?? $status->visibility, + 'application' => [ + 'name' => 'web', + 'website' => null + ], + 'language' => null, + 'mentions' => StatusMentionService::get($status->id), + 'pf_type' => $status->type ?? $status->setType(), + 'reply_count' => (int) $status->reply_count, + 'comments_disabled' => (bool) $status->comments_disabled, + 'thread' => false, + 'replies' => [], + 'parent' => [], + 'place' => $status->place, + 'local' => (bool) $status->local, + 'taggedPeople' => $taggedPeople, + 'liked_by' => LikeService::likedBy($status), + 'media_attachments' => MediaService::get($status->id), + 'account' => AccountService::get($status->profile_id, true), + 'tags' => StatusHashtagService::statusTags($status->id), + 'poll' => $poll + ]; + } +} diff --git a/routes/api.php b/routes/api.php index 72fbf53c1..1ae507a8c 100644 --- a/routes/api.php +++ b/routes/api.php @@ -131,6 +131,12 @@ Route::group(['prefix' => 'api'], function() use($middleware) { Route::post('lookup', 'DirectMessageController@composeLookup')->middleware($middleware); }); + Route::group(['prefix' => 'archive'], function () use($middleware) { + Route::post('add/{id}', 'Api\ApiV1Dot1Controller@archive')->middleware($middleware); + Route::post('remove/{id}', 'Api\ApiV1Dot1Controller@unarchive')->middleware($middleware); + Route::get('list', 'Api\ApiV1Dot1Controller@archivedPosts')->middleware($middleware); + }); + Route::group(['prefix' => 'stories'], function () use($middleware) { Route::get('recent', 'StoryController@recent')->middleware($middleware); });