diff --git a/src/common/middleware/error.ts b/src/common/middleware/error.ts index 733ebee..b062b4f 100644 --- a/src/common/middleware/error.ts +++ b/src/common/middleware/error.ts @@ -1,6 +1,6 @@ import { isHttpError, Status, STATUS_TEXT } from 'x/oak'; import { logger } from '../core/logger.ts'; -import type { Error } from '../types/core.d.ts'; +import type { ErrorResponse } from '../types/core.d.ts'; import type { AppContext } from '../types/core.d.ts'; export default async ( @@ -14,12 +14,12 @@ export default async ( logger.error(err); const status = err.status; response.status = status; - response.body = { message: STATUS_TEXT[status] }; + response.body = { message: STATUS_TEXT[status] }; } else { logger.error(err); const status = Status.InternalServerError; response.status = Status.InternalServerError; - response.body = { message: STATUS_TEXT[status] }; + response.body = { message: STATUS_TEXT[status] }; } } }; diff --git a/src/common/middleware/header.ts b/src/common/middleware/header.ts index 0e9e46d..ccbc8dc 100644 --- a/src/common/middleware/header.ts +++ b/src/common/middleware/header.ts @@ -1,6 +1,6 @@ import { HTTPMethods, Status } from 'x/oak'; import { logger } from '../core/logger.ts'; -import type { AppContext, Error } from '../types/core.d.ts'; +import type { AppContext, ErrorResponse } from '../types/core.d.ts'; const bodyTypes: HTTPMethods[] = [ 'PATCH', @@ -29,7 +29,7 @@ const fail = (header: string, ctx: AppContext) => { const { response } = ctx; response.status = Status.BadRequest; response.type = 'application/json'; - response.body = { + response.body = { message: 'Missing required header', }; logger.error( diff --git a/src/common/types/core.d.ts b/src/common/types/core.d.ts index 2e44394..1ea0469 100644 --- a/src/common/types/core.d.ts +++ b/src/common/types/core.d.ts @@ -6,7 +6,7 @@ import { AppFeatures } from '../experiment/types.d.ts'; export type RCF822Date = string; -export type Error = { +export type ErrorResponse = { message: string; }; diff --git a/src/config/index.ts b/src/config/index.ts index 33799ab..4990f7d 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -1,7 +1,8 @@ -import { AppContext } from '../common/types/core.d.ts'; +import { AppContext, ErrorResponse } from '../common/types/core.d.ts'; import { Repository } from './repository/index.ts'; import { LocalSource } from './local/index.ts'; import { collection } from '../common/mongo/index.ts'; +import { Status } from 'jsr:@oak/commons@0.10/status'; export const config = async ({ state, response }: AppContext) => { const localSource = new LocalSource(collection('config', state.local)); @@ -9,6 +10,16 @@ export const config = async ({ state, response }: AppContext) => { state.features, localSource, ); + const configuration = await repository.getConfiguration(); + response.type = 'application/json'; - response.body = await repository.getConfiguration(); + if (configuration) { + response.status = Status.OK; + response.body = await repository.getConfiguration(); + } else { + response.status = Status.InternalServerError; + response.body = { + message: 'An error occured while fetching configuration', + }; + } }; diff --git a/src/config/local/source.ts b/src/config/local/source.ts index 67c2203..d55f4bd 100644 --- a/src/config/local/source.ts +++ b/src/config/local/source.ts @@ -12,7 +12,7 @@ export class LocalSource { const config = await this.collection?.findOne() ?.catch((e) => { logger.error( - `config.local.source.LocalSource:getConfig: Unable to find config in collection`, + `config.local.source:getConfig: Unable to find config in collection`, e, ); return undefined; diff --git a/src/config/local/types.d.ts b/src/config/local/types.d.ts index 41951b1..8a85442 100644 --- a/src/config/local/types.d.ts +++ b/src/config/local/types.d.ts @@ -27,7 +27,6 @@ export interface ImageConfig extends Document { } export interface ConfigDocument extends Document { - _id: string; navigation: NavigationConfig[]; genres: GenreConfig[]; image: ImageConfig; diff --git a/src/config/repository/index.ts b/src/config/repository/index.ts index 659052c..191acb7 100644 --- a/src/config/repository/index.ts +++ b/src/config/repository/index.ts @@ -2,6 +2,7 @@ import { Features } from '../../common/types/core.d.ts'; import { ClientConfiguration } from '../transformer/types.d.ts'; import { LocalSource } from '../local/index.ts'; import { transform } from '../transformer/index.ts'; +import { logger } from '../../common/core/index.ts'; export class Repository { constructor( @@ -9,12 +10,21 @@ export class Repository { private local: LocalSource, ) {} - // get settings from our database or something based on an app version? - getConfiguration = async (): Promise => { + getConfiguration = async (): Promise => { const config = await this.local.getConfig(); - return { - ...transform({ document: config, features: this.growth }), - }; + if (config) { + try { + const result = transform({ document: config, features: this.growth }); + return result; + } catch (e) { + logger.error( + `config.repository.index:getConfiguration: Error while transforming document`, + e, + ); + } + } + + return undefined; }; } diff --git a/src/config/transformer/index.ts b/src/config/transformer/index.ts index 0feed01..a371ac4 100644 --- a/src/config/transformer/index.ts +++ b/src/config/transformer/index.ts @@ -3,36 +3,44 @@ import { getPlatformSource, isAnalyticsEnabled, } from '../../common/experiment/index.ts'; -import { Optional } from '../../common/mongo/types.d.ts'; import { Transform } from '../../common/transformer/types.d.ts'; import { Features } from '../../common/types/core.d.ts'; import { ConfigDocument } from '../local/types.d.ts'; import { ClientConfiguration } from './types.d.ts'; +import { PlatformSource } from '../../common/experiment/types.d.ts'; +import { idOf } from '../../common/mongo/index.ts'; + +const toImageUrl = (image: string, source?: PlatformSource): string => { + if (source) { + return `${source.media}${image}`; + } + return image; +}; export const transform: Transform< { - document: Optional>; + document: WithId; features: Features; }, ClientConfiguration -> = (data) => { - const platformSource = getPlatformSource(data.features); - const image = data.document?.image; +> = ({ document, features }) => { + const platformSource = getPlatformSource(features); + const { image, _id, genres, navigation } = document; return { - id: data.document?._id, + id: idOf(_id), settings: { - analyticsEnabled: isAnalyticsEnabled(data.features), + analyticsEnabled: isAnalyticsEnabled(features), platformSource: platformSource?.api, }, - genres: data.document?.genres, + genres: genres, image: { - banner: image?.banner ?? '', - poster: image?.poster ?? '', - loading: image?.loading ?? '', - error: image?.error ?? '', - info: image?.info ?? '', - default: image?.default ?? '', + banner: toImageUrl(image.banner, platformSource), + poster: toImageUrl(image.poster, platformSource), + loading: toImageUrl(image.loading, platformSource), + error: toImageUrl(image.error, platformSource), + info: toImageUrl(image.info, platformSource), + default: toImageUrl(image.default, platformSource), }, - navigation: data.document?.navigation, + navigation: navigation, }; }; diff --git a/src/news/mapper.ts b/src/news/mapper.ts index 43ec75e..17a6d2f 100644 --- a/src/news/mapper.ts +++ b/src/news/mapper.ts @@ -1,10 +1,11 @@ import { News, NewsEntity } from './types.d.ts'; import { NewsDocument } from './local/types.d.ts'; import { OptionalId, WithId } from 'npm/mongodb'; +import { idOf } from '../common/mongo/index.ts'; export const toEntity = (data: WithId): NewsEntity => { return { - id: data._id.toHexString(), + id: idOf(data._id), slug: data.slug, title: data.title, author: data.author, diff --git a/src/series/index.ts b/src/series/index.ts index f62774e..c59d304 100644 --- a/src/series/index.ts +++ b/src/series/index.ts @@ -1,5 +1,5 @@ import { Status } from 'x/oak'; -import { AppContext, Error } from '../common/types/core.d.ts'; +import { AppContext, ErrorResponse } from '../common/types/core.d.ts'; import LocalSource from './local/source.ts'; import SeriesRepository from './repository/series.ts'; import SeasonRepository from './repository/season.ts'; @@ -21,7 +21,7 @@ export const series = async ({ request, response, state }: AppContext) => { } else { response.type = 'application/json'; response.status = Status.BadRequest; - response.body = { + response.body = { message: `Missing required query parameter: 'id'`, }; }