feat(server): implement sealed share lifecycle
Signed-off-by: JustMe <mr.toing@outlook.com>
This commit is contained in:
1 parent
e02e024605
commit
42b93ae2d8
45 files changed
+6327
No files matched your search
@@ -0,0 +1,75 @@
|
||||
namespace WebDrop.Core;
|
||||
|
||||
public enum ErrorCode
|
||||
{
|
||||
BadRequest,
|
||||
Unauthorized,
|
||||
Forbidden,
|
||||
NotJoined,
|
||||
SeatsFull,
|
||||
ModeMismatch,
|
||||
NotFound,
|
||||
Conflict,
|
||||
Gone,
|
||||
TooLarge,
|
||||
CaptchaRequired,
|
||||
CaptchaUnavailable,
|
||||
RateLimited,
|
||||
VisitorsFull,
|
||||
Sealed,
|
||||
}
|
||||
|
||||
/// <summary>预期内的业务失败。消息只含错误码,绝不回显用户提交的内容。</summary>
|
||||
public sealed class WebDropException : Exception
|
||||
{
|
||||
public ErrorCode Code { get; }
|
||||
|
||||
/// <summary>仅在 410 日志续传失败时有值,见 api.md。</summary>
|
||||
public long? OldestSeq { get; }
|
||||
|
||||
public WebDropException(ErrorCode code, long? oldestSeq = null) : base(code.ToWire())
|
||||
{
|
||||
Code = code;
|
||||
OldestSeq = oldestSeq;
|
||||
}
|
||||
}
|
||||
|
||||
public static class ErrorCodes
|
||||
{
|
||||
public static string ToWire(this ErrorCode code) => code switch
|
||||
{
|
||||
ErrorCode.BadRequest => "bad_request",
|
||||
ErrorCode.Unauthorized => "unauthorized",
|
||||
ErrorCode.Forbidden => "forbidden",
|
||||
ErrorCode.NotJoined => "not_joined",
|
||||
ErrorCode.SeatsFull => "seats_full",
|
||||
ErrorCode.ModeMismatch => "mode_mismatch",
|
||||
ErrorCode.NotFound => "not_found",
|
||||
ErrorCode.Conflict => "conflict",
|
||||
ErrorCode.Gone => "gone",
|
||||
ErrorCode.TooLarge => "too_large",
|
||||
ErrorCode.CaptchaRequired => "captcha_required",
|
||||
ErrorCode.CaptchaUnavailable => "captcha_unavailable",
|
||||
ErrorCode.RateLimited => "rate_limited",
|
||||
ErrorCode.VisitorsFull => "visitors_full",
|
||||
ErrorCode.Sealed => "sealed",
|
||||
_ => "bad_request",
|
||||
};
|
||||
|
||||
public static int ToStatus(this ErrorCode code) => code switch
|
||||
{
|
||||
ErrorCode.BadRequest => 400,
|
||||
ErrorCode.Unauthorized => 401,
|
||||
ErrorCode.Forbidden or ErrorCode.NotJoined or ErrorCode.SeatsFull or ErrorCode.ModeMismatch => 403,
|
||||
ErrorCode.NotFound => 404,
|
||||
ErrorCode.Conflict => 409,
|
||||
ErrorCode.Sealed => 409,
|
||||
ErrorCode.Gone => 410,
|
||||
ErrorCode.TooLarge => 413,
|
||||
ErrorCode.CaptchaRequired => 428,
|
||||
ErrorCode.CaptchaUnavailable => 503,
|
||||
ErrorCode.RateLimited => 429,
|
||||
ErrorCode.VisitorsFull => 403,
|
||||
_ => 400,
|
||||
};
|
||||
}
|
||||
Reference in new issue
Block a user