@huloglobal/vendure-plugin-geo-block 0.1.0 → 0.2.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.
@@ -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.
47
65
  *
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.
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
70
+ *
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,118 @@ 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
+ }
126
180
  async listChannels(ctx, res) {
127
181
  if (!requireAdmin(ctx, res, false))
128
182
  return;
129
183
  const rows = await this.connection.rawConnection.query(`SELECT id, code, token,
130
184
  COALESCE(customFieldsGeoblockenabled, 0) AS geoBlockEnabled,
185
+ customFieldsGeoblockmode AS geoBlockMode,
131
186
  customFieldsGeoblockallowedregions AS allowedRegions,
132
187
  customFieldsGeoblockallowedcountries AS extraAllowed,
133
188
  customFieldsGeoblockblockedcountries AS blockedCountries,
134
- customFieldsGeoblockallowedgbregions AS allowedGbRegions
189
+ customFieldsGeoblockallowedgbregions AS allowedGbRegions,
190
+ customFieldsGeoblockipallowlist AS ipAllowlist,
191
+ customFieldsGeoblockblockmessage AS blockMessage,
192
+ customFieldsGeoblockblockredirecturl AS blockRedirectUrl,
193
+ customFieldsGeoblockblocklogourl AS blockLogoUrl
135
194
  FROM channel
136
195
  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
196
  const result = rows.map((r) => {
151
- const allowedRegions = parseList(r.allowedRegions, []);
152
- const extraAllowed = parseList(r.extraAllowed, []);
153
- const blockedCountries = parseList(r.blockedCountries, []);
197
+ const allowedRegions = parseList(r.allowedRegions);
198
+ const extraAllowed = parseList(r.extraAllowed);
199
+ const blockedCountries = parseList(r.blockedCountries);
154
200
  const resolved = (0, geo_regions_1.resolveAllowedCountries)({
155
201
  regions: allowedRegions,
156
202
  extraAllowed,
@@ -161,19 +207,20 @@ let GeoBlockController = class GeoBlockController {
161
207
  code: r.code,
162
208
  token: r.token,
163
209
  enabled: !!Number(r.geoBlockEnabled || 0),
210
+ mode: (r.geoBlockMode || 'block'),
164
211
  allowedRegions,
165
212
  extraAllowed,
166
213
  blockedCountries,
167
- allowedGbRegions: parseList(r.allowedGbRegions, []),
214
+ allowedGbRegions: parseList(r.allowedGbRegions),
215
+ ipAllowlist: parseList(r.ipAllowlist),
216
+ blockMessage: r.blockMessage || '',
217
+ blockRedirectUrl: r.blockRedirectUrl || '',
218
+ blockLogoUrl: r.blockLogoUrl || '',
168
219
  resolved: { allowedCountries: resolved.allowed, blockedCountries: resolved.blocked },
169
220
  };
170
221
  });
171
222
  return res.json({ channels: result });
172
223
  }
173
- /**
174
- * Admin: save the geo-block settings for one channel. Body shape
175
- * mirrors what `listChannels` returns (minus the resolved preview).
176
- */
177
224
  async saveChannel(ctx, body, res) {
178
225
  if (!requireAdmin(ctx, res, true))
179
226
  return;
@@ -186,23 +233,197 @@ let GeoBlockController = class GeoBlockController {
186
233
  const clean = v.filter(x => typeof x === 'string').map(x => x.trim().toUpperCase()).filter(Boolean);
187
234
  return JSON.stringify(Array.from(new Set(clean)));
188
235
  };
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);
236
+ const normIpList = (v) => {
237
+ if (!Array.isArray(v))
238
+ return '[]';
239
+ const clean = v.filter(x => typeof x === 'string').map(x => x.trim()).filter(Boolean);
240
+ return JSON.stringify(Array.from(new Set(clean)));
241
+ };
242
+ const mode = body.mode === 'soft' ? 'soft' : 'block';
194
243
  const updated = await this.connection.rawConnection.query(`UPDATE channel
195
244
  SET customFieldsGeoblockenabled = ?,
245
+ customFieldsGeoblockmode = ?,
196
246
  customFieldsGeoblockallowedregions = ?,
197
247
  customFieldsGeoblockallowedcountries = ?,
198
248
  customFieldsGeoblockblockedcountries = ?,
199
- customFieldsGeoblockallowedgbregions = ?
200
- WHERE token = ?`, [enabled, regions, extras, blocked, gbRegions, body.token]);
201
- if (!updated.affectedRows) {
249
+ customFieldsGeoblockallowedgbregions = ?,
250
+ customFieldsGeoblockipallowlist = ?,
251
+ customFieldsGeoblockblockmessage = ?,
252
+ customFieldsGeoblockblockredirecturl = ?,
253
+ customFieldsGeoblockblocklogourl = ?
254
+ WHERE token = ?`, [
255
+ body.enabled ? 1 : 0,
256
+ mode,
257
+ normList(body.allowedRegions),
258
+ normList(body.extraAllowed),
259
+ normList(body.blockedCountries),
260
+ normList(body.allowedGbRegions),
261
+ normIpList(body.ipAllowlist),
262
+ String(body.blockMessage || '').slice(0, 4000),
263
+ String(body.blockRedirectUrl || '').slice(0, 2048),
264
+ String(body.blockLogoUrl || '').slice(0, 2048),
265
+ body.token,
266
+ ]);
267
+ if (!updated.affectedRows)
202
268
  return res.status(404).json({ error: 'channel not found' });
203
- }
204
269
  return res.json({ ok: true });
