diff --git a/package.json b/package.json index 860566c375..16535fa94c 100644 --- a/package.json +++ b/package.json @@ -167,6 +167,7 @@ "serve-favicon": "^2.5.0", "slug": "^9.0.0", "stoppable": "^1.1.0", + "tldts": "7.0.6", "ts-toolbelt": "^9.6.0", "type-is": "^1.6.18", "ulidx": "^2.4.1", diff --git a/src/lib/features/feature-links/feature-link-service.test.ts b/src/lib/features/feature-links/feature-link-service.test.ts index 7efd1eb078..2b8e2163ee 100644 --- a/src/lib/features/feature-links/feature-link-service.test.ts +++ b/src/lib/features/feature-links/feature-link-service.test.ts @@ -11,13 +11,18 @@ test('create, update and delete feature link', async () => { const link = await featureLinkService.createLink( 'default', - { featureName: 'feature', url: 'example.com', title: 'some title' }, + { + featureName: 'feature', + url: 'complex.example.com', + title: 'some title', + }, {} as IAuditUser, ); expect(link).toMatchObject({ featureName: 'feature', - url: 'https://example.com', + url: 'https://complex.example.com', title: 'some title', + domain: 'example', }); const newLink = await featureLinkService.updateLink( @@ -33,6 +38,7 @@ test('create, update and delete feature link', async () => { featureName: 'feature', url: 'https://example1.com', title: 'new title', + domain: 'example1', }); await featureLinkService.deleteLink( diff --git a/src/lib/features/feature-links/feature-link-service.ts b/src/lib/features/feature-links/feature-link-service.ts index 739abd5834..ab9b69f3f1 100644 --- a/src/lib/features/feature-links/feature-link-service.ts +++ b/src/lib/features/feature-links/feature-link-service.ts @@ -13,6 +13,7 @@ import type { import type EventService from '../events/event-service'; import { BadDataError, NotFoundError } from '../../error'; import normalizeUrl from 'normalize-url'; +import { parse } from 'tldts'; interface IFeatureLinkStoreObj { featureLinkStore: IFeatureLinkStore; @@ -47,14 +48,16 @@ export default class FeatureLinkService { async createLink( projectId: string, - newLink: Omit, + newLink: Omit, auditUser: IAuditUser, ): Promise { const normalizedUrl = this.normalize(newLink.url); + const { domainWithoutSuffix } = parse(normalizedUrl); const link = await this.featureLinkStore.insert({ ...newLink, url: normalizedUrl, + domain: domainWithoutSuffix, }); await this.eventService.storeEvent( @@ -71,10 +74,11 @@ export default class FeatureLinkService { async updateLink( { projectId, linkId }: { projectId: string; linkId: string }, - updatedLink: Omit, + updatedLink: Omit, auditUser: IAuditUser, ): Promise { const normalizedUrl = this.normalize(updatedLink.url); + const { domainWithoutSuffix } = parse(normalizedUrl); const preData = await this.featureLinkStore.get(linkId); @@ -85,6 +89,7 @@ export default class FeatureLinkService { const link = await this.featureLinkStore.update(linkId, { ...updatedLink, url: normalizedUrl, + domain: domainWithoutSuffix, }); await this.eventService.storeEvent( diff --git a/src/lib/features/feature-links/feature-link-store-type.ts b/src/lib/features/feature-links/feature-link-store-type.ts index defb86ffb3..ea39c573ee 100644 --- a/src/lib/features/feature-links/feature-link-store-type.ts +++ b/src/lib/features/feature-links/feature-link-store-type.ts @@ -5,6 +5,7 @@ export interface IFeatureLink { featureName: string; url: string; title?: string; + domain: string | null; } export interface IFeatureLinkStore extends Store { diff --git a/yarn.lock b/yarn.lock index 07c10d925a..77f9b3767b 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9061,6 +9061,24 @@ __metadata: languageName: node linkType: hard +"tldts-core@npm:^7.0.6": + version: 7.0.6 + resolution: "tldts-core@npm:7.0.6" + checksum: 10c0/32910f8098bdbb313e3d5ff1ef80cac51568c7682ab5de44d244edf7a08e02b1f7918677c8bf7d52c79f864d4b972bcec83b46e439d0a447f6049423394000c3 + languageName: node + linkType: hard + +"tldts@npm:7.0.6": + version: 7.0.6 + resolution: "tldts@npm:7.0.6" + dependencies: + tldts-core: "npm:^7.0.6" + bin: + tldts: bin/cli.js + checksum: 10c0/9c23a74c017a4cc73323543dc372fb00fc5ee3d4851cdebb4d9d65e7a959c386fc4e40c96574aed8f8c1214956d3777cb9438edf34538e2f1501be94ab1b98fb + languageName: node + linkType: hard + "tmpl@npm:1.0.5": version: 1.0.5 resolution: "tmpl@npm:1.0.5" @@ -9483,6 +9501,7 @@ __metadata: stoppable: "npm:^1.1.0" superagent: "npm:10.2.0" supertest: "npm:7.0.0" + tldts: "npm:7.0.6" ts-node: "npm:10.9.2" ts-toolbelt: "npm:^9.6.0" tsc-watch: "npm:6.2.1"