@huloglobal/vendure-plugin-geo-block 0.1.0 → 0.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.
@@ -15,7 +15,11 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.GeoBlockController = void 0;
16
16
  const common_1 = require("@nestjs/common");
17
17
  const core_1 = require("@vendure/core");
18
+ const geo_block_event_entity_1 = require("./geo-block-event.entity");
18
19
  const geo_regions_1 = require("./geo-regions");
20
+ const plugin_1 = require("./plugin");
21
+ const proxy_headers_1 = require("./proxy-headers");
22
+ const loggerCtx = 'GeoBlockController';
19
23
  function requireAdmin(ctx, res, write = false) {
20
24
  if (!(ctx === null || ctx === void 0 ? void 0 : ctx.activeUserId)) {
21
25
  res.status(401).json({ error: 'Authentication required' });
@@ -32,21 +36,44 @@ const DEFAULTS = {
32
36
  channelToken: '',
33
37
  geoBlock: {
34
38
  enabled: false,
39
+ mode: 'block',
35
40
  allowedCountries: ['GB'],
36
41
  blockedCountries: [],
37
42
  allowedGbRegions: ['ENG', 'WLS'],
38
43
  allowedRegions: [],
44
+ blockMessage: '',
45
+ blockRedirectUrl: null,
46
+ blockLogoUrl: null,
39
47
  },
40
48
  companyData: { showCompanyNumber: false, companyNumber: '' },
41
49
  };
50
+ const parseList = (raw, fallback = []) => {
51
+ if (Array.isArray(raw))
52
+ return raw.filter(v => typeof v === 'string');
53
+ if (typeof raw !== 'string' || !raw.length)
54
+ return fallback;
55
+ try {
56
+ const parsed = JSON.parse(raw);
57
+ if (Array.isArray(parsed))
58
+ return parsed.filter(v => typeof v === 'string');
59
+ }
60
+ catch { }
61
+ return raw.split(',').map(s => s.trim()).filter(Boolean);
62
+ };
42
63
  /**
43
- * Public endpoint serving the storefront-facing site config for a given
44
- * channel. The storefront calls GET /ees/site-config and identifies the
45
- * channel via the standard `vendure-token` header (the same one shop-api
46
- * uses), or via ?token=<channelToken> as a fallback for static fetchers.
64
+ * Public + admin endpoints for the storefront geo-block.
65
+ *
66
+ * Public:
67
+ * GET /geo-block/site-config — channel-aware rules the storefront caches
68
+ * GET /geo-block/check — per-request decision (with logging)
69
+ * GET /geo-block/presets — preset catalogue for the storefront banner
47
70
  *
48
- * Returned shape is deliberately small + flat so the frontend can cache
49
- * it in module memory and re-fetch every 60s without much overhead.
71
+ * Admin:
72
+ * GET /geo-block/admin/channels — all channels + their rules
73
+ * POST /geo-block/admin/save — save one channel's rules
74
+ * GET /geo-block/admin/stats — block totals + top blocked countries
75
+ * POST /geo-block/admin/simulate — "what would happen if a visitor from X visited?"
76
+ * POST /geo-block/admin/gc — prune old GeoBlockEvent rows
50
77
  */
51
78
  let GeoBlockController = class GeoBlockController {
52
79
  constructor(connection) {
@@ -58,99 +85,132 @@ let GeoBlockController = class GeoBlockController {
58
85
  || req.query.token
59
86
  || '';
60
87
  const token = headerToken.trim();
61
- if (!token) {
88
+ if (!token)
62
89
  return { ...DEFAULTS };
63
- }
64
- const rows = await this.connection.rawConnection.query(`SELECT token,
65
- customFieldsShowcompanynumber AS showCompanyNumber,
66
- customFieldsBusinesscompanynumber AS companyNumber,
67
- customFieldsGeoblockenabled AS geoBlockEnabled,
68
- customFieldsGeoblockallowedregions AS allowedRegions,
69
- customFieldsGeoblockallowedcountries AS extraAllowed,
70
- customFieldsGeoblockblockedcountries AS blockedCountries,
71
- customFieldsGeoblockallowedgbregions AS allowedGbRegions
72
- FROM channel
73
- WHERE token = ?
74
- LIMIT 1`, [token]);
75
- if (!rows.length) {
90
+ const row = await this.loadChannelRow(token);
91
+ if (!row)
76
92
  return { ...DEFAULTS, channelToken: token };
77
- }
78
- const r = rows[0];
79
- const parseList = (raw, fallback) => {
80
- if (Array.isArray(raw))
81
- return raw.filter(v => typeof v === 'string');
82
- if (typeof raw !== 'string' || !raw.length)
83
- return fallback;
84
- try {
85
- const parsed = JSON.parse(raw);
86
- if (Array.isArray(parsed))
87
- return parsed.filter(v => typeof v === 'string');
88
- }
89
- catch { }
90
- // MariaDB stores list customFields as a JSON-encoded text. Be
91
- // forgiving of a CSV fallback for older rows.
92
- return raw.split(',').map(s => s.trim()).filter(Boolean);
93
- };
94
- const allowedRegions = parseList(r.allowedRegions, []);
95
- const extraAllowed = parseList(r.extraAllowed, ['GB']);
96
- const blockedCountries = parseList(r.blockedCountries, []);
97
- // Resolve regions + extras − blocked into a single flat allow-list.
98
- // `allowed === null` means WORLDWIDE — no country filter, only the
99
- // denylist applies.
100
- const resolved = (0, geo_regions_1.resolveAllowedCountries)({
101
- regions: allowedRegions,
102
- extraAllowed,
103
- blocked: blockedCountries,
104
- });
105
- return {
106
- channelToken: token,
107
- geoBlock: {
108
- enabled: !!Number(r.geoBlockEnabled || 0),
109
- allowedCountries: resolved.allowed,
110
- blockedCountries: resolved.blocked,
111
- allowedGbRegions: parseList(r.allowedGbRegions, ['ENG', 'WLS']),
112
- allowedRegions,
113
- },
114
- companyData: {
115
- showCompanyNumber: !!Number(r.showCompanyNumber || 0),
116
- companyNumber: String(r.companyNumber || ''),
117
- },
118
- };
93
+ return this.buildConfig(token, row);
119
94
  }
120
95
  /**
121
- * Admin: list every channel with its current geo-block settings.
122
- * Used by the dedicated Vendure admin page so the admin can switch
123
- * between Elite / LicenseDock / any future channel from a single
124
- * screen.
96
+ * Per-request decision endpoint. The storefront calls this on entry
97
+ * (or middleware can call it) with optional `?country=` overrides.
98
+ * Logs the decision so the admin stats panel shows top blocked
99
+ * countries.
100
+ *
101
+ * Returns 200 with `{ allowed: boolean, reason, mode }` regardless —
102
+ * the storefront decides whether to redirect or render a banner.
125
103
  */
104
+ async check(req, res) {
105
+ const headerToken = req.headers['vendure-token']
106
+ || req.headers['x-vendure-token']
107
+ || req.query.token
108
+ || '';
109
+ const token = headerToken.trim();
110
+ if (!token)
111
+ return res.json({ allowed: true, reason: 'no-channel' });
112
+ const row = await this.loadChannelRow(token);
113
+ if (!row)
114
+ return res.json({ allowed: true, reason: 'unknown-channel' });
115
+ const cfg = this.buildConfig(token, row);
116
+ // Optional override (?country=US) for testing — non-prod only;
117
+ // honoured but logged at the trust level of the caller.
118
+ const ip = (0, proxy_headers_1.getRealIp)(req);
119
+ const country = req.query.country
120
+ || (0, proxy_headers_1.getResolvedCountry)(req)
121
+ || null;
122
+ const region = req.query.region
123
+ || (0, proxy_headers_1.getResolvedRegion)(req)
124
+ || null;
125
+ const opts = (0, plugin_1.getOptions)();
126
+ const allowlist = parseList(row.ipAllowlist || '');
127
+ const channelId = Number(row.id) || 1;
128
+ // 1. IP allowlist trumps everything else.
129
+ if ((0, geo_regions_1.ipMatchesAny)(ip, allowlist)) {
130
+ return res.json({ allowed: true, reason: 'ip-allowlist', mode: cfg.geoBlock.mode });
131
+ }
132
+ // 2. Scheduled maintenance window.
133
+ if (opts.maintenanceWindow && inWindow(opts.maintenanceWindow)) {
134
+ await this.logEvent({
135
+ channelId, country, region, ip,
136
+ ua: req.headers['user-agent'],
137
+ url: req.originalUrl,
138
+ decision: cfg.geoBlock.mode === 'soft' ? 'soft-block' : 'block',
139
+ reason: 'maintenance',
140
+ });
141
+ return res.json({
142
+ allowed: false,
143
+ reason: 'maintenance',
144
+ mode: cfg.geoBlock.mode,
145
+ message: cfg.geoBlock.blockMessage || 'The site is temporarily unavailable. Please try again later.',
146
+ redirectUrl: cfg.geoBlock.blockRedirectUrl,
147
+ });
148
+ }
149
+ // 3. Channel rules.
150
+ const verdict = (0, geo_regions_1.isAllowed)(country, region, {
151
+ enabled: cfg.geoBlock.enabled,
152
+ allowedCountries: cfg.geoBlock.allowedCountries,
153
+ blockedCountries: cfg.geoBlock.blockedCountries,
154
+ allowedGbRegions: cfg.geoBlock.allowedGbRegions,
155
+ });
156
+ if (!verdict.allowed) {
157
+ await this.logEvent({
158
+ channelId, country, region, ip,
159
+ ua: req.headers['user-agent'],
160
+ url: req.originalUrl,
161
+ decision: cfg.geoBlock.mode === 'soft' ? 'soft-block' : 'block',
162
+ reason: verdict.reason,
163
+ });
164
+ return res.json({
165
+ allowed: false,
166
+ reason: verdict.reason,
167
+ mode: cfg.geoBlock.mode,
168
+ message: cfg.geoBlock.blockMessage || this.defaultMessage(verdict.reason),
169
+ redirectUrl: cfg.geoBlock.blockRedirectUrl,
170
+ logoUrl: cfg.geoBlock.blockLogoUrl,
171
+ });
172
+ }
173
+ return res.json({ allowed: true, reason: verdict.reason, mode: cfg.geoBlock.mode });
174
+ }
175
+ /** Catalogue of available region presets — fed to the admin picker
176
+ * and any storefront that wants to show "we serve <X>". */
177
+ presets(res) {
178
+ return res.json({ presets: geo_regions_1.REGION_PRESETS });
179
+ }
180
+ /** Admin: plugin health + update availability. Read by the admin UI
181
+ * banner so the operator sees when a new version is on npm. */
182
+ async status(ctx, res) {
183
+ if (!requireAdmin(ctx, res, false))
184
+ return;
185
+ const updater = plugin_1.GeoBlockPlugin.getUpdateChecker();
186
+ const update = updater ? updater.getStatus() : null;
187
+ return res.json({
188
+ packageName: plugin_1.GeoBlockPlugin.getPackageName(),
189
+ version: plugin_1.GeoBlockPlugin.getPackageVersion(),
190
+ update,
191
+ uptimeSec: Math.round(process.uptime()),
192
+ });
193
+ }
126
194
  async listChannels(ctx, res) {
127
195
  if (!requireAdmin(ctx, res, false))
128
196
  return;
129
197
  const rows = await this.connection.rawConnection.query(`SELECT id, code, token,
130
198
  COALESCE(customFieldsGeoblockenabled, 0) AS geoBlockEnabled,
199
+ customFieldsGeoblockmode AS geoBlockMode,
131
200
  customFieldsGeoblockallowedregions AS allowedRegions,
132
201
  customFieldsGeoblockallowedcountries AS extraAllowed,
133
202
  customFieldsGeoblockblockedcountries AS blockedCountries,
134
- customFieldsGeoblockallowedgbregions AS allowedGbRegions
203
+ customFieldsGeoblockallowedgbregions AS allowedGbRegions,
204
+ customFieldsGeoblockipallowlist AS ipAllowlist,
205
+ customFieldsGeoblockblockmessage AS blockMessage,
206
+ customFieldsGeoblockblockredirecturl AS blockRedirectUrl,
207
+ customFieldsGeoblockblocklogourl AS blockLogoUrl
135
208
  FROM channel
136
209
  ORDER BY id`);
137
- const parseList = (raw, fallback) => {
138
- if (Array.isArray(raw))
139
- return raw.filter(v => typeof v === 'string');
140
- if (typeof raw !== 'string' || !raw.length)
141
- return fallback;
142
- try {
143
- const parsed = JSON.parse(raw);
144
- if (Array.isArray(parsed))
145
- return parsed.filter(v => typeof v === 'string');
146
- }
147
- catch { }
148
- return raw.split(',').map(s => s.trim()).filter(Boolean);
149
- };
150
210
  const result = rows.map((r) => {
151
- const allowedRegions = parseList(r.allowedRegions, []);
152
- const extraAllowed = parseList(r.extraAllowed, []);
153
- const blockedCountries = parseList(r.blockedCountries, []);
211
+ const allowedRegions = parseList(r.allowedRegions);
212
+ const extraAllowed = parseList(r.extraAllowed);
213
+ const blockedCountries = parseList(r.blockedCountries);
154
214
  const resolved = (0, geo_regions_1.resolveAllowedCountries)({
155
215
  regions: allowedRegions,
156
216
  extraAllowed,
@@ -161,19 +221,20 @@ let GeoBlockController = class GeoBlockController {
161
221
  code: r.code,
162
222
  token: r.token,
163
223
  enabled: !!Number(r.geoBlockEnabled || 0),
224
+ mode: (r.geoBlockMode || 'block'),
164
225
  allowedRegions,
165
226
  extraAllowed,
166
227
  blockedCountries,
167
- allowedGbRegions: parseList(r.allowedGbRegions, []),
228
+ allowedGbRegions: parseList(r.allowedGbRegions),
229
+ ipAllowlist: parseList(r.ipAllowlist),
230
+ blockMessage: r.blockMessage || '',
231
+ blockRedirectUrl: r.blockRedirectUrl || '',
232
+ blockLogoUrl: r.blockLogoUrl || '',
168
233
  resolved: { allowedCountries: resolved.allowed, blockedCountries: resolved.blocked },
169
234
  };
170
235
  });
171
236
  return res.json({ channels: result });
172
237
  }
173
- /**
174
- * Admin: save the geo-block settings for one channel. Body shape
175
- * mirrors what `listChannels` returns (minus the resolved preview).
176
- */
177
238
  async saveChannel(ctx, body, res) {
178
239
  if (!requireAdmin(ctx, res, true))
179
240
  return;
@@ -186,23 +247,197 @@ let GeoBlockController = class GeoBlockController {
186
247
  const clean = v.filter(x => typeof x === 'string').map(x => x.trim().toUpperCase()).filter(Boolean);
187
248
  return JSON.stringify(Array.from(new Set(clean)));
188
249
  };
189
- const enabled = body.enabled ? 1 : 0;
190
- const regions = normList(body.allowedRegions);
191
- const extras = normList(body.extraAllowed);
192
- const blocked = normList(body.blockedCountries);
193
- const gbRegions = normList(body.allowedGbRegions);
250
+ const normIpList = (v) => {
251
+ if (!Array.isArray(v))
252
+ return '[]';
253
+ const clean = v.filter(x => typeof x === 'string').map(x => x.trim()).filter(Boolean);
254
+ return JSON.stringify(Array.from(new Set(clean)));
255
+ };
256
+ const mode = body.mode === 'soft' ? 'soft' : 'block';
194
257
  const updated = await this.connection.rawConnection.query(`UPDATE channel
195
258
  SET customFieldsGeoblockenabled = ?,
259
+ customFieldsGeoblockmode = ?,
196
260
  customFieldsGeoblockallowedregions = ?,
197
261
  customFieldsGeoblockallowedcountries = ?,
198
262
  customFieldsGeoblockblockedcountries = ?,
199
- customFieldsGeoblockallowedgbregions = ?
200
- WHERE token = ?`, [enabled, regions, extras, blocked, gbRegions, body.token]);
201
- if (!updated.affectedRows) {
263
+ customFieldsGeoblockallowedgbregions = ?,
264
+ customFieldsGeoblockipallowlist = ?,
265
+ customFieldsGeoblockblockmessage = ?,
266
+ customFieldsGeoblockblockredirecturl = ?,
267
+ customFieldsGeoblockblocklogourl = ?
268
+ WHERE token = ?`, [
269
+ body.enabled ? 1 : 0,
270
+ mode,
271
+ normList(body.allowedRegions),
272
+ normList(body.extraAllowed),
273
+ normList(body.blockedCountries),
274
+ normList(body.allowedGbRegions),
275
+ normIpList(body.ipAllowlist),
276
+ String(body.blockMessage || '').slice(0, 4000),
277
+ String(body.blockRedirectUrl || '').slice(0, 2048),
278
+ String(body.blockLogoUrl || '').slice(0, 2048),
279
+ body.token,
280
+ ]);
281
+ if (!updated.affectedRows)
202
282
  return res.status(404).json({ error: 'channel not found' });
203
- }
204
283
  return res.json({ ok: true });
205
284
  }
285
+ /**
286
+ * Admin: top blocked countries + daily series + totals over the last
287
+ * N days (default 30). Fed straight into the admin Stats panel.
288
+ */
289
+ async stats(ctx, req, res) {
290
+ if (!requireAdmin(ctx, res, false))
291
+ return;
292
+ const days = Math.min(Math.max(parseInt(req.query.days || '30', 10) || 30, 1), 365);
293
+ const channelId = req.query.channelId
294
+ ? parseInt(String(req.query.channelId), 10) : null;
295
+ const where = channelId
296
+ ? 'createdAt >= DATE_SUB(NOW(), INTERVAL ? DAY) AND channelId = ?'
297
+ : 'createdAt >= DATE_SUB(NOW(), INTERVAL ? DAY)';
298
+ const params = channelId ? [days, channelId] : [days];
299
+ const top = await this.connection.rawConnection.query(`SELECT country, COUNT(*) AS n
300
+ FROM geo_block_event WHERE ${where}
301
+ GROUP BY country ORDER BY n DESC LIMIT 20`, params);
302
+ const series = await this.connection.rawConnection.query(`SELECT DATE(createdAt) AS day,
303
+ SUM(decision='block') AS blocked,
304
+ SUM(decision='soft-block') AS softBlocked
305
+ FROM geo_block_event WHERE ${where}
306
+ GROUP BY DATE(createdAt) ORDER BY day`, params);
307
+ const totals = await this.connection.rawConnection.query(`SELECT
308
+ SUM(decision='block') AS blocked,
309
+ SUM(decision='soft-block') AS softBlocked,
310
+ COUNT(*) AS total,
311
+ COUNT(DISTINCT ip) AS uniqueIps
312
+ FROM geo_block_event WHERE ${where}`, params);
313
+ const reasons = await this.connection.rawConnection.query(`SELECT reason, COUNT(*) AS n
314
+ FROM geo_block_event WHERE ${where}
315
+ GROUP BY reason ORDER BY n DESC`, params);
316
+ return res.json({
317
+ days, channelId,
318
+ totals: totals[0] || {},
319
+ topCountries: top,
320
+ series, reasons,
321
+ });
322
+ }
323
+ /**
324
+ * Admin: dry-run check — "what would happen if a visitor from US
325
+ * with no UK region came in?". Lets the admin sanity-check their
326
+ * rules without standing up a proxy.
327
+ */
328
+ async simulate(ctx, body, res) {
329
+ if (!requireAdmin(ctx, res, false))
330
+ return;
331
+ if (!(body === null || body === void 0 ? void 0 : body.token))
332
+ return res.status(400).json({ error: 'channel token required' });
333
+ const row = await this.loadChannelRow(body.token);
334
+ if (!row)
335
+ return res.status(404).json({ error: 'channel not found' });
336
+ const cfg = this.buildConfig(body.token, row);
337
+ const verdict = (0, geo_regions_1.isAllowed)(body.country || null, body.region || null, {
338
+ enabled: cfg.geoBlock.enabled,
339
+ allowedCountries: cfg.geoBlock.allowedCountries,
340
+ blockedCountries: cfg.geoBlock.blockedCountries,
341
+ allowedGbRegions: cfg.geoBlock.allowedGbRegions,
342
+ });
343
+ return res.json({
344
+ input: {
345
+ country: body.country || null,
346
+ region: body.region || null,
347
+ ip: body.ip || null,
348
+ },
349
+ verdict,
350
+ ipMatchesAllowlist: (0, geo_regions_1.ipMatchesAny)(body.ip, parseList(row.ipAllowlist || '')),
351
+ effectiveRules: cfg.geoBlock,
352
+ });
353
+ }
354
+ async gc(ctx, body, res) {
355
+ var _a;
356
+ if (!requireAdmin(ctx, res, true))
357
+ return;
358
+ const olderThanDays = Math.max(1, parseInt((body === null || body === void 0 ? void 0 : body.olderThanDays) || '90', 10) || 90);
359
+ const result = await this.connection.rawConnection.query(`DELETE FROM geo_block_event WHERE createdAt < DATE_SUB(NOW(), INTERVAL ? DAY)`, [olderThanDays]);
360
+ return res.json({ deleted: (_a = result === null || result === void 0 ? void 0 : result.affectedRows) !== null && _a !== void 0 ? _a : 0, olderThanDays });
361
+ }
362
+ // -- private helpers ---------------------------------------------------
363
+ async loadChannelRow(token) {
364
+ const rows = await this.connection.rawConnection.query(`SELECT id, token,
365
+ customFieldsShowcompanynumber AS showCompanyNumber,
366
+ customFieldsBusinesscompanynumber AS companyNumber,
367
+ customFieldsGeoblockenabled AS geoBlockEnabled,
368
+ customFieldsGeoblockmode AS geoBlockMode,
369
+ customFieldsGeoblockallowedregions AS allowedRegions,
370
+ customFieldsGeoblockallowedcountries AS extraAllowed,
371
+ customFieldsGeoblockblockedcountries AS blockedCountries,
372
+ customFieldsGeoblockallowedgbregions AS allowedGbRegions,
373
+ customFieldsGeoblockipallowlist AS ipAllowlist,
374
+ customFieldsGeoblockblockmessage AS blockMessage,
375
+ customFieldsGeoblockblockredirecturl AS blockRedirectUrl,
376
+ customFieldsGeoblockblocklogourl AS blockLogoUrl
377
+ FROM channel WHERE token = ? LIMIT 1`, [token]);
378
+ return rows[0] || null;
379
+ }
380
+ buildConfig(token, r) {
381
+ const allowedRegions = parseList(r.allowedRegions);
382
+ const extraAllowed = parseList(r.extraAllowed, ['GB']);
383
+ const blockedCountries = parseList(r.blockedCountries);
384
+ const resolved = (0, geo_regions_1.resolveAllowedCountries)({
385
+ regions: allowedRegions,
386
+ extraAllowed,
387
+ blocked: blockedCountries,
388
+ });
389
+ return {
390
+ channelToken: token,
391
+ geoBlock: {
392
+ enabled: !!Number(r.geoBlockEnabled || 0),
393
+ mode: (r.geoBlockMode === 'soft' ? 'soft' : 'block'),
394
+ allowedCountries: resolved.allowed,
395
+ blockedCountries: resolved.blocked,
396
+ allowedGbRegions: parseList(r.allowedGbRegions, ['ENG', 'WLS']),
397
+ allowedRegions,
398
+ blockMessage: String(r.blockMessage || ''),
399
+ blockRedirectUrl: r.blockRedirectUrl || null,
400
+ blockLogoUrl: r.blockLogoUrl || null,
401
+ },
402
+ companyData: {
403
+ showCompanyNumber: !!Number(r.showCompanyNumber || 0),
404
+ companyNumber: String(r.companyNumber || ''),
405
+ },
406
+ };
407
+ }
408
+ async logEvent(input) {
409
+ try {
410
+ const repo = this.connection.rawConnection.getRepository(geo_block_event_entity_1.GeoBlockEvent);
411
+ const row = repo.create({
412
+ channelId: input.channelId,
413
+ country: input.country ? input.country.toUpperCase().slice(0, 8) : null,
414
+ region: input.region ? input.region.toUpperCase().slice(0, 8) : null,
415
+ ip: input.ip ? input.ip.slice(0, 64) : null,
416
+ userAgent: input.ua ? String(input.ua).slice(0, 500) : null,
417
+ url: (input.url || '').slice(0, 2048),
418
+ decision: input.decision,
419
+ reason: input.reason.slice(0, 64),
420
+ });
421
+ await repo.save(row);
422
+ }
423
+ catch (e) {
424
+ core_1.Logger.warn(`geo-block event log failed: ${e === null || e === void 0 ? void 0 : e.message}`, loggerCtx);
425
+ }
426
+ }
427
+ defaultMessage(reason) {
428
+ switch (reason) {
429
+ case 'denylist':
430
+ return 'This service is not available in your country.';
431
+ case 'country-not-allowed':
432
+ return 'This service is not available in your country.';
433
+ case 'uk-region-not-allowed':
434
+ return 'This service is only available in selected UK regions.';
435
+ case 'maintenance':
436
+ return 'The site is temporarily unavailable. Please try again later.';
437
+ default:
438
+ return 'Access denied.';
439
+ }
440
+ }
206
441
  };
207
442
  exports.GeoBlockController = GeoBlockController;
208
443
  __decorate([
@@ -212,6 +447,29 @@ __decorate([
212
447
  __metadata("design:paramtypes", [Object]),
213
448
  __metadata("design:returntype", Promise)
214
449
  ], GeoBlockController.prototype, "getConfig", null);
450
+ __decorate([
451
+ (0, common_1.Get)('check'),
452
+ __param(0, (0, common_1.Req)()),
453
+ __param(1, (0, common_1.Res)()),
454
+ __metadata("design:type", Function),
455
+ __metadata("design:paramtypes", [Object, Object]),
456
+ __metadata("design:returntype", Promise)
457
+ ], GeoBlockController.prototype, "check", null);
458
+ __decorate([
459
+ (0, common_1.Get)('presets'),
460
+ __param(0, (0, common_1.Res)()),
461
+ __metadata("design:type", Function),
462
+ __metadata("design:paramtypes", [Object]),
463
+ __metadata("design:returntype", void 0)
464
+ ], GeoBlockController.prototype, "presets", null);
465
+ __decorate([
466
+ (0, common_1.Get)('status'),
467
+ __param(0, (0, core_1.Ctx)()),
468
+ __param(1, (0, common_1.Res)()),
469
+ __metadata("design:type", Function),
470
+ __metadata("design:paramtypes", [core_1.RequestContext, Object]),
471
+ __metadata("design:returntype", Promise)
472
+ ], GeoBlockController.prototype, "status", null);
215
473
  __decorate([
216
474
  (0, common_1.Get)('admin/channels'),
217
475
  __param(0, (0, core_1.Ctx)()),
@@ -229,8 +487,43 @@ __decorate([
229
487
  __metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
230
488
  __metadata("design:returntype", Promise)
231
489
  ], GeoBlockController.prototype, "saveChannel", null);
490
+ __decorate([
491
+ (0, common_1.Get)('admin/stats'),
492
+ __param(0, (0, core_1.Ctx)()),
493
+ __param(1, (0, common_1.Req)()),
494
+ __param(2, (0, common_1.Res)()),
495
+ __metadata("design:type", Function),
496
+ __metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
497
+ __metadata("design:returntype", Promise)
498
+ ], GeoBlockController.prototype, "stats", null);
499
+ __decorate([
500
+ (0, common_1.Post)('admin/simulate'),
501
+ __param(0, (0, core_1.Ctx)()),
502
+ __param(1, (0, common_1.Body)()),
503
+ __param(2, (0, common_1.Res)()),
504
+ __metadata("design:type", Function),
505
+ __metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
506
+ __metadata("design:returntype", Promise)
507
+ ], GeoBlockController.prototype, "simulate", null);
508
+ __decorate([
509
+ (0, common_1.Post)('admin/gc'),
510
+ __param(0, (0, core_1.Ctx)()),
511
+ __param(1, (0, common_1.Body)()),
512
+ __param(2, (0, common_1.Res)()),
513
+ __metadata("design:type", Function),
514
+ __metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
515
+ __metadata("design:returntype", Promise)
516
+ ], GeoBlockController.prototype, "gc", null);
232
517
  exports.GeoBlockController = GeoBlockController = __decorate([
233
518
  (0, common_1.Controller)('geo-block'),
234
519
  __metadata("design:paramtypes", [core_1.TransactionalConnection])
235
520
  ], GeoBlockController);
521
+ function inWindow(w) {
522
+ const now = Date.now();
523
+ const start = Date.parse(w.startsAt);
524
+ const end = Date.parse(w.endsAt);
525
+ if (!isFinite(start) || !isFinite(end))
526
+ return false;
527
+ return now >= start && now <= end;
528
+ }
236
529
  //# sourceMappingURL=geo-block.controller.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"geo-block.controller.js","sourceRoot":"","sources":["../src/geo-block.controller.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAuE;AACvE,wCAAyF;AAEzF,+CAAwD;AAExD,SAAS,YAAY,CAAC,GAAmB,EAAE,GAAa,EAAE,KAAK,GAAG,KAAK;IACnE,IAAI,CAAC,CAAA,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,YAAY,CAAA,EAAE,CAAC;QACrB,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,yBAAyB,EAAE,CAAC,CAAC;QAC3D,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAU,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,iBAAU,CAAC,WAAW,CAAC,CAAC;IAC7E,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,MAAM,CAAC,EAAE,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,0BAA0B,EAAE,CAAC,CAAC;QAC5D,OAAO,KAAK,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AA6BD,MAAM,QAAQ,GAAe;IACzB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE;QACN,OAAO,EAAE,KAAK;QACd,gBAAgB,EAAE,CAAC,IAAI,CAAC;QACxB,gBAAgB,EAAE,EAAE;QACpB,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC;QAChC,cAAc,EAAE,EAAE;KACrB;IACD,WAAW,EAAE,EAAE,iBAAiB,EAAE,KAAK,EAAE,aAAa,EAAE,EAAE,EAAE;CAC/D,CAAC;AAEF;;;;;;;;GAQG;AAEI,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IAC3B,YAAoB,UAAmC;QAAnC,eAAU,GAAV,UAAU,CAAyB;IAAG,CAAC;IAGrD,AAAN,KAAK,CAAC,SAAS,CAAQ,GAAY;QAC/B,MAAM,WAAW,GAAI,GAAG,CAAC,OAAO,CAAC,eAAe,CAAY;eACpD,GAAG,CAAC,OAAO,CAAC,iBAAiB,CAAY;eACzC,GAAG,CAAC,KAAK,CAAC,KAAgB;eAC3B,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACT,OAAO,EAAE,GAAG,QAAQ,EAAE,CAAC;QAC3B,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAClD;;;;;;;;;;qBAUS,EACT,CAAC,KAAK,CAAC,CACV,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACf,OAAO,EAAE,GAAG,QAAQ,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;QAChD,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,SAAS,GAAG,CAAC,GAAQ,EAAE,QAAkB,EAAY,EAAE;YACzD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;YACtE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAC;YAC5D,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;YAChF,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,8DAA8D;YAC9D,8CAA8C;YAC9C,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC;QAEF,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;QAE3D,oEAAoE;QACpE,mEAAmE;QACnE,oBAAoB;QACpB,MAAM,QAAQ,GAAG,IAAA,qCAAuB,EAAC;YACrC,OAAO,EAAE,cAAc;YACvB,YAAY;YACZ,OAAO,EAAE,gBAAgB;SAC5B,CAAC,CAAC;QAEH,OAAO;YACH,YAAY,EAAE,KAAK;YACnB,QAAQ,EAAE;gBACN,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;gBACzC,gBAAgB,EAAE,QAAQ,CAAC,OAAO;gBAClC,gBAAgB,EAAE,QAAQ,CAAC,OAAO;gBAClC,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC/D,cAAc;aACjB;YACD,WAAW,EAAE;gBACT,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,iBAAiB,IAAI,CAAC,CAAC;gBACrD,aAAa,EAAE,MAAM,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAAC;aAC/C;SACJ,CAAC;IACN,CAAC;IAED;;;;;OAKG;IAEG,AAAN,KAAK,CAAC,YAAY,CAAQ,GAAmB,EAAS,GAAa;QAC/D,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC;YAAE,OAAO;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CAClD;;;;;;;yBAOa,CAChB,CAAC;QACF,MAAM,SAAS,GAAG,CAAC,GAAQ,EAAE,QAAkB,EAAY,EAAE;YACzD,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;YACtE,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAC;YAC5D,IAAI,CAAC;gBACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBAC/B,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;oBAAE,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;YAChF,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;YACV,OAAO,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE;YAC/B,MAAM,cAAc,GAAG,SAAS,CAAC,CAAC,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;YACvD,MAAM,YAAY,GAAG,SAAS,CAAC,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC;YACnD,MAAM,gBAAgB,GAAG,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC;YAC3D,MAAM,QAAQ,GAAG,IAAA,qCAAuB,EAAC;gBACrC,OAAO,EAAE,cAAc;gBACvB,YAAY;gBACZ,OAAO,EAAE,gBAAgB;aAC5B,CAAC,CAAC;YACH,OAAO;gBACH,EAAE,EAAE,CAAC,CAAC,EAAE;gBACR,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,KAAK,EAAE,CAAC,CAAC,KAAK;gBACd,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;gBACzC,cAAc;gBACd,YAAY;gBACZ,gBAAgB;gBAChB,gBAAgB,EAAE,SAAS,CAAC,CAAC,CAAC,gBAAgB,EAAE,EAAE,CAAC;gBACnD,QAAQ,EAAE,EAAE,gBAAgB,EAAE,QAAQ,CAAC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,CAAC,OAAO,EAAE;aACvF,CAAC;QACN,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED;;;OAGG;IAEG,AAAN,KAAK,CAAC,WAAW,CAAQ,GAAmB,EAAU,IAAS,EAAS,GAAa;QACjF,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC;YAAE,OAAO;QAC1C,IAAI,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAA,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACjD,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC,CAAC;QACrE,CAAC;QACD,MAAM,QAAQ,GAAG,CAAC,CAAM,EAAU,EAAE;YAChC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;gBAAE,OAAO,IAAI,CAAC;YACnC,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;YACpG,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACtD,CAAC,CAAC;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9C,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAChD,MAAM,SAAS,GAAG,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,KAAK,CACrD;;;;;;6BAMiB,EACjB,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,CAC7D,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;IAClC,CAAC;CACJ,CAAA;AAhKY,gDAAkB;AAIrB;IADL,IAAA,YAAG,EAAC,aAAa,CAAC;IACF,WAAA,IAAA,YAAG,GAAE,CAAA;;;;mDAmErB;AASK;IADL,IAAA,YAAG,EAAC,gBAAgB,CAAC;IACF,WAAA,IAAA,UAAG,GAAE,CAAA;IAAuB,WAAA,IAAA,YAAG,GAAE,CAAA;;qCAAtB,qBAAc;;sDA2C5C;AAOK;IADL,IAAA,aAAI,EAAC,YAAY,CAAC;IACA,WAAA,IAAA,UAAG,GAAE,CAAA;IAAuB,WAAA,IAAA,aAAI,GAAE,CAAA;IAAa,WAAA,IAAA,YAAG,GAAE,CAAA;;qCAAzC,qBAAc;;qDA6B3C;6BA/JQ,kBAAkB;IAD9B,IAAA,mBAAU,EAAC,WAAW,CAAC;qCAEY,8BAAuB;GAD9C,kBAAkB,CAgK9B"}
1
+ {"version":3,"file":"geo-block.controller.js","sourceRoot":"","sources":["../src/geo-block.controller.ts"],"names":[],"mappings":"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"}