Skip to content

Commit c945263

Browse files
committed
Update Tag People, allow untagging yourself
1 parent f4dfb4d commit c945263

File tree

5 files changed

+97
-16
lines changed

5 files changed

+97
-16
lines changed

app/Http/Controllers/InternalApiController.php

+8-8
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,14 @@ public function composePost(Request $request)
332332
$media->save();
333333
}
334334

335+
$visibility = $profile->unlisted == true && $visibility == 'public' ? 'unlisted' : $visibility;
336+
$cw = $profile->cw == true ? true : $cw;
337+
$status->is_nsfw = $cw;
338+
$status->visibility = $visibility;
339+
$status->scope = $visibility;
340+
$status->type = $mediaType;
341+
$status->save();
342+
335343
foreach($tagged as $tg) {
336344
$mt = new MediaTag;
337345
$mt->status_id = $status->id;
@@ -347,14 +355,6 @@ public function composePost(Request $request)
347355
MediaTagService::sendNotification($mt);
348356
}
349357

350-
$visibility = $profile->unlisted == true && $visibility == 'public' ? 'unlisted' : $visibility;
351-
$cw = $profile->cw == true ? true : $cw;
352-
$status->is_nsfw = $cw;
353-
$status->visibility = $visibility;
354-
$status->scope = $visibility;
355-
$status->type = $mediaType;
356-
$status->save();
357-
358358
NewStatusPipeline::dispatch($status);
359359
Cache::forget('user:account:id:'.$profile->user_id);
360360
Cache::forget('profile:status_count:'.$profile->id);

app/Http/Controllers/MediaTagController.php

+41
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,21 @@
33
namespace App\Http\Controllers;
44

55
use Illuminate\Http\Request;
6+
use App\Services\MediaTagService;
67
use App\MediaTag;
8+
use App\Notification;
79
use App\Profile;
810
use App\UserFilter;
911
use App\User;
1012
use Illuminate\Support\Str;
1113

1214
class MediaTagController extends Controller
1315
{
16+
public function __construct()
17+
{
18+
$this->middleware('auth');
19+
}
20+
1421
public function usernameLookup(Request $request)
1522
{
1623
abort_if(!$request->user(), 403);
@@ -52,4 +59,38 @@ public function usernameLookup(Request $request)
5259

5360
return $results;
5461
}
62+
63+
public function untagProfile(Request $request)
64+
{
65+
abort_if(!$request->user(), 403);
66+
67+
$this->validate($request, [
68+
'status_id' => 'required',
69+
'profile_id' => 'required'
70+
]);
71+
72+
$user = $request->user();
73+
$status_id = $request->input('status_id');
74+
$profile_id = (int) $request->input('profile_id');
75+
76+
abort_if((int) $user->profile_id !== $profile_id, 400);
77+
78+
$tag = MediaTag::whereStatusId($status_id)
79+
->whereProfileId($profile_id)
80+
->first();
81+
82+
if(!$tag) {
83+
return [];
84+
}
85+
Notification::whereItemType('App\MediaTag')
86+
->whereItemId($tag->id)
87+
->whereProfileId($profile_id)
88+
->whereAction('tagged')
89+
->delete();
90+
91+
MediaTagService::untag($status_id, $profile_id);
92+
93+
return [200];
94+
95+
}
5596
}

app/Services/MediaTagService.php

+24-1
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,24 @@ class MediaTagService
1515
const CACHE_KEY = 'pf:services:media_tags:id:';
1616

