Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[API] Improve status reporting content/headers #425

Merged
merged 10 commits into from
Jul 24, 2024
4 changes: 2 additions & 2 deletions module/Application/src/Controller/IndexController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

namespace Application\Controller;

use Laminas\Http\Response;
use Laminas\Http\Response as HttpResponse;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Mvc\Plugin\Identity\Identity;
use Laminas\Session\Container as SessionContainer;
Expand All @@ -16,7 +16,7 @@
*/
class IndexController extends AbstractActionController
{
public function langAction(): Response
public function langAction(): HttpResponse
{
$session = new SessionContainer('lang');
$session->lang = $this->params()->fromRoute('lang');
Expand Down
10 changes: 10 additions & 0 deletions module/Database/config/module.config.php
Original file line number Diff line number Diff line change
Expand Up @@ -660,6 +660,16 @@
],
],
],
'example500' => [
'type' => Literal::class,
'options' => [
'route' => '/example500',
'defaults' => [
'controller' => ApiController::class,
'action' => 'example500',
],
],
],
'members' => [
'type' => Literal::class,
'options' => [
Expand Down
50 changes: 40 additions & 10 deletions module/Database/src/Controller/ApiController.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@

namespace Database\Controller;

use Database\Model\Enums\ApiResponseStatuses;
use Database\Service\Api as ApiService;
use Laminas\Http\Response;
use Laminas\Http\Response as HttpResponse;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\JsonModel;
use RuntimeException;
use User\Model\Enums\ApiPermissions;
use User\Service\ApiAuthenticationService;

Expand All @@ -30,7 +32,19 @@ public function healthyAction(): JsonModel

$syncPaused = $this->apiService->isSyncPaused();

return new JsonModel(['healthy' => true, 'sync_paused' => $syncPaused]);
return new JsonModel([
'status' => ApiResponseStatuses::Success,
'healthy' => true,
'sync_paused' => $syncPaused,
]);
}

/**
* Error 500 action.
*/
public function example500Action(): JsonModel
{
throw new RuntimeException('An example exception was thrown.');
}

/**
Expand All @@ -48,15 +62,18 @@ public function membersAction(): JsonModel
$allowDeleted = $this->apiAuthService->currentUserCan(ApiPermissions::MembersDeleted);

$members = $this->apiService->getMembers($additionalProperties, $allowDeleted);
$res = ['data' => $members];
$res = [
'status' => ApiResponseStatuses::Success,
'data' => $members,
];

return new JsonModel($res);
}

/**
* Return member
*/
public function memberAction(): JsonModel|Response
public function memberAction(): JsonModel
{
$this->apiAuthService->assertCan(ApiPermissions::MembersR);

Expand All @@ -70,7 +87,10 @@ public function memberAction(): JsonModel|Response
return $this->noContent();
}

$res = ['data' => $member];
$res = [
'status' => ApiResponseStatuses::Success,
'data' => $member,
];

return new JsonModel($res);
}
Expand All @@ -90,20 +110,30 @@ public function membersActiveAction(): JsonModel
$includeInactiveFraternity,
$allowDeleted,
);
$res = ['data' => $members];
$res = [
'status' => ApiResponseStatuses::Success,
'data' => $members,
];

return new JsonModel($res);
}

/**
* To follow best practices, we generate a 204 for empty datasets
*/
private function noContent(): Response
private function noContent(): JsonModel
{
$response = new Response();
$response->setStatusCode(Response::STATUS_CODE_204);
$response = $this->getResponse();
if ($response instanceof HttpResponse) {
$response->setStatusCode(HttpResponse::STATUS_CODE_204);
}

return $response;
$res = [
'status' => ApiResponseStatuses::Success,
'data' => null,
];

return new JsonModel($res);
}

