feat: validation

This commit is contained in:
Nevo David 2025-07-04 12:24:40 +07:00
parent 1faee653d9
commit a80f0397f2
6 changed files with 62 additions and 38 deletions

View File

@ -74,7 +74,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
integrations: state.integrations,
setSelectedIntegrations: state.setSelectedIntegrations,
locked: state.locked,
activateExitButton: state.activateExitButton
activateExitButton: state.activateExitButton,
}))
);
@ -144,7 +144,8 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
const notEnoughChars = checkAllValid.filter((p: any) => {
return p.values.some((a: any) => {
return (
countCharacters(a.content, p?.integration?.identifier || '') === 0 && a.media?.length === 0
countCharacters(a.content, p?.integration?.identifier || '') ===
0 && a.media?.length === 0
);
});
});
@ -239,7 +240,7 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
posts: checkAllValid.map((p: any) => ({
integration: p.integration,
group,
settings: p.settings,
settings: { ...(p.settings || {}), __type: p.integration.identifier },
value: p.values.map((a: any) => ({
...a,
image: a.media || [],
@ -335,7 +336,9 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
onClick={schedule('draft')}
className="rounded-[4px] border-2 border-customColor21"
secondary={true}
disabled={selectedIntegrations.length === 0 || loading || locked}
disabled={
selectedIntegrations.length === 0 || loading || locked
}
>
{t('save_as_draft', 'Save as draft')}
</Button>
@ -344,7 +347,9 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
{addEditSets && (
<Button
className="rounded-[4px] relative group"
disabled={selectedIntegrations.length === 0 || loading || locked}
disabled={
selectedIntegrations.length === 0 || loading || locked
}
onClick={schedule('draft')}
>
Save Set
@ -353,7 +358,9 @@ export const ManageModal: FC<AddEditModalProps> = (props) => {
{!addEditSets && (
<Button
className="rounded-[4px] relative group"
disabled={selectedIntegrations.length === 0 || loading || locked}
disabled={
selectedIntegrations.length === 0 || loading || locked
}
>
<div className="flex justify-center items-center gap-[5px] h-full">
<div

View File

@ -10,7 +10,7 @@ import { useFieldArray } from 'react-hook-form';
import { Button } from '@gitroom/react/form/button';
import { deleteDialog } from '@gitroom/react/helpers/delete.dialog';
import { Subreddit } from './subreddit';
import { LemmySettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/lemmy.dto';
import { LemmySettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/lemmy.dto';
import { useT } from '@gitroom/react/translation/get.transation.service.client';
const LemmySettings: FC = () => {
const { register, control } = useSettings();

View File

@ -13,22 +13,9 @@ import {
ValidateNested,
} from 'class-validator';
import { Type } from 'class-transformer';
import { DevToSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/dev.to.settings.dto';
import { MediaDto } from '@gitroom/nestjs-libraries/dtos/media/media.dto';
import { type AllProvidersSettings } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/all.providers.settings';
import { MediumSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/medium.settings.dto';
import { HashnodeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/hashnode.settings.dto';
import { RedditSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/reddit.dto';
import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto';
import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/pinterest.dto';
import { DribbbleDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/dribbble.dto';
import { TikTokDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/tiktok.dto';
import { DiscordDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/discord.dto';
import { SlackDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/slack.dto';
import { LemmySettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/lemmy.dto';
import { XDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/x.dto';
import { allProviders, type AllProvidersSettings, EmptySettings } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/all.providers.settings';
export class EmptySettings {}
export class Integration {
@IsDefined()
@IsString()
@ -70,23 +57,10 @@ export class Post {
@ValidateNested()
@Type(() => EmptySettings, {
keepDiscriminatorProperty: false,
keepDiscriminatorProperty: true,
discriminator: {
property: '__type',
subTypes: [
{ value: DevToSettingsDto, name: 'devto' },
{ value: MediumSettingsDto, name: 'medium' },
{ value: HashnodeSettingsDto, name: 'hashnode' },
{ value: RedditSettingsDto, name: 'reddit' },
{ value: LemmySettingsDto, name: 'lemmy' },
{ value: YoutubeSettingsDto, name: 'youtube' },
{ value: PinterestSettingsDto, name: 'pinterest' },
{ value: DribbbleDto, name: 'dribbble' },
{ value: TikTokDto, name: 'tiktok' },
{ value: DiscordDto, name: 'discord' },
{ value: SlackDto, name: 'slack' },
{ value: XDto, name: 'x' },
],
subTypes: allProviders(EmptySettings),
},
})
settings: AllProvidersSettings;

View File

@ -6,6 +6,13 @@ import { PinterestSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/provi
import { YoutubeSettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/youtube.settings.dto';
import { TikTokDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/tiktok.dto';
import { XDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/x.dto';
import { LemmySettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/lemmy.dto';
import { DribbbleDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/dribbble.dto';
import { DiscordDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/discord.dto';
import { SlackDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/slack.dto';
import { InstagramDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/instagram.dto';
import { LinkedinDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/linkedin.dto';
import { IsIn, MinLength } from 'class-validator';
export type AllProvidersSettings =
| DevToSettingsDto
@ -15,4 +22,40 @@ export type AllProvidersSettings =
| YoutubeSettingsDto
| PinterestSettingsDto
| XDto
| TikTokDto;
| TikTokDto
| InstagramDto;
export const allProviders = (setEmpty?: any) => {
return [
{ value: RedditSettingsDto, name: 'reddit' },
{ value: LemmySettingsDto, name: 'lemmy' },
{ value: YoutubeSettingsDto, name: 'youtube' },
{ value: PinterestSettingsDto, name: 'pinterest' },
{ value: DribbbleDto, name: 'dribbble' },
{ value: TikTokDto, name: 'tiktok' },
{ value: DiscordDto, name: 'discord' },
{ value: SlackDto, name: 'slack' },
{ value: XDto, name: 'x' },
{ value: LinkedinDto, name: 'linkedin' },
{ value: LinkedinDto, name: 'linkedin-page' },
{ value: InstagramDto, name: 'instagram' },
{ value: InstagramDto, name: 'instagram-standalone' },
{ value: setEmpty, name: 'facebook' },
{ value: setEmpty, name: 'threads' },
{ value: setEmpty, name: 'mastodon' },
{ value: setEmpty, name: 'bluesky' },
{ value: setEmpty, name: 'wrapcast' },
{ value: setEmpty, name: 'telegram' },
{ value: setEmpty, name: 'nostr' },
{ value: setEmpty, name: 'vk' },
].filter((f) => f.value);
};
export class EmptySettings {
@IsIn(allProviders(EmptySettings).map((p) => p.name), {
message: `"__type" must be ${allProviders(EmptySettings)
.map((p) => p.name)
.join(', ')}`,
})
__type: string;
}

View File

@ -9,7 +9,7 @@ import { SocialAbstract } from '@gitroom/nestjs-libraries/integrations/social.ab
import dayjs from 'dayjs';
import { Integration } from '@prisma/client';
import { AuthService } from '@gitroom/helpers/auth/auth.service';
import { LemmySettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/lemmy.dto';
import { LemmySettingsDto } from '@gitroom/nestjs-libraries/dtos/posts/providers-settings/lemmy.dto';
import { groupBy } from 'lodash';
export class LemmyProvider extends SocialAbstract implements SocialProvider {