Completed
Push — master ( 067f09...35db61 )
by Temitope
9s
created

src/Controller/EmojiController.php (1 issue)

Upgrade to new PHP Analysis Engine

These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more

1
<?php
2
/**
3
 * @author   Temitope Olotin <[email protected]>
4
 * @license  <https://opensource.org/license/MIT> MIT
5
 */
6
namespace Laztopaz\EmojiRestfulAPI;
7
8
use Firebase\JWT\JWT;
9
use Psr\Http\Message\ResponseInterface as Response;
10
use Psr\Http\Message\ServerRequestInterface as Request;
11
12
class EmojiController
13
{
14
    private $auth;
15
16
    public function __construct(Oauth $auth)
17
    {
18
        $this->auth = $auth;
19
    }
20
21
    /**
22
     * This method list all emojis.
23
     *
24
     * @param $response
25
     *
26
     * @return json $emojis
27
     */
28
    public function listAllEmoji(Response $response)
29
    {
30
        $emojis = Emoji::with('keywords', 'category', 'created_by')->get();
31
        $emojis = $emojis->toArray();
32
33
        if (count($emojis) > 0) {
34
            return $response
35
            ->withJson($this->formatEmoji($emojis), 200);
36
        }
37
38
        return $response->withJson(['status'], 404);
39
    }
40
41
    /**
42
     * This method get a single emoji.
43
     *
44
     * @param $response
45
     * @param $args
46
     *
47
     * @return json $emoji
48
     */
49
    public function getSingleEmoji(Response $response, $args)
50
    {
51
        $id = $args['id'];
52
53
        $emoji = Emoji::where('id', '=', $id)->with('keywords', 'category', 'created_by')->get();
54
        $emoji = $emoji->toArray();
55
56
        if (count($emoji) > 0) {
57
            return $response
58
            ->withJson($this->formatEmoji($emoji), 200);
59
        }
60
61
        return $response->withStatus(404);
62
    }
63
64
    /**
65
     * This method creates a new emoji.
66
     *
67
     * @param $args
68
     *
69
     * @return json $response;
70
     */
71
    public function createEmoji(Request $request, Response $response)
72
    {
73
        $requestParams = $request->getParsedBody();
74
75
        $emojiKeyword = $requestParams['keywords'];
76
77
        $userId = $this->getCurrentUserId($request, $response);
78
79
        if (is_array($requestParams)) {
80
            $created_at = date('Y-m-d h:i:s');
81
82
            $emoji = Emoji::create(
83
                [
84
                    'name'       => $requestParams['name'],
85
                    'char'       => $requestParams['char'],
86
                    'created_at' => $created_at,
87
                    'category'   => $requestParams['category'],
88
                    'created_by' => $userId,
89
                ]
90
            );
91
92
            if ($emoji->id) {
93
                $createdKeyword = $this->createEmojiKeywords($emoji->id, $emojiKeyword);
94
95
                return $response->withJson($emoji->toArray(), 201);
96
            }
97
98
            return $response->withStatus(204);
99
        }
100
    }
101
102
    /**
103
     * This method updates an emoji.
104
     *
105
     * @param $request
106
     * @param $response
107
     *
108
     * @return json
109
     */
110
    public function updateEmojiByPutVerb(Request $request, Response $response, $args)
111
    {
112
        $upateParams = $request->getParsedBody();
113
114
        if (is_array($upateParams)) {
115
            $id = $args['id'];
116
117
            $emoji = Emoji::find($id);
118
119
            if ($emoji->id) {
120
                $emoji->name = $upateParams['name'];
121
                $emoji->char = $upateParams['char'];
122
                $emoji->category = $upateParams['category'];
123
                $emoji->updated_at = date('Y-m-d h:i:s');
124
                $emoji->save();
125
126
                return $response->withJson(['status'], 201);
127
            }
128
129
            return $response->withJson(['status'], 404);
130
        }
131
    }
132
133
    /**
134
     * This method updates an emoji partially.
135
     *
136
     * @param $request
137
     * @param $response
138
     *
139
     * @return json
140
     */
141
    public function updateEmojiByPatchVerb(Request $request, Response $response, $args)
142
    {
143
        $upateParams = $request->getParsedBody();
144
145
        if (is_array($upateParams)) {
146
            $id = $args['id'];
147
148
            $emoji = Emoji::find($id);
149
            if ($emoji->id) {
150
                $emoji->name = $upateParams['name'];
151
                $emoji->updated_at = date('Y-m-d h:i:s');
152
                $emoji->save();
153
154
                return $response->withJson($emoji->toArray(), 201);
155
            }
156
157
            return $response->withStatus(404);
158
        }
159
    }
160
161
    /**
162
     * This method deletes an emoji.
163
     *
164
     * @param $request
165
     * @param $response
166
     * @param $args
167
     *
168
     * @return json
169
     */
170
    public function deleteEmoji(Request $request, Response $response, $args)
171
    {
172
        $id = $args['id'];
173
174
        $emoji = Emoji::find($id);
175
        if ($emoji->id) {
176
            $emoji->delete();
177
            // Delete keywords assciated with the emoji
178
            Keyword::where('emoji_id', '=', $id)->delete();
179
180
            return $response->withJson(['status'], 204);
181
        }
182
183
        return $response->withStatus(404);
184
    }
185
186
    /**
187
     * This method creates emoji keywords.
188
     *
189
     * @param $request
190
     * @param $response
191
     * @param $args
192
     *
193
     * @return $id
0 ignored issues
show
The doc-type $id could not be parsed: Unknown type name "$id" at position 0. (view supported doc-types)

This check marks PHPDoc comments that could not be parsed by our parser. To see which comment annotations we can parse, please refer to our documentation on supported doc-types.

Loading history...
194
     */
195 View Code Duplication
    public function createEmojiKeywords($emoji_id, $keywords)
196
    {
197
        if ($keywords) {
198
            $splittedKeywords = explode(',', $keywords);
199
200
            $created_at = date('Y-m-d h:i:s');
201
202
            foreach ($splittedKeywords as $keyword) {
203
                $emojiKeyword = Keyword::create([
204
                        'emoji_id'     => $emoji_id,
205
                        'keyword_name' => $keyword,
206
                        'created_at'   => $created_at,
207
                ]);
208
            }
209
        }
210
211
        return $emojiKeyword->id;
212
    }
213
214
    /**
215
     * This method format emoji result.
216
     *
217
     * @param $emojis
218
     *
219
     * @return array $emojis
220
     */
221
    public function formatEmoji(array $emojis)
222
    {
223
        foreach ($emojis as $key => &$value) {
224
            $value['created_by'] = $value['created_by']['firstname'].' '.$value['created_by']['lastname'];
225
            $value['category'] = $value['category']['category_name'];
226
            $value['keywords'] = array_map(function ($key) { return $key['keyword_name']; }, $value['keywords']);
227
        }
228
229
        return $emojis;
230
    }
231
232
    /**
233
     * This method authenticate and return user id.
234
     */
235
    public function getCurrentUserId($request, $response)
236
    {
237
        $loadEnv = DatabaseConnection::loadEnv();
238
239
        $jwtoken = $request->getHeader('HTTP_AUTHORIZATION');
240
241
        try {
242
            if (isset($jwtoken)) {
243
                $secretKey = base64_decode(getenv('secret'));
244
245
                $jwt = json_decode($jwtoken[0], true);
246
247
                //decode the JWT using the key from config
248
                $decodedToken = JWT::decode($jwt['jwt'], $secretKey, ['HS512']);
249
250
                $tokenInfo = (array) $decodedToken;
251
252
                $userInfo = (array) $tokenInfo['dat'];
253
254
                return $userInfo['id'];
255
            }
256
        } catch (\Exception $e) {
257
            return $response->withJson(['status' => $e->getMessage()], 401);
258
        }
259
    }
260
}
261