PHP-Course/exam/api/Posts/Posts.php
2024-07-27 16:42:03 +02:00

93 lines
2.4 KiB
PHP

<?php
namespace Api\Posts;
use Exception;
use Khofmann\Api\Api;
use Khofmann\ApiError\ApiError;
use Khofmann\Input\Input;
use Khofmann\Models\Post\Post;
use Khofmann\Models\User\User;
use Khofmann\Request\Request;
use Khofmann\Response\Response;
class Posts extends Api
{
public function get()
{
// Fetch and constrain all parameters.
$page = max(0, intval(Input::get("p", 0)));
$limit = constrain(0, 30, intval(Input::get("l", 10)));
$authed = Request::token() !== null;
// Return list of posts.
Response::json(Post::list($page, $limit, $authed));
}
public function post(): void
{
// Fetch all required inputs.
// Throw 400 error if a required one is missing.
$content = Input::post("content");
// This one is optional
$limit = constrain(0, 30, intval(Input::post("l", 10)));
if (empty($content)) throw ApiError::missingField(["content"]);
// Get logged in user
$self = User::getByToken(Request::token());
// Try to create a new post for logged in user.
try {
Response::json(Post::create($self, $content, $limit));
} catch (Exception $err) {
switch ($err->getMessage()) {
default:
throw $err;
}
}
}
public function patch($id): void
{
// Fetch all inputs.
$content = Input::patch("content");
// Fetch authed user.
$self = User::getByToken(Request::token());
try {
// Try fetch the post in question, 404 if not found.
$post = Post::getByID($id);
// Throw 400 if we aren't admin but trying to edit another users post.
if (!$self->getIsAdmin() && $post->getUser()->getID() !== $self->getID()) throw ApiError::unauthorized("Not allowed");
// Try update.
Response::json($post->update($content));
} catch (Exception $err) {
switch ($err->getMessage()) {
case "NotFound":
throw ApiError::notFound("post");
default:
// Due to how the failed field is handled, it's ApiError is inside the models update
throw $err;
}
}
}
public function delete($id): void
{
// Try delete, 404 if post was not found.
try {
Response::json(Post::getByID($id)->delete());
} catch (Exception $err) {
switch ($err->getMessage()) {
case "NotFound":
throw ApiError::notFound("post");
default:
throw $err;
}
}
}
}