validate($request); $user = $this->getUser($request); $posting = Posting::find(self::arrayGet($json, 'data.relationships.posting.data.id')); if (!$posting) { throw new BadRequestException(); } $range = get_object_by_range_id($posting->range_id); if (!$range) { throw new RecordNotFoundException(); } if (!Authority::canShowForum($user, $range)) { throw new AuthorizationFailedException(); } $data = [ 'posting_id' => $posting->posting_id, 'user_id' => $user->user_id, 'emoji' => self::arrayGet($json, 'data.attributes.emoji'), ]; $reaction = PostingReaction::findOneBySQL( "posting_id = :posting_id AND user_id = :user_id AND emoji = :emoji", $data ); if (!$reaction) { $reaction = PostingReaction::create($data); if ($user->user_id !== $posting->user_id) { \PersonalNotifications::add( $posting->user_id, \URLHelper::getURL( "dispatch.php/course/forum/discussions/show/{$posting->discussion_id}#post_{$posting->posting_id}", ['cid' => $posting->range_id], true ), studip_interpolate( _('%{name} hat auf deinen Beitrag reagiert.'), ['name' => $user->getFullName()] ), null, self::arrayGet($json, 'data.meta.emoji-icon') ); } } return $this->getCreatedResponse($reaction); } protected function validateResourceDocument($json, $data) { $required_keys = [ 'data.attributes.emoji' => 'Missing `data.attributes.emoji`', 'data.meta.emoji-icon' => 'Missing `data.meta.emoji-icon`', 'data.relationships.posting.data.id' => 'Missing `data.relationships.posting.data.id`', ]; foreach ($required_keys as $key => $error_message) { if (!self::arrayHas($json, $key)) { return $error_message; } } return null; } }