summaryrefslogtreecommitdiff
path: root/src/Errors
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2025-08-14 14:37:56 +0200
committerDaniel Weipert <git@mail.dweipert.de>2025-08-14 14:37:56 +0200
commitc135fcf9041c604b32827a1cb027010bca5915ab (patch)
tree95a2331d5f0bc4a736aa0e716330c39b3fa1ea26 /src/Errors
parent3f4b51b99a4f4dc41dbdce7f34afe7e15d3d426e (diff)
POST login possible
Diffstat (limited to 'src/Errors')
-rw-r--r--src/Errors/ErrorCode.php47
-rw-r--r--src/Errors/ErrorResponse.php30
-rw-r--r--src/Errors/Exception.php21
-rw-r--r--src/Errors/RateLimitError.php20
-rw-r--r--src/Errors/UnknownError.php16
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 [];
+ }
+}