@purpleschool/gptbot 0.7.77 → 0.7.78
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/api/controllers/http/presentation.ts +10 -0
- package/build/api/controllers/http/presentation.js +7 -0
- package/build/commands/auth/register-user.command.js +1 -18
- package/build/commands/auth/vk-login.command.js +1 -18
- package/build/commands/auth/yandex-login.command.js +1 -18
- package/build/commands/product/buy-product.command.js +1 -25
- package/build/commands/subscription/buy-subscription.command.js +1 -25
- package/build/commands/telegram-auth/create-telegram-auth-link.command.js +1 -19
- package/build/commands/telegram-profile/auth-with-telegram-web-app.command.js +0 -7
- package/build/commands/tools/presentation/build-blank-slide.command.js +21 -0
- package/build/commands/tools/presentation/generate-and-insert-slide.command.js +22 -0
- package/build/commands/tools/presentation/index.js +7 -0
- package/build/commands/tools/presentation/presentation-generate-report.command.js +17 -0
- package/build/commands/tools/presentation/presentation-paraphrase.command.js +20 -0
- package/build/commands/tools/presentation/update-presentation-slides.command.js +25 -0
- package/build/commands/tools/presentation/update-presentation.command.js +4 -3
- package/build/commands/tools/presentation/update-slide-image-slot.command.js +34 -0
- package/build/commands/tools/presentation/update-slide.command.js +19 -0
- package/build/constants/errors/errors.js +10 -2
- package/build/constants/presentation/enums/index.js +4 -0
- package/build/constants/presentation/enums/presentation-ai-action-call-status.enum.js +9 -0
- package/build/constants/presentation/enums/presentation-ai-action-pricing-type.enum.js +8 -0
- package/build/constants/presentation/enums/presentation-ai-action-type.enum.js +8 -0
- package/build/constants/presentation/enums/slide-image-slot-action.enum.js +8 -0
- package/build/constants/webmaster/enums/organization-type.enum.js +1 -0
- package/build/helpers/index.js +1 -0
- package/build/helpers/presentation/calculate-presentation-ai-action-price.util.js +16 -0
- package/build/helpers/presentation/index.js +17 -0
- package/build/models/tools/index.js +1 -0
- package/build/models/tools/presentation/index.js +1 -0
- package/build/models/tools/presentation/presentation-ai-action.schema.js +27 -0
- package/build/models/tools/presentation/presentation-config.schema.js +3 -0
- package/build/models/tools/presentation/presentation.schema.js +2 -0
- package/build/models/tools/presentation/slide-content-edit.schema.js +129 -0
- package/build/models/tools/presentation/slide-content.schema.js +22 -20
- package/build/models/tools/presentation/slide.schema.js +39 -1
- package/build/models/user-referrals.schema.js +0 -6
- package/commands/auth/register-user.command.ts +1 -23
- package/commands/auth/vk-login.command.ts +1 -23
- package/commands/auth/yandex-login.command.ts +1 -23
- package/commands/product/buy-product.command.ts +9 -38
- package/commands/subscription/buy-subscription.command.ts +9 -38
- package/commands/telegram-auth/create-telegram-auth-link.command.ts +1 -24
- package/commands/telegram-profile/auth-with-telegram-web-app.command.ts +0 -7
- package/commands/tools/presentation/build-blank-slide.command.ts +23 -0
- package/commands/tools/presentation/generate-and-insert-slide.command.ts +27 -0
- package/commands/tools/presentation/index.ts +7 -0
- package/commands/tools/presentation/presentation-generate-report.command.ts +21 -0
- package/commands/tools/presentation/presentation-paraphrase.command.ts +26 -0
- package/commands/tools/presentation/update-presentation-slides.command.ts +32 -0
- package/commands/tools/presentation/update-presentation.command.ts +5 -4
- package/commands/tools/presentation/update-slide-image-slot.command.ts +40 -0
- package/commands/tools/presentation/update-slide.command.ts +25 -0
- package/constants/errors/errors.ts +10 -2
- package/constants/presentation/enums/index.ts +4 -0
- package/constants/presentation/enums/presentation-ai-action-call-status.enum.ts +5 -0
- package/constants/presentation/enums/presentation-ai-action-pricing-type.enum.ts +4 -0
- package/constants/presentation/enums/presentation-ai-action-type.enum.ts +4 -0
- package/constants/presentation/enums/slide-image-slot-action.enum.ts +4 -0
- package/constants/webmaster/enums/organization-type.enum.ts +1 -0
- package/helpers/index.ts +1 -0
- package/helpers/presentation/calculate-presentation-ai-action-price.util.ts +20 -0
- package/helpers/presentation/index.ts +1 -0
- package/models/tools/index.ts +1 -0
- package/models/tools/presentation/index.ts +1 -0
- package/models/tools/presentation/presentation-ai-action.schema.ts +33 -0
- package/models/tools/presentation/presentation-config.schema.ts +3 -0
- package/models/tools/presentation/presentation.schema.ts +2 -0
- package/models/tools/presentation/slide-content-edit.schema.ts +154 -0
- package/models/tools/presentation/slide-content.schema.ts +119 -32
- package/models/tools/presentation/slide.schema.ts +47 -0
- package/models/user-referrals.schema.ts +0 -6
- package/package.json +1 -1
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
|
|
3
|
+
export namespace PresentationParaphraseCommand {
|
|
4
|
+
export const RequestParamsSchema = z.object({
|
|
5
|
+
presentationId: z.string(),
|
|
6
|
+
slideId: z.string(),
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
export const RequestBodySchema = z.object({
|
|
10
|
+
selectionText: z.string().max(10000),
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
export const RequestSchema = RequestParamsSchema.merge(RequestBodySchema);
|
|
14
|
+
|
|
15
|
+
export type RequestParams = z.infer<typeof RequestParamsSchema>;
|
|
16
|
+
export type RequestBody = z.infer<typeof RequestBodySchema>;
|
|
17
|
+
export type Request = z.infer<typeof RequestSchema>;
|
|
18
|
+
|
|
19
|
+
export const ResponseSchema = z.object({
|
|
20
|
+
data: z.object({
|
|
21
|
+
output: z.string(),
|
|
22
|
+
}),
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
export type Response = z.infer<typeof ResponseSchema>;
|
|
26
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { SlideBulkUpdateSchema } from '../../../models/tools/presentation';
|
|
3
|
+
|
|
4
|
+
export namespace UpdatePresentationSlidesCommand {
|
|
5
|
+
export const RequestSchema = z.object({
|
|
6
|
+
data: SlideBulkUpdateSchema,
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
export type Request = z.infer<typeof RequestSchema>;
|
|
10
|
+
|
|
11
|
+
export const RequestParamsSchema = z.object({
|
|
12
|
+
uuid: z.string().uuid(),
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
export type RequestParams = z.infer<typeof RequestParamsSchema>;
|
|
16
|
+
|
|
17
|
+
export const ResponseSchema = z.object({
|
|
18
|
+
data: z.array(
|
|
19
|
+
z.object({
|
|
20
|
+
uuid: z.string().uuid(),
|
|
21
|
+
order: z.number(),
|
|
22
|
+
contentTypeId: z.string(),
|
|
23
|
+
layoutId: z.string(),
|
|
24
|
+
content: z.record(z.any()),
|
|
25
|
+
createdAt: z.date(),
|
|
26
|
+
updatedAt: z.date(),
|
|
27
|
+
}),
|
|
28
|
+
),
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
export type Response = z.infer<typeof ResponseSchema>;
|
|
32
|
+
}
|
|
@@ -5,11 +5,12 @@ export namespace UpdatePresentationCommand {
|
|
|
5
5
|
export const RequestParamsSchema = z.object({
|
|
6
6
|
uuid: z.string().uuid(),
|
|
7
7
|
});
|
|
8
|
+
export type RequestParams = z.infer<typeof RequestParamsSchema>;
|
|
8
9
|
|
|
9
|
-
export const RequestBodySchema =
|
|
10
|
-
title:
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
export const RequestBodySchema = PresentationSchema.pick({
|
|
11
|
+
title: true,
|
|
12
|
+
templateId: true,
|
|
13
|
+
}).partial();
|
|
13
14
|
export type Request = z.infer<typeof RequestBodySchema>;
|
|
14
15
|
|
|
15
16
|
export const ResponseSchema = z.object({
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { SLIDE_IMAGE_SLOT_ACTION } from '../../../constants';
|
|
3
|
+
import { SlideImageSlotSchema } from '../../../models/tools/presentation/slide-image-slot.schema';
|
|
4
|
+
|
|
5
|
+
export namespace UpdateSlideImageSlotCommand {
|
|
6
|
+
const ReplacePayload = z.object({
|
|
7
|
+
action: z.literal(SLIDE_IMAGE_SLOT_ACTION.REPLACE),
|
|
8
|
+
fileId: z.string().uuid(),
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
const GeneratePayload = z.object({
|
|
12
|
+
action: z.literal(SLIDE_IMAGE_SLOT_ACTION.GENERATE),
|
|
13
|
+
prompt: z.string().min(1).max(1000).optional(),
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
const UpdateImageSlotPayloadSchema = z.discriminatedUnion('action', [
|
|
17
|
+
ReplacePayload,
|
|
18
|
+
GeneratePayload,
|
|
19
|
+
]);
|
|
20
|
+
export type UpdateImageSlotPayload = z.infer<typeof UpdateImageSlotPayloadSchema>;
|
|
21
|
+
|
|
22
|
+
export const RequestSchema = z.object({
|
|
23
|
+
payload: UpdateImageSlotPayloadSchema,
|
|
24
|
+
});
|
|
25
|
+
export type Request = z.infer<typeof RequestSchema>;
|
|
26
|
+
|
|
27
|
+
export const RequestParamsSchema = z.object({
|
|
28
|
+
presentationId: z.string().uuid(),
|
|
29
|
+
slideId: z.string().uuid(),
|
|
30
|
+
slotId: z.string().uuid().optional(),
|
|
31
|
+
});
|
|
32
|
+
export type RequestParams = z.infer<typeof RequestParamsSchema>;
|
|
33
|
+
|
|
34
|
+
export const ResponseSchema = z.object({
|
|
35
|
+
data: z.object({
|
|
36
|
+
imageSlot: SlideImageSlotSchema,
|
|
37
|
+
}),
|
|
38
|
+
});
|
|
39
|
+
export type Response = z.infer<typeof ResponseSchema>;
|
|
40
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { SlideSchema, SlideUpdateSchema } from '../../../models/tools/presentation';
|
|
3
|
+
|
|
4
|
+
export namespace UpdateSlideCommand {
|
|
5
|
+
export const RequestParamsSchema = z.object({
|
|
6
|
+
presentationId: z.string(),
|
|
7
|
+
slideId: z.string(),
|
|
8
|
+
});
|
|
9
|
+
|
|
10
|
+
export const RequestBodySchema = z.object({
|
|
11
|
+
data: SlideUpdateSchema,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export const RequestSchema = RequestParamsSchema.merge(RequestBodySchema);
|
|
15
|
+
|
|
16
|
+
export type RequestParams = z.infer<typeof RequestParamsSchema>;
|
|
17
|
+
export type RequestBody = z.infer<typeof RequestBodySchema>;
|
|
18
|
+
export type Request = z.infer<typeof RequestSchema>;
|
|
19
|
+
|
|
20
|
+
export const ResponseSchema = z.object({
|
|
21
|
+
data: SlideSchema,
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export type Response = z.infer<typeof ResponseSchema>;
|
|
25
|
+
}
|
|
@@ -2247,12 +2247,10 @@ export const ERRORS = {
|
|
|
2247
2247
|
MUSIC_MAX_SYMBOLS_EXCEEDED: {
|
|
2248
2248
|
code: 'A458',
|
|
2249
2249
|
message: 'Превышена максимальная количество символов',
|
|
2250
|
-
httpCode: 400,
|
|
2251
2250
|
},
|
|
2252
2251
|
MUSIC_INVALID_VOCAL: {
|
|
2253
2252
|
code: 'A459',
|
|
2254
2253
|
message: 'Выбран неверный голос для вокала',
|
|
2255
|
-
httpCode: 400,
|
|
2256
2254
|
},
|
|
2257
2255
|
MUSIC_JOB_DELETE_ERROR: {
|
|
2258
2256
|
code: 'A460',
|
|
@@ -2294,4 +2292,14 @@ export const ERRORS = {
|
|
|
2294
2292
|
message: 'Не удалось применить бонусы вебмастеру',
|
|
2295
2293
|
httpCode: 500,
|
|
2296
2294
|
},
|
|
2295
|
+
SLIDE_IMAGE_SLOT_UPDATE_ERROR: {
|
|
2296
|
+
code: 'A450',
|
|
2297
|
+
message: 'Произошла ошибка при обновлении изображения на слайде',
|
|
2298
|
+
httpCode: 500,
|
|
2299
|
+
},
|
|
2300
|
+
FILE_TYPE_NOT_SUPPORTED: {
|
|
2301
|
+
code: 'A451',
|
|
2302
|
+
message: 'Неподдерживаемый тип файла',
|
|
2303
|
+
httpCode: 400,
|
|
2304
|
+
},
|
|
2297
2305
|
};
|
|
@@ -3,3 +3,7 @@ export * from './slide-content-type.enum';
|
|
|
3
3
|
export * from './slide-icon-slot-status.enum';
|
|
4
4
|
export * from './slide-image-slot.status.enum';
|
|
5
5
|
export * from './slide-layout.enum';
|
|
6
|
+
export * from './slide-image-slot-action.enum';
|
|
7
|
+
export * from './presentation-ai-action-type.enum';
|
|
8
|
+
export * from './presentation-ai-action-pricing-type.enum';
|
|
9
|
+
export * from './presentation-ai-action-call-status.enum';
|
package/helpers/index.ts
CHANGED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { PRESENTATION_AI_ACTION_PRICING_TYPE } from '../../constants';
|
|
2
|
+
import { PresentationAiActionPricingRules } from '../../models/tools/presentation';
|
|
3
|
+
|
|
4
|
+
export function calculatePresentationAiActionPrice(
|
|
5
|
+
pricingRules: PresentationAiActionPricingRules,
|
|
6
|
+
selectionText: string,
|
|
7
|
+
): number {
|
|
8
|
+
switch (pricingRules.type) {
|
|
9
|
+
case PRESENTATION_AI_ACTION_PRICING_TYPE.PER_CHARACTER:
|
|
10
|
+
const characterCount = selectionText.length;
|
|
11
|
+
const price = characterCount * pricingRules.price;
|
|
12
|
+
return Math.max(1, Math.ceil(price));
|
|
13
|
+
|
|
14
|
+
case PRESENTATION_AI_ACTION_PRICING_TYPE.FLAT:
|
|
15
|
+
return Math.max(1, Math.ceil(pricingRules.price));
|
|
16
|
+
|
|
17
|
+
default:
|
|
18
|
+
throw new Error(`Unknown pricing type`);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './calculate-presentation-ai-action-price.util';
|
package/models/tools/index.ts
CHANGED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import {
|
|
3
|
+
PRESENTATION_AI_ACTION_PRICING_TYPE,
|
|
4
|
+
PRESENTATION_AI_ACTION_TYPE,
|
|
5
|
+
} from '../../../constants';
|
|
6
|
+
|
|
7
|
+
export const PresentationAiActionPricingRulesSchema = z.discriminatedUnion('type', [
|
|
8
|
+
z.object({
|
|
9
|
+
type: z.literal(PRESENTATION_AI_ACTION_PRICING_TYPE.PER_CHARACTER),
|
|
10
|
+
price: z.number(),
|
|
11
|
+
}),
|
|
12
|
+
z.object({
|
|
13
|
+
type: z.literal(PRESENTATION_AI_ACTION_PRICING_TYPE.FLAT),
|
|
14
|
+
price: z.number(),
|
|
15
|
+
}),
|
|
16
|
+
]);
|
|
17
|
+
export type PresentationAiActionPricingRules = z.infer<
|
|
18
|
+
typeof PresentationAiActionPricingRulesSchema
|
|
19
|
+
>;
|
|
20
|
+
|
|
21
|
+
export const PresentationAiActionSchema = z.object({
|
|
22
|
+
uuid: z.string(),
|
|
23
|
+
type: z.nativeEnum(PRESENTATION_AI_ACTION_TYPE),
|
|
24
|
+
pricingRules: PresentationAiActionPricingRulesSchema,
|
|
25
|
+
maxPromptLength: z.number(),
|
|
26
|
+
aiModel: z.string(),
|
|
27
|
+
title: z.string(),
|
|
28
|
+
icon: z.string(),
|
|
29
|
+
order: z.number(),
|
|
30
|
+
createdAt: z.date(),
|
|
31
|
+
updatedAt: z.date(),
|
|
32
|
+
});
|
|
33
|
+
export type PresentationAiAction = z.infer<typeof PresentationAiActionSchema>;
|
|
@@ -2,16 +2,19 @@ import { z } from 'zod';
|
|
|
2
2
|
import { SlideContentTypeSchema } from './slide-content-type.schema';
|
|
3
3
|
import { LanguageSchema } from '../language';
|
|
4
4
|
import { PresentationTemplateSchema } from './presentation-template.schema';
|
|
5
|
+
import { PresentationAiActionSchema } from './presentation-ai-action.schema';
|
|
5
6
|
|
|
6
7
|
export const PresentationConfigSchema = z.object({
|
|
7
8
|
slideContentTypes: z.array(SlideContentTypeSchema),
|
|
8
9
|
languages: z.array(LanguageSchema),
|
|
9
10
|
templates: z.array(PresentationTemplateSchema),
|
|
11
|
+
aiActions: z.array(PresentationAiActionSchema),
|
|
10
12
|
slideGenerationPrice: z.number(),
|
|
11
13
|
maxSlides: z.number(),
|
|
12
14
|
minSlides: z.number(),
|
|
13
15
|
maxSlideTitleLength: z.number(),
|
|
14
16
|
maxSlideOutlineLength: z.number(),
|
|
15
17
|
maxPromptLength: z.number(),
|
|
18
|
+
imageGenerationPrice: z.number(),
|
|
16
19
|
});
|
|
17
20
|
export type PresentationConfig = z.infer<typeof PresentationConfigSchema>;
|
|
@@ -13,6 +13,8 @@ export const PresentationSchema = z.object({
|
|
|
13
13
|
templateId: z.string(),
|
|
14
14
|
downloadUrl: z.string().nullable(),
|
|
15
15
|
slideCount: z.number(),
|
|
16
|
+
lastContentUpdateAt: z.date().nullable(),
|
|
17
|
+
lastPptxExportedAt: z.date().nullable(),
|
|
16
18
|
createdAt: z.date(),
|
|
17
19
|
updatedAt: z.date(),
|
|
18
20
|
});
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import z from 'zod';
|
|
2
|
+
import {
|
|
3
|
+
ICoverSlideDataStructure,
|
|
4
|
+
IThankYouSlideDataStructure,
|
|
5
|
+
ITextSlideDataStructure,
|
|
6
|
+
IStructuredListSlideDataStructure,
|
|
7
|
+
IContentsSlideDataStructure,
|
|
8
|
+
IImageSlideDataStructure,
|
|
9
|
+
ISectionBreakSlideDataStructure,
|
|
10
|
+
ITableSlideDataStructure,
|
|
11
|
+
SLIDE_CHART_TYPE,
|
|
12
|
+
IBarChartSlideDataStructure,
|
|
13
|
+
IChartSlideDataStructure,
|
|
14
|
+
ImageSlotSchema,
|
|
15
|
+
} from './slide-content.schema';
|
|
16
|
+
import { SLIDE_CONTENT_TYPE } from '../../../constants';
|
|
17
|
+
|
|
18
|
+
export const CoverSlideDataUserEditSchema = z.object({
|
|
19
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.COVER),
|
|
20
|
+
title: z.string().max(1000),
|
|
21
|
+
author: z.object({
|
|
22
|
+
label: z.string().max(200),
|
|
23
|
+
value: z.string().max(500),
|
|
24
|
+
}),
|
|
25
|
+
date: z.object({
|
|
26
|
+
label: z.string().max(200),
|
|
27
|
+
value: z.string().max(500),
|
|
28
|
+
}),
|
|
29
|
+
email: z.object({
|
|
30
|
+
label: z.string().max(200),
|
|
31
|
+
value: z.string().max(500),
|
|
32
|
+
}),
|
|
33
|
+
version: z.literal(1),
|
|
34
|
+
}) satisfies z.ZodType<ICoverSlideDataStructure>;
|
|
35
|
+
|
|
36
|
+
export const ThankYouSlideDataUserEditSchema = z.object({
|
|
37
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.THANK_YOU),
|
|
38
|
+
title: z.string().max(1000),
|
|
39
|
+
author: z.object({
|
|
40
|
+
label: z.string().max(200),
|
|
41
|
+
value: z.string().max(500),
|
|
42
|
+
}),
|
|
43
|
+
date: z.object({
|
|
44
|
+
label: z.string().max(200),
|
|
45
|
+
value: z.string().max(500),
|
|
46
|
+
}),
|
|
47
|
+
email: z.object({
|
|
48
|
+
label: z.string().max(200),
|
|
49
|
+
value: z.string().max(500),
|
|
50
|
+
}),
|
|
51
|
+
version: z.literal(1),
|
|
52
|
+
}) satisfies z.ZodType<IThankYouSlideDataStructure>;
|
|
53
|
+
|
|
54
|
+
export const TextSlideDataUserEditSchema = z.object({
|
|
55
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.TEXT),
|
|
56
|
+
title: z.string().max(1000),
|
|
57
|
+
description: z.string().max(5000),
|
|
58
|
+
version: z.literal(1),
|
|
59
|
+
}) satisfies z.ZodType<ITextSlideDataStructure>;
|
|
60
|
+
|
|
61
|
+
export const StructuredListSlideDataUserEditSchema = z.object({
|
|
62
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.STRUCTURED_LIST),
|
|
63
|
+
title: z.string().max(1000),
|
|
64
|
+
description: z.string().max(2000),
|
|
65
|
+
list: z
|
|
66
|
+
.array(
|
|
67
|
+
z.object({
|
|
68
|
+
title: z.string().max(500),
|
|
69
|
+
description: z.string().max(1000),
|
|
70
|
+
}),
|
|
71
|
+
)
|
|
72
|
+
.max(15),
|
|
73
|
+
version: z.literal(1),
|
|
74
|
+
}) satisfies z.ZodType<IStructuredListSlideDataStructure>;
|
|
75
|
+
|
|
76
|
+
export const ContentsSlideDataUserEditSchema = z.object({
|
|
77
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.CONTENTS),
|
|
78
|
+
title: z.string().max(1000),
|
|
79
|
+
items: z
|
|
80
|
+
.array(
|
|
81
|
+
z.object({
|
|
82
|
+
pageNumber: z.number(),
|
|
83
|
+
title: z.string().max(1000),
|
|
84
|
+
}),
|
|
85
|
+
)
|
|
86
|
+
.max(100),
|
|
87
|
+
version: z.literal(1),
|
|
88
|
+
}) satisfies z.ZodType<IContentsSlideDataStructure>;
|
|
89
|
+
|
|
90
|
+
export const ImageSlideDataUserEditSchema = z.object({
|
|
91
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.TEXT_WITH_IMAGE),
|
|
92
|
+
title: z.string().max(1000),
|
|
93
|
+
description: z.string().max(4000),
|
|
94
|
+
imageSlot: ImageSlotSchema,
|
|
95
|
+
version: z.literal(1),
|
|
96
|
+
}) satisfies z.ZodType<IImageSlideDataStructure>;
|
|
97
|
+
|
|
98
|
+
export const SectionBreakSlideDataUserEditSchema = z.object({
|
|
99
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.SECTION_BREAK),
|
|
100
|
+
title: z.string().max(1000),
|
|
101
|
+
description: z.string().max(1000),
|
|
102
|
+
version: z.literal(1),
|
|
103
|
+
}) satisfies z.ZodType<ISectionBreakSlideDataStructure>;
|
|
104
|
+
|
|
105
|
+
export const TableSlideDataUserEditSchema = z.object({
|
|
106
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.TABLE),
|
|
107
|
+
title: z.string().max(1000),
|
|
108
|
+
description: z.string().max(2000),
|
|
109
|
+
table: z.object({
|
|
110
|
+
columnHeaders: z.array(z.string().max(500)).max(30),
|
|
111
|
+
rows: z.array(z.array(z.string().max(1000))).max(50),
|
|
112
|
+
hasRowHeaders: z.boolean(),
|
|
113
|
+
hasSummaryRow: z.boolean(),
|
|
114
|
+
}),
|
|
115
|
+
version: z.literal(1),
|
|
116
|
+
}) satisfies z.ZodType<ITableSlideDataStructure>;
|
|
117
|
+
|
|
118
|
+
export const BarChartSlideDataUserEditSchema = z.object({
|
|
119
|
+
type: z.literal(SLIDE_CHART_TYPE.BAR),
|
|
120
|
+
categories: z.array(z.string().max(500)).max(100),
|
|
121
|
+
series: z
|
|
122
|
+
.array(
|
|
123
|
+
z.object({
|
|
124
|
+
name: z.string().max(500),
|
|
125
|
+
data: z.array(z.number()),
|
|
126
|
+
type: z.number().min(0).max(11),
|
|
127
|
+
}),
|
|
128
|
+
)
|
|
129
|
+
.max(10),
|
|
130
|
+
yAxisLabel: z.string().max(500).optional(),
|
|
131
|
+
unit: z.string().max(100).optional(),
|
|
132
|
+
version: z.literal(1),
|
|
133
|
+
}) satisfies z.ZodType<IBarChartSlideDataStructure>;
|
|
134
|
+
|
|
135
|
+
export const ChartSlideDataUserEditSchema = z.object({
|
|
136
|
+
contentType: z.literal(SLIDE_CONTENT_TYPE.CHART),
|
|
137
|
+
title: z.string().max(1000),
|
|
138
|
+
description: z.string().max(4000),
|
|
139
|
+
chart: z.discriminatedUnion('type', [BarChartSlideDataUserEditSchema]),
|
|
140
|
+
version: z.literal(1),
|
|
141
|
+
}) satisfies z.ZodType<IChartSlideDataStructure>;
|
|
142
|
+
|
|
143
|
+
export const SlideContentUserEditSchema = z.discriminatedUnion('contentType', [
|
|
144
|
+
CoverSlideDataUserEditSchema,
|
|
145
|
+
StructuredListSlideDataUserEditSchema,
|
|
146
|
+
TextSlideDataUserEditSchema,
|
|
147
|
+
ContentsSlideDataUserEditSchema,
|
|
148
|
+
SectionBreakSlideDataUserEditSchema,
|
|
149
|
+
ImageSlideDataUserEditSchema,
|
|
150
|
+
ThankYouSlideDataUserEditSchema,
|
|
151
|
+
TableSlideDataUserEditSchema,
|
|
152
|
+
ChartSlideDataUserEditSchema,
|
|
153
|
+
]);
|
|
154
|
+
export type SlideContentUserEdit = z.infer<typeof SlideContentUserEditSchema>;
|