@linkforty/core 1.2.0 → 1.3.0
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/README.md +7 -3
- 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.d.ts.map +1 -1
- package/dist/routes/qr.js +10 -15
- 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/redirect.js
CHANGED
|
@@ -1,44 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
-
var ownKeys = function(o) {
|
|
20
|
-
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
-
var ar = [];
|
|
22
|
-
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
-
return ar;
|
|
24
|
-
};
|
|
25
|
-
return ownKeys(o);
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.redirectRoutes = redirectRoutes;
|
|
37
|
-
const database_js_1 = require("../lib/database.js");
|
|
38
|
-
const utils_js_1 = require("../lib/utils.js");
|
|
39
|
-
const fingerprint_js_1 = require("../lib/fingerprint.js");
|
|
40
|
-
const event_emitter_js_1 = require("../lib/event-emitter.js");
|
|
41
|
-
async function redirectRoutes(fastify) {
|
|
1
|
+
import { db } from '../lib/database.js';
|
|
2
|
+
import { parseUserAgent, getLocationFromIP, buildRedirectUrl, detectDevice } from '../lib/utils.js';
|
|
3
|
+
import { storeFingerprintForClick } from '../lib/fingerprint.js';
|
|
4
|
+
import { emitClickEvent } from '../lib/event-emitter.js';
|
|
5
|
+
export async function redirectRoutes(fastify) {
|
|
42
6
|
// Helper function to handle the actual redirect logic
|
|
43
7
|
async function handleRedirect(request, reply, shortCode, templateSlug) {
|
|
44
8
|
let linkData = null;
|
|
@@ -77,7 +41,7 @@ async function redirectRoutes(fastify) {
|
|
|
77
41
|
`;
|
|
78
42
|
params = [shortCode];
|
|
79
43
|
}
|
|
80
|
-
const result = await
|
|
44
|
+
const result = await db.query(query, params);
|
|
81
45
|
if (result.rows.length === 0) {
|
|
82
46
|
return reply.status(404).send({ error: 'Link not found' });
|
|
83
47
|
}
|
|
@@ -99,8 +63,8 @@ async function redirectRoutes(fastify) {
|
|
|
99
63
|
const ip = request.ip;
|
|
100
64
|
const acceptLanguage = request.headers['accept-language'] || '';
|
|
101
65
|
// Get user's actual data for targeting checks
|
|
102
|
-
const device =
|
|
103
|
-
const { countryCode } =
|
|
66
|
+
const device = detectDevice(userAgent);
|
|
67
|
+
const { countryCode } = getLocationFromIP(ip);
|
|
104
68
|
// Extract primary language from accept-language header (e.g., "en-US,en;q=0.9" -> "en")
|
|
105
69
|
const primaryLanguage = acceptLanguage.split(',')[0]?.split('-')[0]?.toLowerCase();
|
|
106
70
|
const rules = link.targeting_rules;
|
|
@@ -137,9 +101,9 @@ async function redirectRoutes(fastify) {
|
|
|
137
101
|
const ip = request.ip;
|
|
138
102
|
const referrer = request.headers.referer || null;
|
|
139
103
|
const acceptLanguage = request.headers['accept-language'] || '';
|
|
140
|
-
const deviceType =
|
|
141
|
-
const { platform, platformVersion } =
|
|
142
|
-
const { countryCode, countryName, region, city, latitude, longitude, timezone } =
|
|
104
|
+
const deviceType = detectDevice(userAgent);
|
|
105
|
+
const { platform, platformVersion } = parseUserAgent(userAgent);
|
|
106
|
+
const { countryCode, countryName, region, city, latitude, longitude, timezone } = getLocationFromIP(ip);
|
|
143
107
|
// Extract UTM parameters from query string
|
|
144
108
|
const query = request.query;
|
|
145
109
|
const utmSource = query?.utm_source;
|
|
@@ -151,7 +115,7 @@ async function redirectRoutes(fastify) {
|
|
|
151
115
|
const fpScreenWidth = query?.fp_sw ? parseInt(query.fp_sw, 10) : undefined;
|
|
152
116
|
const fpScreenHeight = query?.fp_sh ? parseInt(query.fp_sh, 10) : undefined;
|
|
153
117
|
// Insert click event
|
|
154
|
-
const clickResult = await
|
|
118
|
+
const clickResult = await db.query(`INSERT INTO click_events (
|
|
155
119
|
link_id, ip_address, user_agent, device_type, platform,
|
|
156
120
|
country_code, country_name, region, city, latitude, longitude, timezone,
|
|
157
121
|
utm_source, utm_medium, utm_campaign, referrer
|
|
@@ -186,7 +150,7 @@ async function redirectRoutes(fastify) {
|
|
|
186
150
|
platform: deviceType,
|
|
187
151
|
platformVersion,
|
|
188
152
|
};
|
|
189
|
-
await
|
|
153
|
+
await storeFingerprintForClick(clickId, fingerprintData);
|
|
190
154
|
// Determine redirect URL for event emission
|
|
191
155
|
let redirectUrl = link.original_url;
|
|
192
156
|
let redirectReason = 'original_url';
|
|
@@ -202,9 +166,9 @@ async function redirectRoutes(fastify) {
|
|
|
202
166
|
redirectUrl = link.web_fallback_url;
|
|
203
167
|
redirectReason = 'web_fallback_url';
|
|
204
168
|
}
|
|
205
|
-
const finalRedirectUrl =
|
|
169
|
+
const finalRedirectUrl = buildRedirectUrl(redirectUrl, link.utm_parameters);
|
|
206
170
|
// Emit click event for real-time streaming to WebSocket clients
|
|
207
|
-
|
|
171
|
+
emitClickEvent({
|
|
208
172
|
eventId: clickId,
|
|
209
173
|
timestamp: new Date().toISOString(),
|
|
210
174
|
linkId: link.id,
|
|
@@ -225,9 +189,9 @@ async function redirectRoutes(fastify) {
|
|
|
225
189
|
});
|
|
226
190
|
// Trigger webhooks for click_event
|
|
227
191
|
try {
|
|
228
|
-
const webhooksResult = await
|
|
192
|
+
const webhooksResult = await db.query('SELECT * FROM webhooks WHERE user_id = $1 AND is_active = true', [link.user_id]);
|
|
229
193
|
if (webhooksResult.rows.length > 0) {
|
|
230
|
-
const { triggerWebhooks } = await
|
|
194
|
+
const { triggerWebhooks } = await import('../lib/webhook.js');
|
|
231
195
|
const clickEventData = {
|
|
232
196
|
id: clickId,
|
|
233
197
|
linkId: link.id,
|
|
@@ -263,7 +227,7 @@ async function redirectRoutes(fastify) {
|
|
|
263
227
|
});
|
|
264
228
|
// Determine redirect URL based on device
|
|
265
229
|
const userAgent = request.headers['user-agent'] || '';
|
|
266
|
-
const device =
|
|
230
|
+
const device = detectDevice(userAgent);
|
|
267
231
|
let redirectUrl = link.original_url;
|
|
268
232
|
// Check for device-specific URLs
|
|
269
233
|
if (device === 'ios' && link.ios_url) {
|
|
@@ -276,7 +240,7 @@ async function redirectRoutes(fastify) {
|
|
|
276
240
|
redirectUrl = link.web_fallback_url;
|
|
277
241
|
}
|
|
278
242
|
// Add UTM parameters
|
|
279
|
-
const finalUrl =
|
|
243
|
+
const finalUrl = buildRedirectUrl(redirectUrl, link.utm_parameters);
|
|
280
244
|
// Redirect
|
|
281
245
|
return reply.redirect(302, finalUrl);
|
|
282
246
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/routes/redirect.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../src/routes/redirect.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/sdk.js
CHANGED
|
@@ -1,15 +1,12 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const database_js_1 = require("../lib/database.js");
|
|
6
|
-
const fingerprint_js_1 = require("../lib/fingerprint.js");
|
|
7
|
-
const webhook_js_1 = require("../lib/webhook.js");
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { db } from '../lib/database.js';
|
|
3
|
+
import { recordInstallEvent, } from '../lib/fingerprint.js';
|
|
4
|
+
import { triggerWebhooks } from '../lib/webhook.js';
|
|
8
5
|
/**
|
|
9
6
|
* SDK Routes - Mobile SDK endpoints for deferred deep linking
|
|
10
7
|
* These endpoints are used by the mobile SDKs to report installs and retrieve attribution data
|
|
11
8
|
*/
|
|
12
|
-
async function sdkRoutes(fastify) {
|
|
9
|
+
export async function sdkRoutes(fastify) {
|
|
13
10
|
/**
|
|
14
11
|
* POST /api/sdk/v1/install
|
|
15
12
|
* Report app installation and retrieve deferred deep link data
|
|
@@ -34,17 +31,17 @@ async function sdkRoutes(fastify) {
|
|
|
34
31
|
* - deepLinkData: Deep link data if matched (shortCode, URLs, UTM params, etc.)
|
|
35
32
|
*/
|
|
36
33
|
fastify.post('/api/sdk/v1/install', async (request, reply) => {
|
|
37
|
-
const schema =
|
|
38
|
-
ipAddress:
|
|
39
|
-
userAgent:
|
|
40
|
-
timezone:
|
|
41
|
-
language:
|
|
42
|
-
screenWidth:
|
|
43
|
-
screenHeight:
|
|
44
|
-
platform:
|
|
45
|
-
platformVersion:
|
|
46
|
-
deviceId:
|
|
47
|
-
attributionWindowHours:
|
|
34
|
+
const schema = z.object({
|
|
35
|
+
ipAddress: z.string().optional(),
|
|
36
|
+
userAgent: z.string(),
|
|
37
|
+
timezone: z.string().optional(),
|
|
38
|
+
language: z.string().optional(),
|
|
39
|
+
screenWidth: z.number().optional(),
|
|
40
|
+
screenHeight: z.number().optional(),
|
|
41
|
+
platform: z.string().optional(),
|
|
42
|
+
platformVersion: z.string().optional(),
|
|
43
|
+
deviceId: z.string().optional(),
|
|
44
|
+
attributionWindowHours: z.number().optional(),
|
|
48
45
|
});
|
|
49
46
|
const body = schema.parse(request.body);
|
|
50
47
|
// Use client-provided IP or fallback to request IP
|
|
@@ -60,7 +57,7 @@ async function sdkRoutes(fastify) {
|
|
|
60
57
|
platformVersion: body.platformVersion,
|
|
61
58
|
};
|
|
62
59
|
try {
|
|
63
|
-
const result = await
|
|
60
|
+
const result = await recordInstallEvent(fingerprintData, body.deviceId, body.attributionWindowHours);
|
|
64
61
|
return reply.status(200).send({
|
|
65
62
|
installId: result.installId,
|
|
66
63
|
attributed: result.match !== null,
|
|
@@ -93,7 +90,7 @@ async function sdkRoutes(fastify) {
|
|
|
93
90
|
const { fingerprint } = request.params;
|
|
94
91
|
try {
|
|
95
92
|
// Look up install event by fingerprint
|
|
96
|
-
const installResult = await
|
|
93
|
+
const installResult = await db.query(`SELECT
|
|
97
94
|
ie.*,
|
|
98
95
|
l.short_code,
|
|
99
96
|
l.original_url,
|
|
@@ -115,7 +112,7 @@ async function sdkRoutes(fastify) {
|
|
|
115
112
|
const attributed = install.link_id !== null;
|
|
116
113
|
let clickData = null;
|
|
117
114
|
if (install.click_id) {
|
|
118
|
-
const clickResult = await
|
|
115
|
+
const clickResult = await db.query(`SELECT * FROM click_events WHERE id = $1`, [install.click_id]);
|
|
119
116
|
if (clickResult.rows.length > 0) {
|
|
120
117
|
clickData = clickResult.rows[0];
|
|
121
118
|
}
|
|
@@ -176,16 +173,16 @@ async function sdkRoutes(fastify) {
|
|
|
176
173
|
* - acknowledged: Boolean confirmation
|
|
177
174
|
*/
|
|
178
175
|
fastify.post('/api/sdk/v1/event', async (request, reply) => {
|
|
179
|
-
const schema =
|
|
180
|
-
installId:
|
|
181
|
-
eventName:
|
|
182
|
-
eventData:
|
|
183
|
-
timestamp:
|
|
176
|
+
const schema = z.object({
|
|
177
|
+
installId: z.string().uuid(),
|
|
178
|
+
eventName: z.string(),
|
|
179
|
+
eventData: z.record(z.any()).optional(),
|
|
180
|
+
timestamp: z.string().datetime().optional(),
|
|
184
181
|
});
|
|
185
182
|
const body = schema.parse(request.body);
|
|
186
183
|
try {
|
|
187
184
|
// Verify install exists and get link_id for webhook lookup
|
|
188
|
-
const installCheck = await
|
|
185
|
+
const installCheck = await db.query(`SELECT id, link_id FROM install_events WHERE id = $1`, [body.installId]);
|
|
189
186
|
if (installCheck.rows.length === 0) {
|
|
190
187
|
return reply.status(404).send({
|
|
191
188
|
error: 'Install event not found',
|
|
@@ -194,7 +191,7 @@ async function sdkRoutes(fastify) {
|
|
|
194
191
|
const install = installCheck.rows[0];
|
|
195
192
|
const eventTimestamp = body.timestamp || new Date().toISOString();
|
|
196
193
|
// Insert event into in_app_events table
|
|
197
|
-
const eventResult = await
|
|
194
|
+
const eventResult = await db.query(`INSERT INTO in_app_events (install_id, event_name, event_data, event_timestamp)
|
|
198
195
|
VALUES ($1, $2, $3, $4)
|
|
199
196
|
RETURNING id`, [
|
|
200
197
|
body.installId,
|
|
@@ -214,7 +211,7 @@ async function sdkRoutes(fastify) {
|
|
|
214
211
|
// Trigger conversion_event webhooks if install was attributed to a link
|
|
215
212
|
if (install.link_id) {
|
|
216
213
|
// Query webhooks for the user who owns the link
|
|
217
|
-
const webhooksResult = await
|
|
214
|
+
const webhooksResult = await db.query(`SELECT w.*
|
|
218
215
|
FROM webhooks w
|
|
219
216
|
INNER JOIN links l ON l.user_id = w.user_id
|
|
220
217
|
WHERE l.id = $1 AND w.is_active = true`, [install.link_id]);
|
|
@@ -231,7 +228,7 @@ async function sdkRoutes(fastify) {
|
|
|
231
228
|
setImmediate(async () => {
|
|
232
229
|
// Trigger webhooks without delivery logging (basic version)
|
|
233
230
|
// For delivery logging, use @linkforty/cloud premium features
|
|
234
|
-
|
|
231
|
+
triggerWebhooks(webhooksResult.rows, 'conversion_event', eventId, eventData).catch((error) => {
|
|
235
232
|
fastify.log.error('Failed to trigger conversion webhooks:', error);
|
|
236
233
|
});
|
|
237
234
|
});
|
package/dist/routes/sdk.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/routes/sdk.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sdk.js","sourceRoot":"","sources":["../../src/routes/sdk.ts"],"names":[],"mappings":"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"}
|
package/dist/routes/webhooks.js
CHANGED
|
@@ -1,69 +1,33 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { db } from '../lib/database.js';
|
|
3
|
+
import { generateWebhookSecret } from '../lib/webhook.js';
|
|
4
|
+
const webhookEventSchema = z.enum(['click_event', 'install_event', 'conversion_event']);
|
|
5
|
+
const createWebhookSchema = z.object({
|
|
6
|
+
userId: z.string().uuid(),
|
|
7
|
+
name: z.string().min(1).max(255),
|
|
8
|
+
url: z.string().url(),
|
|
9
|
+
events: z.array(webhookEventSchema).min(1),
|
|
10
|
+
headers: z.record(z.string()).optional(),
|
|
11
|
+
retryCount: z.number().int().min(1).max(10).optional(),
|
|
12
|
+
timeoutMs: z.number().int().min(1000).max(60000).optional(),
|
|
17
13
|
});
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
};
|
|
27
|
-
return function (mod) {
|
|
28
|
-
if (mod && mod.__esModule) return mod;
|
|
29
|
-
var result = {};
|
|
30
|
-
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
-
__setModuleDefault(result, mod);
|
|
32
|
-
return result;
|
|
33
|
-
};
|
|
34
|
-
})();
|
|
35
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.webhookRoutes = webhookRoutes;
|
|
37
|
-
const zod_1 = require("zod");
|
|
38
|
-
const database_js_1 = require("../lib/database.js");
|
|
39
|
-
const webhook_js_1 = require("../lib/webhook.js");
|
|
40
|
-
const webhookEventSchema = zod_1.z.enum(['click_event', 'install_event', 'conversion_event']);
|
|
41
|
-
const createWebhookSchema = zod_1.z.object({
|
|
42
|
-
userId: zod_1.z.string().uuid(),
|
|
43
|
-
name: zod_1.z.string().min(1).max(255),
|
|
44
|
-
url: zod_1.z.string().url(),
|
|
45
|
-
events: zod_1.z.array(webhookEventSchema).min(1),
|
|
46
|
-
headers: zod_1.z.record(zod_1.z.string()).optional(),
|
|
47
|
-
retryCount: zod_1.z.number().int().min(1).max(10).optional(),
|
|
48
|
-
timeoutMs: zod_1.z.number().int().min(1000).max(60000).optional(),
|
|
49
|
-
});
|
|
50
|
-
const updateWebhookSchema = zod_1.z.object({
|
|
51
|
-
name: zod_1.z.string().min(1).max(255).optional(),
|
|
52
|
-
url: zod_1.z.string().url().optional(),
|
|
53
|
-
events: zod_1.z.array(webhookEventSchema).min(1).optional(),
|
|
54
|
-
isActive: zod_1.z.boolean().optional(),
|
|
55
|
-
headers: zod_1.z.record(zod_1.z.string()).optional(),
|
|
56
|
-
retryCount: zod_1.z.number().int().min(1).max(10).optional(),
|
|
57
|
-
timeoutMs: zod_1.z.number().int().min(1000).max(60000).optional(),
|
|
14
|
+
const updateWebhookSchema = z.object({
|
|
15
|
+
name: z.string().min(1).max(255).optional(),
|
|
16
|
+
url: z.string().url().optional(),
|
|
17
|
+
events: z.array(webhookEventSchema).min(1).optional(),
|
|
18
|
+
isActive: z.boolean().optional(),
|
|
19
|
+
headers: z.record(z.string()).optional(),
|
|
20
|
+
retryCount: z.number().int().min(1).max(10).optional(),
|
|
21
|
+
timeoutMs: z.number().int().min(1000).max(60000).optional(),
|
|
58
22
|
});
|
|
59
|
-
async function webhookRoutes(fastify) {
|
|
23
|
+
export async function webhookRoutes(fastify) {
|
|
60
24
|
// Get all webhooks for a user
|
|
61
25
|
fastify.get('/api/webhooks', async (request) => {
|
|
62
26
|
const { userId } = request.query;
|
|
63
27
|
if (!userId) {
|
|
64
28
|
throw new Error('userId query parameter is required');
|
|
65
29
|
}
|
|
66
|
-
const result = await
|
|
30
|
+
const result = await db.query(`SELECT id, user_id, name, url, events, is_active, retry_count, timeout_ms, headers, created_at, updated_at
|
|
67
31
|
FROM webhooks
|
|
68
32
|
WHERE user_id = $1
|
|
69
33
|
ORDER BY created_at DESC`, [userId]);
|
|
@@ -77,7 +41,7 @@ async function webhookRoutes(fastify) {
|
|
|
77
41
|
if (!userId) {
|
|
78
42
|
throw new Error('userId query parameter is required');
|
|
79
43
|
}
|
|
80
|
-
const result = await
|
|
44
|
+
const result = await db.query('SELECT * FROM webhooks WHERE id = $1 AND user_id = $2', [id, userId]);
|
|
81
45
|
if (result.rows.length === 0) {
|
|
82
46
|
throw new Error('Webhook not found');
|
|
83
47
|
}
|
|
@@ -87,8 +51,8 @@ async function webhookRoutes(fastify) {
|
|
|
87
51
|
fastify.post('/api/webhooks', async (request) => {
|
|
88
52
|
const data = createWebhookSchema.parse(request.body);
|
|
89
53
|
// Generate secure random secret
|
|
90
|
-
const secret =
|
|
91
|
-
const result = await
|
|
54
|
+
const secret = generateWebhookSecret();
|
|
55
|
+
const result = await db.query(`INSERT INTO webhooks (user_id, name, url, secret, events, retry_count, timeout_ms, headers)
|
|
92
56
|
VALUES ($1, $2, $3, $4, $5, $6, $7, $8)
|
|
93
57
|
RETURNING *`, [
|
|
94
58
|
data.userId,
|
|
@@ -147,7 +111,7 @@ async function webhookRoutes(fastify) {
|
|
|
147
111
|
}
|
|
148
112
|
updates.push(`updated_at = NOW()`);
|
|
149
113
|
values.push(id, userId);
|
|
150
|
-
const result = await
|
|
114
|
+
const result = await db.query(`UPDATE webhooks
|
|
151
115
|
SET ${updates.join(', ')}
|
|
152
116
|
WHERE id = $${paramCount++} AND user_id = $${paramCount}
|
|
153
117
|
RETURNING *`, values);
|
|
@@ -163,7 +127,7 @@ async function webhookRoutes(fastify) {
|
|
|
163
127
|
if (!userId) {
|
|
164
128
|
throw new Error('userId query parameter is required');
|
|
165
129
|
}
|
|
166
|
-
const result = await
|
|
130
|
+
const result = await db.query('DELETE FROM webhooks WHERE id = $1 AND user_id = $2 RETURNING id', [id, userId]);
|
|
167
131
|
if (result.rows.length === 0) {
|
|
168
132
|
throw new Error('Webhook not found');
|
|
169
133
|
}
|
|
@@ -177,7 +141,7 @@ async function webhookRoutes(fastify) {
|
|
|
177
141
|
throw new Error('userId query parameter is required');
|
|
178
142
|
}
|
|
179
143
|
// Get webhook
|
|
180
|
-
const webhookResult = await
|
|
144
|
+
const webhookResult = await db.query('SELECT * FROM webhooks WHERE id = $1 AND user_id = $2', [id, userId]);
|
|
181
145
|
if (webhookResult.rows.length === 0) {
|
|
182
146
|
throw new Error('Webhook not found');
|
|
183
147
|
}
|
|
@@ -199,7 +163,7 @@ async function webhookRoutes(fastify) {
|
|
|
199
163
|
},
|
|
200
164
|
};
|
|
201
165
|
// Deliver webhook synchronously for testing
|
|
202
|
-
const { deliverWebhook } = await
|
|
166
|
+
const { deliverWebhook } = await import('../lib/webhook.js');
|
|
203
167
|
const result = await deliverWebhook(webhook, testPayload);
|
|
204
168
|
return {
|
|
205
169
|
success: result.success,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/routes/webhooks.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"webhooks.js","sourceRoot":"","sources":["../../src/routes/webhooks.ts"],"names":[],"mappings":"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"}
|
package/dist/scripts/migrate.js
CHANGED
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
const database_js_1 = require("../lib/database.js");
|
|
1
|
+
import { initializeDatabase } from '../lib/database.js';
|
|
4
2
|
async function runMigrations() {
|
|
5
3
|
try {
|
|
6
4
|
console.log('Starting database migration...');
|
|
7
|
-
await
|
|
5
|
+
await initializeDatabase();
|
|
8
6
|
console.log('Database migration completed successfully!');
|
|
9
7
|
process.exit(0);
|
|
10
8
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/scripts/migrate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"migrate.js","sourceRoot":"","sources":["../../src/scripts/migrate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,KAAK,UAAU,aAAa;IAC1B,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAC9C,MAAM,kBAAkB,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;QAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,mBAAmB,EAAE,KAAK,CAAC,CAAC;QAC1C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,aAAa,EAAE,CAAC"}
|
package/dist/types/index.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@linkforty/core",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Open-source deeplink management engine with device detection and analytics",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"dependencies": {
|
|
28
28
|
"@fastify/cors": "^8.4.0",
|
|
29
29
|
"@fastify/redis": "^6.1.0",
|
|
30
|
-
"@fastify/websocket": "^
|
|
30
|
+
"@fastify/websocket": "^10.0.1",
|
|
31
31
|
"@types/qrcode": "^1.5.6",
|
|
32
32
|
"dotenv": "^16.3.0",
|
|
33
33
|
"fastify": "^4.24.0",
|