Skip to content

Commit cbd1b60

Browse files
committed
fux: internal sdk
1 parent 996e754 commit cbd1b60

File tree

16 files changed

+73
-36
lines changed

16 files changed

+73
-36
lines changed

apps/api/src/app/topics-v2/dtos/topic-subscription-response.dto.ts

+6
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ export class TopicSubscriptionResponseDto {
5050
})
5151
_id: string;
5252

53+
@ApiProperty({
54+
description: 'The date and time the subscription was created',
55+
example: '2021-01-01T00:00:00.000Z',
56+
})
57+
createdAt: string;
58+
5359
@ApiProperty({
5460
description: 'Topic information',
5561
type: TopicResponseDto,

apps/api/src/app/topics-v2/usecases/list-topic-subscriptions/list-topic-subscriptions.usecase.ts

-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ export class ListTopicSubscriptionsUseCase {
3333
throw new NotFoundException(`Topic with key ${command.topicKey} not found`);
3434
}
3535

36-
// Use the repository method for pagination
3736
const subscriptionsPagination = await this.topicSubscribersRepository.findTopicSubscriptionsWithPagination({
3837
environmentId: command.environmentId,
3938
organizationId: command.organizationId,

apps/api/src/app/topics-v2/usecases/list-topics/map-topic-entity-to.dto.ts

+1
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export function mapTopicSubscriptionsToDto(
2020
return {
2121
_id: String(subscription._id),
2222
topic: mapTopicEntityToDto(topic),
23+
createdAt: subscription.createdAt!,
2324
subscriber: {
2425
_id: String(subscriber._id),
2526
subscriberId: subscriber.subscriberId,

apps/dashboard/src/api/topics.ts

+1
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ export const removeSubscribersFromTopic = async ({
139139

140140
export type TopicSubscription = {
141141
_id: string;
142+
createdAt: string;
142143
topic: {
143144
_id: string;
144145
key: string;

apps/dashboard/src/components/subscribers/subscriptions/subscription-item.tsx

+7
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ import { TopicDrawerButton } from '@/components/topics/topic-drawer';
33
import TruncatedText from '@/components/truncated-text';
44
import { cn } from '@/utils/ui';
55
import { motion } from 'motion/react';
6+
import { TimeDisplayHoverCard } from '@/components/time-display-hover-card';
7+
import { format } from 'date-fns';
68

79
type SubscriptionItemProps = {
810
subscription: TopicSubscription;
@@ -34,6 +36,11 @@ export function SubscriptionItem({ subscription }: SubscriptionItemProps) {
3436
</div>
3537
</div>
3638
</div>
39+
{subscription.createdAt && (
40+
<TimeDisplayHoverCard date={subscription.createdAt} className="text-label-xs text-foreground-600">
41+
{format(new Date(subscription.createdAt), 'MMM d, yyyy')}
42+
</TimeDisplayHoverCard>
43+
)}
3744
</motion.div>
3845
</TopicDrawerButton>
3946
);

apps/dashboard/src/components/topics/topic-drawer.tsx

+2
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,10 @@ const TopicSubscribers = (props: TopicSubscribersProps) => {
128128
<TopicSubscriberItem
129129
key={subscription._id}
130130
subscriber={subscription.subscriber as ISubscriber}
131+
subscription={subscription}
131132
topicKey={topicKey}
132133
readOnly={readOnly}
134+
subscriptionDate={subscription.createdAt}
133135
/>
134136
))
135137
)}

apps/dashboard/src/components/topics/topic-subscriber-item.tsx

+27-16
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,17 @@ import { useState } from 'react';
1616
import { RiDeleteBinLine, RiMailLine } from 'react-icons/ri';
1717
import { SubscriberDrawerButton } from '../subscribers/subscriber-drawer';
1818
import { useRemoveTopicSubscriber } from './hooks/use-topic-subscribers';
19+
import { TimeDisplayHoverCard } from '../time-display-hover-card';
20+
import { format } from 'date-fns';
21+
import { TopicSubscription } from '@/api/topics';
1922

2023
interface TopicSubscriberItemProps {
21-
subscriber: ISubscriber;
2224
topicKey: string;
2325
readOnly?: boolean;
26+
subscription: TopicSubscription;
2427
}
2528

26-
export function TopicSubscriberItem({ subscriber, topicKey, readOnly = false }: TopicSubscriberItemProps) {
29+
export function TopicSubscriberItem({ topicKey, subscription, readOnly = false }: TopicSubscriberItemProps) {
2730
const [confirmDialogOpen, setConfirmDialogOpen] = useState(false);
2831
const { mutate: removeSubscriber, isPending } = useRemoveTopicSubscriber();
2932

@@ -38,55 +41,63 @@ export function TopicSubscriberItem({ subscriber, topicKey, readOnly = false }:
3841

3942
removeSubscriber({
4043
topicKey,
41-
subscriberId: subscriber.subscriberId,
44+
subscriberId: subscription.subscriber.subscriberId,
4245
});
4346

4447
setConfirmDialogOpen(false);
4548
};
4649

4750
const getDisplayName = () => {
48-
if (subscriber.firstName || subscriber.lastName) {
49-
return `${subscriber.firstName || ''} ${subscriber.lastName || ''}`.trim();
51+
if (subscription.subscriber.firstName || subscription.subscriber.lastName) {
52+
return `${subscription.subscriber.firstName || ''} ${subscription.subscriber.lastName || ''}`.trim();
5053
}
5154

5255
return null;
5356
};
5457

5558
const displayName = getDisplayName();
56-
const subscriberTitle = displayName || subscriber.subscriberId;
59+
const subscriberTitle = displayName || subscription.subscriber.subscriberId;
5760

5861
return (
5962
<>
60-
<SubscriberDrawerButton subscriberId={subscriber.subscriberId} readOnly>
63+
<SubscriberDrawerButton subscriberId={subscription.subscriber.subscriberId} readOnly>
6164
<motion.div
6265
variants={itemVariants}
6366
className="border-b-stroke-soft group flex w-full cursor-pointer border-b last:border-b-0 hover:bg-neutral-50"
6467
>
65-
<div className="grid w-full grid-cols-[150px_1fr_auto] items-center px-3 py-2">
68+
<div className="grid w-full grid-cols-[150px_1fr_120px_auto] items-center px-3 py-2">
6669
<div className="flex max-w-[150px] items-center gap-3 overflow-hidden">
6770
<Avatar className="size-8">
68-
<AvatarImage src={subscriber.avatar || undefined} />
71+
<AvatarImage src={subscription.subscriber.avatar || undefined} />
6972
<AvatarFallback>{subscriberTitle[0]}</AvatarFallback>
7073
</Avatar>
7174
<div className="flex flex-col overflow-hidden">
7275
<span className="text-label-xs text-foreground-950 truncate font-medium">
73-
{displayName || subscriber.subscriberId}
76+
{displayName || subscription.subscriber.subscriberId}
7477
</span>
75-
{subscriber.email && (
78+
{subscription.subscriber.email && (
7679
<div className="flex items-center">
7780
<RiMailLine className="mr-1.5 size-3 min-w-3 text-neutral-400" />
78-
<span className="text-label-xs truncate text-neutral-500">{subscriber.email}</span>
81+
<span className="text-label-xs truncate text-neutral-500">{subscription.subscriber.email}</span>
7982
</div>
8083
)}
8184
</div>
8285
</div>
8386

8487
<div className="overflow-hidden px-4 text-left">
85-
<span className="text-label-xs truncate text-neutral-500">{subscriber.subscriberId}</span>
88+
<span className="text-label-xs truncate text-neutral-500">{subscription.subscriber.subscriberId}</span>
89+
</div>
90+
91+
<div className="text-label-xs text-foreground-600 justify-self-end px-2">
92+
{subscription.createdAt && (
93+
<TimeDisplayHoverCard date={subscription.createdAt}>
94+
{format(new Date(subscription.createdAt), 'MMM d, yyyy')}
95+
</TimeDisplayHoverCard>
96+
)}
8697
</div>
8798

8899
{!readOnly && (
89-
<div className="opacity-0 transition-opacity duration-200 group-hover:opacity-100">
100+
<div className="justify-self-end opacity-0 transition-opacity duration-200 group-hover:opacity-100">
90101
<Tooltip>
91102
<TooltipTrigger asChild>
92103
<Button
@@ -114,8 +125,8 @@ export function TopicSubscriberItem({ subscriber, topicKey, readOnly = false }:
114125
<DialogTitle>Remove Subscriber</DialogTitle>
115126
<DialogDescription>
116127
Are you sure you want to remove{' '}
117-
<span className="font-medium">{displayName || subscriber.subscriberId}</span> from this topic? This action
118-
cannot be undone.
128+
<span className="font-medium">{displayName || subscription.subscriber.subscriberId}</span> from this
129+
topic? This action cannot be undone.
119130
</DialogDescription>
120131
</DialogHeader>
121132
<DialogFooter>

libs/internal-sdk/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
**/.speakeasy/temp/
2+
**/.speakeasy/logs/
13
.speakeasy/temp/
24
.DS_Store
35
/mcp-server

libs/internal-sdk/eslint.config.mjs

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export default [
1111
{
1212
rules: {
1313
"no-constant-condition": "off",
14+
"no-useless-escape": "off",
1415
// Handled by typescript compiler
1516
"@typescript-eslint/no-unused-vars": "off",
1617
"@typescript-eslint/no-explicit-any": "off",

libs/internal-sdk/src/funcs/subscribersTopicsList.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import { APICall, APIPromise } from "../types/async.js";
2525
import { Result } from "../types/fp.js";
2626

2727
/**
28-
* List topic subscriptions for a subscriber
28+
* List topics a subscriber is subscribed to
2929
*
3030
* @remarks
3131
* List topic subscriptions for a subscriber with pagination and filtering

libs/internal-sdk/src/lib/config.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,6 @@ export const SDK_METADATA = {
6363
language: "typescript",
6464
openapiDocVersion: "1.0",
6565
sdkVersion: "0.1.21",
66-
genVersion: "2.593.4",
67-
userAgent: "speakeasy-sdk/typescript 0.1.21 2.593.4 1.0 @novu/api",
66+
genVersion: "2.596.2",
67+
userAgent: "speakeasy-sdk/typescript 0.1.21 2.596.2 1.0 @novu/api",
6868
} as const;

libs/internal-sdk/src/lib/sdks.ts

+11-11
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,14 @@ export type RequestOptions = {
4646
*/
4747
serverURL?: string | URL;
4848
/**
49+
* @deprecated `fetchOptions` has been flattened into `RequestOptions`.
50+
*
4951
* Sets various request options on the `fetch` call made by an SDK method.
5052
*
5153
* @see {@link https://developer.mozilla.org/en-US/docs/Web/API/Request/Request#options|Request}
5254
*/
5355
fetchOptions?: Omit<RequestInit, "method" | "body">;
54-
};
56+
} & Omit<RequestInit, "method" | "body">;
5557

5658
type RequestConfig = {
5759
method: string;
@@ -168,7 +170,9 @@ export class ClientSDK {
168170
cookie = cookie.startsWith("; ") ? cookie.slice(2) : cookie;
169171
headers.set("cookie", cookie);
170172

171-
const userHeaders = new Headers(options?.fetchOptions?.headers);
173+
const userHeaders = new Headers(
174+
options?.headers ?? options?.fetchOptions?.headers,
175+
);
172176
for (const [k, v] of userHeaders) {
173177
headers.set(k, v);
174178
}
@@ -179,20 +183,16 @@ export class ClientSDK {
179183
headers.set(conf.uaHeader ?? "user-agent", SDK_METADATA.userAgent);
180184
}
181185

182-
let fetchOptions = options?.fetchOptions;
186+
const fetchOptions: Omit<RequestInit, "method" | "body"> = {
187+
...options?.fetchOptions,
188+
...options,
189+
};
183190
if (!fetchOptions?.signal && conf.timeoutMs && conf.timeoutMs > 0) {
184191
const timeoutSignal = AbortSignal.timeout(conf.timeoutMs);
185-
if (!fetchOptions) {
186-
fetchOptions = { signal: timeoutSignal };
187-
} else {
188-
fetchOptions.signal = timeoutSignal;
189-
}
192+
fetchOptions.signal = timeoutSignal;
190193
}
191194

192195
if (conf.body instanceof ReadableStream) {
193-
if (!fetchOptions) {
194-
fetchOptions = {};
195-
}
196196
Object.assign(fetchOptions, { duplex: "half" });
197197
}
198198

libs/internal-sdk/src/models/components/topicdto.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ import { SDKValidationError } from "../errors/sdkvalidationerror.js";
1010

1111
export type TopicDto = {
1212
/**
13-
* The unique identifier of the topic
13+
* The internal unique identifier of the topic
1414
*/
1515
id: string;
1616
/**
17-
* The key identifier of the topic
17+
* The key identifier of the topic used in your application. Should be unique on the environment level.
1818
*/
1919
key: string;
2020
/**

libs/internal-sdk/src/models/components/topicsubscriptionresponsedto.ts

+7
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ export type TopicSubscriptionResponseDto = {
2525
* The identifier of the subscription
2626
*/
2727
id: string;
28+
/**
29+
* The date and time the subscription was created
30+
*/
31+
createdAt: string;
2832
/**
2933
* Topic information
3034
*/
@@ -42,6 +46,7 @@ export const TopicSubscriptionResponseDto$inboundSchema: z.ZodType<
4246
unknown
4347
> = z.object({
4448
_id: z.string(),
49+
createdAt: z.string(),
4550
topic: TopicResponseDto$inboundSchema,
4651
subscriber: SubscriberDto$inboundSchema,
4752
}).transform((v) => {
@@ -53,6 +58,7 @@ export const TopicSubscriptionResponseDto$inboundSchema: z.ZodType<
5358
/** @internal */
5459
export type TopicSubscriptionResponseDto$Outbound = {
5560
_id: string;
61+
createdAt: string;
5662
topic: TopicResponseDto$Outbound;
5763
subscriber: SubscriberDto$Outbound;
5864
};
@@ -64,6 +70,7 @@ export const TopicSubscriptionResponseDto$outboundSchema: z.ZodType<
6470
TopicSubscriptionResponseDto
6571
> = z.object({
6672
id: z.string(),
73+
createdAt: z.string(),
6774
topic: TopicResponseDto$outboundSchema,
6875
subscriber: SubscriberDto$outboundSchema,
6976
}).transform((v) => {

libs/internal-sdk/src/react-query/subscribersTopicsList.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export type SubscribersTopicsListQueryData =
2929
operations.SubscribersControllerListSubscriberTopicsResponse;
3030

3131
/**
32-
* List topic subscriptions for a subscriber
32+
* List topics a subscriber is subscribed to
3333
*
3434
* @remarks
3535
* List topic subscriptions for a subscriber with pagination and filtering
@@ -50,7 +50,7 @@ export function useSubscribersTopicsList(
5050
}
5151

5252
/**
53-
* List topic subscriptions for a subscriber
53+
* List topics a subscriber is subscribed to
5454
*
5555
* @remarks
5656
* List topic subscriptions for a subscriber with pagination and filtering

libs/internal-sdk/src/sdk/novutopics.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { unwrapAsync } from "../types/fp.js";
99

1010
export class NovuTopics extends ClientSDK {
1111
/**
12-
* List topic subscriptions for a subscriber
12+
* List topics a subscriber is subscribed to
1313
*
1414
* @remarks
1515
* List topic subscriptions for a subscriber with pagination and filtering

0 commit comments

Comments
 (0)