205
270
  }
271
+ /**
272
+ * Admin: top blocked countries + daily series + totals over the last
273
+ * N days (default 30). Fed straight into the admin Stats panel.
274
+ */
275
+ async stats(ctx, req, res) {
276
+ if (!requireAdmin(ctx, res, false))
277
+ return;
278
+ const days = Math.min(Math.max(parseInt(req.query.days || '30', 10) || 30, 1), 365);
279
+ const channelId = req.query.channelId
280
+ ? parseInt(String(req.query.channelId), 10) : null;
281
+ const where = channelId
282
+ ? 'createdAt >= DATE_SUB(NOW(), INTERVAL ? DAY) AND channelId = ?'
283
+ : 'createdAt >= DATE_SUB(NOW(), INTERVAL ? DAY)';
284
+ const params = channelId ? [days, channelId] : [days];
285
+ const top = await this.connection.rawConnection.query(`SELECT country, COUNT(*) AS n
286
+ FROM geo_block_event WHERE ${where}
287
+ GROUP BY country ORDER BY n DESC LIMIT 20`, params);
288
+ const series = await this.connection.rawConnection.query(`SELECT DATE(createdAt) AS day,
289
+ SUM(decision='block') AS blocked,
290
+ SUM(decision='soft-block') AS softBlocked
291
+ FROM geo_block_event WHERE ${where}
292
+ GROUP BY DATE(createdAt) ORDER BY day`, params);
293
+ const totals = await this.connection.rawConnection.query(`SELECT
294
+ SUM(decision='block') AS blocked,
295
+ SUM(decision='soft-block') AS softBlocked,
296
+ COUNT(*) AS total,
297
+ COUNT(DISTINCT ip) AS uniqueIps
298
+ FROM geo_block_event WHERE ${where}`, params);
299
+ const reasons = await this.connection.rawConnection.query(`SELECT reason, COUNT(*) AS n
300
+ FROM geo_block_event WHERE ${where}
301
+ GROUP BY reason ORDER BY n DESC`, params);
302
+ return res.json({
303
+ days, channelId,
304
+ totals: totals[0] || {},
305
+ topCountries: top,
306
+ series, reasons,
307
+ });
308
+ }
309
+ /**
310
+ * Admin: dry-run check — "what would happen if a visitor from US
311
+ * with no UK region came in?". Lets the admin sanity-check their
312
+ * rules without standing up a proxy.
313
+ */
314
+ async simulate(ctx, body, res) {
315
+ if (!requireAdmin(ctx, res, false))
316
+ return;
317
+ if (!(body === null || body === void 0 ? void 0 : body.token))
318
+ return res.status(400).json({ error: 'channel token required' });
319
+ const row = await this.loadChannelRow(body.token);
320
+ if (!row)
321
+ return res.status(404).json({ error: 'channel not found' });
322
+ const cfg = this.buildConfig(body.token, row);
323
+ const verdict = (0, geo_regions_1.isAllowed)(body.country || null, body.region || null, {
324
+ enabled: cfg.geoBlock.enabled,
325
+ allowedCountries: cfg.geoBlock.allowedCountries,
326
+ blockedCountries: cfg.geoBlock.blockedCountries,
327
+ allowedGbRegions: cfg.geoBlock.allowedGbRegions,
328
+ });
329
+ return res.json({
330
+ input: {
331
+ country: body.country || null,
332
+ region: body.region || null,
333
+ ip: body.ip || null,
334
+ },
335
+ verdict,
336
+ ipMatchesAllowlist: (0, geo_regions_1.ipMatchesAny)(body.ip, parseList(row.ipAllowlist || '')),
337
+ effectiveRules: cfg.geoBlock,
338
+ });
339
+ }
340
+ async gc(ctx, body, res) {
341
+ var _a;
342
+ if (!requireAdmin(ctx, res, true))
343
+ return;
344
+ const olderThanDays = Math.max(1, parseInt((body === null || body === void 0 ? void 0 : body.olderThanDays) || '90', 10) || 90);
345
+ const result = await this.connection.rawConnection.query(`DELETE FROM geo_block_event WHERE createdAt < DATE_SUB(NOW(), INTERVAL ? DAY)`, [olderThanDays]);
346
+ return res.json({ deleted: (_a = result === null || result === void 0 ? void 0 : result.affectedRows) !== null && _a !== void 0 ? _a : 0, olderThanDays });
347
+ }
348
+ // -- private helpers ---------------------------------------------------
349
+ async loadChannelRow(token) {
350
+ const rows = await this.connection.rawConnection.query(`SELECT id, token,
351
+ customFieldsShowcompanynumber AS showCompanyNumber,
352
+ customFieldsBusinesscompanynumber AS companyNumber,
353
+ customFieldsGeoblockenabled AS geoBlockEnabled,
354
+ customFieldsGeoblockmode AS geoBlockMode,
355
+ customFieldsGeoblockallowedregions AS allowedRegions,
356
+ customFieldsGeoblockallowedcountries AS extraAllowed,
357
+ customFieldsGeoblockblockedcountries AS blockedCountries,
358
+ customFieldsGeoblockallowedgbregions AS allowedGbRegions,
359
+ customFieldsGeoblockipallowlist AS ipAllowlist,
360
+ customFieldsGeoblockblockmessage AS blockMessage,
361
+ customFieldsGeoblockblockredirecturl AS blockRedirectUrl,
362
+ customFieldsGeoblockblocklogourl AS blockLogoUrl
363
+ FROM channel WHERE token = ? LIMIT 1`, [token]);
364
+ return rows[0] || null;
365
+ }
366
+ buildConfig(token, r) {
367
+ const allowedRegions = parseList(r.allowedRegions);
368
+ const extraAllowed = parseList(r.extraAllowed, ['GB']);
369
+ const blockedCountries = parseList(r.blockedCountries);
370
+ const resolved = (0, geo_regions_1.resolveAllowedCountries)({
371
+ regions: allowedRegions,
372
+ extraAllowed,
373
+ blocked: blockedCountries,
374
+ });
375
+ return {
376
+ channelToken: token,
377
+ geoBlock: {
378
+ enabled: !!Number(r.geoBlockEnabled || 0),
379
+ mode: (r.geoBlockMode === 'soft' ? 'soft' : 'block'),
380
+ allowedCountries: resolved.allowed,
381
+ blockedCountries: resolved.blocked,
382
+ allowedGbRegions: parseList(r.allowedGbRegions, ['ENG', 'WLS']),
383
+ allowedRegions,
384
+ blockMessage: String(r.blockMessage || ''),
385
+ blockRedirectUrl: r.blockRedirectUrl || null,
386
+ blockLogoUrl: r.blockLogoUrl || null,
387
+ },
388
+ companyData: {
389
+ showCompanyNumber: !!Number(r.showCompanyNumber || 0),
390
+ companyNumber: String(r.companyNumber || ''),
391
+ },
392
+ };
393
+ }
394
+ async logEvent(input) {
395
+ try {
396
+ const repo = this.connection.rawConnection.getRepository(geo_block_event_entity_1.GeoBlockEvent);
397
+ const row = repo.create({
398
+ channelId: input.channelId,
399
+ country: input.country ? input.country.toUpperCase().slice(0, 8) : null,
400
+ region: input.region ? input.region.toUpperCase().slice(0, 8) : null,
401
+ ip: input.ip ? input.ip.slice(0, 64) : null,
402
+ userAgent: input.ua ? String(input.ua).slice(0, 500) : null,
403
+ url: (input.url || '').slice(0, 2048),
404
+ decision: input.decision,
405
+ reason: input.reason.slice(0, 64),
406
+ });
407
+ await repo.save(row);
408
+ }
409
+ catch (e) {
410
+ core_1.Logger.warn(`geo-block event log failed: ${e === null || e === void 0 ? void 0 : e.message}`, loggerCtx);
411
+ }
412
+ }
413
+ defaultMessage(reason) {
414
+ switch (reason) {
415
+ case 'denylist':
416
+ return 'This service is not available in your country.';
417
+ case 'country-not-allowed':
418
+ return 'This service is not available in your country.';
419
+ case 'uk-region-not-allowed':
420
+ return 'This service is only available in selected UK regions.';
421
+ case 'maintenance':
422
+ return 'The site is temporarily unavailable. Please try again later.';
423
+ default:
424
+ return 'Access denied.';
425
+ }
426
+ }
206
427
  };
