From 980d1fcb86ca9314b1cfe8d4df4c7820fee1bb30 Mon Sep 17 00:00:00 2001 From: Michael Hoffmann Date: Tue, 24 Jun 2025 20:45:31 +0200 Subject: [PATCH] feat: add LinkDrip provider for short linking service --- .env.example | 6 +- .../src/short-linking/providers/linkdrip.ts | 56 +++++++++++++++++++ .../src/short-linking/short.link.service.ts | 5 ++ 3 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 libraries/nestjs-libraries/src/short-linking/providers/linkdrip.ts diff --git a/.env.example b/.env.example index bbdc5e48..9a017b3a 100644 --- a/.env.example +++ b/.env.example @@ -109,4 +109,8 @@ POSTIZ_OAUTH_CLIENT_SECRET="" # KUTT_API_KEY="" # Your Kutt.it API key # KUTT_API_ENDPOINT="https://kutt.it/api/v2" # Your self-hosted Kutt API endpoint -# KUTT_SHORT_LINK_DOMAIN="kutt.it" # Your self-hosted Kutt domain \ No newline at end of file +# KUTT_SHORT_LINK_DOMAIN="kutt.it" # Your self-hosted Kutt domain + +# LINK_DRIP_API_KEY="" # Your LinkDrip API key +# LINK_DRIP_API_ENDPOINT="https://api.linkdrip.com/v1/" # Your self-hosted LinkDrip API endpoint +# LINK_DRIP_SHORT_LINK_DOMAIN="dripl.ink" # Your self-hosted LinkDrip domain \ No newline at end of file diff --git a/libraries/nestjs-libraries/src/short-linking/providers/linkdrip.ts b/libraries/nestjs-libraries/src/short-linking/providers/linkdrip.ts new file mode 100644 index 00000000..ba970fee --- /dev/null +++ b/libraries/nestjs-libraries/src/short-linking/providers/linkdrip.ts @@ -0,0 +1,56 @@ +import { ShortLinking } from '@gitroom/nestjs-libraries/short-linking/short-linking.interface'; + +const LINK_DRIP_API_ENDPOINT = + process.env.LINK_DRIP_API_ENDPOINT || 'https://api.linkdrip.com/v1/'; +const LINK_DRIP_SHORT_LINK_DOMAIN = + process.env.LINK_DRIP_SHORT_LINK_DOMAIN || 'dripl.ink'; + +const getOptions = () => ({ + headers: { + Authorization: `Bearer ${process.env.LINK_DRIP_API_KEY}`, + 'Content-Type': 'application/json', + }, +}); + +export class LinkDrip implements ShortLinking { + shortLinkDomain = LINK_DRIP_SHORT_LINK_DOMAIN; + + async linksStatistics(links: string[]) { + return Promise.resolve([]); + } + + async convertLinkToShortLink(id: string, link: string) { + try { + const response = await fetch(`${LINK_DRIP_API_ENDPOINT}/create`, { + ...getOptions(), + method: 'POST', + body: JSON.stringify({ + target_url: link, + custom_domain: this.shortLinkDomain, + }), + }); + + if (!response.ok) { + throw new Error( + `Failed to create LinkDrip API short link with status: ${response.status}` + ); + } + + const data = await response.json(); + return data.link; + } catch (error) { + throw new Error(`Failed to create LinkDrip short link: ${error}`); + } + } + + async convertShortLinkToLink(shortLink: string) { + return ''; + } + + getAllLinksStatistics( + id: string, + page: number + ): Promise<{ short: string; original: string; clicks: string }[]> { + return Promise.resolve([]); + } +} diff --git a/libraries/nestjs-libraries/src/short-linking/short.link.service.ts b/libraries/nestjs-libraries/src/short-linking/short.link.service.ts index bb73aa9e..98a09592 100644 --- a/libraries/nestjs-libraries/src/short-linking/short.link.service.ts +++ b/libraries/nestjs-libraries/src/short-linking/short.link.service.ts @@ -4,6 +4,7 @@ import { ShortLinking } from '@gitroom/nestjs-libraries/short-linking/short-link import { Injectable } from '@nestjs/common'; import { ShortIo } from './providers/short.io'; import { Kutt } from './providers/kutt'; +import { LinkDrip } from './providers/linkdrip'; const getProvider = (): ShortLinking => { if (process.env.DUB_TOKEN) { @@ -18,6 +19,10 @@ const getProvider = (): ShortLinking => { return new Kutt(); } + if (process.env.LINK_DRIP_API_KEY) { + return new LinkDrip(); + } + return new Empty(); };