@uptime.app/contracts 3.0.54-rc.1 → 3.0.54-rc.3
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/dist/cjs/service-simulator/mock-request-response.d.ts +8 -0
- package/dist/cjs/service-simulator/mock-request-response.d.ts.map +1 -1
- package/dist/esm/service-simulator/mock-request-response.d.ts +8 -0
- package/dist/esm/service-simulator/mock-request-response.d.ts.map +1 -1
- package/package.json +5 -3
- package/src/access-control/collection-access-control.ts +0 -28
- package/src/access-control/hack-access-control.ts +0 -32
- package/src/access-control/profile-access-control.ts +0 -28
- package/src/app-hack/app-full-hack.ts +0 -9
- package/src/app-hack/app-hack-metadata.ts +0 -61
- package/src/app-hack/app-restricted-hack.ts +0 -22
- package/src/b2b-content-access/b2b-content-access.ts +0 -57
- package/src/b2b-organisation/b2b-carousel.ts +0 -33
- package/src/b2b-organisation/b2b-org-idp-mapping.ts +0 -28
- package/src/b2b-organisation/b2b-organisation-events.ts +0 -21
- package/src/b2b-organisation/b2b-organisation-group-events.ts +0 -21
- package/src/b2b-organisation/b2b-organisation-group-membership-events.ts +0 -21
- package/src/b2b-organisation/b2b-organisation-group-membership.ts +0 -17
- package/src/b2b-organisation/b2b-organisation-group.ts +0 -43
- package/src/b2b-organisation/b2b-organisation-invitation.ts +0 -45
- package/src/b2b-organisation/b2b-organisation-member-events.ts +0 -21
- package/src/b2b-organisation/b2b-organisation-member.ts +0 -20
- package/src/b2b-organisation/b2b-organisation.ts +0 -38
- package/src/brand/brand-events.ts +0 -21
- package/src/brand/brand.ts +0 -78
- package/src/catalogue/catalogue.ts +0 -152
- package/src/cms-hack/cms-searchable-hack.ts +0 -44
- package/src/collection/collection-events.ts +0 -21
- package/src/collection/collection.ts +0 -59
- package/src/collection/enriched-collection-events.ts +0 -18
- package/src/collection/enriched-collection.ts +0 -65
- package/src/course/course-events.ts +0 -21
- package/src/course/course.ts +0 -25
- package/src/course-enrollment/course-enrollment-events.ts +0 -21
- package/src/course-enrollment/course-enrollment.ts +0 -36
- package/src/creator/creator-events.ts +0 -32
- package/src/creator/creator.ts +0 -7
- package/src/distribution/collection-distribution.ts +0 -17
- package/src/distribution/distribution-events.ts +0 -61
- package/src/distribution/hack-distribution.ts +0 -19
- package/src/draft-hack/draft-hack-events.ts +0 -21
- package/src/draft-hack/draft-hack.ts +0 -190
- package/src/draft-hack-generation/draft-hack-generation-commands.ts +0 -10
- package/src/draft-hack-generation/draft-hack-generation-events.ts +0 -55
- package/src/draft-hack-generation/draft-hack-generation.ts +0 -39
- package/src/enriched-b2b-organisation/enriched-b2b-organisation-events.ts +0 -21
- package/src/enriched-b2b-organisation/enriched-b2b-organisation.ts +0 -38
- package/src/enriched-hack/enriched-hack-events.ts +0 -21
- package/src/enriched-hack/enriched-hack.ts +0 -109
- package/src/enrichment-asset/hack-enrichment-video-events.ts +0 -55
- package/src/enrichment-asset/hack-enrichment-video.ts +0 -40
- package/src/entitlement/user-entitlements-commands.ts +0 -54
- package/src/entitlement/user-entitlements-events.ts +0 -29
- package/src/entitlement/user-entitlements.ts +0 -18
- package/src/flashcard/flashcard-events.ts +0 -85
- package/src/flashcard/flashcard.ts +0 -138
- package/src/hack/extracted-subject.ts +0 -31
- package/src/hack/hack-events.ts +0 -21
- package/src/hack/hack-published.ts +0 -21
- package/src/hack/hack-with-voice-events.ts +0 -21
- package/src/hack/hack-with-voice.ts +0 -36
- package/src/hack/hack.ts +0 -127
- package/src/hack/publish-hack-command.ts +0 -20
- package/src/hack/republish-hack-command.ts +0 -20
- package/src/hack-mapping/access-helper.ts +0 -6
- package/src/hack-mapping/app-full-hack.test.ts +0 -13
- package/src/hack-mapping/app-full-hack.ts +0 -14
- package/src/hack-mapping/app-hack-metadata.test.ts +0 -22
- package/src/hack-mapping/app-hack-metadata.ts +0 -82
- package/src/hack-mapping/app-restricted-hack.test.ts +0 -12
- package/src/hack-mapping/app-restricted-hack.ts +0 -21
- package/src/hack-mapping/remove-undefined-fields.ts +0 -9
- package/src/hack-mapping/test-data/enriched-hack.json +0 -2576
- package/src/hack-mapping/test-data/expected-app-full-hack.json +0 -2509
- package/src/hack-mapping/test-data/expected-app-hack-metadata.json +0 -93
- package/src/hack-mapping/test-data/expected-app-restricted-hack.json +0 -799
- package/src/hack-metadata/hack-metadata-events.ts +0 -21
- package/src/hack-metadata/hack-metadata.ts +0 -17
- package/src/hack-of-the-day/hack-of-the-day-events.ts +0 -21
- package/src/hack-of-the-day/hack-of-the-day.ts +0 -13
- package/src/hack-statistics/hack-statistics-events.ts +0 -21
- package/src/hack-statistics/hack-statistics.ts +0 -10
- package/src/hackbot/hack-generation-commands.ts +0 -43
- package/src/hackbot/hack-generation-trigger-events.ts +0 -21
- package/src/hackbot/hack-generation-trigger.ts +0 -54
- package/src/hackbot/knowledge-source-location.ts +0 -5
- package/src/history/history-events.ts +0 -21
- package/src/history/history.ts +0 -46
- package/src/identity-provider/domain-identity-provider-events.ts +0 -21
- package/src/identity-provider/domain-identity-provider.ts +0 -11
- package/src/identity-provider/identity-provider-events.ts +0 -21
- package/src/identity-provider/identity-provider.ts +0 -51
- package/src/index.ts +0 -220
- package/src/interest/interest-events.ts +0 -21
- package/src/interest/interest.ts +0 -15
- package/src/knowledge-source/knowledge-source-events.ts +0 -21
- package/src/knowledge-source/knowledge-source.ts +0 -43
- package/src/knowledge-source-parsing/knowledge-source-metadata.ts +0 -60
- package/src/knowledge-source-parsing/knowledge-source-parsing-commands.ts +0 -50
- package/src/knowledge-source-parsing/knowledge-source-parsing-events.ts +0 -30
- package/src/knowledge-source-parsing/podcast-metadata.ts +0 -45
- package/src/knowledge-source-parsing/podcast-parsing-events.ts +0 -28
- package/src/knowledge-source-parsing/user-hack-generation-options.ts +0 -7
- package/src/learn-upon/get-sqsso-url.ts +0 -13
- package/src/learn-upon/learn-upon-commands.ts +0 -33
- package/src/learn-upon/learn-upon-course-enrollment-events.ts +0 -21
- package/src/learn-upon/learn-upon-course-enrollment.ts +0 -63
- package/src/learn-upon/learn-upon-course-events.ts +0 -21
- package/src/learn-upon/learn-upon-course.ts +0 -109
- package/src/learn-upon/learn-upon-portal-events.ts +0 -21
- package/src/learn-upon/learn-upon-portal.ts +0 -13
- package/src/learn-upon/learn-upon-user-mapping-events.ts +0 -19
- package/src/learn-upon/learn-upon-user-mapping.ts +0 -10
- package/src/learn-upon/learn-upon-webhook-events.ts +0 -81
- package/src/learn-upon/learn-upon-webhook-types.ts +0 -347
- package/src/learn-upon/unenroll.ts +0 -7
- package/src/localisation/live-locales.ts +0 -45
- package/src/localisation/locale-language.ts +0 -4
- package/src/localisation/supported-languages.ts +0 -11
- package/src/localisation/supported-locales.ts +0 -67
- package/src/message-bus/context.ts +0 -8
- package/src/moderation/hack-moderation-result-events.ts +0 -18
- package/src/moderation/hack-moderation-result.ts +0 -27
- package/src/partner/partner-events.ts +0 -21
- package/src/partner/partner.ts +0 -7
- package/src/pending-hack/pending-hack-events.ts +0 -21
- package/src/pending-hack/pending-hack-with-voice-events.ts +0 -21
- package/src/pending-hack/pending-hack-with-voice.ts +0 -25
- package/src/pending-hack/pending-hack.ts +0 -78
- package/src/preferences/preferences-events.ts +0 -15
- package/src/preferences/preferences.ts +0 -35
- package/src/profile/profile-events.ts +0 -41
- package/src/profile/profile.ts +0 -36
- package/src/profile/translated-profile.ts +0 -13
- package/src/referral/referral-events.ts +0 -41
- package/src/referral/referral.ts +0 -76
- package/src/saved/saved-collection-events.ts +0 -19
- package/src/saved/saved-collection.ts +0 -8
- package/src/segment/segment-commands.ts +0 -75
- package/src/segment/segment-events.ts +0 -42
- package/src/segment/segment-with-voice.ts +0 -8
- package/src/segment/segment.ts +0 -82
- package/src/service-simulator/mock-request-response.ts +0 -17
- package/src/skin/skin-events.ts +0 -21
- package/src/skin/skin.ts +0 -7
- package/src/spark/spark-board-read-model.ts +0 -17
- package/src/spark/spark-board.ts +0 -12
- package/src/spark/spark-events.ts +0 -42
- package/src/spark/spark.ts +0 -75
- package/src/text-analysis/hack-categories-extracted-events.ts +0 -24
- package/src/text-analysis/hack-categories-extracted.ts +0 -31
- package/src/text-analysis/hack-entities-extracted-events.ts +0 -24
- package/src/text-analysis/hack-entities-extracted.ts +0 -38
- package/src/text-analysis/hack-keywords-extracted-events.ts +0 -24
- package/src/text-analysis/hack-keywords-extracted.ts +0 -23
- package/src/text-analysis/hack-topics-extracted-events.ts +0 -24
- package/src/text-analysis/hack-topics-extracted.ts +0 -31
- package/src/text-to-speech/create-speech-commands.ts +0 -22
- package/src/text-to-speech/speech-created-events.ts +0 -10
- package/src/text-to-speech/supported-voices.ts +0 -222
- package/src/text-to-speech/text-segment.ts +0 -29
- package/src/theme/theme-events.ts +0 -21
- package/src/theme/theme.ts +0 -68
- package/src/translation/translation-events.ts +0 -73
- package/src/translation/translation.ts +0 -25
- package/src/trending/trending-events.ts +0 -21
- package/src/trending/trending-hacks.ts +0 -8
- package/src/user/cognito-user-authentication-log.ts +0 -8
- package/src/user/get-user.ts +0 -63
- package/src/user/user-events.ts +0 -39
- package/src/user-acl/user-acl-utils.test.ts +0 -273
- package/src/user-acl/user-acl-utils.ts +0 -177
- package/src/user-context/user-context-events.ts +0 -21
- package/src/user-context/user-context.ts +0 -16
- package/src/user-notification-context/user-notification-context-events.ts +0 -21
- package/src/user-notification-context/user-notification-context.ts +0 -10
- package/src/user-statistics/user-statistics-events.ts +0 -97
- package/src/user-statistics/user-statistics.ts +0 -82
- package/src/video-cropping/video-cropping-events.ts +0 -43
- package/src/video-cropping/video-metadata.ts +0 -12
- package/tsconfig.cjs.json +0 -7
- package/tsconfig.npm.json +0 -22
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
export type EntitlementName = 'premium' | 'trial';
|
|
2
|
-
export type EntitlementIssuer = 'Uptime' | 'RevenueCat';
|
|
3
|
-
|
|
4
|
-
export type Entitlement = {
|
|
5
|
-
entitlement: EntitlementName | string;
|
|
6
|
-
issuer: EntitlementIssuer | string;
|
|
7
|
-
expiresAt: string
|
|
8
|
-
issuedAt: string;
|
|
9
|
-
};
|
|
10
|
-
|
|
11
|
-
export interface UserEntitlements {
|
|
12
|
-
id: string;
|
|
13
|
-
v: number;
|
|
14
|
-
createdAt: string;
|
|
15
|
-
updatedAt: string;
|
|
16
|
-
userId: string;
|
|
17
|
-
entitlements: Entitlement[];
|
|
18
|
-
}
|
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
import { Flashcard } from './flashcard';
|
|
2
|
-
|
|
3
|
-
export interface FlashcardCreatedEvent {
|
|
4
|
-
id: string;
|
|
5
|
-
type: 'FlashcardCreated';
|
|
6
|
-
payload: Flashcard;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface FlashcardUpdatedEvent {
|
|
10
|
-
id: string;
|
|
11
|
-
type: 'FlashcardUpdated';
|
|
12
|
-
payload: Flashcard;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface FlashcardDeletedEvent {
|
|
16
|
-
id: string;
|
|
17
|
-
type: 'FlashcardDeleted';
|
|
18
|
-
payload: Flashcard;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export type FlashcardChangedEvent = FlashcardCreatedEvent | FlashcardUpdatedEvent | FlashcardDeletedEvent;
|
|
22
|
-
|
|
23
|
-
export interface FlashcardRestored {
|
|
24
|
-
// needs id and v so that it can be replayed
|
|
25
|
-
// id is flashcard id
|
|
26
|
-
id: string;
|
|
27
|
-
// v is timestamp
|
|
28
|
-
v: number;
|
|
29
|
-
userId: string;
|
|
30
|
-
cardId: string;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface FlashcardRestoredEvent {
|
|
34
|
-
id: string;
|
|
35
|
-
type: 'FlashcardRestored';
|
|
36
|
-
payload: FlashcardRestored;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
export interface FlashcardPromoted {
|
|
40
|
-
// needs id and v so that it can be replayed
|
|
41
|
-
// id is flashcard id
|
|
42
|
-
id: string;
|
|
43
|
-
// v is timestamp
|
|
44
|
-
v: number;
|
|
45
|
-
userId: string;
|
|
46
|
-
cardId: string;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
export interface FlashcardPromotedEvent {
|
|
50
|
-
id: string;
|
|
51
|
-
type: 'FlashcardPromoted';
|
|
52
|
-
payload: FlashcardPromoted;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
export interface FlashcardDismissed {
|
|
56
|
-
// needs id and v so that it can be replayed
|
|
57
|
-
// id is flashcard id
|
|
58
|
-
id: string;
|
|
59
|
-
// v is timestamp
|
|
60
|
-
v: number;
|
|
61
|
-
userId: string;
|
|
62
|
-
cardId: string;
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
export interface FlashcardDismissedEvent {
|
|
66
|
-
id: string
|
|
67
|
-
type: 'FlashcardDismissed';
|
|
68
|
-
payload: FlashcardDismissed;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
export interface FlashcardDemoted {
|
|
72
|
-
// needs id and v so that it can be replayed
|
|
73
|
-
// id is flashcard id
|
|
74
|
-
id: string;
|
|
75
|
-
// v is timestamp
|
|
76
|
-
v: number;
|
|
77
|
-
userId: string;
|
|
78
|
-
cardId: string;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
export interface FlashcardDemotedEvent {
|
|
82
|
-
id: string;
|
|
83
|
-
type: 'FlashcardDemoted';
|
|
84
|
-
payload: FlashcardDemoted;
|
|
85
|
-
}
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { CardType, Hack, SegmentType, SupportedLocale, Theme } from '../index';
|
|
2
|
-
|
|
3
|
-
export interface Flashcard {
|
|
4
|
-
id: string;
|
|
5
|
-
v: number;
|
|
6
|
-
createdAt: string;
|
|
7
|
-
updatedAt: string;
|
|
8
|
-
userId: string;
|
|
9
|
-
hackId: string;
|
|
10
|
-
segmentId: string;
|
|
11
|
-
themeId: string;
|
|
12
|
-
|
|
13
|
-
// also shows up in the "card", but easier to create GSI from top level property
|
|
14
|
-
cardId: string;
|
|
15
|
-
card: FlashedTextCard;
|
|
16
|
-
|
|
17
|
-
/*
|
|
18
|
-
A flashcard can have multiple reasons for its existence
|
|
19
|
-
when all reasons go away (when spark is deleted and hack is made unavailable), the Flashcard is deleted
|
|
20
|
-
*/
|
|
21
|
-
reasonCreated: FlashcardCreationReason[];
|
|
22
|
-
|
|
23
|
-
/*
|
|
24
|
-
true when the user dismisses it
|
|
25
|
-
*/
|
|
26
|
-
isDismissed: boolean;
|
|
27
|
-
|
|
28
|
-
/*
|
|
29
|
-
Flashcards from sparks are considered more important than flashcards from consumed content and should be displayed first
|
|
30
|
-
*/
|
|
31
|
-
relevanceScore: number;
|
|
32
|
-
|
|
33
|
-
/*
|
|
34
|
-
Flashcards start at level 0 and are promoted to level 1+, or demoted back to level 0
|
|
35
|
-
*/
|
|
36
|
-
level: number;
|
|
37
|
-
|
|
38
|
-
/*
|
|
39
|
-
After a flashcard is demoted, flash cycle count increases
|
|
40
|
-
*/
|
|
41
|
-
flashCycle: number;
|
|
42
|
-
|
|
43
|
-
/*
|
|
44
|
-
How many times a user has seen this flashcard
|
|
45
|
-
*/
|
|
46
|
-
timesFlashed: number;
|
|
47
|
-
|
|
48
|
-
memorisationConfidence?: FlashcardMemorisationConfidence;
|
|
49
|
-
|
|
50
|
-
/*
|
|
51
|
-
ISO date in UTC which indicates when to flash this card to the user next.
|
|
52
|
-
When flashcard is dismissed, "nextDateToFlash" becomes "never"
|
|
53
|
-
*/
|
|
54
|
-
nextDateToFlash: string;
|
|
55
|
-
|
|
56
|
-
/*
|
|
57
|
-
Indicates whether the referenced hack is "available" (not hidden or deleted)
|
|
58
|
-
*/
|
|
59
|
-
hackIsAvailable: boolean;
|
|
60
|
-
|
|
61
|
-
/*
|
|
62
|
-
Indicates whether the user has memorised the flashcard. It's considered memorised when its level >= 8
|
|
63
|
-
*/
|
|
64
|
-
isMemorised: boolean;
|
|
65
|
-
|
|
66
|
-
/*
|
|
67
|
-
A hack with an enriched theme, so that the flashcard can be displayed when the hack becomes unavailable. This structure is consistent with Sparks.
|
|
68
|
-
*/
|
|
69
|
-
hack: Hack;
|
|
70
|
-
|
|
71
|
-
/*
|
|
72
|
-
A hack's ACL. The Hack model doesn't have an ACL, this is from the equivalent enriched hack.
|
|
73
|
-
*/
|
|
74
|
-
hackAcl: string[];
|
|
75
|
-
|
|
76
|
-
/*
|
|
77
|
-
A snapshot of the hack theme at the time the flashcard was created. This is consistent with Sparks also having a snapshot of the theme.
|
|
78
|
-
*/
|
|
79
|
-
theme: Theme;
|
|
80
|
-
|
|
81
|
-
/*
|
|
82
|
-
The hackId for the hack in its base locale. Consistent with the Spark model.
|
|
83
|
-
*/
|
|
84
|
-
baseLocaleHackId: string;
|
|
85
|
-
|
|
86
|
-
/*
|
|
87
|
-
The locale of the hack at the time this flashcard was created. Consistent with the Spark model.
|
|
88
|
-
*/
|
|
89
|
-
locale: SupportedLocale;
|
|
90
|
-
|
|
91
|
-
/*
|
|
92
|
-
The language of the hack at the time this flashcard was created. Consistent with the Spark model.
|
|
93
|
-
*/
|
|
94
|
-
language: string;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
export interface FlashedTextCard {
|
|
98
|
-
id: string;
|
|
99
|
-
markdown: string;
|
|
100
|
-
segmentType: SegmentType;
|
|
101
|
-
isTitle?: boolean;
|
|
102
|
-
cardType?: CardType;
|
|
103
|
-
keyPhrases: KeyPhrase[];
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
export type FlashcardCreationReason = FlashcardCreationSparkReason | FlashcardCreationInsightConsumedReason;
|
|
107
|
-
|
|
108
|
-
export interface FlashcardCreationSparkReason {
|
|
109
|
-
type: FlashcardCreationReasonType.SparkCreated;
|
|
110
|
-
sparkId: string;
|
|
111
|
-
// ISO date
|
|
112
|
-
dateSparkCreated: string;
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
export interface FlashcardCreationInsightConsumedReason {
|
|
116
|
-
type: FlashcardCreationReasonType.InsightConsumed;
|
|
117
|
-
// this helps figure out if the insight was already turned into a flashcard. Using the cardId is insufficient because the cardId can change if the markdown of the hack changes.
|
|
118
|
-
// supported insight numbers: 1, 2, 3
|
|
119
|
-
insightNumber: number;
|
|
120
|
-
// ISO date
|
|
121
|
-
dateHackLastViewed: string;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export enum FlashcardCreationReasonType {
|
|
125
|
-
SparkCreated = 'SparkCreated',
|
|
126
|
-
InsightConsumed = 'InsightConsumed'
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
export enum FlashcardMemorisationConfidence {
|
|
130
|
-
Green = 'Green',
|
|
131
|
-
Amber = 'Amber',
|
|
132
|
-
Red = 'Red'
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
export interface KeyPhrase {
|
|
136
|
-
phrase: string;
|
|
137
|
-
score: number;
|
|
138
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
export interface ExtractedSubject {
|
|
2
|
-
name: string;
|
|
3
|
-
}
|
|
4
|
-
|
|
5
|
-
export interface ExtractSubjectsCommandBody {
|
|
6
|
-
id: string;
|
|
7
|
-
v: number;
|
|
8
|
-
reference: string;
|
|
9
|
-
content: string;
|
|
10
|
-
contentType: string; // e.g. 'hack'
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export interface ExtractSubjectsCommand {
|
|
14
|
-
id: string;
|
|
15
|
-
type: 'ExtractSubjectsCommand';
|
|
16
|
-
payload: ExtractSubjectsCommandBody;
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
export interface SubjectsExtracted {
|
|
20
|
-
id: string;
|
|
21
|
-
type: 'SubjectsExtracted',
|
|
22
|
-
payload: SubjectsExtractedBody
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export interface SubjectsExtractedBody {
|
|
26
|
-
id: string,
|
|
27
|
-
v: number,
|
|
28
|
-
reference: string,
|
|
29
|
-
contentType: string;
|
|
30
|
-
subjects: ExtractedSubject[]
|
|
31
|
-
}
|
package/src/hack/hack-events.ts
DELETED
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { Hack } from './hack';
|
|
2
|
-
|
|
3
|
-
export interface HackCreatedEvent {
|
|
4
|
-
id: string;
|
|
5
|
-
type: 'HackCreated';
|
|
6
|
-
payload: Hack;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface HackUpdatedEvent {
|
|
10
|
-
id: string;
|
|
11
|
-
type: 'HackUpdated';
|
|
12
|
-
payload: Hack;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface HackDeletedEvent {
|
|
16
|
-
id: string;
|
|
17
|
-
type: 'HackDeleted';
|
|
18
|
-
payload: Hack;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export type HackChangedEvent = HackCreatedEvent | HackUpdatedEvent | HackDeletedEvent;
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* HackPublished events were introduce in March 2023 and have not been backfilled. Previously PendingHackDeleted events were used.
|
|
3
|
-
*/
|
|
4
|
-
export interface HackPublishedEvent {
|
|
5
|
-
id: string;
|
|
6
|
-
type: 'HackPublished';
|
|
7
|
-
payload: {
|
|
8
|
-
/** set as the hack id */
|
|
9
|
-
id: string;
|
|
10
|
-
/** set as the hack version */
|
|
11
|
-
v: number;
|
|
12
|
-
draftHackId: string;
|
|
13
|
-
draftHackVersion: number;
|
|
14
|
-
hackId: string;
|
|
15
|
-
hackVersion: number;
|
|
16
|
-
baseLocaleHackId: string;
|
|
17
|
-
// added very shortly after the event was introduced so a handful of historic events may be missing this property
|
|
18
|
-
publishCompletedAt: string
|
|
19
|
-
publishStartedAt: string;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { HackWithVoice } from './hack-with-voice';
|
|
2
|
-
|
|
3
|
-
export interface HackWithVoiceCreatedEvent {
|
|
4
|
-
id: string;
|
|
5
|
-
type: 'HackWithVoiceCreated';
|
|
6
|
-
payload: HackWithVoice;
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
export interface HackWithVoiceUpdatedEvent {
|
|
10
|
-
id: string;
|
|
11
|
-
type: 'HackWithVoiceUpdated';
|
|
12
|
-
payload: HackWithVoice;
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
export interface HackWithVoiceDeletedEvent {
|
|
16
|
-
id: string;
|
|
17
|
-
type: 'HackWithVoiceDeleted';
|
|
18
|
-
payload: HackWithVoice;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export type HackWithVoiceChangedEvent = HackWithVoiceCreatedEvent | HackWithVoiceUpdatedEvent | HackWithVoiceDeletedEvent;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Segment } from '../segment/segment';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* HackWithVoice contains the Hack segments a a few basic Hack fields, it does not contain other Hack information.
|
|
5
|
-
* This decision was made due to the complexity of editorialTags and updating them.
|
|
6
|
-
*/
|
|
7
|
-
export interface HackWithVoice {
|
|
8
|
-
/** NOT the id of the hack. Use hackId. The id cannot be the hackId as otherwise id would be duplicated for each voice which would break message replay */
|
|
9
|
-
id: string;
|
|
10
|
-
/** The id of the hack */
|
|
11
|
-
hackId: string;
|
|
12
|
-
baseLocaleHackId: string;
|
|
13
|
-
/** The id of voice used to generate the audio */
|
|
14
|
-
voiceId: string;
|
|
15
|
-
/** True if this is the default voice */
|
|
16
|
-
isDefaultVoice: boolean;
|
|
17
|
-
v: number;
|
|
18
|
-
createdAt: string;
|
|
19
|
-
updatedAt: string;
|
|
20
|
-
|
|
21
|
-
/** introduced Aug 2025. Will be on all hacks republished since then **/
|
|
22
|
-
publishCompletedAt?: string;
|
|
23
|
-
|
|
24
|
-
segments: {
|
|
25
|
-
favouriteQuote: Segment;
|
|
26
|
-
inANutshell: Segment;
|
|
27
|
-
introduction: Segment;
|
|
28
|
-
insights: Segment[];
|
|
29
|
-
conclusion: Segment;
|
|
30
|
-
// composite segments
|
|
31
|
-
overview: Segment;
|
|
32
|
-
shareableOverview: Segment;
|
|
33
|
-
hereAreTheInsights: Segment;
|
|
34
|
-
putInAction?: Segment;
|
|
35
|
-
}
|
|
36
|
-
}
|
package/src/hack/hack.ts
DELETED
|
@@ -1,127 +0,0 @@
|
|
|
1
|
-
import { ExtractedSubject } from './extracted-subject';
|
|
2
|
-
export interface Hack {
|
|
3
|
-
/** The unique id of the hack. */
|
|
4
|
-
id: string;
|
|
5
|
-
/** The locale (language and region) of the hack e.g. fr-FR. Use @uptime.app/localisation-contracts Mandatory property since 12/01/2023. */
|
|
6
|
-
locale: string;
|
|
7
|
-
/** The id of the hack in its original locale. Mandatory property since 12/01/2023. */
|
|
8
|
-
baseLocaleHackId: string;
|
|
9
|
-
v: number;
|
|
10
|
-
createdAt: string;
|
|
11
|
-
updatedAt: string;
|
|
12
|
-
owner: string;
|
|
13
|
-
tenant?: string;
|
|
14
|
-
sourceId?: string;
|
|
15
|
-
title: string;
|
|
16
|
-
themeId: string;
|
|
17
|
-
|
|
18
|
-
/** introduced Aug 2025. Will be on all hacks republished since then **/
|
|
19
|
-
publishCompletedAt?: string;
|
|
20
|
-
|
|
21
|
-
/** introduced Oct 2023 **/
|
|
22
|
-
draftHackId: string;
|
|
23
|
-
draftHackVersion: number;
|
|
24
|
-
|
|
25
|
-
// TODO I'd remove it altogether, but it would be a breaking contract change. Thoughts?
|
|
26
|
-
isHidden?: boolean;
|
|
27
|
-
|
|
28
|
-
editorialTags?: string[];
|
|
29
|
-
|
|
30
|
-
/** Added in October 2025. Internal use only.
|
|
31
|
-
* It surfaces the "trending" tag from editorialTags if it exists.
|
|
32
|
-
* It's a number, 1 meaning true, because DynamoDB does not allow Boolean attributes in indexes.
|
|
33
|
-
*/
|
|
34
|
-
_isTrending?: number;
|
|
35
|
-
|
|
36
|
-
coverUrl?: string;
|
|
37
|
-
/** Added in July 2024. This is the URL of the cover image that is free to use without any copyright. */
|
|
38
|
-
copyrightFreeCoverUrl?: string;
|
|
39
|
-
notifications?: {
|
|
40
|
-
aiGeneratedText?: string
|
|
41
|
-
humanCuratedText?: string;
|
|
42
|
-
},
|
|
43
|
-
segments: {
|
|
44
|
-
favouriteQuote: {
|
|
45
|
-
id: string;
|
|
46
|
-
/** added 04/2023 */
|
|
47
|
-
v?: number;
|
|
48
|
-
};
|
|
49
|
-
inANutshell: {
|
|
50
|
-
id: string;
|
|
51
|
-
/** added 04/2023 */
|
|
52
|
-
v?: number;
|
|
53
|
-
};
|
|
54
|
-
introduction: {
|
|
55
|
-
id: string;
|
|
56
|
-
/** added 04/2023 */
|
|
57
|
-
v?: number;
|
|
58
|
-
};
|
|
59
|
-
insights: {
|
|
60
|
-
id: string
|
|
61
|
-
/** added 04/2023 */
|
|
62
|
-
v?: number;
|
|
63
|
-
}[];
|
|
64
|
-
conclusion: {
|
|
65
|
-
id: string;
|
|
66
|
-
/** added 04/2023 */
|
|
67
|
-
v?: number;
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
// composite segments
|
|
71
|
-
overview: {
|
|
72
|
-
id: string;
|
|
73
|
-
/** added 04/2023 */
|
|
74
|
-
v?: number;
|
|
75
|
-
};
|
|
76
|
-
shareableOverview: {
|
|
77
|
-
id: string;
|
|
78
|
-
/** added 04/2023 */
|
|
79
|
-
v?: number;
|
|
80
|
-
};
|
|
81
|
-
hereAreTheInsights: {
|
|
82
|
-
id: string;
|
|
83
|
-
/** added 04/2023 */
|
|
84
|
-
v?: number;
|
|
85
|
-
};
|
|
86
|
-
putInAction?: {
|
|
87
|
-
id: string;
|
|
88
|
-
/** added 04/2023 */
|
|
89
|
-
v?: number;
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
affiliate?: HackAffiliate;
|
|
93
|
-
topics: HackTopic[];
|
|
94
|
-
contributors?: HackContributor[];
|
|
95
|
-
type: HackType;
|
|
96
|
-
sourceData?: HackSourceData;
|
|
97
|
-
externalLink?: HackExternalLink;
|
|
98
|
-
|
|
99
|
-
/** added Mar 2024 */
|
|
100
|
-
// TODO make it mandatory after a republish
|
|
101
|
-
subjects?: ExtractedSubject[];
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
export interface HackContributor {
|
|
105
|
-
name: string;
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
export interface HackTopic {
|
|
109
|
-
name: string;
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export interface HackAffiliate {
|
|
113
|
-
url: string;
|
|
114
|
-
name: string;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
export type HackType = 'book' | 'course' | 'documentary' | 'podcast' | 'original';
|
|
118
|
-
|
|
119
|
-
export interface HackSourceData {
|
|
120
|
-
episodeTitle?: string;
|
|
121
|
-
releaseDate?: string;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
export interface HackExternalLink {
|
|
125
|
-
url: string;
|
|
126
|
-
type: 'Website' | 'Book' | 'Course' | 'Podcast' | 'Video' | 'Other';
|
|
127
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
export interface PublishHackCommandBody {
|
|
2
|
-
// a command needs an id and a version so that it can be more easily replayed
|
|
3
|
-
// for this specific PublishHack command, the id is the draftHackId and the version is the timestamp
|
|
4
|
-
id: string;
|
|
5
|
-
v: number;
|
|
6
|
-
draftHackId: string;
|
|
7
|
-
draftHackVersion: number;
|
|
8
|
-
hackId: string;
|
|
9
|
-
publishSource: PublishHackSource;
|
|
10
|
-
/** if no voice ids are specified then all voices are generated */
|
|
11
|
-
voiceIds?: string[];
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
export type PublishHackSource = 'web-app' | 'cms' | 'script' | 'translation';
|
|
15
|
-
|
|
16
|
-
export interface PublishHackCommand {
|
|
17
|
-
id: string;
|
|
18
|
-
type: 'PublishHackCommand';
|
|
19
|
-
payload: PublishHackCommandBody;
|
|
20
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { PublishHackSource } from './publish-hack-command';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Republishes a hack. If the hack has never been published then the command will fail.
|
|
5
|
-
* Will republish the current draft version and use the current hacks voices. Will not use new voices
|
|
6
|
-
*/
|
|
7
|
-
export interface RepublishHackCommandBody {
|
|
8
|
-
id: string;
|
|
9
|
-
v: number;
|
|
10
|
-
hackId: string;
|
|
11
|
-
publishSource: PublishHackSource;
|
|
12
|
-
/** will skip the republished if the hack as been published since this date. ISO date format */
|
|
13
|
-
skipIfPublishedSince?: string;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
export interface RepublishHackCommand {
|
|
17
|
-
id: string;
|
|
18
|
-
type: 'RepublishHack';
|
|
19
|
-
payload: RepublishHackCommandBody;
|
|
20
|
-
}
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { EnrichedHack } from '@uptime.app/contracts';
|
|
2
|
-
import ENRICHED_HACK from './test-data/enriched-hack.json';
|
|
3
|
-
import EXPECTED_APP_FULL_HACK from './test-data/expected-app-full-hack.json';
|
|
4
|
-
import { mapToAppFullHack } from './app-full-hack';
|
|
5
|
-
|
|
6
|
-
describe('converting an EnrichedHack to an AppFullHack', () => {
|
|
7
|
-
|
|
8
|
-
test('it returns the expected fields', () => {
|
|
9
|
-
const fullHackData = ENRICHED_HACK as any as EnrichedHack;
|
|
10
|
-
const fullHack = mapToAppFullHack(fullHackData);
|
|
11
|
-
expect(fullHack).toEqual(EXPECTED_APP_FULL_HACK);
|
|
12
|
-
});
|
|
13
|
-
});
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { AppFullHack } from '../app-hack/app-full-hack';
|
|
2
|
-
import { EnrichedHack } from '../enriched-hack/enriched-hack';
|
|
3
|
-
import { mapToAppRestrictedHack } from './app-restricted-hack';
|
|
4
|
-
import { removeUndefinedFields } from './remove-undefined-fields';
|
|
5
|
-
|
|
6
|
-
export function mapToAppFullHack(hack: EnrichedHack): AppFullHack {
|
|
7
|
-
const appHack = mapToAppRestrictedHack(hack);
|
|
8
|
-
// allow access to all segments
|
|
9
|
-
const segments = removeUndefinedFields(hack.segments);
|
|
10
|
-
return removeUndefinedFields({
|
|
11
|
-
...appHack,
|
|
12
|
-
segments
|
|
13
|
-
});
|
|
14
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { EnrichedHack } from '@uptime.app/contracts';
|
|
2
|
-
import ENRICHED_HACK from './test-data/enriched-hack.json';
|
|
3
|
-
import EXPECTED_APP_HACK_METADATA from './test-data/expected-app-hack-metadata.json';
|
|
4
|
-
import { mapToAppHackMetadata } from './app-hack-metadata';
|
|
5
|
-
describe('converting an EnrichedHack to an AppHackMetadata', () => {
|
|
6
|
-
|
|
7
|
-
test('it returns the expected fields', () => {
|
|
8
|
-
const appHackMetadataData = ENRICHED_HACK as any as EnrichedHack;
|
|
9
|
-
const appHackMetadata = mapToAppHackMetadata(appHackMetadataData);
|
|
10
|
-
expect(appHackMetadata).toEqual(EXPECTED_APP_HACK_METADATA);
|
|
11
|
-
});
|
|
12
|
-
|
|
13
|
-
test('a hack not in the uptime catalogue has shareScope set to private', () => {
|
|
14
|
-
const appHackMetadata = mapToAppHackMetadata({...ENRICHED_HACK, acl: ['catalogue:not-uptime']} as EnrichedHack);
|
|
15
|
-
expect(appHackMetadata.shareScope).toBe('private');
|
|
16
|
-
});
|
|
17
|
-
|
|
18
|
-
test('a hack not included on the website has shareScope set to private', () => {
|
|
19
|
-
const appHackMetadata = mapToAppHackMetadata({...ENRICHED_HACK, includeInWebsite: false} as EnrichedHack);
|
|
20
|
-
expect(appHackMetadata.shareScope).toBe('private');
|
|
21
|
-
});
|
|
22
|
-
});
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { removeUndefinedFields } from './remove-undefined-fields';
|
|
2
|
-
import { hackIsInUptimeCatalogue } from './access-helper';
|
|
3
|
-
import { EnrichedHack } from '../enriched-hack/enriched-hack';
|
|
4
|
-
import { AppHackMetadata } from '../app-hack/app-hack-metadata';
|
|
5
|
-
|
|
6
|
-
export function mapToAppHackMetadata(hack: EnrichedHack): AppHackMetadata {
|
|
7
|
-
// This function purposely picks the required fields from the EnrichedHack rather than deleting the unnecessary fields from EnrichedHack
|
|
8
|
-
// This ensures that if the EnrichedHack model is updated then those extra fields are not returned accidentally.
|
|
9
|
-
// This means that a service will not reflect any updated fields until it updates this module
|
|
10
|
-
return removeUndefinedFields({
|
|
11
|
-
id: hack.id,
|
|
12
|
-
title: hack.title,
|
|
13
|
-
owner: hack.owner,
|
|
14
|
-
v: hack.v,
|
|
15
|
-
hackVersion: hack.hackVersion,
|
|
16
|
-
createdAt: hack.createdAt,
|
|
17
|
-
updatedAt: hack.updatedAt,
|
|
18
|
-
baseLocaleHackId: hack.baseLocaleHackId,
|
|
19
|
-
language: hack.language,
|
|
20
|
-
locale: hack.locale,
|
|
21
|
-
acl: hack.acl,
|
|
22
|
-
themeId: hack.theme.id,
|
|
23
|
-
isHidden: hack.isHidden,
|
|
24
|
-
editorialTags: hack.editorialTags,
|
|
25
|
-
coverUrl: hack.coverUrl,
|
|
26
|
-
description: hack.description,
|
|
27
|
-
segments: toHackAppMetadataSegments(hack.segments),
|
|
28
|
-
topics: hack.topics,
|
|
29
|
-
contributors: hack.contributors,
|
|
30
|
-
type: hack.type,
|
|
31
|
-
sourceData: hack.sourceData,
|
|
32
|
-
// todo - should we pick the required fields from profile rather than the entire object?
|
|
33
|
-
profile: hack.profile,
|
|
34
|
-
timeSaved: hack.timeSaved,
|
|
35
|
-
estimatedTimeSaved: hack.estimatedTimeSaved,
|
|
36
|
-
shareScope: getShareScope(hack),
|
|
37
|
-
catalogues: aclToCatalogues(hack.acl),
|
|
38
|
-
tenantDisplayName: hack.tenantDisplayName
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
function toHackAppMetadataSegments(segments: EnrichedHack['segments']): AppHackMetadata['segments'] {
|
|
43
|
-
return removeUndefinedFields({
|
|
44
|
-
favouriteQuote: {
|
|
45
|
-
id: segments.favouriteQuote.id,
|
|
46
|
-
},
|
|
47
|
-
inANutshell: {
|
|
48
|
-
id: segments.inANutshell.id,
|
|
49
|
-
},
|
|
50
|
-
introduction: {
|
|
51
|
-
id: segments.introduction.id,
|
|
52
|
-
},
|
|
53
|
-
insights: segments.insights.map(insight => ({
|
|
54
|
-
id: insight.id,
|
|
55
|
-
})),
|
|
56
|
-
conclusion: {
|
|
57
|
-
id: segments.conclusion.id,
|
|
58
|
-
},
|
|
59
|
-
overview: {
|
|
60
|
-
id: segments.overview.id,
|
|
61
|
-
},
|
|
62
|
-
shareableOverview: {
|
|
63
|
-
id: segments.shareableOverview.id,
|
|
64
|
-
},
|
|
65
|
-
hereAreTheInsights: {
|
|
66
|
-
id: segments.hereAreTheInsights.id,
|
|
67
|
-
},
|
|
68
|
-
putInAction: segments.putInAction && {
|
|
69
|
-
id: segments.putInAction.id,
|
|
70
|
-
},
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
function getShareScope(hack: {acl: string[]; includeInWebsite: boolean}): 'public' | 'private' {
|
|
75
|
-
return (hack.includeInWebsite && hackIsInUptimeCatalogue(hack)) ? 'public' : 'private';
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
function aclToCatalogues(acl: string[]): string[] {
|
|
79
|
-
return acl
|
|
80
|
-
.filter(entry => entry.startsWith('catalogue:'))
|
|
81
|
-
.map(entry => entry.replace('catalogue:', ''));
|
|
82
|
-
}
|