fix: usage of internal api

Signed-off-by: Tilman Vatteroth <git@tilmanvatteroth.de>
This commit is contained in:
Tilman Vatteroth 2023-10-08 21:40:37 +02:00 committed by Philip Molares
parent 3076bb4cc3
commit a2b291294e
4 changed files with 37 additions and 41 deletions

View file

@ -39,7 +39,20 @@ export abstract class ApiRequestBuilder<ResponseType> {
* @return the base url * @return the base url
*/ */
private determineBaseUrl(baseUrl?: string) { private determineBaseUrl(baseUrl?: string) {
return typeof window !== 'undefined' ? baseUrl ?? '/' : baseUrlFromEnvExtractor.extractBaseUrls().internalApiUrl if (this.isSSR()) {
const internalApiUrl = baseUrlFromEnvExtractor.extractBaseUrls().internalApiUrl
const actualBaseUrl = internalApiUrl ?? baseUrl
if (actualBaseUrl === undefined) {
throw new Error("Can't make request without forced base url and without internal api url")
}
return actualBaseUrl
} else {
return baseUrl ?? '/'
}
}
private isSSR() {
return typeof window === 'undefined'
} }
protected async sendRequestAndVerifyResponse(httpMethod: RequestInit['method']): Promise<ApiResponse<ResponseType>> { protected async sendRequestAndVerifyResponse(httpMethod: RequestInit['method']): Promise<ApiResponse<ResponseType>> {

View file

@ -10,7 +10,7 @@ import React, { createContext } from 'react'
export interface BaseUrls { export interface BaseUrls {
renderer: string renderer: string
editor: string editor: string
internalApiUrl: string internalApiUrl: string | undefined
} }
interface BaseUrlContextProviderProps { interface BaseUrlContextProviderProps {

View file

@ -83,7 +83,7 @@ describe('BaseUrlFromEnvExtractor', () => {
expect(() => sut.extractBaseUrls()).toThrow() expect(() => sut.extractBaseUrls()).toThrow()
}) })
it('should copy editor base url to renderer base/internal api url if url is omitted', () => { it('should copy editor base url to renderer base url if url is omitted', () => {
process.env.HD_BASE_URL = 'https://editor1.example.org/' process.env.HD_BASE_URL = 'https://editor1.example.org/'
delete process.env.HD_RENDERER_BASE_URL delete process.env.HD_RENDERER_BASE_URL
delete process.env.HD_INTERNAL_API_URL delete process.env.HD_INTERNAL_API_URL
@ -91,7 +91,7 @@ describe('BaseUrlFromEnvExtractor', () => {
expect(sut.extractBaseUrls()).toStrictEqual({ expect(sut.extractBaseUrls()).toStrictEqual({
renderer: 'https://editor1.example.org/', renderer: 'https://editor1.example.org/',
internalApiUrl: 'https://editor1.example.org/', internalApiUrl: undefined,
editor: 'https://editor1.example.org/' editor: 'https://editor1.example.org/'
}) })
}) })

View file

@ -6,7 +6,7 @@
import type { BaseUrls } from '../components/common/base-url/base-url-context-provider' import type { BaseUrls } from '../components/common/base-url/base-url-context-provider'
import { Logger } from './logger' import { Logger } from './logger'
import { isTestMode, isBuildTime } from './test-modes' import { isTestMode, isBuildTime } from './test-modes'
import { NoSubdirectoryAllowedError, parseUrl } from '@hedgedoc/commons' import { parseUrl } from '@hedgedoc/commons'
import { Optional } from '@mrdrogdrog/optional' import { Optional } from '@mrdrogdrog/optional'
/** /**
@ -17,54 +17,35 @@ export class BaseUrlFromEnvExtractor {
private readonly logger = new Logger('Base URL Configuration') private readonly logger = new Logger('Base URL Configuration')
private extractUrlFromEnvVar(envVarValue: string | undefined): Optional<URL> { private extractUrlFromEnvVar(envVarValue: string | undefined): Optional<URL> {
try { return parseUrl(envVarValue).orThrow(() => new Error(`${envVarValue} isn't a valid URL`))
return parseUrl(envVarValue)
} catch (error) {
if (error instanceof NoSubdirectoryAllowedError) {
this.logger.error(error.message)
return Optional.empty()
} else {
throw error
}
}
} }
private extractEditorBaseUrlFromEnv(): Optional<URL> { private extractUrlFromEnv(envVarName: string): Optional<URL> {
const envValue = this.extractUrlFromEnvVar(process.env.HD_BASE_URL)
if (envValue.isEmpty()) {
this.logger.error("HD_BASE_URL isn't a valid URL!")
}
return envValue
}
private extractUrlFromEnv(editorBaseUrl: URL, envVarName: string): Optional<URL> {
if (isTestMode) { if (isTestMode) {
this.logger.info(`Test mode activated. Using editor base url for ${envVarName}.`) this.logger.info(`Test mode activated. Using editor base url for ${envVarName}.`)
return Optional.of(editorBaseUrl) return Optional.empty()
} }
if (!process.env[envVarName]) { if (!process.env[envVarName]) {
this.logger.info(`${envVarName} is unset. Using editor base url.`) this.logger.info(`${envVarName} is unset.`)
return Optional.of(editorBaseUrl) return Optional.empty()
} }
return this.extractUrlFromEnvVar(process.env[envVarName]) return this.extractUrlFromEnvVar(process.env[envVarName])
} }
private renewBaseUrls(): BaseUrls { private renewBaseUrls(): BaseUrls {
return this.extractEditorBaseUrlFromEnv() return this.extractUrlFromEnvVar(process.env.HD_BASE_URL)
.flatMap((editorBaseUrl) => .map((editorBaseUrl) => {
this.extractUrlFromEnv(editorBaseUrl, 'HD_RENDERER_BASE_URL').flatMap((rendererBaseUrl) => const rendererBaseUrl = this.extractUrlFromEnv('HD_RENDERER_BASE_URL').orElse(editorBaseUrl)
this.extractUrlFromEnv(editorBaseUrl, 'HD_INTERNAL_API_URL').map((internalApiUrl) => { const internalApiUrl = this.extractUrlFromEnv('HD_INTERNAL_API_URL').orElse(undefined)
return { return {
editor: editorBaseUrl.toString(), editor: editorBaseUrl.toString(),
renderer: rendererBaseUrl.toString(), renderer: rendererBaseUrl.toString(),
internalApiUrl: internalApiUrl.toString() internalApiUrl: internalApiUrl?.toString()
} } as BaseUrls
}) })
) .orElseThrow(() => new Error("couldn't parse env"))
)
.orElseThrow(() => new Error('couldnt parse env vars'))
} }
/** /**
@ -94,7 +75,9 @@ export class BaseUrlFromEnvExtractor {
} }
this.logger.info('Editor base URL', this.baseUrls.editor.toString()) this.logger.info('Editor base URL', this.baseUrls.editor.toString())
this.logger.info('Renderer base URL', this.baseUrls.renderer.toString()) this.logger.info('Renderer base URL', this.baseUrls.renderer.toString())
this.logger.info('Internal API URL', this.baseUrls.internalApiUrl.toString()) if (this.baseUrls.internalApiUrl !== undefined) {
this.logger.info('Internal API URL', this.baseUrls.internalApiUrl?.toString())
}
} }
} }