the browser-facing portion of osu!
at master 116 lines 3.8 kB view raw
1<?php 2 3// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the GNU Affero General Public License v3.0. 4// See the LICENCE file in the repository root for full licence text. 5 6namespace App\Transformers; 7 8use App\Models\BeatmapDiscussion; 9 10class BeatmapDiscussionTransformer extends TransformerAbstract 11{ 12 protected array $availableIncludes = [ 13 'beatmap', 14 'beatmapset', 15 'posts', 16 'current_user_attributes', 17 'starting_post', 18 'votes', 19 ]; 20 21 protected $requiredPermission = 'BeatmapDiscussionShow'; 22 23 public function transform(BeatmapDiscussion $discussion) 24 { 25 return [ 26 'id' => $discussion->id, 27 'beatmapset_id' => $discussion->beatmapset_id, 28 'beatmap_id' => $discussion->beatmap_id, 29 'user_id' => $discussion->user_id, 30 'deleted_by_id' => $discussion->deleted_by_id, 31 'message_type' => $discussion->message_type, 32 'parent_id' => $discussion->parent_id, 33 'timestamp' => $discussion->timestamp, 34 'resolved' => $discussion->resolved, 35 'can_be_resolved' => $discussion->canBeResolved(), 36 'can_grant_kudosu' => $discussion->canGrantKudosu(), 37 'created_at' => json_time($discussion->created_at), 38 'updated_at' => json_time($discussion->updated_at), 39 'deleted_at' => json_time($discussion->deleted_at), 40 'last_post_at' => json_time($discussion->last_post_at), 41 42 'kudosu_denied' => $discussion->kudosu_denied, 43 ]; 44 } 45 46 public function includeStartingPost(BeatmapDiscussion $discussion) 47 { 48 if ($discussion->startingPost === null) { 49 return; 50 } 51 52 return $this->item( 53 $discussion->startingPost, 54 new BeatmapDiscussionPostTransformer() 55 ); 56 } 57 58 public function includePosts(BeatmapDiscussion $discussion) 59 { 60 return $this->collection( 61 $discussion->beatmapDiscussionPosts, 62 new BeatmapDiscussionPostTransformer() 63 ); 64 } 65 66 public function includeVotes(BeatmapDiscussion $discussion) 67 { 68 return $this->primitive($discussion->votesSummary()); 69 } 70 71 public function includeBeatmap(BeatmapDiscussion $discussion) 72 { 73 if ($discussion->beatmap_id === null) { 74 return; 75 } 76 77 return $this->item( 78 $discussion->beatmap, 79 new BeatmapCompactTransformer() 80 ); 81 } 82 83 public function includeBeatmapset(BeatmapDiscussion $discussion) 84 { 85 return $this->item( 86 $discussion->beatmapset, 87 new BeatmapsetCompactTransformer() 88 ); 89 } 90 91 public function includeCurrentUserAttributes(BeatmapDiscussion $discussion) 92 { 93 $currentUser = auth()->user(); 94 95 if ($currentUser === null) { 96 return; 97 } 98 99 // This assumes beatmapDiscussionVotes are already preloaded and 100 // thus will save one query. 101 foreach ($discussion->beatmapDiscussionVotes as $vote) { 102 if ($vote->user_id === $currentUser->user_id) { 103 $score = $vote->score; 104 break; 105 } 106 } 107 108 return $this->primitive([ 109 'vote_score' => $score ?? 0, 110 'can_moderate_kudosu' => priv_check_user($currentUser, 'BeatmapDiscussionAllowOrDenyKudosu', $discussion)->can(), 111 'can_resolve' => priv_check_user($currentUser, 'BeatmapDiscussionResolve', $discussion)->can(), 112 'can_reopen' => priv_check_user($currentUser, 'BeatmapDiscussionReopen', $discussion)->can(), 113 'can_destroy' => priv_check_user($currentUser, 'BeatmapDiscussionDestroy', $discussion)->can(), 114 ]); 115 } 116}