Skip to content

Commit a1f2b79

Browse files
committed
feat(registry): add new router domain "alias" field
This field is used to safely bind routes across multiple ILC instances Fixed typings
1 parent 1d6106b commit a1f2b79

File tree

22 files changed

+373
-38
lines changed

22 files changed

+373
-38
lines changed

registry/client/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ $ npm install
77
$ npm start
88
```
99

10-
And then browse to [http://localhost:8080/](http://localhost:8080/).
10+
And then browse to [http://localhost:4001/](http://localhost:4001/).
1111

1212
The default credentials are:
1313
**root / pwd** - for admin access.

registry/client/src/routerDomains/Edit.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ const InputForm = ({ mode = 'edit', ...props }) => {
3030
</ReferenceInput>
3131
<TextInput source="canonicalDomain" label="Canonical Domain" fullWidth />
3232
<TextInput source="brandId" label="Brand ID" fullWidth />
33+
<TextInput source="alias" label="Alias" fullWidth />
3334
</FormTab>
3435

3536
<FormTab label="Domain Props">

registry/client/src/routerDomains/List.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const PostList = (props) => {
3434
</ReferenceField>
3535
<TextField source="canonicalDomain" sortable={false} emptyText="-" label="Canonical Domain" />
3636
<TextField source="brandId" sortable={false} emptyText="-" label="Brand ID" />
37+
<TextField source="alias" sortable={false} emptyText="-" label="Alias" />
3738
<ListActionsToolbar>
3839
<EditButton />
3940
</ListActionsToolbar>

registry/lde/oauth-server.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ import { OAuth2Server } from 'oauth2-mock-server';
77
await server.issuer.keys.generate('RS256');
88

99
// Start the server
10-
await server.start(8080);
11-
console.log('Issuer URL:', server.issuer.url); // -> http://localhost:8080
10+
await server.start(8085);
11+
console.log('Issuer URL:', server.issuer.url);
1212

1313
server.service.on('beforeTokenSigning', (token, req) => {
1414
token.payload.unique_name = 'root';

registry/package-lock.json

Lines changed: 8 additions & 8 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

registry/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
"cross-env": "10.1.0",
5252
"jsonwebtoken": "^9.0.2",
5353
"mocha": "^11.7.5",
54-
"nock": "^14.0.10",
54+
"nock": "^14.0.11",
5555
"nodemon": "^3.1.11",
5656
"nyc": "^17.1.0",
5757
"oauth2-mock-server": "^8.2.0",

registry/server/appRoutes/interfaces/index.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ export interface AppRoute {
5757
meta?: object | string | null;
5858
domainId?: number | null;
5959
domainIdIdxble?: number | null;
60+
domainAlias?: string | null;
6061
namespace?: string | null;
6162
}
6263

@@ -68,6 +69,7 @@ export type AppRouteDto = {
6869
templateName: string | null;
6970
slots: Record<string, AppRouteSlotDto>;
7071
domainId: number | null;
72+
domainAlias: string | null;
7173
meta: Record<string, any>;
7274
versionId: string;
7375
namespace: string | null;
@@ -80,15 +82,20 @@ const commonAppRoute = {
8082
next: Joi.bool().default(false),
8183
templateName: templateNameSchema.allow(null).default(null),
8284
slots: Joi.object().pattern(commonAppRouteSlot.name, appRouteSlotSchema).default({}),
83-
domainId: Joi.number().default(null),
85+
domainId: Joi.number(),
86+
domainAlias: Joi.string()
87+
.lowercase()
88+
.pattern(/^[a-z0-9-]+$/)
89+
.max(64)
90+
.trim(),
8491
meta: Joi.object().default({}),
8592
versionId: Joi.string().strip(),
8693
namespace: Joi.string().default(null),
8794
};
8895

8996
export const partialAppRouteSchema = Joi.object({
9097
...commonAppRoute,
91-
});
98+
}).oxor('domainId', 'domainAlias');
9299

93100
const conditionSpecialRole = {
94101
is: Joi.exist(),
@@ -108,4 +115,4 @@ export const appRouteSchema = Joi.object<AppRouteDto>({
108115
is: Joi.exist(),
109116
then: Joi.forbidden(),
110117
}),
111-
});
118+
}).oxor('domainId', 'domainAlias');

registry/server/appRoutes/routes/RoutesService.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import { appendDigest } from '../../util/hmac';
77
import { EntityTypes, VersionedRecord } from '../../versioning/interfaces';
88
import { AppRoute, AppRouteDto, appRouteSchema, AppRouteSlot } from '../interfaces';
99
import { prepareAppRouteSlotsToSave, prepareAppRouteToSave } from '../services/prepareAppRoute';
10+
import { resolveDomainAlias } from '../services/resolveDomainAlias';
1011

1112
export type AppRouteWithSlot = VersionedRecord<AppRoute & AppRouteSlot>;
1213

@@ -49,10 +50,11 @@ export class RoutesService {
4950
* @returns routeId
5051
*/
5152
public async upsert(params: unknown, user: User, trxProvider: Knex.TransactionProvider): Promise<AppRoute> {
52-
const { slots, ...appRoute } = await appRouteSchema.validateAsync(params, {
53+
const { slots, ...validated } = await appRouteSchema.validateAsync(params, {
5354
noDefaults: false,
5455
externals: false,
5556
});
57+
const appRoute = await resolveDomainAlias(validated);
5658

5759
let savedAppRouteId: number;
5860
const appRouteRecord = prepareAppRouteToSave(appRoute);

registry/server/appRoutes/routes/createAppRoute.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import validateRequestFactory from '../../common/services/validateRequest';
44
import db from '../../db';
55
import { extractInsertedId, handleForeignConstraintError } from '../../util/db';
66
import { defined, getJoiErr, joiErrorToResponse } from '../../util/helpers';
7-
import { appRouteSchema } from '../interfaces';
7+
import { AppRouteDto, appRouteSchema } from '../interfaces';
88
import { prepareAppRouteSlotsToSave, prepareAppRouteToSave } from '../services/prepareAppRoute';
9+
import { resolveDomainAlias } from '../services/resolveDomainAlias';
910
import { transformSpecialRoutesForDB } from '../services/transformSpecialRoutes';
1011
import { retrieveAppRouteFromDB } from './getAppRoute';
1112
import { routesService } from './RoutesService';
@@ -17,13 +18,14 @@ const validateRequestBeforeCreateAppRoute = validateRequestFactory([
1718
},
1819
]);
1920

20-
const createAppRoute = async (req: Request, res: Response) => {
21+
const createAppRoute = async (req: Request<unknown, unknown, AppRouteDto>, res: Response) => {
2122
const { slots: appRouteSlots, ...appRouteData } = req.body;
2223

23-
const appRoute = transformSpecialRoutesForDB(appRouteData);
24+
const domainResolved = await resolveDomainAlias(appRouteData);
25+
const appRoute = transformSpecialRoutesForDB(domainResolved);
2426

2527
if (appRouteData.specialRole) {
26-
const existingRoute = await db.first().from('routes').where({
28+
const existingRoute = await db('routes').first().where({
2729
route: appRoute.route,
2830
domainId: appRoute.domainId,
2931
});

registry/server/appRoutes/routes/updateAppRoute.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ import {
88
prepareAppRouteToRespond,
99
prepareAppRouteToSave,
1010
} from '../services/prepareAppRoute';
11-
import { partialAppRouteSchema } from '../interfaces';
11+
import { resolveDomainAlias } from '../services/resolveDomainAlias';
12+
import { AppRouteDto, partialAppRouteSchema } from '../interfaces';
1213
import { appRouteIdSchema } from '../interfaces';
1314
import { transformSpecialRoutesForDB } from '../services/transformSpecialRoutes';
1415
import { routesService, RoutesService } from './RoutesService';
@@ -30,11 +31,12 @@ const validateRequestBeforeUpdateAppRoute = validateRequestFactory([
3031
},
3132
]);
3233

33-
const updateAppRoute = async (req: Request<UpdateAppRouteRequestParams>, res: Response) => {
34+
const updateAppRoute = async (req: Request<UpdateAppRouteRequestParams, unknown, AppRouteDto>, res: Response) => {
3435
const { slots: appRouteSlots, ...appRouteData } = req.body;
3536

3637
const appRouteId = +req.params.id;
37-
const appRoute = transformSpecialRoutesForDB(appRouteData);
38+
const domainResolved = await resolveDomainAlias(appRouteData);
39+
const appRoute = transformSpecialRoutesForDB(domainResolved);
3840

3941
const countToUpdate = await db('routes').where('id', appRouteId);
4042
if (!countToUpdate.length) {

0 commit comments

Comments
 (0)