Skip to content

Commit

Permalink
feat: Add landing page API and add it to all runtimes with a server. (#…
Browse files Browse the repository at this point in the history
…2333)

* feat: Add landing page API and add it to all runtimes with a server.

* Update landingPage.html

* Update landingPage.html

Co-authored-by: Golo Roden <golo.roden@thenativeweb.io>
  • Loading branch information
Hannes Leutloff and goloroden committed Aug 6, 2021
1 parent 92b1d3e commit 179da8b
Show file tree
Hide file tree
Showing 30 changed files with 402 additions and 13 deletions.
50 changes: 50 additions & 0 deletions assets/landingPage.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>wolkenkit</title>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="description" content="wolkenkit is a CQRS and event-sourcing framework based on Node.js." />

<link rel="icon" type="image/png" sizes="32x32" href="<wolkenkitFaviconPngSrc>" />
<style type="text/css">
body {
margin: 0;
padding: 0;
width: 100vw;
height: 100vh;

background-color: #212121;

display: flex;
align-items: center;
justify-content: center;
}

@keyframes grow-logo {
from {
transform: scale(0.9, 0.9);
opacity: 0.7;
}

to {
transform: scale(1, 1);
opacity: 1;
}
}

img {
width: 10vw;
height: 10vw;

animation-name: grow-logo;
animation-duration: 2s;
animation-timing-function: ease-in-out;
}
</style>
</head>
<body>
<img src="<wolkenkitLogoSvgSrc>" alt="wolkenkit logo" />
</body>
</html>
22 changes: 22 additions & 0 deletions assets/logo.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
31 changes: 31 additions & 0 deletions lib/apis/landingPage/http/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Application as ExpressApplication } from 'express';
import { getApiBase } from '../../base/getApiBase';
import { getMiddleware as getLoggingMiddleware } from 'flaschenpost';
import { landingPage } from './landingPage';

const getApi = async function (): Promise<{ api: ExpressApplication }> {
const api = await getApiBase({
request: {
headers: { cors: { origin: []}},
body: { parser: false },
query: { parser: { useJson: false }}
},
response: {
headers: { cache: false }
}
});

const loggingMiddleware = getLoggingMiddleware();

api.get(
`/${landingPage.path}`,
loggingMiddleware,
await landingPage.getHandler()
);

return { api };
};

export {
getApi
};
47 changes: 47 additions & 0 deletions lib/apis/landingPage/http/landingPage.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import fs from 'fs';
import path from 'path';
import { WolkenkitRequestHandler } from '../../base/WolkenkitRequestHandler';

const landingPage = {
description: 'Serves the landing page',
path: '',

request: {},
response: {
statusCodes: [ 200 ]
},

async getHandler (): Promise<WolkenkitRequestHandler> {
const absoluteAssetsDirectory = path.join(__dirname, '..', '..', '..', '..', 'assets');

const absoluteLandingPageFile = path.join(absoluteAssetsDirectory, 'landingPage.html');
const absoluteWolkenkitLogoFile = path.join(absoluteAssetsDirectory, 'logo.svg');
const absoluteFaviconFile = path.join(absoluteAssetsDirectory, 'favicon.png');

const [
landingPageContentRaw,
wolkenkitLogoBase64,
faviconBase64
] = await Promise.all([
await fs.promises.readFile(absoluteLandingPageFile, 'utf-8'),
await fs.promises.readFile(absoluteWolkenkitLogoFile, 'base64'),
await fs.promises.readFile(absoluteFaviconFile, 'base64')
]);

const landingPageContent = landingPageContentRaw.
replace(
'<wolkenkitLogoSvgSrc>',
`data:image/svg+xml;charset=utf-8;base64,${wolkenkitLogoBase64}`
).
replace(
'<wolkenkitFaviconPngSrc>',
`data:image/png;base64,${faviconBase64}`
);

return async function (req, res): Promise<void> {
res.status(200).send(landingPageContent);
};
}
};

