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}