From 93464bfa091a5dadb4a2cae62897e4ef6d43652c Mon Sep 17 00:00:00 2001 From: Eddy Hernandez Date: Fri, 23 May 2025 10:55:57 -0700 Subject: [PATCH] feat(short-linking): make Dub provider configurable for self-hosting --- .env.example | 5 ++++ .../src/short-linking/providers/dub.ts | 23 +++++++++++-------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.env.example b/.env.example index 3c8ebde2..7549f16e 100644 --- a/.env.example +++ b/.env.example @@ -100,3 +100,8 @@ POSTIZ_OAUTH_USERINFO_URL="https://authentik.example.com/application/o/userinfo" POSTIZ_OAUTH_CLIENT_ID="" POSTIZ_OAUTH_CLIENT_SECRET="" # POSTIZ_OAUTH_SCOPE="openid profile email" # default values + +# Short Link Service Settings +# DUB_TOKEN="" # Your self-hosted Dub API token +# DUB_API_ENDPOINT="https://api.dub.co" # Your self-hosted Dub API endpoint +# DUB_SHORT_LINK_DOMAIN="dub.sh" # Your self-hosted Dub domain diff --git a/libraries/nestjs-libraries/src/short-linking/providers/dub.ts b/libraries/nestjs-libraries/src/short-linking/providers/dub.ts index cc61a150..b0352680 100644 --- a/libraries/nestjs-libraries/src/short-linking/providers/dub.ts +++ b/libraries/nestjs-libraries/src/short-linking/providers/dub.ts @@ -1,20 +1,23 @@ import { ShortLinking } from '@gitroom/nestjs-libraries/short-linking/short-linking.interface'; -const options = { +const DUB_API_ENDPOINT = process.env.DUB_API_ENDPOINT || 'https://api.dub.co'; +const DUB_SHORT_LINK_DOMAIN = process.env.DUB_SHORT_LINK_DOMAIN || 'dub.sh'; + +const getOptions = () => ({ headers: { Authorization: `Bearer ${process.env.DUB_TOKEN}`, 'Content-Type': 'application/json', }, -}; +}); export class Dub implements ShortLinking { - shortLinkDomain = 'dub.sh'; + shortLinkDomain = DUB_SHORT_LINK_DOMAIN; async linksStatistics(links: string[]) { return Promise.all( links.map(async (link) => { const response = await ( - await fetch(`https://api.dub.co/links/info?domain=${this.shortLinkDomain}&key=${link.split('/').pop()}`, options) + await fetch(`${DUB_API_ENDPOINT}/links/info?domain=${this.shortLinkDomain}&key=${link.split('/').pop()}`, getOptions()) ).json(); return { @@ -29,8 +32,8 @@ export class Dub implements ShortLinking { async convertLinkToShortLink(id: string, link: string) { return ( await ( - await fetch(`https://api.dub.co/links`, { - ...options, + await fetch(`${DUB_API_ENDPOINT}/links`, { + ...getOptions(), method: 'POST', body: JSON.stringify({ url: link, @@ -46,8 +49,8 @@ export class Dub implements ShortLinking { return await ( await ( await fetch( - `https://api.dub.co/links/info?domain=${shortLink}`, - options + `${DUB_API_ENDPOINT}/links/info?domain=${shortLink}`, + getOptions() ) ).json() ).url; @@ -60,8 +63,8 @@ export class Dub implements ShortLinking { ): Promise<{ short: string; original: string; clicks: string }[]> { const response = await ( await fetch( - `https://api.dub.co/links?tenantId=${id}&page=${page}&pageSize=100`, - options + `${DUB_API_ENDPOINT}/links?tenantId=${id}&page=${page}&pageSize=100`, + getOptions() ) ).json();