Skip to content

Commit 600ed9b

Browse files
committed
feat: add clone functionality for subscription page configurations and update related schemas
1 parent 3709873 commit 600ed9b

File tree

14 files changed

+156
-5
lines changed

14 files changed

+156
-5
lines changed

libs/contract/api/controllers/subscription-page-configs.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@ export const SUBSCRIPTION_PAGE_CONFIGS_ROUTES = {
1111

1212
ACTIONS: {
1313
REORDER: `${ACTIONS_ROUTE}/reorder`,
14+
CLONE: `${ACTIONS_ROUTE}/clone`,
1415
},
1516
} as const;

libs/contract/api/routes.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -401,6 +401,7 @@ export const REST_API = {
401401
CREATE: `${ROOT}/${CONTROLLERS.SUBSCRIPTION_PAGE_CONFIGS_CONTROLLER}/${CONTROLLERS.SUBSCRIPTION_PAGE_CONFIGS_ROUTES.CREATE}`,
402402
ACTIONS: {
403403
REORDER: `${ROOT}/${CONTROLLERS.SUBSCRIPTION_PAGE_CONFIGS_CONTROLLER}/${CONTROLLERS.SUBSCRIPTION_PAGE_CONFIGS_ROUTES.ACTIONS.REORDER}`,
404+
CLONE: `${ROOT}/${CONTROLLERS.SUBSCRIPTION_PAGE_CONFIGS_CONTROLLER}/${CONTROLLERS.SUBSCRIPTION_PAGE_CONFIGS_ROUTES.ACTIONS.CLONE}`,
404405
},
405406
},
406407
} as const;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { z } from 'zod';
2+
3+
import { REST_API, SUBSCRIPTION_PAGE_CONFIGS_ROUTES } from '../../../api';
4+
import { SubscriptionPageConfigSchema } from '../../../models';
5+
import { getEndpointDetails } from '../../../constants';
6+
7+
export namespace CloneSubscriptionPageConfigCommand {
8+
export const url = REST_API.SUBSCRIPTION_PAGE_CONFIGS.ACTIONS.CLONE;
9+
export const TSQ_url = url;
10+
11+
export const endpointDetails = getEndpointDetails(
12+
SUBSCRIPTION_PAGE_CONFIGS_ROUTES.ACTIONS.CLONE,
13+
'post',
14+
'Clone subscription page config',
15+
);
16+
17+
export const RequestSchema = z.object({
18+
cloneFromUuid: z.string().uuid(),
19+
});
20+
21+
export type Request = z.infer<typeof RequestSchema>;
22+
23+
export const ResponseSchema = z.object({
24+
response: SubscriptionPageConfigSchema.extend({
25+
config: z.unknown(),
26+
}),
27+
});
28+
29+
export type Response = z.infer<typeof ResponseSchema>;
30+
}
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
1+
export * from './clone-subpage-config.command';
12
export * from './reorder.command';