1717
public static function get($mediaId, $usernames = true)
18+
{
19+
return self::coldGet($mediaId, $usernames);
20+
}
21+
22+
public static function coldGet($mediaId, $usernames = true)
1823
{
1924
$k = 'pf:services:media_tags:get:sid:' . $mediaId;
2025
return Cache::remember($k, now()->addMinutes(60), function() use($mediaId, $usernames) {
2126
$key = self::CACHE_KEY . $mediaId;
2227
if(Redis::zCount($key, '-inf', '+inf') == 0) {
23-
return [];
28+
$tags = MediaTag::whereStatusId($mediaId)->get();
29+
if($tags->count() == 0) {
30+
return [];
31+
}
32+
33+
foreach ($tags as $t) {
34+
self::set($mediaId, $t->profile_id);
35+
}
2436
}
2537
$res = Redis::zRange($key, 0, -1);
2638
if(!$usernames) {
@@ -52,6 +64,7 @@ protected function idToUsername($id)
5264
}
5365

5466
return [
67+
'id' => (string) $id,
5568
'username' => $profile->username,
5669
'avatar' => $profile->avatarUrl()
5770
];
@@ -75,4 +88,14 @@ public static function sendNotification(MediaTag $tag)
7588
return;
7689
}
7790

91+
public static function untag($statusId, $profileId)
92+
{
93+
MediaTag::whereStatusId($statusId)
94+
->whereProfileId($profileId)
95+
->delete();
96+
$key = 'pf:services:media_tags:get:sid:' . $statusId;
97+
Redis::zRem(self::CACHE_KEY.$statusId, $profileId);
98+
Cache::forget($key);
99+
return true;
100+
}
78101
}

resources/assets/js/components/PostComponent.vue

+23-6
Original file line numberDiff line numberDiff line change
@@ -595,16 +595,17 @@
595595
title="Tagged People"
596596
body-class="list-group-flush py-3 px-0">
597597
<div class="list-group">
598-
<div class="list-group-item border-0 py-1" v-for="(user, index) in status.taggedPeople" :key="'modal_taggedpeople_'+index">
598+
<div class="list-group-item border-0 py-1" v-for="(taguser, index) in status.taggedPeople" :key="'modal_taggedpeople_'+index">
599599
<div class="media">
600-
<a :href="'/'+user.username">
601-
<img class="mr-3 rounded-circle box-shadow" :src="user.avatar" :alt="user.username + '’s avatar'" width="30px">
600+
<a :href="'/'+taguser.username">
601+
<img class="mr-3 rounded-circle box-shadow" :src="taguser.avatar" :alt="taguser.username + '’s avatar'" width="30px">
602602
</a>
603603
<div class="media-body">
604-
<p class="pt-1" style="font-size: 14px">
605-
<a :href="'/'+user.username" class="font-weight-bold text-dark">
606-
{{user.username}}
604+
<p class="pt-1 d-flex justify-content-between" style="font-size: 14px">
605+
<a :href="'/'+taguser.username" class="font-weight-bold text-dark">
606+
{{taguser.username}}
607607
</a>
608+
<button v-if="taguser.id == user.id" class="btn btn-outline-primary btn-sm py-1 px-3" @click="untagMe()">Untag Me</button>
608609
</p>
609610
</div>
610611
</div>
@@ -1392,6 +1393,22 @@ export default {
13921393
13931394
showTaggedPeopleModal() {
13941395
this.$refs.taggedModal.show();
1396+
},
1397+
1398+
untagMe() {
1399+
this.$refs.taggedModal.hide();
1400+
let id = this.user.id;
1401+
axios.post('/api/local/compose/tag/untagme', {
1402+
status_id: this.statusId,
1403+
profile_id: id
1404+
}).then(res => {
1405+
this.status.taggedPeople = this.status.taggedPeople.filter(t => {
1406+
return t.id != id;
1407+
});
1408+
swal('Untagged', 'You have been untagged from this post.', 'success');
1409+
}).catch(err => {
1410+
swal('An Error Occurred', 'Please try again later.', 'error');
1411+
});
13951412
}
13961413
13971414
},

routes/web.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@
187187
Route::post('compose/media/update/{id}', 'MediaController@composeUpdate')->middleware('throttle:maxComposeMediaUpdatesPerHour,60')->middleware('throttle:maxComposeMediaUpdatesPerDay,1440')->middleware('throttle:maxComposeMediaUpdatesPerMonth,43800');
188188
Route::get('compose/location/search', 'ApiController@composeLocationSearch');
189189
Route::get('compose/tag/search', 'MediaTagController@usernameLookup');
190-
190+
Route::post('compose/tag/untagme', 'MediaTagController@untagProfile');
191191
});
192192
Route::group(['prefix' => 'admin'], function () {
193193
Route::post('moderate', 'Api\AdminApiController@moderate');

0 commit comments

Comments
 (0)