diff options
author | Daniel Weipert <git@mail.dweipert.de> | 2025-08-14 14:37:56 +0200 |
---|---|---|
committer | Daniel Weipert <git@mail.dweipert.de> | 2025-08-14 14:37:56 +0200 |
commit | c135fcf9041c604b32827a1cb027010bca5915ab (patch) | |
tree | 95a2331d5f0bc4a736aa0e716330c39b3fa1ea26 /src/Errors | |
parent | 3f4b51b99a4f4dc41dbdce7f34afe7e15d3d426e (diff) |
POST login possible
Diffstat (limited to 'src/Errors')
-rw-r--r-- | src/Errors/ErrorCode.php | 47 | ||||
-rw-r--r-- | src/Errors/ErrorResponse.php | 30 | ||||
-rw-r--r-- | src/Errors/Exception.php | 21 | ||||
-rw-r--r-- | src/Errors/RateLimitError.php | 20 | ||||
-rw-r--r-- | src/Errors/UnknownError.php | 16 |
5 files changed, 134 insertions, 0 deletions
diff --git a/src/Errors/ErrorCode.php b/src/Errors/ErrorCode.php new file mode 100644 index 0000000..b59f0a1 --- /dev/null +++ b/src/Errors/ErrorCode.php @@ -0,0 +1,47 @@ +<?php + +namespace App\Errors; + +enum ErrorCode: string +{ + case FORBIDDEN = "M_FORBIDDEN"; + case UNKNOWN_TOKEN = "M_UNKNOWN_TOKEN"; + case MISSING_TOKEN = "M_MISSING_TOKEN"; + case USER_LOCKED = "M_USER_LOCKED"; + case USER_SUSPENDED = "M_USER_SUSPENDED"; + case BAD_JSON = "M_BAD_JSON"; + case NOT_JSON = "M_NOT_JSON"; + case NOT_FOUND = "M_NOT_FOUND"; + case LIMIT_EXCEEDED = "M_LIMIT_EXCEEDED"; + case UNRECOGNIZED = "M_UNRECOGNIZED"; + case UNKNOWN = "M_UNKNOWN"; + + case UNAUTHORIZED = "M_UNAUTHORIZED"; + case USER_DEACTIVATED = "M_USER_DEACTIVATED"; + case USER_IN_USE = "M_USER_IN_USE"; + case INVALID_USERNAME = "M_INVALID_USERNAME"; + case ROOM_IN_USE = "M_ROOM_IN_USE"; + case INVALID_ROOM_STATE = "M_INVALID_ROOM_STATE"; + + case THREEPID_IN_USE = "M_THREEPID_IN_USE"; + case THREEPID_NOT_FOUND = "M_THREEPID_NOT_FOUND"; + case THREEPID_AUTH_FAILED = "M_THREEPID_AUTH_FAILED"; + case THREEPID_DENIED = "M_THREEPID_DENIED"; + case THREEPID_MEDIUM_NOT_SUPPORTED = "M_THREEPID_MEDIUM_NOT_SUPPORTED"; + + case SERVER_NOT_TRUSTED = "M_SERVER_NOT_TRUSTED"; + case UNSUPPORTED_ROOM_VERSION = "M_UNSUPPORTED_ROOM_VERSION"; + case INCOMPATIBLE_ROOM_VERSION = "M_INCOMPATIBLE_ROOM_VERSION"; + case BAD_STATE = "M_BAD_STATE"; + case GUEST_ACCESS_FORBIDDEN = "M_GUEST_ACCESS_FORBIDDEN"; + + case CAPTCHA_NEEDED = "M_CAPTCHA_NEEDED"; + case CAPTCHA_INVALID = "M_CAPTCHA_INVALID"; + + case MISSING_PARAM = "M_MISSING_PARAM"; + case INVALID_PARAM = "M_INVALID_PARAM"; + case TOO_LARGE = "M_TOO_LARGE"; + case EXCLUSIVE = "M_EXCLUSIVE"; + case RESOURCE_LIMIT_EXCEEDED = "M_RESOURCE_LIMIT_EXCEEDED"; + case CANNOT_LEAVE_SERVER_NOTICE_ROOM = "M_CANNOT_LEAVE_SERVER_NOTICE_ROOM"; +} diff --git a/src/Errors/ErrorResponse.php b/src/Errors/ErrorResponse.php new file mode 100644 index 0000000..6248659 --- /dev/null +++ b/src/Errors/ErrorResponse.php @@ -0,0 +1,30 @@ +<?php + +namespace App\Errors; + +use Symfony\Component\HttpFoundation\JsonResponse; + +class ErrorResponse extends JsonResponse +{ + public function __construct(ErrorCode $code, string $message, int $httpCode) + { + parent::__construct( + [ + "errcode" => $code, + "error" => $message, + ], + $httpCode + ); + } + + public static function fromException(Exception $exception): self + { + $self = new self($exception->getErrorCode(), $exception->getMessage(), $exception->getCode()); + + $self->setData( + json_decode($self->data, true) + $exception->getAdditionalData() + ); + + return $self; + } +} diff --git a/src/Errors/Exception.php b/src/Errors/Exception.php new file mode 100644 index 0000000..ccb124e --- /dev/null +++ b/src/Errors/Exception.php @@ -0,0 +1,21 @@ +<?php + +namespace App\Errors; + +abstract class Exception extends \RuntimeException +{ + public function __construct(private ErrorCode $errorCode, string $message, int $httpCode) + { + parent::__construct($message, $httpCode); + } + + public function getErrorCode(): ErrorCode + { + return $this->errorCode; + } + + /** + * @return void + */ + abstract public function getAdditionalData(): array; +} diff --git a/src/Errors/RateLimitError.php b/src/Errors/RateLimitError.php new file mode 100644 index 0000000..d84f66a --- /dev/null +++ b/src/Errors/RateLimitError.php @@ -0,0 +1,20 @@ +<?php + +namespace App\Errors; + +use Symfony\Component\HttpFoundation\Response; + +class RateLimitError extends Exception +{ + public function __construct(private int $retryAfter) + { + parent::__construct(ErrorCode::LIMIT_EXCEEDED, "Too many requests", Response::HTTP_TOO_MANY_REQUESTS); + } + + public function getAdditionalData(): array + { + return [ + "retry_after_ms" => $this->retryAfter, + ]; + } +} diff --git a/src/Errors/UnknownError.php b/src/Errors/UnknownError.php new file mode 100644 index 0000000..f861597 --- /dev/null +++ b/src/Errors/UnknownError.php @@ -0,0 +1,16 @@ +<?php + +namespace App\Errors; + +class UnknownError extends Exception +{ + public function __construct(string $message, int $httpCode) + { + parent::__construct(ErrorCode::UNKNOWN, $message, $httpCode); + } + + public function getAdditionalData(): array + { + return []; + } +} |