@oneuptime/common 12.0.18 → 12.0.19
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/Models/DatabaseModels/EnterpriseLicense.ts +23 -0
- package/Models/DatabaseModels/Index.ts +4 -2
- package/Models/DatabaseModels/Monitor.ts +39 -9
- package/Models/DatabaseModels/UserMicrosoftTeams.ts +344 -0
- package/Models/DatabaseModels/UserNotificationRule.ts +144 -8
- package/Models/DatabaseModels/UserNotificationSetting.ts +34 -0
- package/Models/DatabaseModels/UserOnCallLogTimeline.ts +95 -0
- package/Models/DatabaseModels/UserSlack.ts +341 -0
- package/Models/DatabaseModels/WorkspaceProjectAuthToken.ts +9 -0
- package/Server/API/UserMicrosoftTeamsAPI.ts +127 -0
- package/Server/API/UserSlackAPI.ts +125 -0
- package/Server/EnvironmentConfig.ts +12 -107
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788700000000-RemoveMarketingConversionUploadState.ts +33 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788800000000-DropMarketingConversionAddEnterpriseLicenseEmail.ts +51 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.ts +117 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.ts +197 -0
- package/Server/Infrastructure/Postgres/SchemaMigrations/Index.ts +8 -0
- package/Server/Infrastructure/Queue.ts +7 -0
- package/Server/Services/EnterpriseLicenseService.ts +60 -0
- package/Server/Services/Index.ts +6 -2
- package/Server/Services/LlmLogService.ts +25 -9
- package/Server/Services/OnCallReadinessService.ts +86 -2
- package/Server/Services/ProjectService.ts +67 -0
- package/Server/Services/UserMicrosoftTeamsService.ts +208 -0
- package/Server/Services/UserNotificationMethodAdminService.ts +167 -5
- package/Server/Services/UserNotificationRuleAdminService.ts +40 -6
- package/Server/Services/UserNotificationRuleService.ts +589 -11
- package/Server/Services/UserNotificationSettingService.ts +138 -0
- package/Server/Services/UserService.ts +28 -0
- package/Server/Services/UserSlackService.ts +218 -0
- package/Server/Services/WorkspaceProjectAuthTokenService.ts +67 -1
- package/Server/Services/WorkspaceUserAuthTokenService.ts +73 -0
- package/Server/Services/WorkspaceUserNotificationService.ts +190 -0
- package/Server/Utils/Marketing/MarketingEventUtil.ts +145 -0
- package/Server/Utils/Marketing/MarketingEventWebhook.ts +114 -0
- package/Server/Utils/Monitor/MonitorLogUtil.ts +14 -1
- package/Server/Utils/Monitor/MonitorPayloadRedaction.ts +321 -0
- package/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.ts +191 -4
- package/Tests/App/Dashboard/AdminNotificationRulesPage.test.tsx +22 -14
- package/Tests/App/Dashboard/AdminUserNotificationMethodsPage.test.tsx +22 -11
- package/Tests/App/Dashboard/OnCallPreventionGuards.test.tsx +37 -1
- package/Tests/App/Dashboard/OnCallRulesTable.test.tsx +18 -10
- package/Tests/Models/DatabaseModels/DomainRoleTierCoverage.test.ts +27 -1
- package/Tests/Models/DatabaseModels/MonitorSecretKeyColumnAccessControl.test.ts +214 -0
- package/Tests/Server/API/OnCallReadinessAPI.test.ts +145 -26
- package/Tests/Server/API/UserNotificationMethodAdminAPI.test.ts +2 -2
- package/Tests/Server/Services/AIServiceDailyBudget.test.ts +11 -1
- package/Tests/Server/Services/AdminRuleEditGuards.test.ts +22 -8
- package/Tests/Server/Services/DeliverNotificationForRuleExtraction.test.ts +18 -2
- package/Tests/Server/Services/EpisodeRuleSeverityRepair.test.ts +5 -1
- package/Tests/Server/Services/LlmLogServiceTokenAggregateParams.test.ts +640 -0
- package/Tests/Server/Services/NotificationChannelEventCoverage.test.ts +246 -22
- package/Tests/Server/Services/NotificationDeletionImpact.test.ts +136 -8
- package/Tests/Server/Services/OnCallNotificationFallback.test.ts +191 -8
- package/Tests/Server/Services/OnCallReadinessService.test.ts +343 -18
- package/Tests/Server/Services/SeverityRuleBackfill.test.ts +5 -1
- package/Tests/Server/Services/UserMicrosoftTeamsService.test.ts +343 -0
- package/Tests/Server/Services/UserNotificationMethodAdminService.test.ts +209 -8
- package/Tests/Server/Services/UserNotificationRuleAdminGuards.test.ts +22 -6
- package/Tests/Server/Services/UserNotificationRuleDefaultCreation.test.ts +12 -6
- package/Tests/Server/Services/UserNotificationRuleExecuteItem.test.ts +37 -3
- package/Tests/Server/Services/UserNotificationRuleWorkspaceDelivery.test.ts +669 -0
- package/Tests/Server/Services/UserNotificationSettingWorkspaceChannels.test.ts +410 -0
- package/Tests/Server/Services/UserSlackService.test.ts +407 -0
- package/Tests/Server/Services/WorkspaceProjectAuthTokenDisconnectCascade.test.ts +224 -0
- package/Tests/Server/Services/WorkspaceUserAuthTokenNotificationMethodCascade.test.ts +189 -0
- package/Tests/Server/Services/WorkspaceUserNotificationService.test.ts +496 -0
- package/Tests/Server/Types/Database/Permissions/AdminNotificationRuleAccess.test.ts +30 -17
- package/Tests/Server/Types/Database/Permissions/CreateOwnershipScoping.test.ts +8 -3
- package/Tests/Server/Types/Database/Permissions/OwnerOnlyColumns.test.ts +72 -3
- package/Tests/Server/Types/Database/Permissions/UserNotificationRuleScoping.test.ts +22 -18
- package/Tests/Server/Types/Database/Permissions/WorkspaceMethodStampedColumnCreate.test.ts +178 -0
- package/Tests/Server/Utils/Marketing/MarketingEventUtil.test.ts +259 -0
- package/Tests/Server/Utils/Marketing/MarketingEventWebhook.test.ts +257 -0
- package/Tests/Server/Utils/Monitor/MonitorLogUtilRedaction.test.ts +300 -0
- package/Tests/Server/Utils/Monitor/MonitorPayloadRedaction.test.ts +381 -0
- package/Tests/Server/Utils/Runbook/RunbookExecutePermission.test.ts +228 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayErasureTombstone.test.ts +189 -0
- package/Tests/Server/Utils/SessionReplay/SessionReplayUsage.test.ts +205 -0
- package/Tests/Server/Utils/Telemetry/AppMetrics.test.ts +275 -0
- package/Tests/Server/Utils/Telemetry/TelemetryContext.test.ts +279 -0
- package/Tests/Server/Utils/Workspace/MicrosoftTeamsDirectMessage.test.ts +454 -0
- package/Tests/UI/Utils/NotificationMethodUtil.test.ts +137 -9
- package/Tests/UI/Utils/PermissionGate.test.ts +105 -0
- package/Types/Marketing/MarketingEvent.ts +97 -0
- package/UI/Utils/NotificationMethodUtil.ts +41 -1
- package/UI/Utils/PermissionGate.ts +56 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js +24 -0
- package/build/dist/Models/DatabaseModels/EnterpriseLicense.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Index.js +4 -2
- package/build/dist/Models/DatabaseModels/Index.js.map +1 -1
- package/build/dist/Models/DatabaseModels/Monitor.js +39 -9
- package/build/dist/Models/DatabaseModels/Monitor.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserMicrosoftTeams.js +363 -0
- package/build/dist/Models/DatabaseModels/UserMicrosoftTeams.js.map +1 -0
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js +145 -8
- package/build/dist/Models/DatabaseModels/UserNotificationRule.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserNotificationSetting.js +38 -0
- package/build/dist/Models/DatabaseModels/UserNotificationSetting.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js +96 -0
- package/build/dist/Models/DatabaseModels/UserOnCallLogTimeline.js.map +1 -1
- package/build/dist/Models/DatabaseModels/UserSlack.js +361 -0
- package/build/dist/Models/DatabaseModels/UserSlack.js.map +1 -0
- package/build/dist/Models/DatabaseModels/WorkspaceProjectAuthToken.js.map +1 -1
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js +82 -0
- package/build/dist/Server/API/UserMicrosoftTeamsAPI.js.map +1 -0
- package/build/dist/Server/API/UserSlackAPI.js +81 -0
- package/build/dist/Server/API/UserSlackAPI.js.map +1 -0
- package/build/dist/Server/EnvironmentConfig.js +10 -70
- package/build/dist/Server/EnvironmentConfig.js.map +1 -1
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788700000000-RemoveMarketingConversionUploadState.js +26 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788700000000-RemoveMarketingConversionUploadState.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788800000000-DropMarketingConversionAddEnterpriseLicenseEmail.js +37 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788800000000-DropMarketingConversionAddEnterpriseLicenseEmail.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js +106 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1788900000000-RedactStoredMonitorIngestSecrets.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js +78 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/1789000000000-AddUserSlackAndMicrosoftTeams.js.map +1 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js +8 -0
- package/build/dist/Server/Infrastructure/Postgres/SchemaMigrations/Index.js.map +1 -1
- package/build/dist/Server/Infrastructure/Queue.js +7 -0
- package/build/dist/Server/Infrastructure/Queue.js.map +1 -1
- package/build/dist/Server/Services/EnterpriseLicenseService.js +65 -0
- package/build/dist/Server/Services/EnterpriseLicenseService.js.map +1 -1
- package/build/dist/Server/Services/Index.js +6 -2
- package/build/dist/Server/Services/Index.js.map +1 -1
- package/build/dist/Server/Services/LlmLogService.js +25 -9
- package/build/dist/Server/Services/LlmLogService.js.map +1 -1
- package/build/dist/Server/Services/OnCallReadinessService.js +74 -2
- package/build/dist/Server/Services/OnCallReadinessService.js.map +1 -1
- package/build/dist/Server/Services/ProjectService.js +56 -0
- package/build/dist/Server/Services/ProjectService.js.map +1 -1
- package/build/dist/Server/Services/UserMicrosoftTeamsService.js +183 -0
- package/build/dist/Server/Services/UserMicrosoftTeamsService.js.map +1 -0
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js +138 -2
- package/build/dist/Server/Services/UserNotificationMethodAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js +32 -4
- package/build/dist/Server/Services/UserNotificationRuleAdminService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationRuleService.js +499 -67
- package/build/dist/Server/Services/UserNotificationRuleService.js.map +1 -1
- package/build/dist/Server/Services/UserNotificationSettingService.js +118 -0
- package/build/dist/Server/Services/UserNotificationSettingService.js.map +1 -1
- package/build/dist/Server/Services/UserService.js +26 -1
- package/build/dist/Server/Services/UserService.js.map +1 -1
- package/build/dist/Server/Services/UserSlackService.js +195 -0
- package/build/dist/Server/Services/UserSlackService.js.map +1 -0
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js +64 -1
- package/build/dist/Server/Services/WorkspaceProjectAuthTokenService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceUserAuthTokenService.js +70 -0
- package/build/dist/Server/Services/WorkspaceUserAuthTokenService.js.map +1 -1
- package/build/dist/Server/Services/WorkspaceUserNotificationService.js +129 -0
- package/build/dist/Server/Services/WorkspaceUserNotificationService.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js +94 -0
- package/build/dist/Server/Utils/Marketing/MarketingEventUtil.js.map +1 -0
- package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js +93 -0
- package/build/dist/Server/Utils/Marketing/MarketingEventWebhook.js.map +1 -0
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js +12 -1
- package/build/dist/Server/Utils/Monitor/MonitorLogUtil.js.map +1 -1
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js +233 -0
- package/build/dist/Server/Utils/Monitor/MonitorPayloadRedaction.js.map +1 -0
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js +141 -4
- package/build/dist/Server/Utils/Workspace/MicrosoftTeams/MicrosoftTeams.js.map +1 -1
- package/build/dist/Types/Marketing/MarketingEvent.js +43 -0
- package/build/dist/Types/Marketing/MarketingEvent.js.map +1 -0
- package/build/dist/UI/Utils/NotificationMethodUtil.js +33 -1
- package/build/dist/UI/Utils/NotificationMethodUtil.js.map +1 -1
- package/build/dist/UI/Utils/PermissionGate.js +32 -0
- package/build/dist/UI/Utils/PermissionGate.js.map +1 -1
- package/package.json +1 -1
- package/Models/DatabaseModels/MarketingConversion.ts +0 -410
- package/Server/Services/MarketingConversionService.ts +0 -10
- package/Server/Utils/Marketing/ConversionUploadProvider.ts +0 -215
- package/Server/Utils/Marketing/ConversionUploadProviders.ts +0 -22
- package/Server/Utils/Marketing/Providers/GoogleAds.ts +0 -333
- package/Server/Utils/Marketing/Providers/LinkedIn.ts +0 -185
- package/Server/Utils/Marketing/Providers/Meta.ts +0 -182
- package/Server/Utils/Marketing/Providers/MicrosoftAds.ts +0 -223
- package/Server/Utils/Marketing/Providers/Reddit.ts +0 -208
- package/Tests/Server/Utils/Marketing/AdUploadableConversionTypes.test.ts +0 -315
- package/Tests/Server/Utils/Marketing/ConversionUploadProvider.test.ts +0 -300
- package/Tests/Server/Utils/Marketing/GoogleAds.test.ts +0 -592
- package/Tests/Server/Utils/Marketing/LinkedIn.test.ts +0 -282
- package/Tests/Server/Utils/Marketing/Meta.test.ts +0 -304
- package/Tests/Server/Utils/Marketing/MicrosoftAds.test.ts +0 -263
- package/Tests/Server/Utils/Marketing/Reddit.test.ts +0 -259
- package/Types/Marketing/MarketingConversion.ts +0 -53
- package/build/dist/Models/DatabaseModels/MarketingConversion.js +0 -445
- package/build/dist/Models/DatabaseModels/MarketingConversion.js.map +0 -1
- package/build/dist/Server/Services/MarketingConversionService.js +0 -9
- package/build/dist/Server/Services/MarketingConversionService.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js +0 -93
- package/build/dist/Server/Utils/Marketing/ConversionUploadProvider.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js +0 -20
- package/build/dist/Server/Utils/Marketing/ConversionUploadProviders.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js +0 -221
- package/build/dist/Server/Utils/Marketing/Providers/GoogleAds.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js +0 -137
- package/build/dist/Server/Utils/Marketing/Providers/LinkedIn.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js +0 -133
- package/build/dist/Server/Utils/Marketing/Providers/Meta.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js +0 -143
- package/build/dist/Server/Utils/Marketing/Providers/MicrosoftAds.js.map +0 -1
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js +0 -145
- package/build/dist/Server/Utils/Marketing/Providers/Reddit.js.map +0 -1
- package/build/dist/Types/Marketing/MarketingConversion.js +0 -52
- package/build/dist/Types/Marketing/MarketingConversion.js.map +0 -1
|
@@ -1,445 +0,0 @@
|
|
|
1
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
-
};
|
|
7
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
-
};
|
|
10
|
-
import BaseModel from "./DatabaseBaseModel/DatabaseBaseModel";
|
|
11
|
-
import Route from "../../Types/API/Route";
|
|
12
|
-
import ColumnAccessControl from "../../Types/Database/AccessControl/ColumnAccessControl";
|
|
13
|
-
import TableAccessControl from "../../Types/Database/AccessControl/TableAccessControl";
|
|
14
|
-
import ColumnLength from "../../Types/Database/ColumnLength";
|
|
15
|
-
import ColumnType from "../../Types/Database/ColumnType";
|
|
16
|
-
import CrudApiEndpoint from "../../Types/Database/CrudApiEndpoint";
|
|
17
|
-
import TableColumn from "../../Types/Database/TableColumn";
|
|
18
|
-
import TableColumnType from "../../Types/Database/TableColumnType";
|
|
19
|
-
import TableMetadata from "../../Types/Database/TableMetadata";
|
|
20
|
-
import IconProp from "../../Types/Icon/IconProp";
|
|
21
|
-
import ObjectID from "../../Types/ObjectID";
|
|
22
|
-
import { Column, Entity, Index } from "typeorm";
|
|
23
|
-
/*
|
|
24
|
-
* Internal table (no API access) recording server-confirmed conversions —
|
|
25
|
-
* signups, booked meetings and paid subscriptions — together with the
|
|
26
|
-
* attribution the converting visitor carried (ad click IDs, UTM parameters,
|
|
27
|
-
* first touch) and the status of uploading them to ad platforms. Browser
|
|
28
|
-
* analytics never write this table: rows are written by the Cal.com webhook and
|
|
29
|
-
* the MarketingConversions worker job, which also reads it.
|
|
30
|
-
*
|
|
31
|
-
* This table is deliberately not a CRM. Contact, account and deal records live
|
|
32
|
-
* in Revenue, and nothing here creates or advances them — a booked meeting is
|
|
33
|
-
* a measured conversion, not a qualified opportunity.
|
|
34
|
-
*/
|
|
35
|
-
let MarketingConversion = class MarketingConversion extends BaseModel {
|
|
36
|
-
constructor() {
|
|
37
|
-
super(...arguments);
|
|
38
|
-
this.conversionType = undefined;
|
|
39
|
-
this.userId = undefined;
|
|
40
|
-
this.projectId = undefined;
|
|
41
|
-
this.email = undefined;
|
|
42
|
-
this.clickIds = undefined;
|
|
43
|
-
this.conversionAt = undefined;
|
|
44
|
-
this.conversionValueInUSDCents = undefined;
|
|
45
|
-
this.uploadState = undefined;
|
|
46
|
-
/*
|
|
47
|
-
* Last-touch UTM parameters, copied from the User or Project this conversion
|
|
48
|
-
* belongs to, or read from Cal booking metadata for a booked meeting.
|
|
49
|
-
*
|
|
50
|
-
* The ledger carried only clickIds until now, which meant the only thing
|
|
51
|
-
* that could answer "how many demos did this campaign produce" was the ad
|
|
52
|
-
* platform, and only for clicks it had auto-tagged. Any campaign delivering
|
|
53
|
-
* UTMs without a click id — a newsletter, a sponsorship, a conference link —
|
|
54
|
-
* was invisible in OneUptime's own data. These columns are what make the
|
|
55
|
-
* ledger reportable on its own.
|
|
56
|
-
*/
|
|
57
|
-
this.utmCampaign = undefined;
|
|
58
|
-
this.utmSource = undefined;
|
|
59
|
-
this.utmMedium = undefined;
|
|
60
|
-
this.utmTerm = undefined;
|
|
61
|
-
this.utmContent = undefined;
|
|
62
|
-
this.utmUrl = undefined;
|
|
63
|
-
this.firstTouchAttribution = undefined;
|
|
64
|
-
/*
|
|
65
|
-
* SHA-256 of the lowercased, trimmed email (Common/Server/Utils/Attribution).
|
|
66
|
-
*
|
|
67
|
-
* Two jobs, and it is the same value for both. Ad platforms that support
|
|
68
|
-
* enhanced matching want exactly this digest, and it is the only key that
|
|
69
|
-
* can join a booked meeting to the signup it produced weeks later: a
|
|
70
|
-
* MeetingBooked row has no userId, a SignUp row has no booking, and the
|
|
71
|
-
* person may well have used a different device for each. Indexed because
|
|
72
|
-
* the chain-linking pass looks conversions up by it.
|
|
73
|
-
*/
|
|
74
|
-
this.emailHash = undefined;
|
|
75
|
-
/*
|
|
76
|
-
* The earlier conversion by the same person that this one followed.
|
|
77
|
-
*
|
|
78
|
-
* Set by the MarketingConversions worker, never by a writer: the writers see
|
|
79
|
-
* one moment each and cannot know what came before it. A paid subscription
|
|
80
|
-
* pointing at a booked meeting is what makes "revenue this demo campaign
|
|
81
|
-
* produced" answerable — without it the ledger holds four unrelated rows for
|
|
82
|
-
* one customer journey.
|
|
83
|
-
*/
|
|
84
|
-
this.attributedToConversionId = undefined;
|
|
85
|
-
}
|
|
86
|
-
};
|
|
87
|
-
__decorate([
|
|
88
|
-
ColumnAccessControl({
|
|
89
|
-
create: [],
|
|
90
|
-
read: [],
|
|
91
|
-
update: [],
|
|
92
|
-
}),
|
|
93
|
-
TableColumn({
|
|
94
|
-
type: TableColumnType.ShortText,
|
|
95
|
-
required: true,
|
|
96
|
-
title: "Conversion Type",
|
|
97
|
-
description: "SignUp, MeetingBooked or PaidSubscription.",
|
|
98
|
-
}),
|
|
99
|
-
Column({
|
|
100
|
-
type: ColumnType.ShortText,
|
|
101
|
-
length: ColumnLength.ShortText,
|
|
102
|
-
nullable: false,
|
|
103
|
-
}),
|
|
104
|
-
__metadata("design:type", String)
|
|
105
|
-
], MarketingConversion.prototype, "conversionType", void 0);
|
|
106
|
-
__decorate([
|
|
107
|
-
ColumnAccessControl({
|
|
108
|
-
create: [],
|
|
109
|
-
read: [],
|
|
110
|
-
update: [],
|
|
111
|
-
}),
|
|
112
|
-
Index("idx_marketing_conversion_user_id"),
|
|
113
|
-
TableColumn({
|
|
114
|
-
type: TableColumnType.ObjectID,
|
|
115
|
-
required: false,
|
|
116
|
-
title: "User ID",
|
|
117
|
-
description: "User this conversion belongs to (SignUp conversions). Null when the conversion has no OneUptime user yet, as with a booked meeting.",
|
|
118
|
-
}),
|
|
119
|
-
Column({
|
|
120
|
-
type: ColumnType.ObjectID,
|
|
121
|
-
nullable: true,
|
|
122
|
-
transformer: ObjectID.getDatabaseTransformer(),
|
|
123
|
-
}),
|
|
124
|
-
__metadata("design:type", ObjectID)
|
|
125
|
-
], MarketingConversion.prototype, "userId", void 0);
|
|
126
|
-
__decorate([
|
|
127
|
-
ColumnAccessControl({
|
|
128
|
-
create: [],
|
|
129
|
-
read: [],
|
|
130
|
-
update: [],
|
|
131
|
-
}),
|
|
132
|
-
Index("idx_marketing_conversion_project_id"),
|
|
133
|
-
TableColumn({
|
|
134
|
-
type: TableColumnType.ObjectID,
|
|
135
|
-
required: false,
|
|
136
|
-
title: "Project ID",
|
|
137
|
-
description: "Project this conversion belongs to (PaidSubscription conversions).",
|
|
138
|
-
}),
|
|
139
|
-
Column({
|
|
140
|
-
type: ColumnType.ObjectID,
|
|
141
|
-
nullable: true,
|
|
142
|
-
transformer: ObjectID.getDatabaseTransformer(),
|
|
143
|
-
}),
|
|
144
|
-
__metadata("design:type", ObjectID)
|
|
145
|
-
], MarketingConversion.prototype, "projectId", void 0);
|
|
146
|
-
__decorate([
|
|
147
|
-
ColumnAccessControl({
|
|
148
|
-
create: [],
|
|
149
|
-
read: [],
|
|
150
|
-
update: [],
|
|
151
|
-
}),
|
|
152
|
-
TableColumn({
|
|
153
|
-
type: TableColumnType.ShortText,
|
|
154
|
-
required: false,
|
|
155
|
-
title: "Email",
|
|
156
|
-
description: "Email of the converting user. Never sent anywhere in the clear: every ad platform receives the SHA-256 in emailHash instead.",
|
|
157
|
-
}),
|
|
158
|
-
Column({
|
|
159
|
-
type: ColumnType.ShortText,
|
|
160
|
-
length: ColumnLength.ShortText,
|
|
161
|
-
nullable: true,
|
|
162
|
-
}),
|
|
163
|
-
__metadata("design:type", Object)
|
|
164
|
-
], MarketingConversion.prototype, "email", void 0);
|
|
165
|
-
__decorate([
|
|
166
|
-
ColumnAccessControl({
|
|
167
|
-
create: [],
|
|
168
|
-
read: [],
|
|
169
|
-
update: [],
|
|
170
|
-
}),
|
|
171
|
-
TableColumn({
|
|
172
|
-
type: TableColumnType.JSON,
|
|
173
|
-
required: true,
|
|
174
|
-
title: "Click IDs",
|
|
175
|
-
description: "Ad click identifiers (gclid, wbraid, gbraid, fbclid, ...) captured for this conversion.",
|
|
176
|
-
}),
|
|
177
|
-
Column({
|
|
178
|
-
type: ColumnType.JSON,
|
|
179
|
-
nullable: false,
|
|
180
|
-
}),
|
|
181
|
-
__metadata("design:type", Object)
|
|
182
|
-
], MarketingConversion.prototype, "clickIds", void 0);
|
|
183
|
-
__decorate([
|
|
184
|
-
ColumnAccessControl({
|
|
185
|
-
create: [],
|
|
186
|
-
read: [],
|
|
187
|
-
update: [],
|
|
188
|
-
}),
|
|
189
|
-
TableColumn({
|
|
190
|
-
type: TableColumnType.Date,
|
|
191
|
-
required: true,
|
|
192
|
-
title: "Conversion At",
|
|
193
|
-
description: "When the conversion happened.",
|
|
194
|
-
}),
|
|
195
|
-
Column({
|
|
196
|
-
type: ColumnType.Date,
|
|
197
|
-
nullable: false,
|
|
198
|
-
}),
|
|
199
|
-
__metadata("design:type", Date)
|
|
200
|
-
], MarketingConversion.prototype, "conversionAt", void 0);
|
|
201
|
-
__decorate([
|
|
202
|
-
ColumnAccessControl({
|
|
203
|
-
create: [],
|
|
204
|
-
read: [],
|
|
205
|
-
update: [],
|
|
206
|
-
}),
|
|
207
|
-
TableColumn({
|
|
208
|
-
type: TableColumnType.Number,
|
|
209
|
-
required: false,
|
|
210
|
-
title: "Conversion Value (USD Cents)",
|
|
211
|
-
description: "Conversion value in USD cents (monthly recurring revenue for paid subscriptions). Null when unknown (custom pricing) or not applicable (signups, booked meetings).",
|
|
212
|
-
}),
|
|
213
|
-
Column({
|
|
214
|
-
type: ColumnType.Number,
|
|
215
|
-
nullable: true,
|
|
216
|
-
}),
|
|
217
|
-
__metadata("design:type", Object)
|
|
218
|
-
], MarketingConversion.prototype, "conversionValueInUSDCents", void 0);
|
|
219
|
-
__decorate([
|
|
220
|
-
ColumnAccessControl({
|
|
221
|
-
create: [],
|
|
222
|
-
read: [],
|
|
223
|
-
update: [],
|
|
224
|
-
}),
|
|
225
|
-
TableColumn({
|
|
226
|
-
type: TableColumnType.JSON,
|
|
227
|
-
required: false,
|
|
228
|
-
title: "Upload State",
|
|
229
|
-
description: "Per-ad-platform upload state, keyed by provider (google, meta, microsoft, linkedin, reddit, ...): { status: Uploaded|Failed|Skipped, attempts, error, uploadedAt }. Absent key or absent status means pending.",
|
|
230
|
-
}),
|
|
231
|
-
Column({
|
|
232
|
-
type: ColumnType.JSON,
|
|
233
|
-
nullable: true,
|
|
234
|
-
}),
|
|
235
|
-
__metadata("design:type", Object)
|
|
236
|
-
], MarketingConversion.prototype, "uploadState", void 0);
|
|
237
|
-
__decorate([
|
|
238
|
-
ColumnAccessControl({
|
|
239
|
-
create: [],
|
|
240
|
-
read: [],
|
|
241
|
-
update: [],
|
|
242
|
-
}),
|
|
243
|
-
Index("idx_marketing_conversion_utm_campaign"),
|
|
244
|
-
TableColumn({
|
|
245
|
-
type: TableColumnType.LongText,
|
|
246
|
-
required: false,
|
|
247
|
-
title: "UTM Campaign",
|
|
248
|
-
description: "Last-touch utm_campaign for this conversion.",
|
|
249
|
-
}),
|
|
250
|
-
Column({
|
|
251
|
-
type: ColumnType.LongText,
|
|
252
|
-
length: ColumnLength.LongText,
|
|
253
|
-
nullable: true,
|
|
254
|
-
}),
|
|
255
|
-
__metadata("design:type", Object)
|
|
256
|
-
], MarketingConversion.prototype, "utmCampaign", void 0);
|
|
257
|
-
__decorate([
|
|
258
|
-
ColumnAccessControl({
|
|
259
|
-
create: [],
|
|
260
|
-
read: [],
|
|
261
|
-
update: [],
|
|
262
|
-
}),
|
|
263
|
-
Index("idx_marketing_conversion_utm_source"),
|
|
264
|
-
TableColumn({
|
|
265
|
-
type: TableColumnType.LongText,
|
|
266
|
-
required: false,
|
|
267
|
-
title: "UTM Source",
|
|
268
|
-
description: "Last-touch utm_source for this conversion.",
|
|
269
|
-
}),
|
|
270
|
-
Column({
|
|
271
|
-
type: ColumnType.LongText,
|
|
272
|
-
length: ColumnLength.LongText,
|
|
273
|
-
nullable: true,
|
|
274
|
-
}),
|
|
275
|
-
__metadata("design:type", Object)
|
|
276
|
-
], MarketingConversion.prototype, "utmSource", void 0);
|
|
277
|
-
__decorate([
|
|
278
|
-
ColumnAccessControl({
|
|
279
|
-
create: [],
|
|
280
|
-
read: [],
|
|
281
|
-
update: [],
|
|
282
|
-
}),
|
|
283
|
-
TableColumn({
|
|
284
|
-
type: TableColumnType.LongText,
|
|
285
|
-
required: false,
|
|
286
|
-
title: "UTM Medium",
|
|
287
|
-
description: "Last-touch utm_medium for this conversion.",
|
|
288
|
-
}),
|
|
289
|
-
Column({
|
|
290
|
-
type: ColumnType.LongText,
|
|
291
|
-
length: ColumnLength.LongText,
|
|
292
|
-
nullable: true,
|
|
293
|
-
}),
|
|
294
|
-
__metadata("design:type", Object)
|
|
295
|
-
], MarketingConversion.prototype, "utmMedium", void 0);
|
|
296
|
-
__decorate([
|
|
297
|
-
ColumnAccessControl({
|
|
298
|
-
create: [],
|
|
299
|
-
read: [],
|
|
300
|
-
update: [],
|
|
301
|
-
}),
|
|
302
|
-
TableColumn({
|
|
303
|
-
type: TableColumnType.LongText,
|
|
304
|
-
required: false,
|
|
305
|
-
title: "UTM Term",
|
|
306
|
-
description: "Last-touch utm_term for this conversion.",
|
|
307
|
-
}),
|
|
308
|
-
Column({
|
|
309
|
-
type: ColumnType.LongText,
|
|
310
|
-
length: ColumnLength.LongText,
|
|
311
|
-
nullable: true,
|
|
312
|
-
}),
|
|
313
|
-
__metadata("design:type", Object)
|
|
314
|
-
], MarketingConversion.prototype, "utmTerm", void 0);
|
|
315
|
-
__decorate([
|
|
316
|
-
ColumnAccessControl({
|
|
317
|
-
create: [],
|
|
318
|
-
read: [],
|
|
319
|
-
update: [],
|
|
320
|
-
}),
|
|
321
|
-
TableColumn({
|
|
322
|
-
type: TableColumnType.LongText,
|
|
323
|
-
required: false,
|
|
324
|
-
title: "UTM Content",
|
|
325
|
-
description: "Last-touch utm_content for this conversion.",
|
|
326
|
-
}),
|
|
327
|
-
Column({
|
|
328
|
-
type: ColumnType.LongText,
|
|
329
|
-
length: ColumnLength.LongText,
|
|
330
|
-
nullable: true,
|
|
331
|
-
}),
|
|
332
|
-
__metadata("design:type", Object)
|
|
333
|
-
], MarketingConversion.prototype, "utmContent", void 0);
|
|
334
|
-
__decorate([
|
|
335
|
-
ColumnAccessControl({
|
|
336
|
-
create: [],
|
|
337
|
-
read: [],
|
|
338
|
-
update: [],
|
|
339
|
-
}),
|
|
340
|
-
TableColumn({
|
|
341
|
-
type: TableColumnType.LongText,
|
|
342
|
-
required: false,
|
|
343
|
-
title: "UTM URL",
|
|
344
|
-
description: "Landing URL of the attributed visit. The only attribution a campaign leaves when its link carried a click id and no UTMs at all, as Google Ads auto-tagging does.",
|
|
345
|
-
}),
|
|
346
|
-
Column({
|
|
347
|
-
type: ColumnType.LongText,
|
|
348
|
-
length: ColumnLength.LongText,
|
|
349
|
-
nullable: true,
|
|
350
|
-
}),
|
|
351
|
-
__metadata("design:type", Object)
|
|
352
|
-
], MarketingConversion.prototype, "utmUrl", void 0);
|
|
353
|
-
__decorate([
|
|
354
|
-
ColumnAccessControl({
|
|
355
|
-
create: [],
|
|
356
|
-
read: [],
|
|
357
|
-
update: [],
|
|
358
|
-
}),
|
|
359
|
-
TableColumn({
|
|
360
|
-
type: TableColumnType.JSON,
|
|
361
|
-
required: false,
|
|
362
|
-
title: "First Touch Attribution",
|
|
363
|
-
description: "UTM parameters, click IDs, landing URL and referrer from the visitor's first attributed visit. The utm* columns above hold last-touch values.",
|
|
364
|
-
}),
|
|
365
|
-
Column({
|
|
366
|
-
type: ColumnType.JSON,
|
|
367
|
-
nullable: true,
|
|
368
|
-
}),
|
|
369
|
-
__metadata("design:type", Object)
|
|
370
|
-
], MarketingConversion.prototype, "firstTouchAttribution", void 0);
|
|
371
|
-
__decorate([
|
|
372
|
-
ColumnAccessControl({
|
|
373
|
-
create: [],
|
|
374
|
-
read: [],
|
|
375
|
-
update: [],
|
|
376
|
-
}),
|
|
377
|
-
Index("idx_marketing_conversion_email_hash"),
|
|
378
|
-
TableColumn({
|
|
379
|
-
type: TableColumnType.ShortText,
|
|
380
|
-
required: false,
|
|
381
|
-
title: "Email Hash",
|
|
382
|
-
description: "SHA-256 of the normalized (trimmed, lowercased) email. Used for ad-platform enhanced matching and to join conversions by the same person across the demo/signup boundary.",
|
|
383
|
-
}),
|
|
384
|
-
Column({
|
|
385
|
-
type: ColumnType.ShortText,
|
|
386
|
-
length: ColumnLength.ShortText,
|
|
387
|
-
nullable: true,
|
|
388
|
-
}),
|
|
389
|
-
__metadata("design:type", Object)
|
|
390
|
-
], MarketingConversion.prototype, "emailHash", void 0);
|
|
391
|
-
__decorate([
|
|
392
|
-
ColumnAccessControl({
|
|
393
|
-
create: [],
|
|
394
|
-
read: [],
|
|
395
|
-
update: [],
|
|
396
|
-
}),
|
|
397
|
-
Index("idx_marketing_conversion_attributed_to"),
|
|
398
|
-
TableColumn({
|
|
399
|
-
type: TableColumnType.ObjectID,
|
|
400
|
-
required: false,
|
|
401
|
-
title: "Attributed To Conversion ID",
|
|
402
|
-
description: "The earliest earlier conversion by the same person (matched on emailHash) that this conversion followed. Null when this is the first conversion in the chain.",
|
|
403
|
-
}),
|
|
404
|
-
Column({
|
|
405
|
-
type: ColumnType.ObjectID,
|
|
406
|
-
nullable: true,
|
|
407
|
-
transformer: ObjectID.getDatabaseTransformer(),
|
|
408
|
-
}),
|
|
409
|
-
__metadata("design:type", Object)
|
|
410
|
-
], MarketingConversion.prototype, "attributedToConversionId", void 0);
|
|
411
|
-
MarketingConversion = __decorate([
|
|
412
|
-
TableAccessControl({
|
|
413
|
-
create: [],
|
|
414
|
-
read: [],
|
|
415
|
-
update: [],
|
|
416
|
-
delete: [],
|
|
417
|
-
}),
|
|
418
|
-
CrudApiEndpoint(new Route("/marketing-conversion")),
|
|
419
|
-
TableMetadata({
|
|
420
|
-
tableName: "MarketingConversion",
|
|
421
|
-
singularName: "Marketing Conversion",
|
|
422
|
-
pluralName: "Marketing Conversions",
|
|
423
|
-
icon: IconProp.ChartBar,
|
|
424
|
-
tableDescription: "Server-confirmed conversions (signups, meetings booked, paid subscriptions), the campaign attribution each carried, and their upload status to ad platforms for offline conversion tracking.",
|
|
425
|
-
}),
|
|
426
|
-
Entity({
|
|
427
|
-
name: "MarketingConversion",
|
|
428
|
-
})
|
|
429
|
-
/*
|
|
430
|
-
* One conversion of each type per user/project. Postgres treats NULLs as
|
|
431
|
-
* distinct, so these indexes only constrain rows that actually carry a user or
|
|
432
|
-
* project id — conversion types with neither (a booked meeting from an
|
|
433
|
-
* anonymous visitor) are de-duplicated by their deterministic primary key
|
|
434
|
-
* instead.
|
|
435
|
-
*/
|
|
436
|
-
,
|
|
437
|
-
Index("uq_marketing_conversion_type_user", ["conversionType", "userId"], {
|
|
438
|
-
unique: true,
|
|
439
|
-
}),
|
|
440
|
-
Index("uq_marketing_conversion_type_project", ["conversionType", "projectId"], {
|
|
441
|
-
unique: true,
|
|
442
|
-
})
|
|
443
|
-
], MarketingConversion);
|
|
444
|
-
export default MarketingConversion;
|
|
445
|
-
//# sourceMappingURL=MarketingConversion.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketingConversion.js","sourceRoot":"","sources":["../../../../Models/DatabaseModels/MarketingConversion.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import DatabaseService from "./DatabaseService";
|
|
2
|
-
import MarketingConversion from "../../Models/DatabaseModels/MarketingConversion";
|
|
3
|
-
export class Service extends DatabaseService {
|
|
4
|
-
constructor() {
|
|
5
|
-
super(MarketingConversion);
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
export default new Service();
|
|
9
|
-
//# sourceMappingURL=MarketingConversionService.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"MarketingConversionService.js","sourceRoot":"","sources":["../../../../Server/Services/MarketingConversionService.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,mBAAmB,MAAM,iDAAiD,CAAC;AAElF,MAAM,OAAO,OAAQ,SAAQ,eAAoC;IAC/D;QACE,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAC7B,CAAC;CACF;AAED,eAAe,IAAI,OAAO,EAAE,CAAC"}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { AxiosError } from "axios";
|
|
2
|
-
import Attribution from "../Attribution";
|
|
3
|
-
import { AdUploadableMarketingConversionTypes, LeadMarketingConversionTypes, MarketingConversionType, } from "../../../Types/Marketing/MarketingConversion";
|
|
4
|
-
export default class ConversionUploadProvider {
|
|
5
|
-
constructor() {
|
|
6
|
-
/*
|
|
7
|
-
* Max conversions this provider accepts in one upload() call. Providers
|
|
8
|
-
* that issue one HTTP request per conversion must keep this small so a
|
|
9
|
-
* single run finishes well inside the worker job timeout.
|
|
10
|
-
*/
|
|
11
|
-
this.maxBatchSize = 500;
|
|
12
|
-
}
|
|
13
|
-
/*
|
|
14
|
-
* Screens conversion types the ledger records but no ad platform has a
|
|
15
|
-
* mapping for, before any provider sees them.
|
|
16
|
-
*/
|
|
17
|
-
getSkipReason(conversion) {
|
|
18
|
-
if (!AdUploadableMarketingConversionTypes.includes(conversion.conversionType)) {
|
|
19
|
-
return {
|
|
20
|
-
reason: `Conversion type ${conversion.conversionType || "unknown"} has no ad platform conversion mapping`,
|
|
21
|
-
isPermanent: true,
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
return this.getProviderSkipReason(conversion);
|
|
25
|
-
}
|
|
26
|
-
getClickId(conversion, clickIdKey) {
|
|
27
|
-
const clickIds = conversion.clickIds || {};
|
|
28
|
-
const value = clickIds[clickIdKey];
|
|
29
|
-
return typeof value === "string" && value ? value : undefined;
|
|
30
|
-
}
|
|
31
|
-
/*
|
|
32
|
-
* The hashed email this conversion can be matched on, or undefined.
|
|
33
|
-
*
|
|
34
|
-
* Prefers the stored emailHash and falls back to hashing the email column,
|
|
35
|
-
* so rows written before emailHash existed still match. Both paths go
|
|
36
|
-
* through Attribution so the digest is identical whichever one produced it.
|
|
37
|
-
*/
|
|
38
|
-
getHashedEmail(conversion) {
|
|
39
|
-
if (conversion.emailHash) {
|
|
40
|
-
return conversion.emailHash;
|
|
41
|
-
}
|
|
42
|
-
return Attribution.hashEmail(conversion.email) || undefined;
|
|
43
|
-
}
|
|
44
|
-
/*
|
|
45
|
-
* Resolve a per-type value, or undefined when the column holds a string that
|
|
46
|
-
* is not a known conversion type. The column is a plain varchar, so this
|
|
47
|
-
* cannot be assumed away even though the mapping itself is exhaustive.
|
|
48
|
-
*/
|
|
49
|
-
resolveByConversionType(conversion, mapping) {
|
|
50
|
-
const conversionType = conversion.conversionType;
|
|
51
|
-
if (!Object.values(MarketingConversionType).includes(conversionType)) {
|
|
52
|
-
return undefined;
|
|
53
|
-
}
|
|
54
|
-
return mapping[conversionType];
|
|
55
|
-
}
|
|
56
|
-
/*
|
|
57
|
-
* A sales-led lead (booked meeting, enterprise licence request) rather than
|
|
58
|
-
* a completed transaction.
|
|
59
|
-
*/
|
|
60
|
-
isLead(conversion) {
|
|
61
|
-
return LeadMarketingConversionTypes.includes(conversion.conversionType);
|
|
62
|
-
}
|
|
63
|
-
/*
|
|
64
|
-
* The revenue to report for this conversion, in USD.
|
|
65
|
-
*
|
|
66
|
-
* Leads return undefined regardless of what the row holds. A booked meeting
|
|
67
|
-
* is not money, and reporting one as revenue would let a bidding algorithm
|
|
68
|
-
* optimise towards booking meetings that never close.
|
|
69
|
-
*/
|
|
70
|
-
getValueInUSD(conversion) {
|
|
71
|
-
if (this.isLead(conversion)) {
|
|
72
|
-
return undefined;
|
|
73
|
-
}
|
|
74
|
-
if (conversion.conversionValueInUSDCents === undefined ||
|
|
75
|
-
conversion.conversionValueInUSDCents === null ||
|
|
76
|
-
conversion.conversionValueInUSDCents <= 0) {
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
return conversion.conversionValueInUSDCents / 100;
|
|
80
|
-
}
|
|
81
|
-
isOlderThanDays(conversion, days) {
|
|
82
|
-
const conversionAt = conversion.conversionAt || new Date();
|
|
83
|
-
return Date.now() - conversionAt.getTime() > days * 24 * 60 * 60 * 1000;
|
|
84
|
-
}
|
|
85
|
-
static getErrorMessage(err) {
|
|
86
|
-
var _a, _b;
|
|
87
|
-
if (err instanceof AxiosError) {
|
|
88
|
-
return `HTTP ${((_a = err.response) === null || _a === void 0 ? void 0 : _a.status) || "?"}: ${JSON.stringify(((_b = err.response) === null || _b === void 0 ? void 0 : _b.data) || err.message).slice(0, 900)}`;
|
|
89
|
-
}
|
|
90
|
-
return (err === null || err === void 0 ? void 0 : err.message) || "Unknown error";
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
//# sourceMappingURL=ConversionUploadProvider.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConversionUploadProvider.js","sourceRoot":"","sources":["../../../../../Server/Utils/Marketing/ConversionUploadProvider.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import GoogleAdsProvider from "./Providers/GoogleAds";
|
|
2
|
-
import LinkedInProvider from "./Providers/LinkedIn";
|
|
3
|
-
import MetaProvider from "./Providers/Meta";
|
|
4
|
-
import MicrosoftAdsProvider from "./Providers/MicrosoftAds";
|
|
5
|
-
import RedditProvider from "./Providers/Reddit";
|
|
6
|
-
/*
|
|
7
|
-
* All ad platforms OneUptime can upload offline conversions to. To add a
|
|
8
|
-
* platform: implement ConversionUploadProvider (one file under Providers/),
|
|
9
|
-
* add its env config to EnvironmentConfig, and list it here — no schema or
|
|
10
|
-
* worker changes needed. Unconfigured providers are ignored at runtime.
|
|
11
|
-
*/
|
|
12
|
-
const AllConversionUploadProviders = [
|
|
13
|
-
new GoogleAdsProvider(),
|
|
14
|
-
new MetaProvider(),
|
|
15
|
-
new MicrosoftAdsProvider(),
|
|
16
|
-
new LinkedInProvider(),
|
|
17
|
-
new RedditProvider(),
|
|
18
|
-
];
|
|
19
|
-
export default AllConversionUploadProviders;
|
|
20
|
-
//# sourceMappingURL=ConversionUploadProviders.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"ConversionUploadProviders.js","sourceRoot":"","sources":["../../../../../Server/Utils/Marketing/ConversionUploadProviders.ts"],"names":[],"mappings":"AACA,OAAO,iBAAiB,MAAM,uBAAuB,CAAC;AACtD,OAAO,gBAAgB,MAAM,sBAAsB,CAAC;AACpD,OAAO,YAAY,MAAM,kBAAkB,CAAC;AAC5C,OAAO,oBAAoB,MAAM,0BAA0B,CAAC;AAC5D,OAAO,cAAc,MAAM,oBAAoB,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,4BAA4B,GAAoC;IACpE,IAAI,iBAAiB,EAAE;IACvB,IAAI,YAAY,EAAE;IAClB,IAAI,oBAAoB,EAAE;IAC1B,IAAI,gBAAgB,EAAE;IACtB,IAAI,cAAc,EAAE;CACrB,CAAC;AAEF,eAAe,4BAA4B,CAAC"}
|