@linkforty/core 1.2.0 → 1.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +26 -55
- package/dist/index.js.map +1 -1
- package/dist/lib/database.js +6 -12
- package/dist/lib/database.js.map +1 -1
- package/dist/lib/event-emitter.js +7 -12
- package/dist/lib/event-emitter.js.map +1 -1
- package/dist/lib/fingerprint.js +20 -64
- package/dist/lib/fingerprint.js.map +1 -1
- package/dist/lib/utils.js +11 -21
- package/dist/lib/utils.js.map +1 -1
- package/dist/lib/webhook.js +7 -16
- package/dist/lib/webhook.js.map +1 -1
- package/dist/routes/analytics.js +14 -17
- package/dist/routes/analytics.js.map +1 -1
- package/dist/routes/debug.js +16 -19
- package/dist/routes/debug.js.map +1 -1
- package/dist/routes/index.js +8 -19
- package/dist/routes/index.js.map +1 -1
- package/dist/routes/links.js +38 -41
- package/dist/routes/links.js.map +1 -1
- package/dist/routes/preview.js +4 -7
- package/dist/routes/preview.js.map +1 -1
- package/dist/routes/qr.js +6 -12
- package/dist/routes/qr.js.map +1 -1
- package/dist/routes/redirect.js +19 -55
- package/dist/routes/redirect.js.map +1 -1
- package/dist/routes/sdk.js +28 -31
- package/dist/routes/sdk.js.map +1 -1
- package/dist/routes/webhooks.js +29 -65
- package/dist/routes/webhooks.js.map +1 -1
- package/dist/scripts/migrate.js +2 -4
- package/dist/scripts/migrate.js.map +1 -1
- package/dist/types/index.js +1 -2
- package/package.json +2 -2
package/dist/routes/analytics.js
CHANGED
|
@@ -1,8 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
exports.analyticsRoutes = analyticsRoutes;
|
|
4
|
-
const database_js_1 = require("../lib/database.js");
|
|
5
|
-
async function analyticsRoutes(fastify) {
|
|
1
|
+
import { db } from '../lib/database.js';
|
|
2
|
+
export async function analyticsRoutes(fastify) {
|
|
6
3
|
// Get overall analytics for a user
|
|
7
4
|
fastify.get('/api/analytics/overview', async (request) => {
|
|
8
5
|
const { userId, days = 30 } = request.query;
|
|
@@ -10,14 +7,14 @@ async function analyticsRoutes(fastify) {
|
|
|
10
7
|
throw new Error('userId query parameter is required');
|
|
11
8
|
}
|
|
12
9
|
// Get total and unique clicks
|
|
13
|
-
const clicksResult = await
|
|
10
|
+
const clicksResult = await db.query(`SELECT
|
|
14
11
|
COUNT(*) as total_clicks,
|
|
15
12
|
COUNT(DISTINCT ip_address) as unique_clicks
|
|
16
13
|
FROM click_events ce
|
|
17
14
|
JOIN links l ON ce.link_id = l.id
|
|
18
15
|
WHERE l.user_id = $1 AND ce.clicked_at >= NOW() - INTERVAL '${days} days'`, [userId]);
|
|
19
16
|
// Get clicks by date
|
|
20
|
-
const dateResult = await
|
|
17
|
+
const dateResult = await db.query(`SELECT
|
|
21
18
|
DATE(ce.clicked_at) as date,
|
|
22
19
|
COUNT(*) as clicks
|
|
23
20
|
FROM click_events ce
|
|
@@ -26,7 +23,7 @@ async function analyticsRoutes(fastify) {
|
|
|
26
23
|
GROUP BY DATE(ce.clicked_at)
|
|
27
24
|
ORDER BY date`, [userId]);
|
|
28
25
|
// Get clicks by country
|
|
29
|
-
const countryResult = await
|
|
26
|
+
const countryResult = await db.query(`SELECT
|
|
30
27
|
COALESCE(ce.country_code, 'Unknown') as country_code,
|
|
31
28
|
COALESCE(ce.country_name, ce.country_code, 'Unknown') as country,
|
|
32
29
|
COUNT(*) as clicks
|
|
@@ -36,7 +33,7 @@ async function analyticsRoutes(fastify) {
|
|
|
36
33
|
GROUP BY ce.country_code, ce.country_name
|
|
37
34
|
ORDER BY clicks DESC`, [userId]);
|
|
38
35
|
// Get clicks by device
|
|
39
|
-
const deviceResult = await
|
|
36
|
+
const deviceResult = await db.query(`SELECT
|
|
40
37
|
COALESCE(ce.device_type, 'Unknown') as device,
|
|
41
38
|
COUNT(*) as clicks
|
|
42
39
|
FROM click_events ce
|
|
@@ -45,7 +42,7 @@ async function analyticsRoutes(fastify) {
|
|
|
45
42
|
GROUP BY ce.device_type
|
|
46
43
|
ORDER BY clicks DESC`, [userId]);
|
|
47
44
|
// Get clicks by platform
|
|
48
|
-
const platformResult = await
|
|
45
|
+
const platformResult = await db.query(`SELECT
|
|
49
46
|
COALESCE(ce.platform, 'Unknown') as platform,
|
|
50
47
|
COUNT(*) as clicks
|
|
51
48
|
FROM click_events ce
|
|
@@ -54,7 +51,7 @@ async function analyticsRoutes(fastify) {
|
|
|
54
51
|
GROUP BY ce.platform
|
|
55
52
|
ORDER BY clicks DESC`, [userId]);
|
|
56
53
|
// Get top performing links
|
|
57
|
-
const topLinksResult = await
|
|
54
|
+
const topLinksResult = await db.query(`SELECT
|
|
58
55
|
l.id,
|
|
59
56
|
l.short_code,
|
|
60
57
|
l.title,
|
|
@@ -106,24 +103,24 @@ async function analyticsRoutes(fastify) {
|
|
|
106
103
|
throw new Error('userId query parameter is required');
|
|
107
104
|
}
|
|
108
105
|
// Verify link ownership
|
|
109
|
-
const linkResult = await
|
|
106
|
+
const linkResult = await db.query('SELECT id FROM links WHERE id = $1 AND user_id = $2', [linkId, userId]);
|
|
110
107
|
if (linkResult.rows.length === 0) {
|
|
111
108
|
throw new Error('Link not found');
|
|
112
109
|
}
|
|
113
110
|
// Get analytics for specific link
|
|
114
|
-
const clicksResult = await
|
|
111
|
+
const clicksResult = await db.query(`SELECT
|
|
115
112
|
COUNT(*) as total_clicks,
|
|
116
113
|
COUNT(DISTINCT ip_address) as unique_clicks
|
|
117
114
|
FROM click_events
|
|
118
115
|
WHERE link_id = $1 AND clicked_at >= NOW() - INTERVAL '${days} days'`, [linkId]);
|
|
119
|
-
const dateResult = await
|
|
116
|
+
const dateResult = await db.query(`SELECT
|
|
120
117
|
DATE(clicked_at) as date,
|
|
121
118
|
COUNT(*) as clicks
|
|
122
119
|
FROM click_events
|
|
123
120
|
WHERE link_id = $1 AND clicked_at >= NOW() - INTERVAL '${days} days'
|
|
124
121
|
GROUP BY DATE(clicked_at)
|
|
125
122
|
ORDER BY date`, [linkId]);
|
|
126
|
-
const countryResult = await
|
|
123
|
+
const countryResult = await db.query(`SELECT
|
|
127
124
|
COALESCE(country_code, 'Unknown') as country_code,
|
|
128
125
|
COALESCE(country_name, country_code, 'Unknown') as country,
|
|
129
126
|
COUNT(*) as clicks
|
|
@@ -131,14 +128,14 @@ async function analyticsRoutes(fastify) {
|
|
|
131
128
|
WHERE link_id = $1 AND clicked_at >= NOW() - INTERVAL '${days} days'
|
|
132
129
|
GROUP BY country_code, country_name
|
|
133
130
|
ORDER BY clicks DESC`, [linkId]);
|
|
134
|
-
const deviceResult = await
|
|
131
|
+
const deviceResult = await db.query(`SELECT
|
|
135
132
|
COALESCE(device_type, 'Unknown') as device,
|
|
136
133
|
COUNT(*) as clicks
|
|
137
134
|
FROM click_events
|
|
138
135
|
WHERE link_id = $1 AND clicked_at >= NOW() - INTERVAL '${days} days'
|
|
139
136
|
GROUP BY device_type
|
|
140
137
|
ORDER BY clicks DESC`, [linkId]);
|
|
141
|
-
const platformResult = await
|
|
138
|
+
const platformResult = await db.query(`SELECT
|
|
142
139
|
COALESCE(platform, 'Unknown') as platform,
|
|
143
140
|
COUNT(*) as clicks
|
|
144
141
|
FROM click_events
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"analytics.js","sourceRoot":"","sources":["../../src/routes/analytics.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/debug.js
CHANGED
|
@@ -1,27 +1,24 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const database_js_1 = require("../lib/database.js");
|
|
6
|
-
const utils_js_1 = require("../lib/utils.js");
|
|
7
|
-
const event_emitter_js_1 = require("../lib/event-emitter.js");
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { db } from '../lib/database.js';
|
|
3
|
+
import { detectDevice } from '../lib/utils.js';
|
|
4
|
+
import { subscribeToClickEvents } from '../lib/event-emitter.js';
|
|
8
5
|
/**
|
|
9
6
|
* Device simulation request schema
|
|
10
7
|
*/
|
|
11
|
-
const simulateRequestSchema =
|
|
12
|
-
linkId:
|
|
13
|
-
userId:
|
|
14
|
-
deviceType:
|
|
15
|
-
userAgent:
|
|
16
|
-
country:
|
|
17
|
-
language:
|
|
18
|
-
ipAddress:
|
|
8
|
+
const simulateRequestSchema = z.object({
|
|
9
|
+
linkId: z.string().uuid(),
|
|
10
|
+
userId: z.string().uuid(),
|
|
11
|
+
deviceType: z.enum(['ios', 'android', 'web']).optional(),
|
|
12
|
+
userAgent: z.string().optional(),
|
|
13
|
+
country: z.string().length(2).optional(), // ISO country code
|
|
14
|
+
language: z.string().optional(), // e.g., "en", "es", "fr"
|
|
15
|
+
ipAddress: z.string().ip().optional(),
|
|
19
16
|
});
|
|
20
17
|
/**
|
|
21
18
|
* Debugging routes for testing and validation
|
|
22
19
|
* Premium Cloud-only feature
|
|
23
20
|
*/
|
|
24
|
-
async function debugRoutes(fastify) {
|
|
21
|
+
export async function debugRoutes(fastify) {
|
|
25
22
|
/**
|
|
26
23
|
* POST /api/debug/simulate
|
|
27
24
|
* Simulate a link click with custom device parameters
|
|
@@ -30,7 +27,7 @@ async function debugRoutes(fastify) {
|
|
|
30
27
|
fastify.post('/api/debug/simulate', async (request) => {
|
|
31
28
|
const data = simulateRequestSchema.parse(request.body);
|
|
32
29
|
// Fetch the link
|
|
33
|
-
const linkResult = await
|
|
30
|
+
const linkResult = await db.query(`SELECT * FROM links WHERE id = $1 AND user_id = $2`, [data.linkId, data.userId]);
|
|
34
31
|
if (linkResult.rows.length === 0) {
|
|
35
32
|
throw new Error('Link not found');
|
|
36
33
|
}
|
|
@@ -41,7 +38,7 @@ async function debugRoutes(fastify) {
|
|
|
41
38
|
deviceType = data.deviceType;
|
|
42
39
|
}
|
|
43
40
|
else if (data.userAgent) {
|
|
44
|
-
deviceType =
|
|
41
|
+
deviceType = detectDevice(data.userAgent);
|
|
45
42
|
}
|
|
46
43
|
else {
|
|
47
44
|
deviceType = 'web'; // Default
|
|
@@ -287,7 +284,7 @@ async function debugRoutes(fastify) {
|
|
|
287
284
|
},
|
|
288
285
|
}));
|
|
289
286
|
// Subscribe to click events
|
|
290
|
-
const unsubscribe =
|
|
287
|
+
const unsubscribe = subscribeToClickEvents((eventData) => {
|
|
291
288
|
// Filter by userId
|
|
292
289
|
if (eventData.userId !== userId) {
|
|
293
290
|
return;
|
package/dist/routes/debug.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/routes/debug.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"debug.js","sourceRoot":"","sources":["../../src/routes/debug.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/index.js
CHANGED
|
@@ -1,20 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
Object.defineProperty(exports, "analyticsRoutes", { enumerable: true, get: function () { return analytics_js_1.analyticsRoutes; } });
|
|
10
|
-
var sdk_js_1 = require("./sdk.js");
|
|
11
|
-
Object.defineProperty(exports, "sdkRoutes", { enumerable: true, get: function () { return sdk_js_1.sdkRoutes; } });
|
|
12
|
-
var qr_js_1 = require("./qr.js");
|
|
13
|
-
Object.defineProperty(exports, "qrRoutes", { enumerable: true, get: function () { return qr_js_1.qrRoutes; } });
|
|
14
|
-
var webhooks_js_1 = require("./webhooks.js");
|
|
15
|
-
Object.defineProperty(exports, "webhookRoutes", { enumerable: true, get: function () { return webhooks_js_1.webhookRoutes; } });
|
|
16
|
-
var preview_js_1 = require("./preview.js");
|
|
17
|
-
Object.defineProperty(exports, "previewRoutes", { enumerable: true, get: function () { return preview_js_1.previewRoutes; } });
|
|
18
|
-
var debug_js_1 = require("./debug.js");
|
|
19
|
-
Object.defineProperty(exports, "debugRoutes", { enumerable: true, get: function () { return debug_js_1.debugRoutes; } });
|
|
1
|
+
export { redirectRoutes } from './redirect.js';
|
|
2
|
+
export { linkRoutes } from './links.js';
|
|
3
|
+
export { analyticsRoutes } from './analytics.js';
|
|
4
|
+
export { sdkRoutes } from './sdk.js';
|
|
5
|
+
export { qrRoutes } from './qr.js';
|
|
6
|
+
export { webhookRoutes } from './webhooks.js';
|
|
7
|
+
export { previewRoutes } from './preview.js';
|
|
8
|
+
export { debugRoutes } from './debug.js';
|
|
20
9
|
//# sourceMappingURL=index.js.map
|
package/dist/routes/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/routes/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/routes/links.js
CHANGED
|
@@ -1,45 +1,42 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
campaign: zod_1.z.string().optional(),
|
|
20
|
-
term: zod_1.z.string().optional(),
|
|
21
|
-
content: zod_1.z.string().optional(),
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { db } from '../lib/database.js';
|
|
3
|
+
import { generateShortCode } from '../lib/utils.js';
|
|
4
|
+
const createLinkSchema = z.object({
|
|
5
|
+
userId: z.string().uuid(),
|
|
6
|
+
originalUrl: z.string().url(),
|
|
7
|
+
title: z.string().optional(),
|
|
8
|
+
description: z.string().optional(),
|
|
9
|
+
iosUrl: z.string().url().optional(),
|
|
10
|
+
androidUrl: z.string().url().optional(),
|
|
11
|
+
webFallbackUrl: z.string().url().optional(),
|
|
12
|
+
customCode: z.string().optional(),
|
|
13
|
+
utmParameters: z.object({
|
|
14
|
+
source: z.string().optional(),
|
|
15
|
+
medium: z.string().optional(),
|
|
16
|
+
campaign: z.string().optional(),
|
|
17
|
+
term: z.string().optional(),
|
|
18
|
+
content: z.string().optional(),
|
|
22
19
|
}).optional(),
|
|
23
|
-
targetingRules:
|
|
24
|
-
countries:
|
|
25
|
-
devices:
|
|
26
|
-
languages:
|
|
20
|
+
targetingRules: z.object({
|
|
21
|
+
countries: z.array(z.string()).optional(),
|
|
22
|
+
devices: z.array(z.enum(['ios', 'android', 'web'])).optional(),
|
|
23
|
+
languages: z.array(z.string()).optional(),
|
|
27
24
|
}).optional(),
|
|
28
|
-
ogTitle:
|
|
29
|
-
ogDescription:
|
|
30
|
-
ogImageUrl:
|
|
31
|
-
ogType:
|
|
32
|
-
attributionWindowHours:
|
|
25
|
+
ogTitle: z.string().optional(),
|
|
26
|
+
ogDescription: z.string().optional(),
|
|
27
|
+
ogImageUrl: z.string().url().optional(),
|
|
28
|
+
ogType: z.string().optional(),
|
|
29
|
+
attributionWindowHours: z.number()
|
|
33
30
|
.int('Attribution window must be an integer')
|
|
34
31
|
.min(1, 'Attribution window must be at least 1 hour')
|
|
35
32
|
.max(2160, 'Attribution window must be at most 2160 hours (90 days)')
|
|
36
33
|
.optional(),
|
|
37
|
-
expiresAt:
|
|
34
|
+
expiresAt: z.string().datetime().optional(),
|
|
38
35
|
});
|
|
39
36
|
const updateLinkSchema = createLinkSchema.partial().extend({
|
|
40
|
-
isActive:
|
|
37
|
+
isActive: z.boolean().optional(),
|
|
41
38
|
}).omit({ userId: true });
|
|
42
|
-
async function linkRoutes(fastify) {
|
|
39
|
+
export async function linkRoutes(fastify) {
|
|
43
40
|
// Get all links for a user
|
|
44
41
|
fastify.get('/api/links', async (request) => {
|
|
45
42
|
const { userId } = request.query;
|
|
@@ -55,7 +52,7 @@ async function linkRoutes(fastify) {
|
|
|
55
52
|
GROUP BY l.id
|
|
56
53
|
ORDER BY l.created_at DESC
|
|
57
54
|
`;
|
|
58
|
-
const result = await
|
|
55
|
+
const result = await db.query(query, [userId]);
|
|
59
56
|
return result.rows.map(row => ({
|
|
60
57
|
...row,
|
|
61
58
|
clickCount: parseInt(row.click_count),
|
|
@@ -70,7 +67,7 @@ async function linkRoutes(fastify) {
|
|
|
70
67
|
if (!userId) {
|
|
71
68
|
throw new Error('userId query parameter is required');
|
|
72
69
|
}
|
|
73
|
-
const result = await
|
|
70
|
+
const result = await db.query(`SELECT l.*, COUNT(ce.id) as click_count
|
|
74
71
|
FROM links l
|
|
75
72
|
LEFT JOIN click_events ce ON l.id = ce.link_id
|
|
76
73
|
WHERE l.id = $1 AND l.user_id = $2
|
|
@@ -90,21 +87,21 @@ async function linkRoutes(fastify) {
|
|
|
90
87
|
fastify.post('/api/links', async (request) => {
|
|
91
88
|
const data = createLinkSchema.parse(request.body);
|
|
92
89
|
// Generate short code
|
|
93
|
-
let shortCode = data.customCode ||
|
|
90
|
+
let shortCode = data.customCode || generateShortCode();
|
|
94
91
|
// Ensure short code is unique
|
|
95
92
|
let attempts = 0;
|
|
96
93
|
while (attempts < 10) {
|
|
97
|
-
const existing = await
|
|
94
|
+
const existing = await db.query('SELECT id FROM links WHERE short_code = $1', [shortCode]);
|
|
98
95
|
if (existing.rows.length === 0) {
|
|
99
96
|
break;
|
|
100
97
|
}
|
|
101
|
-
shortCode =
|
|
98
|
+
shortCode = generateShortCode();
|
|
102
99
|
attempts++;
|
|
103
100
|
}
|
|
104
101
|
if (attempts >= 10) {
|
|
105
102
|
throw new Error('Unable to generate unique short code');
|
|
106
103
|
}
|
|
107
|
-
const result = await
|
|
104
|
+
const result = await db.query(`INSERT INTO links (
|
|
108
105
|
user_id, short_code, original_url, title, description,
|
|
109
106
|
ios_url, android_url, web_fallback_url, utm_parameters, targeting_rules,
|
|
110
107
|
og_title, og_description, og_image_url, og_type,
|
|
@@ -167,7 +164,7 @@ async function linkRoutes(fastify) {
|
|
|
167
164
|
}
|
|
168
165
|
updates.push('updated_at = NOW()');
|
|
169
166
|
values.push(id, userId);
|
|
170
|
-
const result = await
|
|
167
|
+
const result = await db.query(`UPDATE links SET ${updates.join(', ')}
|
|
171
168
|
WHERE id = $${paramIndex} AND user_id = $${paramIndex + 1}
|
|
172
169
|
RETURNING *`, values);
|
|
173
170
|
if (result.rows.length === 0) {
|
|
@@ -187,7 +184,7 @@ async function linkRoutes(fastify) {
|
|
|
187
184
|
if (!userId) {
|
|
188
185
|
throw new Error('userId query parameter is required');
|
|
189
186
|
}
|
|
190
|
-
const result = await
|
|
187
|
+
const result = await db.query('DELETE FROM links WHERE id = $1 AND user_id = $2 RETURNING id', [id, userId]);
|
|
191
188
|
if (result.rows.length === 0) {
|
|
192
189
|
throw new Error('Link not found');
|
|
193
190
|
}
|
package/dist/routes/links.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/routes/links.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"links.js","sourceRoot":"","sources":["../../src/routes/links.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/preview.js
CHANGED
|
@@ -1,7 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.previewRoutes = previewRoutes;
|
|
4
|
-
const database_js_1 = require("../lib/database.js");
|
|
1
|
+
import { db } from '../lib/database.js';
|
|
5
2
|
/**
|
|
6
3
|
* Detect if the request is from a social media scraper/bot
|
|
7
4
|
* These bots crawl links to generate previews when shared on social platforms
|
|
@@ -144,7 +141,7 @@ function escapeHtml(text) {
|
|
|
144
141
|
};
|
|
145
142
|
return text.replace(/[&<>"']/g, (m) => map[m]);
|
|
146
143
|
}
|
|
147
|
-
async function previewRoutes(fastify) {
|
|
144
|
+
export async function previewRoutes(fastify) {
|
|
148
145
|
/**
|
|
149
146
|
* GET /:shortCode/preview
|
|
150
147
|
* Always return HTML preview page with Open Graph tags
|
|
@@ -157,7 +154,7 @@ async function previewRoutes(fastify) {
|
|
|
157
154
|
: 'https://link.forty';
|
|
158
155
|
try {
|
|
159
156
|
// Lookup link by short code
|
|
160
|
-
const result = await
|
|
157
|
+
const result = await db.query(`SELECT * FROM links
|
|
161
158
|
WHERE short_code = $1 AND is_active = true
|
|
162
159
|
AND (expires_at IS NULL OR expires_at > NOW())`, [shortCode]);
|
|
163
160
|
if (result.rows.length === 0) {
|
|
@@ -199,7 +196,7 @@ async function previewRoutes(fastify) {
|
|
|
199
196
|
// If it's a social scraper, return OG preview HTML
|
|
200
197
|
if (isSocialScraper(userAgent)) {
|
|
201
198
|
try {
|
|
202
|
-
const result = await
|
|
199
|
+
const result = await db.query(`SELECT * FROM links
|
|
203
200
|
WHERE short_code = $1 AND is_active = true
|
|
204
201
|
AND (expires_at IS NULL OR expires_at > NOW())`, [shortCode]);
|
|
205
202
|
if (result.rows.length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/routes/preview.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/routes/preview.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/qr.js
CHANGED
|
@@ -1,15 +1,9 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.qrRoutes = qrRoutes;
|
|
7
|
-
const qrcode_1 = __importDefault(require("qrcode"));
|
|
8
|
-
const database_js_1 = require("../lib/database.js");
|
|
1
|
+
import QRCode from 'qrcode';
|
|
2
|
+
import { db } from '../lib/database.js';
|
|
9
3
|
/**
|
|
10
4
|
* QR Code Routes - Generate QR codes for links
|
|
11
5
|
*/
|
|
12
|
-
async function qrRoutes(fastify) {
|
|
6
|
+
export async function qrRoutes(fastify) {
|
|
13
7
|
/**
|
|
14
8
|
* GET /api/links/:id/qr
|
|
15
9
|
* Generate QR code for a link
|
|
@@ -63,7 +57,7 @@ async function qrRoutes(fastify) {
|
|
|
63
57
|
}
|
|
64
58
|
}
|
|
65
59
|
// Get link from database
|
|
66
|
-
const result = await
|
|
60
|
+
const result = await db.query('SELECT short_code, original_url FROM links WHERE id = $1 AND is_active = true', [id]);
|
|
67
61
|
if (result.rows.length === 0) {
|
|
68
62
|
return reply.status(404).send({ error: 'Link not found' });
|
|
69
63
|
}
|
|
@@ -86,7 +80,7 @@ async function qrRoutes(fastify) {
|
|
|
86
80
|
};
|
|
87
81
|
if (format === 'png') {
|
|
88
82
|
// Generate PNG as buffer
|
|
89
|
-
const buffer = await
|
|
83
|
+
const buffer = await QRCode.toBuffer(shortUrl, options);
|
|
90
84
|
// Cache as base64
|
|
91
85
|
if (fastify.redis) {
|
|
92
86
|
try {
|
|
@@ -104,7 +98,7 @@ async function qrRoutes(fastify) {
|
|
|
104
98
|
}
|
|
105
99
|
else {
|
|
106
100
|
// Generate SVG as string
|
|
107
|
-
const svg = await
|
|
101
|
+
const svg = await QRCode.toString(shortUrl, {
|
|
108
102
|
...options,
|
|
109
103
|
type: 'svg',
|
|
110
104
|
});
|
package/dist/routes/qr.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../src/routes/qr.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"qr.js","sourceRoot":"","sources":["../../src/routes/qr.ts"],"names":[],"mappings":"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"}
|