/**
Expand Down
6 changes: 3 additions & 3 deletions module/Database/src/Controller/MeetingController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
use Database\Service\Api as ApiService;
use Database\Service\Meeting as MeetingService;
use Doctrine\DBAL\Exception\ForeignKeyConstraintViolationException;
use Laminas\Http\Response;
use Laminas\Http\Response as HttpResponse;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\JsonModel;
use Laminas\View\Model\ViewModel;
Expand Down Expand Up @@ -42,7 +42,7 @@ public function indexAction(): ViewModel
/**
* Create a new meeting.
*/
public function createAction(): Response|ViewModel
public function createAction(): HttpResponse|ViewModel
{
$request = $this->getRequest();

Expand Down Expand Up @@ -159,7 +159,7 @@ protected function getDecisionForms(
/**
* Decision form action.
*/
public function decisionformAction(): Response|ViewModel
public function decisionformAction(): HttpResponse|ViewModel
{
if (!$this->getRequest()->isPost()) {
return $this->redirect()->toRoute('meeting');
Expand Down
53 changes: 32 additions & 21 deletions module/Database/src/Controller/MemberController.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,10 +11,11 @@
use Database\Service\Stripe as StripeService;
use DateTime;
use Laminas\Http\Header\HeaderInterface;
use Laminas\Http\Response;
use Laminas\Http\Response as HttpResponse;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Mvc\I18n\Translator;
use Laminas\Mvc\Plugin\FlashMessenger\FlashMessenger;
use Laminas\Stdlib\ResponseInterface;
use Laminas\View\Model\JsonModel;
use Laminas\View\Model\ViewModel;

Expand Down Expand Up @@ -48,7 +49,7 @@ public function indexAction(): ViewModel
/**
* Subscribe action.
*/
public function subscribeAction(): Response|ViewModel
public function subscribeAction(): HttpResponse|ViewModel
{
$ipMCS = ip2long($this->remoteAddress) >= ip2long('131.155.68.0')
&& ip2long($this->remoteAddress) <= ip2long('131.155.71.255');
Expand Down Expand Up @@ -118,7 +119,7 @@ public function checkoutStatusAction(): ViewModel
return new ViewModel($results);
}

public function checkoutRestartAction(): Response|ViewModel
public function checkoutRestartAction(): HttpResponse|ViewModel
{
$token = (string) $this->params()->fromRoute('token');
$paymentLink = $this->stripeService->getPaymentLink($token);
Expand All @@ -138,10 +139,10 @@ public function checkoutRestartAction(): Response|ViewModel

return $this->redirect()
->toUrl($restartedCheckoutLink)
->setStatusCode(Response::STATUS_CODE_303);
->setStatusCode(HttpResponse::STATUS_CODE_303);
}

public function paymentWebhookAction(): Response
public function paymentWebhookAction(): ResponseInterface
{
$signature = $this->getRequest()->getHeader('Stripe-Signature');

Expand All @@ -153,13 +154,23 @@ public function paymentWebhookAction(): Response
// (good) support for using Fibers to do this concurrently.
$this->stripeService->handleEvent($event);

return $this->getResponse()
->setStatusCode(Response::STATUS_CODE_200);
// We know this is always going to be an HttpResponse
$response = $this->getResponse();
if ($response instanceof HttpResponse) {
$response->setStatusCode(HttpResponse::STATUS_CODE_200);
}

return $response;
}
}

return $this->getResponse()
->setStatusCode(Response::STATUS_CODE_400);
// We know this is always going to be an HttpResponse
$response = $this->getResponse();
if ($response instanceof HttpResponse) {
$response->setStatusCode(HttpResponse::STATUS_CODE_400);
}

return $response;
}

/**
Expand Down Expand Up @@ -243,7 +254,7 @@ public function searchFilteredAction(): JsonModel
*
* Shows member information.
*/
public function showAction(): Response|ViewModel
public function showAction(): HttpResponse|ViewModel
{
$lidnr = (int) $this->params()->fromRoute('id');
$member = $this->memberService->getMemberWithDecisions($lidnr);
Expand Down Expand Up @@ -295,7 +306,7 @@ public function showAction(): Response|ViewModel
*
* Toggles if a member wants a supremum
*/
public function setSupremumAction(): Response|ViewModel
public function setSupremumAction(): HttpResponse|ViewModel
{
$member = $this->memberService->getMember((int) $this->params()->fromRoute('id'));

Expand All @@ -322,7 +333,7 @@ public function setSupremumAction(): Response|ViewModel
*
* Edit member information.
*/
public function editAction(): Response|ViewModel
public function editAction(): HttpResponse|ViewModel
{
$member = $this->memberService->getMember((int) $this->params()->fromRoute('id'));

Expand Down Expand Up @@ -367,7 +378,7 @@ public function editAction(): Response|ViewModel
*
* Delete a member.
*/
public function deleteAction(): Response|ViewModel
public function deleteAction(): HttpResponse|ViewModel
{
$member = $this->memberService->getMember((int) $this->params()->fromRoute('id'));

Expand Down Expand Up @@ -404,7 +415,7 @@ public function deleteAction(): Response|ViewModel
*
* Update list membership.
*/
public function listsAction(): Response|ViewModel
public function listsAction(): HttpResponse|ViewModel
{
$member = $this->memberService->getMember((int) $this->params()->fromRoute('id'));

Expand Down Expand Up @@ -449,7 +460,7 @@ public function listsAction(): Response|ViewModel
*
* Update / renew membership.
*/
public function membershipAction(): Response|ViewModel
public function membershipAction(): HttpResponse|ViewModel
{
$member = $this->memberService->getMember((int) $this->params()->fromRoute('id'));

Expand Down Expand Up @@ -505,7 +516,7 @@ public function membershipAction(): Response|ViewModel
*
* Extend the duration of the membership.
*/
public function expirationAction(): Response|ViewModel
public function expirationAction(): HttpResponse|ViewModel
{
$member = $this->memberService->getMember((int) $this->params()->fromRoute('id'));

Expand Down Expand Up @@ -553,7 +564,7 @@ public function expirationAction(): Response|ViewModel
*
* Edit a member's address.
*/
public function editAddressAction(): Response|ViewModel
public function editAddressAction(): HttpResponse|ViewModel
{
$type = AddressTypes::tryFrom($this->params()->fromRoute('type'));

Expand Down Expand Up @@ -610,7 +621,7 @@ public function editAddressAction(): Response|ViewModel
*
* Add a member's address.
*/
public function addAddressAction(): Response|ViewModel
public function addAddressAction(): HttpResponse|ViewModel
{
$type = AddressTypes::tryFrom($this->params()->fromRoute('type'));

Expand Down Expand Up @@ -672,7 +683,7 @@ public function addAddressAction(): Response|ViewModel
*
* Remove a member's address.
*/
public function removeAddressAction(): Response|ViewModel
public function removeAddressAction(): HttpResponse|ViewModel
{
$type = AddressTypes::tryFrom($this->params()->fromRoute('type'));

Expand Down Expand Up @@ -789,7 +800,7 @@ public function showUpdateAction(): ViewModel
/**
* Approve a pending member update.
*/
public function approveUpdateAction(): Response|ViewModel
public function approveUpdateAction(): HttpResponse|ViewModel
{
$memberUpdate = $this->memberService->getPendingMemberUpdate((int) $this->params()->fromRoute('id'));

Expand Down Expand Up @@ -835,7 +846,7 @@ public function approveUpdateAction(): Response|ViewModel
/**
* Reject a member update.
*/
public function rejectUpdateAction(): Response|ViewModel
public function rejectUpdateAction(): HttpResponse|ViewModel
{
$memberUpdate = $this->memberService->getPendingMemberUpdate((int) $this->params()->fromRoute('id'));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
use Database\Model\ProspectiveMember as ProspectiveMemberModel;
use Database\Service\Member as MemberService;
use Database\Service\Stripe as StripeService;
use Laminas\Http\Response;
use Laminas\Http\Response as HttpResponse;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\Mvc\I18n\Translator;
use Laminas\View\Model\JsonModel;
Expand Down Expand Up @@ -72,7 +72,7 @@ public function showAction(): ViewModel
*
* Shows prospective member information.
*/
public function finalizeAction(): Response
public function finalizeAction(): HttpResponse
{
$lidnr = (int) $this->params()->fromRoute('id');

Expand Down Expand Up @@ -111,7 +111,7 @@ public function finalizeAction(): Response
*
* Delete a prospective member.
*/
public function deleteAction(): Response|ViewModel
public function deleteAction(): HttpResponse|ViewModel
{
$lidnr = (int) $this->params()->fromRoute('id');
$prospectiveMember = $this->memberService->getProspectiveMember($lidnr);
Expand Down
6 changes: 3 additions & 3 deletions module/Database/src/Controller/QueryController.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
namespace Database\Controller;

use Database\Service\Query as QueryService;
use Laminas\Http\Response;
use Laminas\Http\Response as HttpResponse;
use Laminas\Mvc\Controller\AbstractActionController;
use Laminas\View\Model\ViewModel;

Expand All @@ -18,7 +18,7 @@
/**
* Index action.
*/
public function indexAction(): Response|ViewModel
public function indexAction(): HttpResponse|ViewModel

Check failure on line 21 in module/Database/src/Controller/QueryController.php

View workflow job for this annotation

GitHub Actions / Psalm

InvalidReturnType

module/Database/src/Controller/QueryController.php:21:36: InvalidReturnType: The declared return type 'Laminas\View\Model\ViewModel' for Database\Controller\QueryController::indexAction is incorrect, got 'Laminas\Http\Response|Laminas\View\Model\ViewModel' (see https://psalm.dev/011)
{
if ($this->getRequest()->isPost()) {
$post = $this->getRequest()->getPost()->toArray();
Expand All @@ -40,7 +40,7 @@
}

if (isset($query)) {
return $this->redirect()->toRoute('query/show', [

Check failure on line 43 in module/Database/src/Controller/QueryController.php

View workflow job for this annotation

GitHub Actions / Psalm

InvalidReturnStatement

module/Database/src/Controller/QueryController.php:43:24: InvalidReturnStatement: The inferred type 'Laminas\Http\Response' does not match the declared return type 'Laminas\View\Model\ViewModel' for Database\Controller\QueryController::indexAction (see https://psalm.dev/128)
'query' => $query->getId(),
]);
}
Expand Down Expand Up @@ -74,7 +74,7 @@
/**
* Export action.
*/
public function exportAction(): Response|ViewModel
public function exportAction(): HttpResponse|ViewModel
{
if ($this->getRequest()->isPost()) {
$result = $this->queryService->execute(
Expand Down
Loading
Loading