@antelopejs/dms-marketing 0.2.2
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/LICENSE +190 -0
- package/README.md +143 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +35 -0
- package/dist/config.js.map +1 -0
- package/dist/data-api/body.d.ts +1 -0
- package/dist/data-api/body.js +15 -0
- package/dist/data-api/body.js.map +1 -0
- package/dist/data-api/funnels.d.ts +32 -0
- package/dist/data-api/funnels.js +302 -0
- package/dist/data-api/funnels.js.map +1 -0
- package/dist/data-api/hidden-filter.d.ts +1 -0
- package/dist/data-api/hidden-filter.js +11 -0
- package/dist/data-api/hidden-filter.js.map +1 -0
- package/dist/data-api/index.d.ts +4 -0
- package/dist/data-api/index.js +21 -0
- package/dist/data-api/index.js.map +1 -0
- package/dist/data-api/tenant-scope.d.ts +15 -0
- package/dist/data-api/tenant-scope.js +43 -0
- package/dist/data-api/tenant-scope.js.map +1 -0
- package/dist/data-api/websites.d.ts +25 -0
- package/dist/data-api/websites.js +73 -0
- package/dist/data-api/websites.js.map +1 -0
- package/dist/db/index.d.ts +2 -0
- package/dist/db/index.js +19 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/models/funnels.model.d.ts +25 -0
- package/dist/db/models/funnels.model.js +39 -0
- package/dist/db/models/funnels.model.js.map +1 -0
- package/dist/db/models/index.d.ts +7 -0
- package/dist/db/models/index.js +24 -0
- package/dist/db/models/index.js.map +1 -0
- package/dist/db/models/marketing_events.model.d.ts +49 -0
- package/dist/db/models/marketing_events.model.js +85 -0
- package/dist/db/models/marketing_events.model.js.map +1 -0
- package/dist/db/models/marketing_sessions.model.d.ts +33 -0
- package/dist/db/models/marketing_sessions.model.js +50 -0
- package/dist/db/models/marketing_sessions.model.js.map +1 -0
- package/dist/db/models/marketing_settings.model.d.ts +23 -0
- package/dist/db/models/marketing_settings.model.js +13 -0
- package/dist/db/models/marketing_settings.model.js.map +1 -0
- package/dist/db/models/page_snapshots.model.d.ts +27 -0
- package/dist/db/models/page_snapshots.model.js +32 -0
- package/dist/db/models/page_snapshots.model.js.map +1 -0
- package/dist/db/models/retention.d.ts +6 -0
- package/dist/db/models/retention.js +26 -0
- package/dist/db/models/retention.js.map +1 -0
- package/dist/db/models/website_statistics.model.d.ts +31 -0
- package/dist/db/models/website_statistics.model.js +63 -0
- package/dist/db/models/website_statistics.model.js.map +1 -0
- package/dist/db/models/websites.model.d.ts +26 -0
- package/dist/db/models/websites.model.js +27 -0
- package/dist/db/models/websites.model.js.map +1 -0
- package/dist/db/tables/funnels.table.d.ts +31 -0
- package/dist/db/tables/funnels.table.js +54 -0
- package/dist/db/tables/funnels.table.js.map +1 -0
- package/dist/db/tables/index.d.ts +7 -0
- package/dist/db/tables/index.js +24 -0
- package/dist/db/tables/index.js.map +1 -0
- package/dist/db/tables/marketing_events.table.d.ts +15 -0
- package/dist/db/tables/marketing_events.table.js +66 -0
- package/dist/db/tables/marketing_events.table.js.map +1 -0
- package/dist/db/tables/marketing_sessions.table.d.ts +26 -0
- package/dist/db/tables/marketing_sessions.table.js +115 -0
- package/dist/db/tables/marketing_sessions.table.js.map +1 -0
- package/dist/db/tables/marketing_settings.table.d.ts +11 -0
- package/dist/db/tables/marketing_settings.table.js +51 -0
- package/dist/db/tables/marketing_settings.table.js.map +1 -0
- package/dist/db/tables/page_snapshots.table.d.ts +17 -0
- package/dist/db/tables/page_snapshots.table.js +72 -0
- package/dist/db/tables/page_snapshots.table.js.map +1 -0
- package/dist/db/tables/website_statistics.table.d.ts +14 -0
- package/dist/db/tables/website_statistics.table.js +60 -0
- package/dist/db/tables/website_statistics.table.js.map +1 -0
- package/dist/db/tables/websites.table.d.ts +13 -0
- package/dist/db/tables/websites.table.js +60 -0
- package/dist/db/tables/websites.table.js.map +1 -0
- package/dist/hooks/index.d.ts +1 -0
- package/dist/hooks/index.js +39 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/implementations/dms-marketing/index.d.ts +2 -0
- package/dist/implementations/dms-marketing/index.js +8 -0
- package/dist/implementations/dms-marketing/index.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +89 -0
- package/dist/index.js.map +1 -0
- package/dist/pages/all.d.ts +5 -0
- package/dist/pages/all.js +22 -0
- package/dist/pages/all.js.map +1 -0
- package/dist/pages/campaigns/page.d.ts +9 -0
- package/dist/pages/campaigns/page.js +27 -0
- package/dist/pages/campaigns/page.js.map +1 -0
- package/dist/pages/funnels/page.d.ts +9 -0
- package/dist/pages/funnels/page.js +27 -0
- package/dist/pages/funnels/page.js.map +1 -0
- package/dist/pages/index.d.ts +4 -0
- package/dist/pages/index.js +21 -0
- package/dist/pages/index.js.map +1 -0
- package/dist/pages/module.d.ts +1 -0
- package/dist/pages/module.js +13 -0
- package/dist/pages/module.js.map +1 -0
- package/dist/pages/overview/page.d.ts +9 -0
- package/dist/pages/overview/page.js +27 -0
- package/dist/pages/overview/page.js.map +1 -0
- package/dist/pages/pages/page.d.ts +9 -0
- package/dist/pages/pages/page.js +27 -0
- package/dist/pages/pages/page.js.map +1 -0
- package/dist/pages/settings/form.d.ts +3 -0
- package/dist/pages/settings/form.js +35 -0
- package/dist/pages/settings/form.js.map +1 -0
- package/dist/pages/settings/page.d.ts +9 -0
- package/dist/pages/settings/page.js +27 -0
- package/dist/pages/settings/page.js.map +1 -0
- package/dist/routes/collect.d.ts +7 -0
- package/dist/routes/collect.js +62 -0
- package/dist/routes/collect.js.map +1 -0
- package/dist/routes/experiments.d.ts +6 -0
- package/dist/routes/experiments.js +63 -0
- package/dist/routes/experiments.js.map +1 -0
- package/dist/routes/funnels.d.ts +16 -0
- package/dist/routes/funnels.js +44 -0
- package/dist/routes/funnels.js.map +1 -0
- package/dist/routes/index.d.ts +8 -0
- package/dist/routes/index.js +25 -0
- package/dist/routes/index.js.map +1 -0
- package/dist/routes/settings.d.ts +8 -0
- package/dist/routes/settings.js +50 -0
- package/dist/routes/settings.js.map +1 -0
- package/dist/routes/snapshot.d.ts +10 -0
- package/dist/routes/snapshot.js +147 -0
- package/dist/routes/snapshot.js.map +1 -0
- package/dist/routes/stats.d.ts +44 -0
- package/dist/routes/stats.js +278 -0
- package/dist/routes/stats.js.map +1 -0
- package/dist/routes/tracker.d.ts +6 -0
- package/dist/routes/tracker.js +57 -0
- package/dist/routes/tracker.js.map +1 -0
- package/dist/routes/websites.d.ts +13 -0
- package/dist/routes/websites.js +144 -0
- package/dist/routes/websites.js.map +1 -0
- package/dist/services/acquisition.d.ts +15 -0
- package/dist/services/acquisition.js +153 -0
- package/dist/services/acquisition.js.map +1 -0
- package/dist/services/bounded-cache.d.ts +14 -0
- package/dist/services/bounded-cache.js +45 -0
- package/dist/services/bounded-cache.js.map +1 -0
- package/dist/services/collect.d.ts +11 -0
- package/dist/services/collect.js +193 -0
- package/dist/services/collect.js.map +1 -0
- package/dist/services/experiment-definitions.d.ts +4 -0
- package/dist/services/experiment-definitions.js +36 -0
- package/dist/services/experiment-definitions.js.map +1 -0
- package/dist/services/experiments/assign.d.ts +5 -0
- package/dist/services/experiments/assign.js +52 -0
- package/dist/services/experiments/assign.js.map +1 -0
- package/dist/services/experiments/index.d.ts +3 -0
- package/dist/services/experiments/index.js +20 -0
- package/dist/services/experiments/index.js.map +1 -0
- package/dist/services/experiments/results.d.ts +20 -0
- package/dist/services/experiments/results.js +91 -0
- package/dist/services/experiments/results.js.map +1 -0
- package/dist/services/experiments/stats.d.ts +12 -0
- package/dist/services/experiments/stats.js +62 -0
- package/dist/services/experiments/stats.js.map +1 -0
- package/dist/services/funnels/compute.d.ts +15 -0
- package/dist/services/funnels/compute.js +68 -0
- package/dist/services/funnels/compute.js.map +1 -0
- package/dist/services/funnels/index.d.ts +2 -0
- package/dist/services/funnels/index.js +19 -0
- package/dist/services/funnels/index.js.map +1 -0
- package/dist/services/funnels/results.d.ts +14 -0
- package/dist/services/funnels/results.js +72 -0
- package/dist/services/funnels/results.js.map +1 -0
- package/dist/services/geoip.d.ts +3 -0
- package/dist/services/geoip.js +38 -0
- package/dist/services/geoip.js.map +1 -0
- package/dist/services/heatmap.d.ts +10 -0
- package/dist/services/heatmap.js +180 -0
- package/dist/services/heatmap.js.map +1 -0
- package/dist/services/index.d.ts +26 -0
- package/dist/services/index.js +43 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/ingest-guard.d.ts +11 -0
- package/dist/services/ingest-guard.js +44 -0
- package/dist/services/ingest-guard.js.map +1 -0
- package/dist/services/keyed-queue.d.ts +4 -0
- package/dist/services/keyed-queue.js +19 -0
- package/dist/services/keyed-queue.js.map +1 -0
- package/dist/services/origin-guard.d.ts +5 -0
- package/dist/services/origin-guard.js +43 -0
- package/dist/services/origin-guard.js.map +1 -0
- package/dist/services/period.d.ts +2 -0
- package/dist/services/period.js +19 -0
- package/dist/services/period.js.map +1 -0
- package/dist/services/prune.d.ts +7 -0
- package/dist/services/prune.js +49 -0
- package/dist/services/prune.js.map +1 -0
- package/dist/services/query-param.d.ts +1 -0
- package/dist/services/query-param.js +11 -0
- package/dist/services/query-param.js.map +1 -0
- package/dist/services/request-body.d.ts +2 -0
- package/dist/services/request-body.js +41 -0
- package/dist/services/request-body.js.map +1 -0
- package/dist/services/request-meta.d.ts +3 -0
- package/dist/services/request-meta.js +19 -0
- package/dist/services/request-meta.js.map +1 -0
- package/dist/services/rollup-write.d.ts +4 -0
- package/dist/services/rollup-write.js +84 -0
- package/dist/services/rollup-write.js.map +1 -0
- package/dist/services/sessionize.d.ts +23 -0
- package/dist/services/sessionize.js +78 -0
- package/dist/services/sessionize.js.map +1 -0
- package/dist/services/settings.d.ts +6 -0
- package/dist/services/settings.js +113 -0
- package/dist/services/settings.js.map +1 -0
- package/dist/services/snapshots.d.ts +24 -0
- package/dist/services/snapshots.js +139 -0
- package/dist/services/snapshots.js.map +1 -0
- package/dist/services/tenant-funnel.d.ts +3 -0
- package/dist/services/tenant-funnel.js +17 -0
- package/dist/services/tenant-funnel.js.map +1 -0
- package/dist/services/tenant-website.d.ts +5 -0
- package/dist/services/tenant-website.js +34 -0
- package/dist/services/tenant-website.js.map +1 -0
- package/dist/services/url.d.ts +10 -0
- package/dist/services/url.js +81 -0
- package/dist/services/url.js.map +1 -0
- package/dist/services/user-agent.d.ts +2 -0
- package/dist/services/user-agent.js +17 -0
- package/dist/services/user-agent.js.map +1 -0
- package/dist/services/visitor-id.d.ts +1 -0
- package/dist/services/visitor-id.js +19 -0
- package/dist/services/visitor-id.js.map +1 -0
- package/dist/services/website-cache.d.ts +3 -0
- package/dist/services/website-cache.js +22 -0
- package/dist/services/website-cache.js.map +1 -0
- package/dist/types/constants.d.ts +74 -0
- package/dist/types/constants.js +79 -0
- package/dist/types/constants.js.map +1 -0
- package/dist/types/events.d.ts +114 -0
- package/dist/types/events.js +29 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/index.d.ts +5 -0
- package/dist/types/index.js +22 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/settings.d.ts +67 -0
- package/dist/types/settings.js +58 -0
- package/dist/types/settings.js.map +1 -0
- package/dist/types/snapshots.d.ts +95 -0
- package/dist/types/snapshots.js +41 -0
- package/dist/types/snapshots.js.map +1 -0
- package/dist/types/statistics.d.ts +38 -0
- package/dist/types/statistics.js +33 -0
- package/dist/types/statistics.js.map +1 -0
- package/dist/utils/experiment-type.d.ts +52 -0
- package/dist/utils/experiment-type.js +94 -0
- package/dist/utils/experiment-type.js.map +1 -0
- package/dist/utils/funnel-steps-type.d.ts +42 -0
- package/dist/utils/funnel-steps-type.js +62 -0
- package/dist/utils/funnel-steps-type.js.map +1 -0
- package/frontend-vue/.editorconfig +12 -0
- package/frontend-vue/.prettierrc +7 -0
- package/frontend-vue/app/components/CampaignsView.vue +330 -0
- package/frontend-vue/app/components/ExperimentInput.vue +128 -0
- package/frontend-vue/app/components/FunnelDetail.vue +1026 -0
- package/frontend-vue/app/components/FunnelStepsInput.vue +154 -0
- package/frontend-vue/app/components/FunnelsView.vue +493 -0
- package/frontend-vue/app/components/HeatmapCanvas.vue +116 -0
- package/frontend-vue/app/components/NoWebsiteState.vue +18 -0
- package/frontend-vue/app/components/OverviewView.vue +493 -0
- package/frontend-vue/app/components/PagePreview.vue +915 -0
- package/frontend-vue/app/components/PagesView.vue +378 -0
- package/frontend-vue/app/components/ScrollDepthOverlay.vue +158 -0
- package/frontend-vue/app/components/TextKpiCard.vue +28 -0
- package/frontend-vue/app/components/TopListTabsCard.vue +162 -0
- package/frontend-vue/app/components/TrackerSnippet.vue +31 -0
- package/frontend-vue/app/components/VariationsInput.vue +164 -0
- package/frontend-vue/app/composables/useChildId.ts +13 -0
- package/frontend-vue/app/composables/useExperiment.ts +59 -0
- package/frontend-vue/app/composables/useFunnelSteps.ts +25 -0
- package/frontend-vue/app/composables/useLatestRequest.ts +90 -0
- package/frontend-vue/app/composables/useMarketingApi.ts +420 -0
- package/frontend-vue/app/composables/useMarketingPeriod.ts +66 -0
- package/frontend-vue/app/composables/useMarketingRoutes.ts +51 -0
- package/frontend-vue/app/composables/useMarketingWebsiteForm.ts +69 -0
- package/frontend-vue/app/composables/useMarketingWebsites.ts +80 -0
- package/frontend-vue/app/composables/useSnapshotFrame.ts +183 -0
- package/frontend-vue/app/plugins/funnel-steps-data-type.client.ts +46 -0
- package/frontend-vue/app/utils/dmsComponent.ts +18 -0
- package/frontend-vue/app/utils/heatmapPalette.ts +41 -0
- package/frontend-vue/app/utils/snapshotViewportUnits.ts +63 -0
- package/frontend-vue/dms.frontend.ts +35 -0
- package/frontend-vue/eslint.config.mjs +16 -0
- package/frontend-vue/i18n/locales/marketing-en-GB.json +382 -0
- package/frontend-vue/i18n/locales/marketing-fr-FR.json +382 -0
- package/frontend-vue/package.json +30 -0
- package/frontend-vue/pnpm-lock.yaml +5226 -0
- package/frontend-vue/pnpm-workspace.yaml +2 -0
- package/frontend-vue/tests/drafts.test.ts +54 -0
- package/frontend-vue/tests/i18n.test.ts +86 -0
- package/frontend-vue/tests/period.test.ts +35 -0
- package/frontend-vue/tests/registration.test.ts +63 -0
- package/frontend-vue/tests/routes.test.ts +31 -0
- package/frontend-vue/tests/stubs/frontend-module.ts +56 -0
- package/frontend-vue/vitest.config.ts +20 -0
- package/package.json +91 -0
- package/static/snapshot.js +497 -0
- package/static/tracker.js +503 -0
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
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 __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./funnels.model"), exports);
|
|
18
|
+
__exportStar(require("./marketing_events.model"), exports);
|
|
19
|
+
__exportStar(require("./marketing_sessions.model"), exports);
|
|
20
|
+
__exportStar(require("./marketing_settings.model"), exports);
|
|
21
|
+
__exportStar(require("./page_snapshots.model"), exports);
|
|
22
|
+
__exportStar(require("./website_statistics.model"), exports);
|
|
23
|
+
__exportStar(require("./websites.model"), exports);
|
|
24
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/db/models/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,2DAAyC;AACzC,6DAA2C;AAC3C,6DAA2C;AAC3C,yDAAuC;AACvC,6DAA2C;AAC3C,mDAAiC"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { type Table } from "@antelopejs/interface-database";
|
|
2
|
+
import { type EventKind } from "@/types";
|
|
3
|
+
import { MarketingEvent } from "../tables/marketing_events.table";
|
|
4
|
+
export interface EventRangeQuery<F extends keyof MarketingEvent> {
|
|
5
|
+
websiteIds: string[];
|
|
6
|
+
since: Date;
|
|
7
|
+
until: Date;
|
|
8
|
+
kinds?: EventKind[];
|
|
9
|
+
url?: string;
|
|
10
|
+
limit: number;
|
|
11
|
+
fields: readonly F[];
|
|
12
|
+
}
|
|
13
|
+
export interface ScrollDepthQuery {
|
|
14
|
+
websiteIds: string[];
|
|
15
|
+
since: Date;
|
|
16
|
+
until: Date;
|
|
17
|
+
url: string;
|
|
18
|
+
}
|
|
19
|
+
export interface ScrollDepthBucket {
|
|
20
|
+
depth: number;
|
|
21
|
+
views: number;
|
|
22
|
+
}
|
|
23
|
+
declare const MarketingEventsModel_base: {
|
|
24
|
+
new (database: import("@antelopejs/interface-database").SchemaInstance<any>): {
|
|
25
|
+
readonly table: Table<MarketingEvent>;
|
|
26
|
+
readonly database: import("@antelopejs/interface-database").SchemaInstance<any>;
|
|
27
|
+
get(id: string): PromiseLike<MarketingEvent | undefined>;
|
|
28
|
+
getBy(index: keyof MarketingEvent, ...keys: any[]): PromiseLike<MarketingEvent[]>;
|
|
29
|
+
getAll(): PromiseLike<MarketingEvent[]>;
|
|
30
|
+
insert(obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingEvent> | import("@antelopejs/interface-database-decorators").DeepPartial<MarketingEvent>[], options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<string[]>;
|
|
31
|
+
update(id: string, obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingEvent>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
32
|
+
update(obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingEvent>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
33
|
+
delete(id: string): Promise<number>;
|
|
34
|
+
};
|
|
35
|
+
readonly schemaName: string;
|
|
36
|
+
fromPlainData(obj: any): MarketingEvent;
|
|
37
|
+
fromDatabase(obj: any): MarketingEvent | undefined;
|
|
38
|
+
toDatabase(obj: any): Record<string, any>;
|
|
39
|
+
validate(obj: unknown, options?: import("@antelopejs/interface-database-decorators").ValidateInputOptions): import("@antelopejs/interface-database-decorators").ValidationResult;
|
|
40
|
+
};
|
|
41
|
+
export declare class MarketingEventsModel extends MarketingEventsModel_base {
|
|
42
|
+
queryRange<F extends keyof MarketingEvent>(query: EventRangeQuery<F>): Promise<Pick<MarketingEvent, F | "timestamp">[]>;
|
|
43
|
+
countScrollDepths(query: ScrollDepthQuery): Promise<ScrollDepthBucket[]>;
|
|
44
|
+
insertMany(events: MarketingEvent[]): Promise<number>;
|
|
45
|
+
deleteHeatmapEvents(websiteId: string, url?: string): Promise<number>;
|
|
46
|
+
deleteOlderThan(cutoff: Date): Promise<number>;
|
|
47
|
+
deleteByWebsite(websiteId: string): Promise<number>;
|
|
48
|
+
}
|
|
49
|
+
export {};
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MarketingEventsModel = void 0;
|
|
4
|
+
const interface_database_1 = require("@antelopejs/interface-database");
|
|
5
|
+
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
6
|
+
const types_1 = require("@/types");
|
|
7
|
+
const constants_1 = require("@/types/constants");
|
|
8
|
+
const marketing_events_table_1 = require("../tables/marketing_events.table");
|
|
9
|
+
const EPOCH_LOWER_BOUND = new Date(0);
|
|
10
|
+
const SCROLL_KIND = "scroll";
|
|
11
|
+
class MarketingEventsModel extends (0, interface_database_decorators_1.BasicDataModel)(marketing_events_table_1.MarketingEvent, marketing_events_table_1.marketingEventsTableName) {
|
|
12
|
+
async queryRange(query) {
|
|
13
|
+
if (query.websiteIds.length === 0) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
let q = this.table
|
|
17
|
+
.getAll(query.websiteIds, "websiteId")
|
|
18
|
+
.filter((doc) => doc.key("timestamp").ge(query.since))
|
|
19
|
+
.filter((doc) => doc.key("timestamp").le(query.until));
|
|
20
|
+
const url = query.url;
|
|
21
|
+
if (url) {
|
|
22
|
+
q = q.filter((doc) => doc.key("url").eq(url));
|
|
23
|
+
}
|
|
24
|
+
const kinds = query.kinds;
|
|
25
|
+
if (kinds && kinds.length > 0) {
|
|
26
|
+
q = q.filter((doc) => interface_database_1.ValueProxy.constant(kinds).includes(doc.key("kind")));
|
|
27
|
+
}
|
|
28
|
+
return q
|
|
29
|
+
.orderBy("timestamp", "asc")
|
|
30
|
+
.slice(0, query.limit)
|
|
31
|
+
.pluck("timestamp", ...query.fields)
|
|
32
|
+
.run();
|
|
33
|
+
}
|
|
34
|
+
async countScrollDepths(query) {
|
|
35
|
+
if (query.websiteIds.length === 0) {
|
|
36
|
+
return [];
|
|
37
|
+
}
|
|
38
|
+
return this.table
|
|
39
|
+
.getAll(query.websiteIds, "websiteId")
|
|
40
|
+
.filter((doc) => doc.key("timestamp").ge(query.since))
|
|
41
|
+
.filter((doc) => doc.key("timestamp").le(query.until))
|
|
42
|
+
.filter((doc) => doc.key("url").eq(query.url))
|
|
43
|
+
.filter((doc) => doc.key("kind").eq(SCROLL_KIND))
|
|
44
|
+
.filter((doc) => {
|
|
45
|
+
const depth = doc.key("data").cast().key("depth");
|
|
46
|
+
return depth.ge(0).and(depth.le(constants_1.SCROLL_DEPTH_SCALE));
|
|
47
|
+
})
|
|
48
|
+
.map((doc) => ({
|
|
49
|
+
depth: doc.key("data").cast().key("depth").round(),
|
|
50
|
+
}))
|
|
51
|
+
.group("depth", (stream, depth) => ({
|
|
52
|
+
depth,
|
|
53
|
+
views: stream.count(),
|
|
54
|
+
}))
|
|
55
|
+
.run();
|
|
56
|
+
}
|
|
57
|
+
async insertMany(events) {
|
|
58
|
+
if (events.length === 0) {
|
|
59
|
+
return 0;
|
|
60
|
+
}
|
|
61
|
+
const rows = events;
|
|
62
|
+
const ids = await this.table.insert(rows).run();
|
|
63
|
+
return ids.length;
|
|
64
|
+
}
|
|
65
|
+
async deleteHeatmapEvents(websiteId, url) {
|
|
66
|
+
let q = this.table
|
|
67
|
+
.getAll([websiteId], "websiteId")
|
|
68
|
+
.filter((doc) => interface_database_1.ValueProxy.constant(types_1.HEATMAP_EVENT_KINDS).includes(doc.key("kind")));
|
|
69
|
+
if (url) {
|
|
70
|
+
q = q.filter((doc) => doc.key("url").eq(url));
|
|
71
|
+
}
|
|
72
|
+
return q.delete().run();
|
|
73
|
+
}
|
|
74
|
+
async deleteOlderThan(cutoff) {
|
|
75
|
+
return this.table
|
|
76
|
+
.between("timestamp", EPOCH_LOWER_BOUND, cutoff)
|
|
77
|
+
.delete()
|
|
78
|
+
.run();
|
|
79
|
+
}
|
|
80
|
+
async deleteByWebsite(websiteId) {
|
|
81
|
+
return this.table.getAll([websiteId], "websiteId").delete().run();
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
exports.MarketingEventsModel = MarketingEventsModel;
|
|
85
|
+
//# sourceMappingURL=marketing_events.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing_events.model.js","sourceRoot":"","sources":["../../../src/db/models/marketing_events.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { MarketingSession } from "../tables/marketing_sessions.table";
|
|
2
|
+
export interface SessionActivityDelta {
|
|
3
|
+
pageviews: number;
|
|
4
|
+
events: number;
|
|
5
|
+
lastSeenAt: Date;
|
|
6
|
+
exitUrl?: string;
|
|
7
|
+
}
|
|
8
|
+
declare const MarketingSessionsModel_base: {
|
|
9
|
+
new (database: import("@antelopejs/interface-database").SchemaInstance<any>): {
|
|
10
|
+
readonly table: import("@antelopejs/interface-database").Table<MarketingSession>;
|
|
11
|
+
readonly database: import("@antelopejs/interface-database").SchemaInstance<any>;
|
|
12
|
+
get(id: string): PromiseLike<MarketingSession | undefined>;
|
|
13
|
+
getBy(index: keyof MarketingSession, ...keys: any[]): PromiseLike<MarketingSession[]>;
|
|
14
|
+
getAll(): PromiseLike<MarketingSession[]>;
|
|
15
|
+
insert(obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingSession> | import("@antelopejs/interface-database-decorators").DeepPartial<MarketingSession>[], options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<string[]>;
|
|
16
|
+
update(id: string, obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingSession>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
17
|
+
update(obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingSession>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
18
|
+
delete(id: string): Promise<number>;
|
|
19
|
+
};
|
|
20
|
+
readonly schemaName: string;
|
|
21
|
+
fromPlainData(obj: any): MarketingSession;
|
|
22
|
+
fromDatabase(obj: any): MarketingSession | undefined;
|
|
23
|
+
toDatabase(obj: any): Record<string, any>;
|
|
24
|
+
validate(obj: unknown, options?: import("@antelopejs/interface-database-decorators").ValidateInputOptions): import("@antelopejs/interface-database-decorators").ValidationResult;
|
|
25
|
+
};
|
|
26
|
+
export declare class MarketingSessionsModel extends MarketingSessionsModel_base {
|
|
27
|
+
findLatestForVisitor(websiteId: string, visitorId: string): Promise<MarketingSession | undefined>;
|
|
28
|
+
getLastActivityByWebsites(websiteIds: string[]): Promise<Map<string, number>>;
|
|
29
|
+
recordActivity(sessionId: string, delta: SessionActivityDelta): Promise<void>;
|
|
30
|
+
deleteOlderThan(cutoff: Date): Promise<number>;
|
|
31
|
+
deleteByWebsite(websiteId: string): Promise<number>;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MarketingSessionsModel = void 0;
|
|
4
|
+
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
5
|
+
const marketing_sessions_table_1 = require("../tables/marketing_sessions.table");
|
|
6
|
+
const retention_1 = require("./retention");
|
|
7
|
+
class MarketingSessionsModel extends (0, interface_database_decorators_1.BasicDataModel)(marketing_sessions_table_1.MarketingSession, marketing_sessions_table_1.marketingSessionsTableName) {
|
|
8
|
+
async findLatestForVisitor(websiteId, visitorId) {
|
|
9
|
+
const results = await this.table
|
|
10
|
+
.getAll(websiteId, "websiteId")
|
|
11
|
+
.filter((doc) => doc.key("visitorId").eq(visitorId))
|
|
12
|
+
.orderBy("startedAt", "desc")
|
|
13
|
+
.slice(0, 1)
|
|
14
|
+
.run();
|
|
15
|
+
return results[0];
|
|
16
|
+
}
|
|
17
|
+
async getLastActivityByWebsites(websiteIds) {
|
|
18
|
+
if (websiteIds.length === 0) {
|
|
19
|
+
return new Map();
|
|
20
|
+
}
|
|
21
|
+
const rows = await this.table
|
|
22
|
+
.getAll(websiteIds, "websiteId")
|
|
23
|
+
.group("websiteId", (stream, websiteId) => ({
|
|
24
|
+
websiteId,
|
|
25
|
+
lastSeenAt: stream.max("lastSeenAt"),
|
|
26
|
+
}))
|
|
27
|
+
.filter((row) => row.key("lastSeenAt").ne(null))
|
|
28
|
+
.run();
|
|
29
|
+
return new Map(rows.map((row) => [row.websiteId, new Date(row.lastSeenAt).getTime()]));
|
|
30
|
+
}
|
|
31
|
+
async recordActivity(sessionId, delta) {
|
|
32
|
+
await this.table
|
|
33
|
+
.get(sessionId)
|
|
34
|
+
.update((doc) => ({
|
|
35
|
+
pageviewsCount: doc.key("pageviewsCount").add(delta.pageviews),
|
|
36
|
+
eventsCount: doc.key("eventsCount").add(delta.events),
|
|
37
|
+
lastSeenAt: delta.lastSeenAt,
|
|
38
|
+
...(delta.exitUrl !== undefined && { exitUrl: delta.exitUrl }),
|
|
39
|
+
}))
|
|
40
|
+
.run();
|
|
41
|
+
}
|
|
42
|
+
async deleteOlderThan(cutoff) {
|
|
43
|
+
return (0, retention_1.deleteExpiredRows)(this.table, "lastSeenAt", cutoff);
|
|
44
|
+
}
|
|
45
|
+
async deleteByWebsite(websiteId) {
|
|
46
|
+
return this.table.getAll([websiteId], "websiteId").delete().run();
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
exports.MarketingSessionsModel = MarketingSessionsModel;
|
|
50
|
+
//# sourceMappingURL=marketing_sessions.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing_sessions.model.js","sourceRoot":"","sources":["../../../src/db/models/marketing_sessions.model.ts"],"names":[],"mappings":";;;AAAA,6FAA2E;AAC3E,iFAG4C;AAC5C,2CAAgD;AAShD,MAAa,sBAAuB,SAAQ,IAAA,8CAAc,EACxD,2CAAgB,EAChB,qDAA0B,CAC3B;IAMC,KAAK,CAAC,oBAAoB,CACxB,SAAiB,EACjB,SAAiB;QAEjB,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,KAAK;aAC7B,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC;aAC9B,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;aACnD,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;aAC5B,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;aACX,GAAG,EAAE,CAAC;QACT,OAAO,OAAO,CAAC,CAAC,CAAC,CAAC;IACpB,CAAC;IAGD,KAAK,CAAC,yBAAyB,CAC7B,UAAoB;QAEpB,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,GAAG,EAAE,CAAC;QACnB,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,KAAK;aAC1B,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC;aAC/B,KAAK,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;YAC1C,SAAS;YACT,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,YAAY,CAAC;SACrC,CAAC,CAAC;aACF,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC;aAC/C,GAAG,EAAE,CAAC;QACT,OAAO,IAAI,GAAG,CACZ,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,CACvE,CAAC;IACJ,CAAC;IAQD,KAAK,CAAC,cAAc,CAClB,SAAiB,EACjB,KAA2B;QAE3B,MAAM,IAAI,CAAC,KAAK;aACb,GAAG,CAAC,SAAS,CAAC;aACd,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAChB,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC;YAC9D,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC;YACrD,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;SAC/D,CAAC,CAAC;aACF,GAAG,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAY;QAChC,OAAO,IAAA,6BAAiB,EAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IACpE,CAAC;CACF;AAtED,wDAsEC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { MarketingSettings } from "../tables/marketing_settings.table";
|
|
2
|
+
declare const MarketingSettingsModel_base: {
|
|
3
|
+
new (database: import("@antelopejs/interface-database").SchemaInstance<any>): {
|
|
4
|
+
readonly table: import("@antelopejs/interface-database").Table<MarketingSettings>;
|
|
5
|
+
readonly database: import("@antelopejs/interface-database").SchemaInstance<any>;
|
|
6
|
+
get(id: string): PromiseLike<MarketingSettings | undefined>;
|
|
7
|
+
getBy(index: keyof MarketingSettings, ...keys: any[]): PromiseLike<MarketingSettings[]>;
|
|
8
|
+
getAll(): PromiseLike<MarketingSettings[]>;
|
|
9
|
+
insert(obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingSettings> | import("@antelopejs/interface-database-decorators").DeepPartial<MarketingSettings>[], options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<string[]>;
|
|
10
|
+
update(id: string, obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingSettings>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
11
|
+
update(obj: import("@antelopejs/interface-database-decorators").DeepPartial<MarketingSettings>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
12
|
+
delete(id: string): Promise<number>;
|
|
13
|
+
};
|
|
14
|
+
readonly schemaName: string;
|
|
15
|
+
fromPlainData(obj: any): MarketingSettings;
|
|
16
|
+
fromDatabase(obj: any): MarketingSettings | undefined;
|
|
17
|
+
toDatabase(obj: any): Record<string, any>;
|
|
18
|
+
validate(obj: unknown, options?: import("@antelopejs/interface-database-decorators").ValidateInputOptions): import("@antelopejs/interface-database-decorators").ValidationResult;
|
|
19
|
+
};
|
|
20
|
+
export declare class MarketingSettingsModel extends MarketingSettingsModel_base {
|
|
21
|
+
getSingleton(): Promise<MarketingSettings | undefined>;
|
|
22
|
+
}
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MarketingSettingsModel = void 0;
|
|
4
|
+
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
5
|
+
const marketing_settings_table_1 = require("../tables/marketing_settings.table");
|
|
6
|
+
class MarketingSettingsModel extends (0, interface_database_decorators_1.BasicDataModel)(marketing_settings_table_1.MarketingSettings, marketing_settings_table_1.marketingSettingsTableName) {
|
|
7
|
+
async getSingleton() {
|
|
8
|
+
const row = await this.table.nth(0).run();
|
|
9
|
+
return MarketingSettingsModel.fromDatabase(row);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.MarketingSettingsModel = MarketingSettingsModel;
|
|
13
|
+
//# sourceMappingURL=marketing_settings.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"marketing_settings.model.js","sourceRoot":"","sources":["../../../src/db/models/marketing_settings.model.ts"],"names":[],"mappings":";;;AAAA,6FAA2E;AAC3E,iFAG4C;AAE5C,MAAa,sBAAuB,SAAQ,IAAA,8CAAc,EACxD,4CAAiB,EACjB,qDAA0B,CAC3B;IACC,KAAK,CAAC,YAAY;QAChB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;QAC1C,OAAO,sBAAsB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;IAClD,CAAC;CACF;AARD,wDAQC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { PageSnapshot } from "../tables/page_snapshots.table";
|
|
2
|
+
declare const PageSnapshotsModel_base: {
|
|
3
|
+
new (database: import("@antelopejs/interface-database").SchemaInstance<any>): {
|
|
4
|
+
readonly table: import("@antelopejs/interface-database").Table<PageSnapshot>;
|
|
5
|
+
readonly database: import("@antelopejs/interface-database").SchemaInstance<any>;
|
|
6
|
+
get(id: string): PromiseLike<PageSnapshot | undefined>;
|
|
7
|
+
getBy(index: keyof PageSnapshot, ...keys: any[]): PromiseLike<PageSnapshot[]>;
|
|
8
|
+
getAll(): PromiseLike<PageSnapshot[]>;
|
|
9
|
+
insert(obj: import("@antelopejs/interface-database-decorators").DeepPartial<PageSnapshot> | import("@antelopejs/interface-database-decorators").DeepPartial<PageSnapshot>[], options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<string[]>;
|
|
10
|
+
update(id: string, obj: import("@antelopejs/interface-database-decorators").DeepPartial<PageSnapshot>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
11
|
+
update(obj: import("@antelopejs/interface-database-decorators").DeepPartial<PageSnapshot>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
12
|
+
delete(id: string): Promise<number>;
|
|
13
|
+
};
|
|
14
|
+
readonly schemaName: string;
|
|
15
|
+
fromPlainData(obj: any): PageSnapshot;
|
|
16
|
+
fromDatabase(obj: any): PageSnapshot | undefined;
|
|
17
|
+
toDatabase(obj: any): Record<string, any>;
|
|
18
|
+
validate(obj: unknown, options?: import("@antelopejs/interface-database-decorators").ValidateInputOptions): import("@antelopejs/interface-database-decorators").ValidationResult;
|
|
19
|
+
};
|
|
20
|
+
export declare class PageSnapshotsModel extends PageSnapshotsModel_base {
|
|
21
|
+
getByPath(websiteId: string, url: string): Promise<PageSnapshot[]>;
|
|
22
|
+
countByWebsite(websiteId: string): Promise<number>;
|
|
23
|
+
upsert(row: PageSnapshot): Promise<void>;
|
|
24
|
+
deleteByWebsite(websiteId: string, url?: string): Promise<number>;
|
|
25
|
+
deleteOlderThan(cutoff: Date): Promise<number>;
|
|
26
|
+
}
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PageSnapshotsModel = void 0;
|
|
4
|
+
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
5
|
+
const page_snapshots_table_1 = require("../tables/page_snapshots.table");
|
|
6
|
+
const retention_1 = require("./retention");
|
|
7
|
+
class PageSnapshotsModel extends (0, interface_database_decorators_1.BasicDataModel)(page_snapshots_table_1.PageSnapshot, page_snapshots_table_1.pageSnapshotsTableName) {
|
|
8
|
+
async getByPath(websiteId, url) {
|
|
9
|
+
return this.table
|
|
10
|
+
.getAll([websiteId], "websiteId")
|
|
11
|
+
.filter((doc) => doc.key("url").eq(url))
|
|
12
|
+
.run();
|
|
13
|
+
}
|
|
14
|
+
async countByWebsite(websiteId) {
|
|
15
|
+
return this.table.getAll([websiteId], "websiteId").count().run();
|
|
16
|
+
}
|
|
17
|
+
async upsert(row) {
|
|
18
|
+
await this.table.insert(row, { conflict: "replace" }).run();
|
|
19
|
+
}
|
|
20
|
+
async deleteByWebsite(websiteId, url) {
|
|
21
|
+
let q = this.table.getAll([websiteId], "websiteId");
|
|
22
|
+
if (url) {
|
|
23
|
+
q = q.filter((doc) => doc.key("url").eq(url));
|
|
24
|
+
}
|
|
25
|
+
return q.delete().run();
|
|
26
|
+
}
|
|
27
|
+
async deleteOlderThan(cutoff) {
|
|
28
|
+
return (0, retention_1.deleteExpiredRows)(this.table, "capturedAt", cutoff);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.PageSnapshotsModel = PageSnapshotsModel;
|
|
32
|
+
//# sourceMappingURL=page_snapshots.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"page_snapshots.model.js","sourceRoot":"","sources":["../../../src/db/models/page_snapshots.model.ts"],"names":[],"mappings":";;;AAAA,6FAA2E;AAC3E,yEAGwC;AACxC,2CAAgD;AAEhD,MAAa,kBAAmB,SAAQ,IAAA,8CAAc,EACpD,mCAAY,EACZ,6CAAsB,CACvB;IAEC,KAAK,CAAC,SAAS,CAAC,SAAiB,EAAE,GAAW;QAC5C,OAAO,IAAI,CAAC,KAAK;aACd,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;aAChC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;aACvC,GAAG,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,SAAiB;QACpC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC,KAAK,EAAE,CAAC,GAAG,EAAE,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,GAAiB;QAC5B,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,SAAiB,EAAE,GAAY;QACnD,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,CAAC;QACpD,IAAI,GAAG,EAAE,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IAC1B,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAAY;QAChC,OAAO,IAAA,6BAAiB,EAAC,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7D,CAAC;CACF;AA/BD,gDA+BC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { Table } from "@antelopejs/interface-database";
|
|
2
|
+
interface RetentionRow {
|
|
3
|
+
_id: string;
|
|
4
|
+
}
|
|
5
|
+
export declare function deleteExpiredRows<F extends string, T extends RetentionRow & Record<F, Date>>(table: Table<T>, field: F, cutoff: Date): Promise<number>;
|
|
6
|
+
export {};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.deleteExpiredRows = deleteExpiredRows;
|
|
4
|
+
const EPOCH_LOWER_BOUND = new Date(0);
|
|
5
|
+
async function deleteExpiredRows(table, field, cutoff) {
|
|
6
|
+
const candidates = (await table
|
|
7
|
+
.between(field, EPOCH_LOWER_BOUND, cutoff)
|
|
8
|
+
.pluck("_id", field)
|
|
9
|
+
.run());
|
|
10
|
+
let deleted = 0;
|
|
11
|
+
for (const row of candidates) {
|
|
12
|
+
const outcome = await table
|
|
13
|
+
.atomicMutation(row._id, {
|
|
14
|
+
type: "deleteIfEqual",
|
|
15
|
+
field,
|
|
16
|
+
expectedValue: row[field],
|
|
17
|
+
})
|
|
18
|
+
.run();
|
|
19
|
+
if (outcome === "unknown") {
|
|
20
|
+
throw new Error("Retention deletion outcome is unknown");
|
|
21
|
+
}
|
|
22
|
+
deleted += Number(outcome === "applied");
|
|
23
|
+
}
|
|
24
|
+
return deleted;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=retention.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retention.js","sourceRoot":"","sources":["../../../src/db/models/retention.ts"],"names":[],"mappings":";;AAYA,8CAuBC;AA7BD,MAAM,iBAAiB,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;AAM/B,KAAK,UAAU,iBAAiB,CAGrC,KAAe,EAAE,KAAQ,EAAE,MAAY;IACvC,MAAM,UAAU,GAAG,CAAC,MAAM,KAAK;SAC5B,OAAO,CAAC,KAAK,EAAE,iBAAyB,EAAE,MAAc,CAAC;SACzD,KAAK,CAAC,KAAK,EAAE,KAAK,CAAC;SACnB,GAAG,EAAE,CAAyB,CAAC;IAClC,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,MAAM,KAAK;aACxB,cAAc,CAAC,GAAG,CAAC,GAAG,EAAE;YACvB,IAAI,EAAE,eAAe;YACrB,KAAK;YACL,aAAa,EAAE,GAAG,CAAC,KAAK,CAAC;SAC1B,CAAC;aACD,GAAG,EAAE,CAAC;QACT,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;QAC3D,CAAC;QACD,OAAO,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { type TopDimension, type TopEntries, type MarketingStatsDelta } from "@/types";
|
|
2
|
+
import { WebsiteStatistics } from "../tables/website_statistics.table";
|
|
3
|
+
export declare function dayRowId(websiteId: string, day: number): string;
|
|
4
|
+
export type DayTops = Partial<Record<TopDimension, TopEntries>>;
|
|
5
|
+
declare const WebsiteStatisticsModel_base: {
|
|
6
|
+
new (database: import("@antelopejs/interface-database").SchemaInstance<any>): {
|
|
7
|
+
readonly table: import("@antelopejs/interface-database").Table<WebsiteStatistics>;
|
|
8
|
+
readonly database: import("@antelopejs/interface-database").SchemaInstance<any>;
|
|
9
|
+
get(id: string): PromiseLike<WebsiteStatistics | undefined>;
|
|
10
|
+
getBy(index: keyof WebsiteStatistics, ...keys: any[]): PromiseLike<WebsiteStatistics[]>;
|
|
11
|
+
getAll(): PromiseLike<WebsiteStatistics[]>;
|
|
12
|
+
insert(obj: import("@antelopejs/interface-database-decorators").DeepPartial<WebsiteStatistics> | import("@antelopejs/interface-database-decorators").DeepPartial<WebsiteStatistics>[], options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<string[]>;
|
|
13
|
+
update(id: string, obj: import("@antelopejs/interface-database-decorators").DeepPartial<WebsiteStatistics>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
14
|
+
update(obj: import("@antelopejs/interface-database-decorators").DeepPartial<WebsiteStatistics>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
15
|
+
delete(id: string): Promise<number>;
|
|
16
|
+
};
|
|
17
|
+
readonly schemaName: string;
|
|
18
|
+
fromPlainData(obj: any): WebsiteStatistics;
|
|
19
|
+
fromDatabase(obj: any): WebsiteStatistics | undefined;
|
|
20
|
+
toDatabase(obj: any): Record<string, any>;
|
|
21
|
+
validate(obj: unknown, options?: import("@antelopejs/interface-database-decorators").ValidateInputOptions): import("@antelopejs/interface-database-decorators").ValidationResult;
|
|
22
|
+
};
|
|
23
|
+
export declare class WebsiteStatisticsModel extends WebsiteStatisticsModel_base {
|
|
24
|
+
getDaysSince(websiteId: string, cutoff: number): Promise<WebsiteStatistics[]>;
|
|
25
|
+
getTopsSince(websiteId: string, cutoff: number, dimensions: readonly TopDimension[]): Promise<DayTops[]>;
|
|
26
|
+
addDelta(id: string, delta: MarketingStatsDelta, tops: Record<TopDimension, TopEntries>): Promise<number>;
|
|
27
|
+
deleteDaysBefore(cutoff: number): Promise<number>;
|
|
28
|
+
emptyTopsBefore(cutoff: number): Promise<number>;
|
|
29
|
+
deleteByWebsite(websiteId: string): Promise<number>;
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebsiteStatisticsModel = void 0;
|
|
4
|
+
exports.dayRowId = dayRowId;
|
|
5
|
+
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
6
|
+
const types_1 = require("@/types");
|
|
7
|
+
const website_statistics_table_1 = require("../tables/website_statistics.table");
|
|
8
|
+
function dayRowId(websiteId, day) {
|
|
9
|
+
return `${websiteId}:${day}`;
|
|
10
|
+
}
|
|
11
|
+
class WebsiteStatisticsModel extends (0, interface_database_decorators_1.BasicDataModel)(website_statistics_table_1.WebsiteStatistics, website_statistics_table_1.websiteStatisticsTableName) {
|
|
12
|
+
async getDaysSince(websiteId, cutoff) {
|
|
13
|
+
return this.table
|
|
14
|
+
.getAll(websiteId, "websiteId")
|
|
15
|
+
.filter((doc) => doc.key("day").ge(cutoff))
|
|
16
|
+
.orderBy("day", "asc")
|
|
17
|
+
.run();
|
|
18
|
+
}
|
|
19
|
+
async getTopsSince(websiteId, cutoff, dimensions) {
|
|
20
|
+
return this.table
|
|
21
|
+
.getAll(websiteId, "websiteId")
|
|
22
|
+
.filter((doc) => doc.key("day").ge(cutoff))
|
|
23
|
+
.map((doc) => {
|
|
24
|
+
const tops = doc.key("tops");
|
|
25
|
+
return Object.fromEntries(dimensions.map((dimension) => [dimension, tops.key(dimension)]));
|
|
26
|
+
})
|
|
27
|
+
.run();
|
|
28
|
+
}
|
|
29
|
+
async addDelta(id, delta, tops) {
|
|
30
|
+
return this.table
|
|
31
|
+
.get(id)
|
|
32
|
+
.update((doc) => ({
|
|
33
|
+
pageviews: doc.key("pageviews").add(delta.pageviews),
|
|
34
|
+
sessions: doc.key("sessions").add(delta.sessions),
|
|
35
|
+
newVisitors: doc.key("newVisitors").add(delta.newVisitors),
|
|
36
|
+
customEvents: doc.key("customEvents").add(delta.customEvents),
|
|
37
|
+
bouncedSessions: doc
|
|
38
|
+
.key("bouncedSessions")
|
|
39
|
+
.default(0)
|
|
40
|
+
.add(delta.bouncedSessions),
|
|
41
|
+
sessionDurationMs: doc
|
|
42
|
+
.key("sessionDurationMs")
|
|
43
|
+
.default(0)
|
|
44
|
+
.add(delta.sessionDurationMs),
|
|
45
|
+
tops,
|
|
46
|
+
}))
|
|
47
|
+
.run();
|
|
48
|
+
}
|
|
49
|
+
async deleteDaysBefore(cutoff) {
|
|
50
|
+
return this.table.between("day", 0, cutoff).delete().run();
|
|
51
|
+
}
|
|
52
|
+
async emptyTopsBefore(cutoff) {
|
|
53
|
+
return this.table
|
|
54
|
+
.between("day", 0, cutoff)
|
|
55
|
+
.update({ tops: (0, types_1.byDimension)(() => ({})) })
|
|
56
|
+
.run();
|
|
57
|
+
}
|
|
58
|
+
async deleteByWebsite(websiteId) {
|
|
59
|
+
return this.table.getAll(websiteId, "websiteId").delete().run();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
exports.WebsiteStatisticsModel = WebsiteStatisticsModel;
|
|
63
|
+
//# sourceMappingURL=website_statistics.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"website_statistics.model.js","sourceRoot":"","sources":["../../../src/db/models/website_statistics.model.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Website } from "../tables/websites.table";
|
|
2
|
+
declare const WebsitesModel_base: {
|
|
3
|
+
new (database: import("@antelopejs/interface-database").SchemaInstance<any>): {
|
|
4
|
+
readonly table: import("@antelopejs/interface-database").Table<Website>;
|
|
5
|
+
readonly database: import("@antelopejs/interface-database").SchemaInstance<any>;
|
|
6
|
+
get(id: string): PromiseLike<Website | undefined>;
|
|
7
|
+
getBy(index: keyof Website, ...keys: any[]): PromiseLike<Website[]>;
|
|
8
|
+
getAll(): PromiseLike<Website[]>;
|
|
9
|
+
insert(obj: import("@antelopejs/interface-database-decorators").DeepPartial<Website> | import("@antelopejs/interface-database-decorators").DeepPartial<Website>[], options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<string[]>;
|
|
10
|
+
update(id: string, obj: import("@antelopejs/interface-database-decorators").DeepPartial<Website>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
11
|
+
update(obj: import("@antelopejs/interface-database-decorators").DeepPartial<Website>, options?: import("@antelopejs/interface-database-decorators").ValidateOptions): Promise<number>;
|
|
12
|
+
delete(id: string): Promise<number>;
|
|
13
|
+
};
|
|
14
|
+
readonly schemaName: string;
|
|
15
|
+
fromPlainData(obj: any): Website;
|
|
16
|
+
fromDatabase(obj: any): Website | undefined;
|
|
17
|
+
toDatabase(obj: any): Record<string, any>;
|
|
18
|
+
validate(obj: unknown, options?: import("@antelopejs/interface-database-decorators").ValidateInputOptions): import("@antelopejs/interface-database-decorators").ValidationResult;
|
|
19
|
+
};
|
|
20
|
+
export declare class WebsitesModel extends WebsitesModel_base {
|
|
21
|
+
getByTenant(tenantId: string): Promise<Website[]>;
|
|
22
|
+
listIdsByTenant(tenantId: string): Promise<string[]>;
|
|
23
|
+
listTenantIds(): Promise<string[]>;
|
|
24
|
+
deleteByTenant(tenantId: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebsitesModel = void 0;
|
|
4
|
+
const interface_database_decorators_1 = require("@antelopejs/interface-database-decorators");
|
|
5
|
+
const websites_table_1 = require("../tables/websites.table");
|
|
6
|
+
class WebsitesModel extends (0, interface_database_decorators_1.BasicDataModel)(websites_table_1.Website, websites_table_1.websitesTableName) {
|
|
7
|
+
async getByTenant(tenantId) {
|
|
8
|
+
return this.table
|
|
9
|
+
.getAll(tenantId, "tenantId")
|
|
10
|
+
.orderBy("createdAt", "desc")
|
|
11
|
+
.run();
|
|
12
|
+
}
|
|
13
|
+
async listIdsByTenant(tenantId) {
|
|
14
|
+
return this.table
|
|
15
|
+
.getAll(tenantId, "tenantId")
|
|
16
|
+
.map((doc) => doc.key("_id"))
|
|
17
|
+
.run();
|
|
18
|
+
}
|
|
19
|
+
async listTenantIds() {
|
|
20
|
+
return this.table.distinct("tenantId").run();
|
|
21
|
+
}
|
|
22
|
+
async deleteByTenant(tenantId) {
|
|
23
|
+
await this.table.getAll(tenantId, "tenantId").delete().run();
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
exports.WebsitesModel = WebsitesModel;
|
|
27
|
+
//# sourceMappingURL=websites.model.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websites.model.js","sourceRoot":"","sources":["../../../src/db/models/websites.model.ts"],"names":[],"mappings":";;;AAAA,6FAA2E;AAC3E,6DAAsE;AAEtE,MAAa,aAAc,SAAQ,IAAA,8CAAc,EAAC,wBAAO,EAAE,kCAAiB,CAAC;IAC3E,KAAK,CAAC,WAAW,CAAC,QAAgB;QAChC,OAAO,IAAI,CAAC,KAAK;aACd,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;aAC5B,OAAO,CAAC,WAAW,EAAE,MAAM,CAAC;aAC5B,GAAG,EAAE,CAAC;IACX,CAAC;IAGD,KAAK,CAAC,eAAe,CAAC,QAAgB;QACpC,OAAO,IAAI,CAAC,KAAK;aACd,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC;aAC5B,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;aAC5B,GAAG,EAAE,CAAC;IACX,CAAC;IAED,KAAK,CAAC,aAAa;QACjB,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC;IAC/D,CAAC;CACF;AAvBD,sCAuBC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Table } from "@antelopejs/interface-database-decorators";
|
|
2
|
+
export declare const funnelsTableName = "marketing_funnels";
|
|
3
|
+
export interface FunnelStep {
|
|
4
|
+
kind: "url" | "custom";
|
|
5
|
+
value: string;
|
|
6
|
+
}
|
|
7
|
+
export declare const EXPERIMENT_STATUSES: readonly ["draft", "running", "stopped"];
|
|
8
|
+
export type ExperimentStatus = (typeof EXPERIMENT_STATUSES)[number];
|
|
9
|
+
export interface ExperimentVariation {
|
|
10
|
+
key: string;
|
|
11
|
+
weight: number;
|
|
12
|
+
}
|
|
13
|
+
export interface ExperimentRun {
|
|
14
|
+
startedAt: number;
|
|
15
|
+
stoppedAt: number | null;
|
|
16
|
+
}
|
|
17
|
+
export interface FunnelExperiment {
|
|
18
|
+
key: string;
|
|
19
|
+
status: ExperimentStatus;
|
|
20
|
+
variations: ExperimentVariation[];
|
|
21
|
+
runs: ExperimentRun[];
|
|
22
|
+
}
|
|
23
|
+
export declare class Funnel extends Table {
|
|
24
|
+
websiteId: string;
|
|
25
|
+
name: string;
|
|
26
|
+
steps: FunnelStep[];
|
|
27
|
+
conversionWindowMs: number;
|
|
28
|
+
experiment: FunnelExperiment | null;
|
|
29
|
+
createdAt: Date;
|
|
30
|
+
updatedAt: Date;
|
|
31
|
+
}
|