export { landingPage };
3 changes: 3 additions & 0 deletions lib/runtimes/microservice/processes/command/getApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { Configuration } from './Configuration';
import { flaschenpost } from 'flaschenpost';
import { getCorsOrigin } from 'get-cors-origin';
import { getApi as getHandleCommandApi } from '../../../../apis/handleCommand/http';
import { getApi as getLandingPageApi } from '../../../../apis/landingPage/http';
import { getApi as getOpenApiApi } from '../../../../apis/openApi/http';
import { IdentityProvider } from 'limes';
import { OnCancelCommand } from '../../../../apis/handleCommand/OnCancelCommand';
Expand All @@ -27,6 +28,7 @@ const getApi = async function ({
}): Promise<{ api: ExpressApplication }> {
const corsOrigin = getCorsOrigin(configuration.commandCorsOrigin);

const { api: landingPageApi } = await getLandingPageApi();
const { api: handleCommandApi, getApiDefinitions: getHandleCommandApiDefinitions } = await getHandleCommandApi({
corsOrigin,
onReceiveCommand,
Expand All @@ -37,6 +39,7 @@ const getApi = async function ({

const api = express();

api.use(landingPageApi);
api.use('/command', handleCommandApi);

if (configuration.enableOpenApiDocumentation) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { getApi as getAwaitCommandWithMetadataApi } from '../../../../apis/await
import { getCommandWithMetadataSchema } from '../../../../common/schemas/getCommandWithMetadataSchema';
import { getCorsOrigin } from 'get-cors-origin';
import { getApi as getHandleCommandWithMetadataApi } from '../../../../apis/handleCommandWithMetadata/http';
import { getApi as getLandingPageApi } from '../../../../apis/landingPage/http';
import { ItemIdentifier } from '../../../../common/elements/ItemIdentifier';
import { OnCancelCommand } from '../../../../apis/handleCommandWithMetadata/OnCancelCommand';
import { OnReceiveCommand } from '../../../../apis/handleCommand/OnReceiveCommand';
Expand All @@ -32,15 +33,15 @@ const getApi = async function ({
onReceiveCommand: OnReceiveCommand;
onCancelCommand: OnCancelCommand;
}): Promise<{ api: ExpressApplication }> {
const commandWithMetadataParser = new Parser(getCommandWithMetadataSchema());

const { api: landingPageApi } = await getLandingPageApi();
const { api: handleCommandApi } = await getHandleCommandWithMetadataApi({
corsOrigin: getCorsOrigin(configuration.handleCommandCorsOrigin),
onReceiveCommand,
onCancelCommand,
application
});

const commandWithMetadataParser = new Parser(getCommandWithMetadataSchema());

const { api: awaitCommandWithMetadataApi } = await getAwaitCommandWithMetadataApi<CommandWithMetadata<CommandData>>({
corsOrigin: getCorsOrigin(configuration.awaitCommandCorsOrigin),
priorityQueueStore,
Expand All @@ -57,6 +58,7 @@ const getApi = async function ({

const api = express();

api.use(landingPageApi);
api.use('/handle-command', handleCommandApi);
api.use('/await-command', awaitCommandWithMetadataApi);

Expand Down
3 changes: 3 additions & 0 deletions lib/runtimes/microservice/processes/domainEvent/getApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Application } from '../../../../common/application/Application';
import { Configuration } from './Configuration';
import { flaschenpost } from 'flaschenpost';
import { getCorsOrigin } from 'get-cors-origin';
import { getApi as getLandingPageApi } from '../../../../apis/landingPage/http';
import { getApi as getObserveDomainEventsApi } from '../../../../apis/observeDomainEvents/http';
import { getApi as getOpenApiApi } from '../../../../apis/openApi/http';
import { IdentityProvider } from 'limes';
Expand All @@ -25,6 +26,7 @@ const getApi = async function ({
}): Promise<{ api: ExpressApplication; publishDomainEvent: PublishDomainEvent }> {
const corsOrigin = getCorsOrigin(configuration.domainEventCorsOrigin);

const { api: landingPageApi } = await getLandingPageApi();
const { api: observeDomainEventsApi, publishDomainEvent, getApiDefinitions: getObserveDomainApiDefinitions } =
await getObserveDomainEventsApi({
corsOrigin,
Expand All @@ -36,6 +38,7 @@ const getApi = async function ({

const api = express();

api.use(landingPageApi);
api.use('/domain-events', observeDomainEventsApi);

if (configuration.enableOpenApiDocumentation) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { getApi as getAwaitDomainEventApi } from '../../../../apis/awaitItem/htt
import { getCorsOrigin } from 'get-cors-origin';
import { getDomainEventSchema } from '../../../../common/schemas/getDomainEventSchema';
import { getApi as getHandleDomainEventApi } from '../../../../apis/handleDomainEvent/http';
import { getApi as getLandingPageApi } from '../../../../apis/landingPage/http';
import { ItemIdentifier } from '../../../../common/elements/ItemIdentifier';
import { OnReceiveDomainEvent } from '../../../../apis/handleDomainEvent/OnReceiveDomainEvent';
import { Parser } from 'validate-value';
Expand All @@ -29,14 +30,14 @@ const getApi = async function ({
newDomainEventPubSubChannel: string;
onReceiveDomainEvent: OnReceiveDomainEvent;
}): Promise<{ api: ExpressApplication }> {
const domainEventParser = new Parser(getDomainEventSchema());

const { api: landingPageApi } = await getLandingPageApi();
const { api: handleDomainEventApi } = await getHandleDomainEventApi({
corsOrigin: getCorsOrigin(configuration.handleDomainEventCorsOrigin),
application,
onReceiveDomainEvent
});

const domainEventParser = new Parser(getDomainEventSchema());

const { api: awaitDomainEventApi } = await getAwaitDomainEventApi<DomainEvent<DomainEventData>>({
corsOrigin: getCorsOrigin(configuration.awaitDomainEventCorsOrigin),
priorityQueueStore,
Expand All @@ -55,6 +56,7 @@ const getApi = async function ({

const api = express();

api.use(landingPageApi);
api.use('/handle-domain-event', handleDomainEventApi);
api.use('/await-domain-event', awaitDomainEventApi);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Configuration } from './Configuration';
import { DomainEventStore } from '../../../../stores/domainEventStore/DomainEventStore';
import { getCorsOrigin } from 'get-cors-origin';
import { getApi as getLandingPageApi } from '../../../../apis/landingPage/http';
import { getApi as getQueryDomainEventStoreApi } from '../../../../apis/queryDomainEventStore/http';
import { getApi as getWriteDomainEventStoreApi } from '../../../../apis/writeDomainEventStore/http';
import express, { Application } from 'express';
Expand All @@ -12,18 +13,19 @@ const getApi = async function ({
configuration: Configuration;
domainEventStore: DomainEventStore;
}): Promise<{ api: Application }> {
const { api: landingPageApi } = await getLandingPageApi();
const { api: queryDomainEventStoreApi } = await getQueryDomainEventStoreApi({
corsOrigin: getCorsOrigin(configuration.queryDomainEventsCorsOrigin),
domainEventStore
});

const { api: writeDomainEventStoreApi } = await getWriteDomainEventStoreApi({
corsOrigin: getCorsOrigin(configuration.writeDomainEventsCorsOrigin),
domainEventStore
});

const api = express();

api.use(landingPageApi);
api.use('/query', queryDomainEventStoreApi);
api.use('/write', writeDomainEventStoreApi);

Expand Down
3 changes: 3 additions & 0 deletions lib/runtimes/microservice/processes/file/getApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Application } from '../../../../common/application/Application';
import { Configuration } from './Configuration';
import { FileStore } from '../../../../stores/fileStore/FileStore';
import { getCorsOrigin } from 'get-cors-origin';
import { getApi as getLandingPageApi } from '../../../../apis/landingPage/http';
import { getApi as getManageFileApi } from '../../../../apis/manageFile/http';
import { getApi as getOpenApiApi } from '../../../../apis/openApi/http';
import { IdentityProvider } from 'limes';
Expand All @@ -20,6 +21,7 @@ const getApi = async function ({
}): Promise<{ api: ExpressApplication }> {
const corsOrigin = getCorsOrigin(configuration.fileCorsOrigin);

const { api: landingPageApi } = await getLandingPageApi();
const { api: manageFileApi, getApiDefinitions: getManageFileApiDefinitions } = await getManageFileApi({
corsOrigin,
application,
Expand All @@ -29,6 +31,7 @@ const getApi = async function ({

const api = express();

api.use(landingPageApi);
api.use('/files', manageFileApi);

if (configuration.enableOpenApiDocumentation) {
Expand Down
6 changes: 5 additions & 1 deletion lib/runtimes/microservice/processes/graphql/getApi.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ import { Application } from '../../../../common/application/Application';
import { Configuration } from './Configuration';
import { getCorsOrigin } from 'get-cors-origin';
import { getApi as getGraphqlApi } from '../../../../apis/graphql';
import { getApi as getLandingPageApi } from '../../../../apis/landingPage/http';
import { IdentityProvider } from 'limes';
import { InitializeGraphQlOnServer } from '../../../../apis/graphql/InitializeGraphQlOnServer';
import { Notification } from '../../../../common/elements/Notification';
Expand Down Expand Up @@ -35,9 +36,9 @@ const getApi = async function ({
publishDomainEvent: PublishDomainEvent;
initializeGraphQlOnServer: InitializeGraphQlOnServer | undefined;
}> {
const api = express();
const corsOrigin = getCorsOrigin(configuration.corsOrigin);

const { api: landingPageApi } = await getLandingPageApi();
const { api: handleCommandGraphqlApi, publishDomainEvent: publishDomainEventToGraphqlApi, initializeGraphQlOnServer } = await getGraphqlApi({
corsOrigin,
application,
Expand All @@ -58,6 +59,9 @@ const getApi = async function ({
webSocketEndpoint: '/graphql/v2/'
});

const api = express();

api.use(landingPageApi);
api.use('/graphql', handleCommandGraphqlApi);

// eslint-disable-next-line unicorn/consistent-function-scoping
Expand Down
7 changes: 5 additions & 2 deletions lib/runtimes/microservice/processes/notification/getApi.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Application } from '../../../../common/application/Application';
import { Configuration } from './Configuration';
import { getCorsOrigin } from 'get-cors-origin';
import { getApi as getLandingPageApi } from '../../../../apis/landingPage/http';
import { getApi as getSubscribeNotificationsApi } from '../../../../apis/subscribeNotifications/http';
import { IdentityProvider } from 'limes';
import { Notification } from '../../../../common/elements/Notification';
Expand All @@ -22,8 +23,7 @@ const getApi = async function ({
}): Promise<{ api: ExpressApplication }> {
const corsOrigin = getCorsOrigin(configuration.notificationCorsOrigin);

const api = express();

const { api: landingPageApi } = await getLandingPageApi();
const { api: subscribeNotificationsApi } = await getSubscribeNotificationsApi({
application,
identityProviders,
Expand All @@ -33,6 +33,9 @@ const getApi = async function ({
heartbeatInterval: configuration.heartbeatInterval
});

const api = express();

api.use(landingPageApi);
api.use('/notifications', subscribeNotificationsApi);

return { api };
Expand Down
Loading

0 comments on commit 179da8b

Please sign in to comment.