refactor: http service (#2233)

This commit is contained in:
Mo
2023-02-28 20:43:25 -06:00
committed by GitHub
parent 6e7618b258
commit e7f1d35341
142 changed files with 1116 additions and 1307 deletions

View File

@@ -0,0 +1,5 @@
export type DeprecatedError = {
message: string
status: number
tag?: string
}

View File

@@ -0,0 +1,13 @@
import { DeprecatedError } from './DeprecatedError'
import { HttpStatusCode } from './HttpStatusCode'
import { DeprecatedResponseMeta } from './DeprecatedResponseMeta'
export type DeprecatedHttpResponse = {
status: HttpStatusCode
error?: DeprecatedError
data?: {
error?: DeprecatedError
}
meta?: DeprecatedResponseMeta
headers?: Map<string, string | null>
}

View File

@@ -0,0 +1,8 @@
import { DeprecatedError } from './DeprecatedError'
import { HttpStatusCode } from './HttpStatusCode'
export type DeprecatedMinimalHttpResponse = {
status: HttpStatusCode
error?: DeprecatedError
headers?: Map<string, string | null>
}

View File

@@ -0,0 +1,11 @@
import { Role } from '@standardnotes/security'
export type DeprecatedResponseMeta = {
auth: {
userUuid?: string
roles?: Role[]
}
server: {
filesServerUrl?: string
}
}

View File

@@ -1,7 +1,6 @@
export enum StatusCode {
export enum DeprecatedStatusCode {
LocalValidationError = 10,
CanceledMfa = 11,
UnknownError = 12,
HttpStatusMinSuccess = 200,
HttpStatusNoContent = 204,

View File

@@ -1,10 +0,0 @@
export type Error = {
message: string
status: number
tag?: string
/** In the case of MFA required responses,
* the required prompt is returned as part of the error */
payload?: {
mfa_key?: string
}
}

View File

@@ -0,0 +1,15 @@
export enum ErrorTag {
MfaInvalid = 'mfa-invalid',
MfaRequired = 'mfa-required',
U2FRequired = 'u2f-required',
RefreshTokenInvalid = 'invalid-refresh-token',
RefreshTokenExpired = 'expired-refresh-token',
AccessTokenExpired = 'expired-access-token',
ParametersInvalid = 'invalid-parameters',
RevokedSession = 'revoked-session',
AuthInvalid = 'invalid-auth',
ReadOnlyAccess = 'read-only-access',
ClientValidationError = 'client-validation-error',
ClientCanceledMfa = 'client-canceled-mfa',
}

View File

@@ -1,6 +0,0 @@
import { HttpResponse } from './HttpResponse'
import { StatusCode } from './StatusCode'
export function isErrorResponseExpiredToken(errorResponse: HttpResponse): boolean {
return errorResponse.status === StatusCode.HttpStatusExpiredAccessToken
}

View File

@@ -0,0 +1,6 @@
import { ErrorTag } from './ErrorTag'
export type HttpError = {
message: string
tag?: ErrorTag
}

View File

@@ -0,0 +1,5 @@
import { HttpError } from './HttpError'
export type HttpErrorResponseBody = {
error: HttpError
}

View File

@@ -0,0 +1 @@
export type HttpHeaders = Map<string, string | null>

View File

@@ -0,0 +1,13 @@
import { HttpRequestParams } from './HttpRequestParams'
import { HttpVerb } from './HttpVerb'
export type HttpRequest = {
url: string
params?: HttpRequestParams
rawBytes?: Uint8Array
verb: HttpVerb
authentication?: string
customHeaders?: Record<string, string>[]
responseType?: XMLHttpRequestResponseType
external?: boolean
}

View File

@@ -0,0 +1 @@
export type HttpRequestParams = unknown

View File

@@ -1,13 +1,26 @@
import { StatusCode } from './StatusCode'
import { Error } from './Error'
import { ResponseMeta } from './ResponseMeta'
import { HttpErrorResponseBody } from './HttpErrorResponseBody'
import { HttpResponseMeta } from './HttpResponseMeta'
import { HttpHeaders } from './HttpHeaders'
import { HttpStatusCode } from './HttpStatusCode'
export type HttpResponse = {
status?: StatusCode
error?: Error
data?: {
error?: Error
}
meta?: ResponseMeta
headers?: Map<string, string | null>
type AnySuccessRecord = Record<string, unknown> & { error?: never }
interface HttpResponseBase {
status: HttpStatusCode
meta?: HttpResponseMeta
headers?: HttpHeaders
}
export interface HttpErrorResponse extends HttpResponseBase {
data: HttpErrorResponseBody
}
export interface HttpSuccessResponse<T = AnySuccessRecord> extends HttpResponseBase {
data: T
}
export type HttpResponse<T = AnySuccessRecord> = HttpErrorResponse | HttpSuccessResponse<T>
export function isErrorResponse<T>(response: HttpResponse<T>): response is HttpErrorResponse {
return (response.data as HttpErrorResponseBody)?.error != undefined
}

View File

@@ -1,6 +1,6 @@
import { Role } from '@standardnotes/security'
export type ResponseMeta = {
export type HttpResponseMeta = {
auth: {
userUuid?: string
roles?: Role[]

View File

@@ -0,0 +1,11 @@
export enum HttpStatusCode {
Success = 200,
NoContent = 204,
MultipleChoices = 300,
BadRequest = 400,
Unauthorized = 401,
Forbidden = 403,
Gone = 410,
ExpiredAccessToken = 498,
InternalServerError = 500,
}

View File

@@ -0,0 +1,7 @@
export enum HttpVerb {
Get = 'GET',
Post = 'POST',
Put = 'PUT',
Patch = 'PATCH',
Delete = 'DELETE',
}

View File

@@ -1,8 +0,0 @@
import { StatusCode } from './StatusCode'
import { Error } from './Error'
export type MinimalHttpResponse = {
status?: StatusCode
error?: Error
headers?: Map<string, string | null>
}

View File

@@ -0,0 +1,15 @@
export * from './ErrorTag'
export * from './HttpErrorResponseBody'
export * from './HttpHeaders'
export * from './HttpRequest'
export * from './HttpRequestParams'
export * from './HttpResponse'
export * from './HttpResponseMeta'
export * from './HttpVerb'
export * from './DeprecatedError'
export * from './DeprecatedHttpResponse'
export * from './DeprecatedMinimalHttpResponses'
export * from './DeprecatedResponseMeta'
export * from './DeprecatedStatusCode'
export * from './HttpStatusCode'
export * from './HttpError'