207
428
  exports.GeoBlockController = GeoBlockController;
208
429
  __decorate([
@@ -212,6 +433,21 @@ __decorate([
212
433
  __metadata("design:paramtypes", [Object]),
213
434
  __metadata("design:returntype", Promise)
214
435
  ], GeoBlockController.prototype, "getConfig", null);
436
+ __decorate([
437
+ (0, common_1.Get)('check'),
438
+ __param(0, (0, common_1.Req)()),
439
+ __param(1, (0, common_1.Res)()),
440
+ __metadata("design:type", Function),
441
+ __metadata("design:paramtypes", [Object, Object]),
442
+ __metadata("design:returntype", Promise)
443
+ ], GeoBlockController.prototype, "check", null);
444
+ __decorate([
445
+ (0, common_1.Get)('presets'),
446
+ __param(0, (0, common_1.Res)()),
447
+ __metadata("design:type", Function),
448
+ __metadata("design:paramtypes", [Object]),
449
+ __metadata("design:returntype", void 0)
450
+ ], GeoBlockController.prototype, "presets", null);
215
451
  __decorate([
216
452
  (0, common_1.Get)('admin/channels'),
217
453
  __param(0, (0, core_1.Ctx)()),
@@ -229,8 +465,43 @@ __decorate([
229
465
  __metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
230
466
  __metadata("design:returntype", Promise)
231
467
  ], GeoBlockController.prototype, "saveChannel", null);
468
+ __decorate([
469
+ (0, common_1.Get)('admin/stats'),
470
+ __param(0, (0, core_1.Ctx)()),
471
+ __param(1, (0, common_1.Req)()),
472
+ __param(2, (0, common_1.Res)()),
473
+ __metadata("design:type", Function),
474
+ __metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
475
+ __metadata("design:returntype", Promise)
476
+ ], GeoBlockController.prototype, "stats", null);
477
+ __decorate([
478
+ (0, common_1.Post)('admin/simulate'),
479
+ __param(0, (0, core_1.Ctx)()),
480
+ __param(1, (0, common_1.Body)()),
481
+ __param(2, (0, common_1.Res)()),
482
+ __metadata("design:type", Function),
483
+ __metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
484
+ __metadata("design:returntype", Promise)
485
+ ], GeoBlockController.prototype, "simulate", null);
486
+ __decorate([
487
+ (0, common_1.Post)('admin/gc'),
488
+ __param(0, (0, core_1.Ctx)()),
489
+ __param(1, (0, common_1.Body)()),
490
+ __param(2, (0, common_1.Res)()),
491
+ __metadata("design:type", Function),
492
+ __metadata("design:paramtypes", [core_1.RequestContext, Object, Object]),
493
+ __metadata("design:returntype", Promise)
494
+ ], GeoBlockController.prototype, "gc", null);
232
495
  exports.GeoBlockController = GeoBlockController = __decorate([
233
496
  (0, common_1.Controller)('geo-block'),
234
497
  __metadata("design:paramtypes", [core_1.TransactionalConnection])
235
498
  ], GeoBlockController);
499
+ function inWindow(w) {
500
+ const now = Date.now();
501
+ const start = Date.parse(w.startsAt);
502
+ const end = Date.parse(w.endsAt);
503
+ if (!isFinite(start) || !isFinite(end))
504
+ return false;
505
+ return now >= start && now <= end;
506
+ }
236
507
  //# 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":"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"}
1
+ {"version":3,"file":"geo-block.controller.js","sourceRoot":"","sources":["../src/geo-block.controller.ts"],"names":[],"mappings":"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"}