libs/contract/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@remnawave/backend-contract",
3-
"version": "2.3.59",
3+
"version": "2.3.61",
44
"public": true,
55
"license": "AGPL-3.0-only",
66
"description": "A contract library for Remnawave Backend. It can be used in backend and frontend.",
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export const BUTTON_TYPES = {
2+
EXTERNAL: 'external',
3+
SUBSCRIPTION_LINK: 'subscriptionLink',
4+
} as const;
5+
6+
export type TButtonType = (typeof BUTTON_TYPES)[keyof typeof BUTTON_TYPES];
7+
8+
export const BUTTON_TYPES_VALUES = Object.values(BUTTON_TYPES);
9+
10+
export const isButtonType = (value: string): value is TButtonType => {
11+
return BUTTON_TYPES_VALUES.includes(value as TButtonType);
12+
};
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
11
export * from './app-config.constant';
2+
export * from './button-types.constant';
3+
export * from './installation-guide-blocks.constant';
4+
export * from './subscription-info-blocks.constant';
25
export * from './subscription-page-config';
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
export const INSTALLATION_GUIDE_BLOCKS_VARIANTS = {
2+
CARDS: 'cards',
3+
ACCORDION: 'accordion',
4+
MINIMAL: 'minimal',
5+
TIMELINE: 'timeline',
6+
} as const;
7+
8+
export type TInstallationGuideBlockVariant =
9+
(typeof INSTALLATION_GUIDE_BLOCKS_VARIANTS)[keyof typeof INSTALLATION_GUIDE_BLOCKS_VARIANTS];
10+
11+
export const INSTALLATION_GUIDE_BLOCKS_VARIANTS_VALUES = Object.values(
12+
INSTALLATION_GUIDE_BLOCKS_VARIANTS,
13+
);
14+
15+
export const isInstallationGuideBlockVariant = (
16+
value: string,
17+
): value is TInstallationGuideBlockVariant => {
18+
return INSTALLATION_GUIDE_BLOCKS_VARIANTS_VALUES.includes(
19+
value as TInstallationGuideBlockVariant,
20+
);
21+
};
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
export const SUBSCRIPTION_INFO_BLOCK_VARIANTS = {
2+
COLLAPSED: 'collapsed',
3+
EXPANDED: 'expanded',
4+
CARDS: 'cards',
5+
HIDDEN: 'hidden',
6+
} as const;
7+
8+
export type TSubscriptionInfoBlockVariant =
9+
(typeof SUBSCRIPTION_INFO_BLOCK_VARIANTS)[keyof typeof SUBSCRIPTION_INFO_BLOCK_VARIANTS];
10+
11+
export const SUBSCRIPTION_INFO_BLOCK_VARIANTS_VALUES = Object.values(
12+
SUBSCRIPTION_INFO_BLOCK_VARIANTS,
13+
);
14+
15+
export const isSubscriptionInfoBlockVariant = (
16+
value: string,
17+
): value is TSubscriptionInfoBlockVariant => {
18+
return SUBSCRIPTION_INFO_BLOCK_VARIANTS_VALUES.includes(value as TSubscriptionInfoBlockVariant);
19+
};

libs/subscription-page/models/subscription-page-config/subscription-page-config.schema.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ import {
44
SUBSCRIPTION_PAGE_CONFIG_VERSION,
55
SUBSCRIPTION_PAGE_CONFIG_PLATFORM_TYPES,
66
SUBSCRIPTION_PAGE_CONFIG_ADDITIONAL_LOCALES,
7+
SUBSCRIPTION_INFO_BLOCK_VARIANTS,
8+
INSTALLATION_GUIDE_BLOCKS_VARIANTS,
9+
BUTTON_TYPES,
710
} from '../../constants';
811
import {
912
validateLocalizedTexts,
@@ -25,7 +28,7 @@ const SvgLibrarySchema = z.record(
2528

2629
const ButtonSchema = z.object({
2730
link: z.string(),
28-
type: z.enum(['external', 'subscriptionLink']),
31+
type: z.nativeEnum(BUTTON_TYPES),
2932
text: LocalizedTextSchema,
3033
svgIconKey: z.string(),
3134
});
@@ -82,10 +85,12 @@ const BrandingSettingsSchema = z.object({
8285

8386
const UiConfigSchema = z.object({
8487
subscriptionInfo: z.object({
85-
block: z.enum(['collapsed', 'expanded', 'cards', 'hidden']),
88+
block: z.nativeEnum(SUBSCRIPTION_INFO_BLOCK_VARIANTS),
8689
}),
8790
installationGuides: z.object({
88-
block: z.enum(['cards', 'accordion', 'minimal', 'timeline']).default('cards'),
91+
block: z
92+
.nativeEnum(INSTALLATION_GUIDE_BLOCKS_VARIANTS)
93+
.default(INSTALLATION_GUIDE_BLOCKS_VARIANTS.CARDS),
8994
headerText: LocalizedTextSchema,
9095
}),
9196
connectionKeys: z.object({

0 commit comments

Comments
 (0)