From b608dffbac643c15516d5a02df635eac0fa170b5 Mon Sep 17 00:00:00 2001 From: nael Date: Wed, 31 Jul 2024 00:04:47 +0200 Subject: [PATCH 1/5] :sparkles: Add password recovery --- .env.example | 4 + apps/webapp/src/app/b2c/login/page.tsx | 12 + .../src/app/b2c/login/reset-password.tsx | 24 + .../ForgotPasswordForm.tsx | 69 + .../CustomLoginComponent/LoginUserForm.tsx | 6 +- .../ResetPasswordForm.tsx | 132 ++ .../create/useInitiatePasswordRecovery.tsx | 45 + .../src/hooks/create/useResetPassword.tsx | 46 + docker-compose.dev.yml | 4 + docker-compose.source.yml | 4 + docker-compose.yml | 4 + docs/mint.json | 28 +- packages/api/package.json | 3 +- .../api/src/@core/auth/auth.controller.ts | 26 + packages/api/src/@core/auth/auth.module.ts | 2 + packages/api/src/@core/auth/auth.service.ts | 72 +- .../@core/auth/dto/password-recovery.dto.ts | 6 + .../src/@core/auth/dto/reset-password.dto.ts | 10 + packages/api/src/@core/mailer/module.ts | 32 + .../@core/mailer/templates/password-reset.hbs | 18 + .../timeoffbalance.controller.ts | 5 +- pnpm-lock.yaml | 1849 ++++++++++++++++- 22 files changed, 2315 insertions(+), 86 deletions(-) create mode 100644 apps/webapp/src/app/b2c/login/reset-password.tsx create mode 100644 apps/webapp/src/components/Auth/CustomLoginComponent/ForgotPasswordForm.tsx create mode 100644 apps/webapp/src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx create mode 100644 apps/webapp/src/hooks/create/useInitiatePasswordRecovery.tsx create mode 100644 apps/webapp/src/hooks/create/useResetPassword.tsx create mode 100644 packages/api/src/@core/auth/dto/password-recovery.dto.ts create mode 100644 packages/api/src/@core/auth/dto/reset-password.dto.ts create mode 100644 packages/api/src/@core/mailer/module.ts create mode 100644 packages/api/src/@core/mailer/templates/password-reset.hbs diff --git a/.env.example b/.env.example index 61c55439e..d882c2a62 100644 --- a/.env.example +++ b/.env.example @@ -21,6 +21,10 @@ REDIS_PASS=A3vniod98Zbuvn9u5 #REDIS_TLS= +MAIL_HOST=smtp.example.com +MAIL_USER=your-email@example.com +MAIL_PASSWORD=your-email-password + # ================================================ diff --git a/apps/webapp/src/app/b2c/login/page.tsx b/apps/webapp/src/app/b2c/login/page.tsx index aeb85e556..f2f933737 100644 --- a/apps/webapp/src/app/b2c/login/page.tsx +++ b/apps/webapp/src/app/b2c/login/page.tsx @@ -12,12 +12,14 @@ import { useEffect, useState } from "react"; import Cookies from 'js-cookie'; import useProfileStore from "@/state/profileStore"; import useUser from "@/hooks/get/useUser"; +import { Button } from "@/components/ui/button"; export default function Page() { const [userInitialized,setUserInitialized] = useState(true) const {mutate} = useUser() const router = useRouter() const {profile} = useProfileStore(); + const [activeTab, setActiveTab] = useState('login'); useEffect(() => { if(profile) @@ -70,6 +72,16 @@ export default function Page() { + {activeTab === 'login' && ( + + )} + {activeTab === 'forgot-password' && ( + + )}
Login Page Image diff --git a/apps/webapp/src/app/b2c/login/reset-password.tsx b/apps/webapp/src/app/b2c/login/reset-password.tsx new file mode 100644 index 000000000..60105d976 --- /dev/null +++ b/apps/webapp/src/app/b2c/login/reset-password.tsx @@ -0,0 +1,24 @@ +'use client'; + +import React from 'react'; +import { useSearchParams } from 'next/navigation'; +import ResetPasswordForm from '@/components/Auth/CustomLoginComponent/ResetPasswordForm'; + +const ResetPasswordPage = () => { + const searchParams = useSearchParams(); + const token = searchParams.get('token'); + + if (!token) { + return
Invalid or missing reset token. Please try the password reset process again.
; + } + + return ( +
+
+ +
+
+ ); +}; + +export default ResetPasswordPage; \ No newline at end of file diff --git a/apps/webapp/src/components/Auth/CustomLoginComponent/ForgotPasswordForm.tsx b/apps/webapp/src/components/Auth/CustomLoginComponent/ForgotPasswordForm.tsx new file mode 100644 index 000000000..7bce34aad --- /dev/null +++ b/apps/webapp/src/components/Auth/CustomLoginComponent/ForgotPasswordForm.tsx @@ -0,0 +1,69 @@ +import React from 'react'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import * as z from 'zod'; +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'; +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; +import { Button } from '@/components/ui/button'; +import { toast } from 'sonner'; +import useInitiatePasswordRecovery from '@/hooks/create/useInitiatePasswordRecovery'; + +const formSchema = z.object({ + email: z.string().email({ message: 'Enter valid Email' }), +}); + +const ForgotPasswordForm = () => { + const { func } = useInitiatePasswordRecovery(); + + const sform = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + email: '', + }, + }); + + const onSubmit = (values: z.infer) => { + toast.promise( + func({ email: values.email }), + { + loading: 'Sending recovery email...', + success: 'Recovery email sent. Please check your inbox.', + error: 'Failed to send recovery email. Please try again.', + } + ); + }; + + return ( +
+ + + + Forgot Password + Enter your email to reset your password. + + + ( + + Email + + + + + + )} + /> + + + + + +
+ + ); +}; + +export default ForgotPasswordForm; \ No newline at end of file diff --git a/apps/webapp/src/components/Auth/CustomLoginComponent/LoginUserForm.tsx b/apps/webapp/src/components/Auth/CustomLoginComponent/LoginUserForm.tsx index 1e49ab5e0..340ea07f2 100644 --- a/apps/webapp/src/components/Auth/CustomLoginComponent/LoginUserForm.tsx +++ b/apps/webapp/src/components/Auth/CustomLoginComponent/LoginUserForm.tsx @@ -29,10 +29,11 @@ import { toast } from 'sonner' import useProfileStore from '@/state/profileStore'; import Cookies from 'js-cookie'; import { useQueryClient } from '@tanstack/react-query' +import Link from 'next/link' const formSchema = z.object({ email: z.string().email({ - message:"Enter valid Email" + message:"Enter valid Email" }), password : z.string().min(2, { message: "Enter Password.", @@ -132,6 +133,9 @@ const LoginUserForm = () => { + + Forgot Password? + diff --git a/apps/webapp/src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx b/apps/webapp/src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx new file mode 100644 index 000000000..483cd12a0 --- /dev/null +++ b/apps/webapp/src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx @@ -0,0 +1,132 @@ +// src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx + +import React, { useState } from 'react'; +import { useForm } from 'react-hook-form'; +import { zodResolver } from '@hookform/resolvers/zod'; +import * as z from 'zod'; +import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'; +import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from '@/components/ui/form'; +import { Input } from '@/components/ui/input'; +import { Button } from '@/components/ui/button'; +import { toast } from 'sonner'; +import { useRouter } from 'next/navigation'; +import useResetPassword from '@/hooks/create/useResetPassword'; +import { Eye, EyeOff } from 'lucide-react'; + +const formSchema = z.object({ + newPassword: z + .string() + .min(8, { message: "Password must be at least 8 characters long" }) + .regex(/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[@$!%*?&])[A-Za-z\d@$!%*?&]{8,}$/, { + message: "Password must contain at least one uppercase letter, one lowercase letter, one number, and one special character", + }), + confirmPassword: z.string(), +}).refine((data) => data.newPassword === data.confirmPassword, { + message: "Passwords don't match", + path: ["confirmPassword"], +}); + +const ResetPasswordForm = ({ token }) => { + const router = useRouter(); + const { func } = useResetPassword(); + const [showPassword, setShowPassword] = useState(false); + const [showConfirmPassword, setShowConfirmPassword] = useState(false); + + const form = useForm>({ + resolver: zodResolver(formSchema), + defaultValues: { + newPassword: '', + confirmPassword: '', + }, + }); + + const onSubmit = async (values: z.infer) => { + try { + toast.promise( + func({ token, newPassword: values.newPassword }), + { + loading: 'Resetting password...', + success: 'Password reset successful. Please log in with your new password.', + error: 'Failed to reset password. Please try again.', + } + ); + router.push('/b2c/login'); + } catch (error) { + console.error('Password reset error:', error); + } + }; + + return ( +
+ + + + Reset Password + Enter your new password to reset your account. + + + ( + + New Password + +
+ + +
+
+ +
+ )} + /> + ( + + Confirm New Password + +
+ + +
+
+ +
+ )} + /> +
+ + + +
+
+ + ); +}; + +export default ResetPasswordForm; \ No newline at end of file diff --git a/apps/webapp/src/hooks/create/useInitiatePasswordRecovery.tsx b/apps/webapp/src/hooks/create/useInitiatePasswordRecovery.tsx new file mode 100644 index 000000000..73711c4b0 --- /dev/null +++ b/apps/webapp/src/hooks/create/useInitiatePasswordRecovery.tsx @@ -0,0 +1,45 @@ +import config from '@/lib/config'; +import { useMutation } from '@tanstack/react-query'; +import Cookies from 'js-cookie'; + +const useInitiatePasswordRecovery = () => { + const call = async (data: { + email: string + }) => { + const response = await fetch(`${config.API_URL}/auth/forgot-password`, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.message || "Unknown error occurred"); + } + + return response.json(); + }; + const func = (data: { + email: string + }) => { + return new Promise(async (resolve, reject) => { + try { + const result = await call(data); + resolve(result); + + } catch (error) { + reject(error); + } + }); + }; + return { + mutationFn: useMutation({ + mutationFn: call, + }), + func + } +}; + +export default useInitiatePasswordRecovery; diff --git a/apps/webapp/src/hooks/create/useResetPassword.tsx b/apps/webapp/src/hooks/create/useResetPassword.tsx new file mode 100644 index 000000000..88e272683 --- /dev/null +++ b/apps/webapp/src/hooks/create/useResetPassword.tsx @@ -0,0 +1,46 @@ +import config from '@/lib/config'; +import { useMutation } from '@tanstack/react-query'; +import Cookies from 'js-cookie'; + +interface ResetPasswordData { + token: string; + newPassword: string; +} + +const useResetPassword = () => { + const call = async (data: ResetPasswordData) => { + const response = await fetch(`${config.API_URL}/auth/reset-password`, { + method: 'POST', + body: JSON.stringify(data), + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (!response.ok) { + const errorData = await response.json(); + throw new Error(errorData.message || "Unknown error occurred"); + } + + return response.json(); + }; + const func = (data: ResetPasswordData) => { + return new Promise(async (resolve, reject) => { + try { + const result = await call(data); + resolve(result); + + } catch (error) { + reject(error); + } + }); + }; + return { + mutationFn: useMutation({ + mutationFn: call, + }), + func + } +}; + +export default useResetPassword; diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 830a61fb0..777b0ba66 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -42,6 +42,10 @@ services: REDIS_PASS: ${REDIS_PASS} REDIS_USER: ${REDIS_USER} REDIS_PORT: ${REDIS_PORT} + MAIL_HOST: ${MAIL_HOST} + MAIL_USER: ${MAIL_USER} + MAIL_PASSWORD: ${MAIL_PASSWORD} + WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_DOMAIN} #REDIS_TLS: 1 # set this variable to 1 when Redis is AWS hosted REDIS_DB: ${REDIS_DB} ENCRYPT_CRYPTO_SECRET_KEY: ${ENCRYPT_CRYPTO_SECRET_KEY} diff --git a/docker-compose.source.yml b/docker-compose.source.yml index 0d830a2ae..f742fe81c 100644 --- a/docker-compose.source.yml +++ b/docker-compose.source.yml @@ -42,7 +42,11 @@ services: REDIS_HOST: ${REDIS_HOST} REDIS_USER: ${REDIS_USER} REDIS_PASS: ${REDIS_PASS} + MAIL_HOST: ${MAIL_HOST} + MAIL_USER: ${MAIL_USER} + MAIL_PASSWORD: ${MAIL_PASSWORD} BACKEND_PORT: ${BACKEND_PORT} + WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_DOMAIN} REDIS_DB: ${REDIS_DB} ENCRYPT_CRYPTO_SECRET_KEY: ${ENCRYPT_CRYPTO_SECRET_KEY} HUBSPOT_CRM_CLOUD_CLIENT_ID: ${HUBSPOT_CRM_CLOUD_CLIENT_ID} diff --git a/docker-compose.yml b/docker-compose.yml index fafe6b1d4..f2025cc71 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -37,7 +37,11 @@ services: REDIS_USER: ${REDIS_USER} REDIS_PASS: ${REDIS_PASS} REDIS_PORT: ${REDIS_PORT} + MAIL_HOST: ${MAIL_HOST} + MAIL_USER: ${MAIL_USER} + MAIL_PASSWORD: ${MAIL_PASSWORD} REDIS_DB: ${REDIS_DB} + WEBAPP_URL: ${NEXT_PUBLIC_WEBAPP_DOMAIN} ENCRYPT_CRYPTO_SECRET_KEY: ${ENCRYPT_CRYPTO_SECRET_KEY} HUBSPOT_CRM_CLOUD_CLIENT_ID: ${HUBSPOT_CRM_CLOUD_CLIENT_ID} HUBSPOT_CRM_CLOUD_CLIENT_SECRET: ${HUBSPOT_CRM_CLOUD_CLIENT_SECRET} diff --git a/docs/mint.json b/docs/mint.json index 2b24256fb..928ba3a6c 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -857,6 +857,7 @@ { "group": "Recipes", "pages": [ + "recipes/frontend-sdk", "recipes/embed-catalog", "recipes/import-existing-users", "recipes/catch-connection-token", @@ -903,12 +904,29 @@ ] }, { - "group": "Open-Source", - "pages": [ - "open-source/self-hosting/guide", - "open-source/contributors/setup" + "group":"Open-Source", + "pages":[ + { + "group":"Selfhost", + "icon":"house-laptop", + "pages":[ + "open-source/selfhost/self-host-guide", + "open-source/selfhost/envVariables", + "open-source/selfhost/ngrok" + ] + }, + { + "group":"Build a connector", + "icon":"star", + "pages":[ + "open-source/contributors/setup", + "open-source/contributors/metadata", + "open-source/contributors/build", + "open-source/contributors/test" + ] + } ] - }, + }, { "group": "Support", "pages": [ diff --git a/packages/api/package.json b/packages/api/package.json index 18d076a19..c1930e2dc 100644 --- a/packages/api/package.json +++ b/packages/api/package.json @@ -96,7 +96,8 @@ "ts-loader": "^9.4.3", "ts-node": "^10.9.1", "tsconfig-paths": "^4.2.0", - "typescript": "^5.1.3" + "typescript": "^5.1.3", + "@nestjs-modules/mailer": "^2.0.2" }, "jest": { "moduleFileExtensions": [ diff --git a/packages/api/src/@core/auth/auth.controller.ts b/packages/api/src/@core/auth/auth.controller.ts index b777285bc..a2df61c89 100644 --- a/packages/api/src/@core/auth/auth.controller.ts +++ b/packages/api/src/@core/auth/auth.controller.ts @@ -22,6 +22,8 @@ import { import { ApiKeyDto } from './dto/api-key.dto'; import { LoginDto } from './dto/login.dto'; import { RefreshDto } from './dto/refresh.dto'; +import { PasswordRecoveryDto } from './dto/password-recovery.dto'; +import { ResetPasswordDto } from './dto/reset-password.dto'; @ApiTags('auth') @ApiExcludeController() @@ -34,6 +36,30 @@ export class AuthController { this.logger.setContext(AuthController.name); } + @ApiOperation({ + operationId: 'initiatePasswordRecovery', + summary: 'Initiate Password Recovery', + }) + @ApiBody({ type: PasswordRecoveryDto }) + @ApiResponse({ status: 200 }) + @Post('forgot-password') + async initiatePasswordRecovery( + @Body() passwordRecoveryDto: PasswordRecoveryDto, + ) { + return this.authService.initiatePasswordRecovery(passwordRecoveryDto.email); + } + + @ApiOperation({ operationId: 'resetPassword', summary: 'Reset Password' }) + @ApiBody({ type: ResetPasswordDto }) + @ApiResponse({ status: 200 }) + @Post('reset-password') + async resetPassword(@Body() resetPasswordDto: ResetPasswordDto) { + return this.authService.resetPassword( + resetPasswordDto.token, + resetPasswordDto.newPassword, + ); + } + @ApiOperation({ operationId: 'signUp', summary: 'Register' }) @ApiBody({ type: CreateUserDto }) @ApiResponse({ status: 201 }) diff --git a/packages/api/src/@core/auth/auth.module.ts b/packages/api/src/@core/auth/auth.module.ts index 70577fec3..69fc9500e 100644 --- a/packages/api/src/@core/auth/auth.module.ts +++ b/packages/api/src/@core/auth/auth.module.ts @@ -8,6 +8,7 @@ import { AuthController } from './auth.controller'; import { AuthService } from './auth.service'; import { ApiKeyStrategy } from './strategies/auth-header-api-key.strategy'; import { JwtStrategy } from './strategies/jwt.strategy'; +import { MailModule } from '@@core/mailer/module'; @Module({ controllers: [AuthController], @@ -22,6 +23,7 @@ import { JwtStrategy } from './strategies/jwt.strategy'; ], imports: [ PassportModule, + MailModule, JwtModule.register({ secret: process.env.JWT_SECRET, }), diff --git a/packages/api/src/@core/auth/auth.service.ts b/packages/api/src/@core/auth/auth.service.ts index ebd9461b5..834885ab4 100644 --- a/packages/api/src/@core/auth/auth.service.ts +++ b/packages/api/src/@core/auth/auth.service.ts @@ -1,7 +1,12 @@ import { LoggerService } from '@@core/@core-services/logger/logger.service'; import { ProjectsService } from '@@core/projects/projects.service'; -import { AuthError } from '@@core/utils/errors'; -import { Injectable } from '@nestjs/common'; +import { MailerService } from '@nestjs-modules/mailer'; +import { + BadRequestException, + ConflictException, + Injectable, + NotFoundException, +} from '@nestjs/common'; import { JwtService } from '@nestjs/jwt'; import * as bcrypt from 'bcrypt'; import * as crypto from 'crypto'; @@ -10,7 +15,6 @@ import { PrismaService } from '../@core-services/prisma/prisma.service'; import { CreateUserDto } from './dto/create-user.dto'; import { LoginDto } from './dto/login.dto'; import { VerifyUserDto } from './dto/verify-user.dto'; -import { ConflictException } from '@nestjs/common'; @Injectable() export class AuthService { @@ -19,10 +23,66 @@ export class AuthService { private projectService: ProjectsService, private jwtService: JwtService, private logger: LoggerService, + private mailerService: MailerService, ) { this.logger.setContext(AuthService.name); } + async initiatePasswordRecovery(email: string) { + const user = await this.prisma.users.findFirst({ where: { email } }); //todo: put unique in db on email + if (!user) { + throw new NotFoundException('User not found'); + } + + const resetToken = crypto.randomBytes(32).toString('hex'); + const resetTokenExpiry = new Date(Date.now() + 3600000); // 1 hour from now + + await this.prisma.users.update({ + where: { id_user: user.id_user }, + data: { reset_token: resetToken, reset_token_expiry: resetTokenExpiry }, + }); + + const resetUrl = `${process.env.WEBAPP_URL}/reset-password?token=${resetToken}`; + + await this.mailerService.sendMail({ + to: user.email, + subject: 'Password Reset Request', + template: './../mailer/templates/password-reset', + context: { + name: user.first_name, + resetUrl, + }, + }); + + return { message: 'Password reset email sent' }; + } + + async resetPassword(token: string, newPassword: string) { + const user = await this.prisma.users.findFirst({ + where: { + reset_token: token, + reset_token_expiry: { gt: new Date() }, + }, + }); + + if (!user) { + throw new BadRequestException('Invalid or expired reset token'); + } + + const hashedPassword = await bcrypt.hash(newPassword, 10); + + await this.prisma.users.update({ + where: { id_user: user.id_user }, + data: { + password_hash: hashedPassword, + reset_token: null, + reset_token_expiry: null, + }, + }); + + return { message: 'Password reset successful' }; + } + async getUsers() { try { return await this.prisma.users.findMany(); @@ -68,7 +128,9 @@ export class AuthService { }); if (foundUser) { - throw new ConflictException(`Email already exists. Try resetting your password.`); + throw new ConflictException( + `Email already exists. Try resetting your password.`, + ); } return await this.createUser(user); } catch (error) { @@ -324,4 +386,4 @@ export class AuthService { throw error; } } -} \ No newline at end of file +} diff --git a/packages/api/src/@core/auth/dto/password-recovery.dto.ts b/packages/api/src/@core/auth/dto/password-recovery.dto.ts new file mode 100644 index 000000000..c42b85331 --- /dev/null +++ b/packages/api/src/@core/auth/dto/password-recovery.dto.ts @@ -0,0 +1,6 @@ +import { IsEmail } from 'class-validator'; + +export class PasswordRecoveryDto { + @IsEmail() + email: string; +} diff --git a/packages/api/src/@core/auth/dto/reset-password.dto.ts b/packages/api/src/@core/auth/dto/reset-password.dto.ts new file mode 100644 index 000000000..efda4ce0c --- /dev/null +++ b/packages/api/src/@core/auth/dto/reset-password.dto.ts @@ -0,0 +1,10 @@ +import { IsString, MinLength } from 'class-validator'; + +export class ResetPasswordDto { + @IsString() + token: string; + + @IsString() + @MinLength(8) + newPassword: string; +} diff --git a/packages/api/src/@core/mailer/module.ts b/packages/api/src/@core/mailer/module.ts new file mode 100644 index 000000000..ca0789d90 --- /dev/null +++ b/packages/api/src/@core/mailer/module.ts @@ -0,0 +1,32 @@ +// src/mailer/mailer.module.ts + +import { Module } from '@nestjs/common'; +import { MailerModule } from '@nestjs-modules/mailer'; +import { HandlebarsAdapter } from '@nestjs-modules/mailer/dist/adapters/handlebars.adapter'; +import { join } from 'path'; + +@Module({ + imports: [ + MailerModule.forRoot({ + transport: { + host: process.env.MAIL_HOST, + secure: false, + auth: { + user: process.env.MAIL_USER, + pass: process.env.MAIL_PASSWORD, + }, + }, + defaults: { + from: '"No Reply" ', + }, + template: { + dir: join(__dirname, 'templates'), + adapter: new HandlebarsAdapter(), + options: { + strict: true, + }, + }, + }), + ], +}) +export class MailModule {} diff --git a/packages/api/src/@core/mailer/templates/password-reset.hbs b/packages/api/src/@core/mailer/templates/password-reset.hbs new file mode 100644 index 000000000..79d519751 --- /dev/null +++ b/packages/api/src/@core/mailer/templates/password-reset.hbs @@ -0,0 +1,18 @@ + + + + + Password Reset + + +

Hello {{name}},

+

We received a request to reset your password. If you didn't make this request, you can ignore this email.

+

To reset your password, please click the link below:

+ Reset Password +

This link will expire in 1 hour.

+

If you're having trouble clicking the link, you can copy and paste the following URL into your browser:

+

{{resetUrl}}

+

Thank you,

+

Your Application Team

+ + \ No newline at end of file diff --git a/packages/api/src/hris/timeoffbalance/timeoffbalance.controller.ts b/packages/api/src/hris/timeoffbalance/timeoffbalance.controller.ts index efd2f348e..5e6e89cd9 100644 --- a/packages/api/src/hris/timeoffbalance/timeoffbalance.controller.ts +++ b/packages/api/src/hris/timeoffbalance/timeoffbalance.controller.ts @@ -28,7 +28,10 @@ import { import { ConnectionUtils } from '@@core/connections/@utils'; import { ApiKeyAuthGuard } from '@@core/auth/guards/api-key.guard'; import { FetchObjectsQueryDto } from '@@core/utils/dtos/fetch-objects-query.dto'; -import { ApiGetCustomResponse, ApiPaginatedResponse } from '@@core/utils/dtos/openapi.respone.dto'; +import { + ApiGetCustomResponse, + ApiPaginatedResponse, +} from '@@core/utils/dtos/openapi.respone.dto'; @ApiBearerAuth('bearer') @ApiTags('hris/timeoffbalances') diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5180944f7..ee1d2012f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -563,6 +563,9 @@ importers: specifier: ^17.7.2 version: 17.7.2 devDependencies: + '@nestjs-modules/mailer': + specifier: ^2.0.2 + version: 2.0.2(@nestjs/common@10.3.7)(@nestjs/core@10.3.7)(nodemailer@6.9.14) '@nestjs/cli': specifier: ^10.0.0 version: 10.3.2 @@ -911,7 +914,7 @@ packages: resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 @@ -920,7 +923,7 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 dev: false /@babel/helper-compilation-targets@7.23.6: @@ -959,7 +962,7 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 /@babel/helper-function-name@7.24.7: resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} @@ -972,7 +975,7 @@ packages: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 /@babel/helper-hoist-variables@7.24.7: resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} @@ -984,7 +987,7 @@ packages: resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 /@babel/helper-module-imports@7.24.7: resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} @@ -1006,7 +1009,7 @@ packages: '@babel/helper-module-imports': 7.24.3 '@babel/helper-simple-access': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 dev: true /@babel/helper-module-transforms@7.24.9(@babel/core@7.24.9): @@ -1032,7 +1035,7 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 dev: true /@babel/helper-simple-access@7.24.7: @@ -1048,7 +1051,7 @@ packages: resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 /@babel/helper-split-export-declaration@7.24.7: resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} @@ -1056,18 +1059,10 @@ packages: dependencies: '@babel/types': 7.24.9 - /@babel/helper-string-parser@7.24.1: - resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} - engines: {node: '>=6.9.0'} - /@babel/helper-string-parser@7.24.8: resolution: {integrity: sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - /@babel/helper-validator-identifier@7.24.7: resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} @@ -1087,7 +1082,7 @@ packages: dependencies: '@babel/template': 7.24.0 '@babel/traverse': 7.24.1(supports-color@5.5.0) - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 transitivePeerDependencies: - supports-color dev: true @@ -1103,7 +1098,7 @@ packages: resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.0 @@ -1122,7 +1117,8 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 + dev: true /@babel/parser@7.24.8: resolution: {integrity: sha512-WzfbgXOkGzZiXXCqk43kKwZjzwx4oulxZi3nq2TYL9mOjQv6kYwul9mz6ID36njuL7Xkp6nJEfok848Zj10j/w==} @@ -1301,8 +1297,8 @@ packages: engines: {node: '>=6.9.0'} dependencies: '@babel/code-frame': 7.24.2 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 /@babel/template@7.24.7: resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} @@ -1322,8 +1318,8 @@ packages: '@babel/helper-function-name': 7.23.0 '@babel/helper-hoist-variables': 7.22.5 '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 debug: 4.3.4(supports-color@5.5.0) globals: 11.12.0 transitivePeerDependencies: @@ -1350,9 +1346,10 @@ packages: resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.24.1 - '@babel/helper-validator-identifier': 7.22.20 + '@babel/helper-string-parser': 7.24.8 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 + dev: true /@babel/types@7.24.9: resolution: {integrity: sha512-xm8XrMKz0IlUdocVbYJe0Z9xEgidU7msskG8BbhnTPK/HZ2z/7FP7ykqPgrUH+C+r414mNfNWam1f2vqOjqjYQ==} @@ -1563,6 +1560,112 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true + /@css-inline/css-inline-android-arm-eabi@0.14.1: + resolution: {integrity: sha512-LNUR8TY4ldfYi0mi/d4UNuHJ+3o8yLQH9r2Nt6i4qeg1i7xswfL3n/LDLRXvGjBYqeEYNlhlBQzbPwMX1qrU6A==} + engines: {node: '>= 10'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-android-arm64@0.14.1: + resolution: {integrity: sha512-tH5us0NYGoTNBHOUHVV7j9KfJ4DtFOeTLA3cM0XNoMtArNu2pmaaBMFJPqECzavfXkLc7x5Z22UPZYjoyHfvCA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-darwin-arm64@0.14.1: + resolution: {integrity: sha512-QE5W1YRIfRayFrtrcK/wqEaxNaqLULPI0gZB4ArbFRd3d56IycvgBasDTHPre5qL2cXCO3VyPx+80XyHOaVkag==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-darwin-x64@0.14.1: + resolution: {integrity: sha512-mAvv2sN8awNFsbvBzlFkZPbCNZ6GCWY5/YcIz7V5dPYw+bHHRbjnlkNTEZq5BsDxErVrMIGvz05PGgzuNvZvdQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-linux-arm-gnueabihf@0.14.1: + resolution: {integrity: sha512-AWC44xL0X7BgKvrWEqfSqkT2tJA5kwSGrAGT+m0gt11wnTYySvQ6YpX0fTY9i3ppYGu4bEdXFjyK2uY1DTQMHA==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-linux-arm64-gnu@0.14.1: + resolution: {integrity: sha512-drj0ciiJgdP3xKXvNAt4W+FH4KKMs8vB5iKLJ3HcH07sNZj58Sx++2GxFRS1el3p+GFp9OoYA6dgouJsGEqt0Q==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-linux-arm64-musl@0.14.1: + resolution: {integrity: sha512-FzknI+st8eA8YQSdEJU9ykcM0LZjjigBuynVF5/p7hiMm9OMP8aNhWbhZ8LKJpKbZrQsxSGS4g9Vnr6n6FiSdQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-linux-x64-gnu@0.14.1: + resolution: {integrity: sha512-yubbEye+daDY/4vXnyASAxH88s256pPati1DfVoZpU1V0+KP0BZ1dByZOU1ktExurbPH3gZOWisAnBE9xon0Uw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-linux-x64-musl@0.14.1: + resolution: {integrity: sha512-6CRAZzoy1dMLPC/tns2rTt1ZwPo0nL/jYBEIAsYTCWhfAnNnpoLKVh5Nm+fSU3OOwTTqU87UkGrFJhObD/wobQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline-win32-x64-msvc@0.14.1: + resolution: {integrity: sha512-nzotGiaiuiQW78EzsiwsHZXbxEt6DiMUFcDJ6dhiliomXxnlaPyBfZb6/FMBgRJOf6sknDt/5695OttNmbMYzg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@css-inline/css-inline@0.14.1: + resolution: {integrity: sha512-u4eku+hnPqqHIGq/ZUQcaP0TrCbYeLIYBaK7qClNRGZbnh8RC4gVxLEIo8Pceo1nOK9E5G4Lxzlw5KnXcvflfA==} + engines: {node: '>= 10'} + optionalDependencies: + '@css-inline/css-inline-android-arm-eabi': 0.14.1 + '@css-inline/css-inline-android-arm64': 0.14.1 + '@css-inline/css-inline-darwin-arm64': 0.14.1 + '@css-inline/css-inline-darwin-x64': 0.14.1 + '@css-inline/css-inline-linux-arm-gnueabihf': 0.14.1 + '@css-inline/css-inline-linux-arm64-gnu': 0.14.1 + '@css-inline/css-inline-linux-arm64-musl': 0.14.1 + '@css-inline/css-inline-linux-x64-gnu': 0.14.1 + '@css-inline/css-inline-linux-x64-musl': 0.14.1 + '@css-inline/css-inline-win32-x64-msvc': 0.14.1 + dev: true + /@ctrl/tinycolor@3.6.1: resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==} engines: {node: '>=10'} @@ -2731,6 +2834,32 @@ packages: dev: false optional: true + /@nestjs-modules/mailer@2.0.2(@nestjs/common@10.3.7)(@nestjs/core@10.3.7)(nodemailer@6.9.14): + resolution: {integrity: sha512-+z4mADQasg0H1ZaGu4zZTuKv2pu+XdErqx99PLFPzCDNTN/q9U59WPgkxVaHnsvKHNopLj5Xap7G4ZpptduoYw==} + peerDependencies: + '@nestjs/common': '>=7.0.9' + '@nestjs/core': '>=7.0.9' + nodemailer: '>=6.4.6' + dependencies: + '@css-inline/css-inline': 0.14.1 + '@nestjs/common': 10.3.7(class-transformer@0.5.1)(class-validator@0.14.1)(reflect-metadata@0.1.14)(rxjs@7.8.1) + '@nestjs/core': 10.3.7(@nestjs/common@10.3.7)(@nestjs/platform-express@10.3.7)(reflect-metadata@0.1.14)(rxjs@7.8.1) + glob: 10.3.12 + nodemailer: 6.9.14 + optionalDependencies: + '@types/ejs': 3.1.5 + '@types/mjml': 4.7.4 + '@types/pug': 2.0.10 + ejs: 3.1.10 + handlebars: 4.7.8 + liquidjs: 10.16.1 + mjml: 4.15.3 + preview-email: 3.0.20 + pug: 3.0.3 + transitivePeerDependencies: + - encoding + dev: true + /@nestjs/bull-shared@10.1.1(@nestjs/common@10.3.7)(@nestjs/core@10.3.7): resolution: {integrity: sha512-su7eThDrSz1oQagEi8l+1CyZ7N6nMgmyAX0DuZoXqT1KEVEDqGX7x80RlPVF60m/8SYOskckGMjJROSfNQcErw==} peerDependencies: @@ -3240,6 +3369,12 @@ packages: transitivePeerDependencies: - encoding + /@one-ini/wasm@0.1.1: + resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} + requiresBuild: true + dev: true + optional: true + /@opentelemetry/api-logs@0.51.1: resolution: {integrity: sha512-E3skn949Pk1z2XtXu/lxf6QAZpawuTM/IUEXcAzpiUkTd73Hmvw26FiN3cJuTmkpM5hZzHwkomVdtrh/n/zzwA==} engines: {node: '>=14'} @@ -5278,6 +5413,15 @@ packages: resolution: {integrity: sha512-S3Kq8e7LqxkA9s7HKLqXGTGck1uwis5vAXan3FnU5yw1Ec5hsSGnq4s/UCaSqABPOnOTg7zASLyst7+ohgWexg==} dev: true + /@selderee/plugin-htmlparser2@0.11.0: + resolution: {integrity: sha512-P33hHGdldxGabLFjPPpaTxVolMrzrcegejx+0GxjrIb9Zv48D8yAIA/QTDR2dFl7Uz7urX8aX6+5bCZslr+gWQ==} + requiresBuild: true + dependencies: + domhandler: 5.0.3 + selderee: 0.11.0 + dev: true + optional: true + /@sentry-internal/tracing@7.109.0: resolution: {integrity: sha512-PzK/joC5tCuh2R/PRh+7dp+uuZl7pTsBIjPhVZHMTtb9+ls65WkdZJ1/uKXPouyz8NOo9Xok7aEvEo9seongyw==} engines: {node: '>=8'} @@ -5643,20 +5787,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.4 - '@babel/types': 7.24.0 + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 dev: true /@types/babel__traverse@7.20.5: resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} dependencies: - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 dev: true /@types/body-parser@1.19.5: @@ -5740,6 +5884,11 @@ packages: resolution: {integrity: sha512-Ps3T8E8dZDam6fUyNiMkekK3XUsaUEik+idO9/YjPtfj2qruF8tFBXS7XhtE4iIXBLxhmLjP3SXpLhVf21I9Lw==} dev: false + /@types/ejs@3.1.5: + resolution: {integrity: sha512-nv+GSx77ZtXiJzwKdsASqi+YQ5Z7vwHsTP0JY2SiQgjGckkBRKZnk8nIM+7oUZ1VCtuTz0+By4qVR7fqzp/Dfg==} + dev: true + optional: true + /@types/eslint-scope@3.7.7: resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} dependencies: @@ -5881,6 +6030,19 @@ packages: resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} dev: false + /@types/mjml-core@4.15.0: + resolution: {integrity: sha512-jSRWTOpwRS/uHIBfGdvLl0a7MaoBZZYHKI+HhsFYChrUOKVJTnjSYsuV6wx0snv6ZaX3TUo5OP/gNsz/uzZz1A==} + requiresBuild: true + dev: true + optional: true + + /@types/mjml@4.7.4: + resolution: {integrity: sha512-vyi1vzWgMzFMwZY7GSZYX0GU0dmtC8vLHwpgk+NWmwbwRSrlieVyJ9sn5elodwUfklJM7yGl0zQeet1brKTWaQ==} + dependencies: + '@types/mjml-core': 4.15.0 + dev: true + optional: true + /@types/mysql@2.15.22: resolution: {integrity: sha512-wK1pzsJVVAjYCSZWQoWHziQZbNggXFDUEIGf54g4ZM/ERuP86uGdWeKZWMYlqTPMZfHJJvLPyogXGvCOg87yLQ==} dependencies: @@ -5965,6 +6127,11 @@ packages: /@types/prop-types@15.7.12: resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + /@types/pug@2.0.10: + resolution: {integrity: sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==} + dev: true + optional: true + /@types/qs@6.9.14: resolution: {integrity: sha512-5khscbd3SwWMhFqylJBLQ0zIu7c1K6Vz0uBIt915BI3zV0q1nfjRQD3RqSBcPaO6PHEF4ov/t9y89fSiyThlPA==} @@ -6437,6 +6604,13 @@ packages: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} dev: false + /abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + requiresBuild: true + dev: true + optional: true + /abort-controller@3.0.0: resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} engines: {node: '>=6.5'} @@ -6451,20 +6625,12 @@ packages: mime-types: 2.1.35 negotiator: 0.6.3 - /acorn-import-assertions@1.9.0(acorn@8.11.3): + /acorn-import-assertions@1.9.0(acorn@8.12.1): resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} peerDependencies: acorn: ^8 dependencies: - acorn: 8.11.3 - - /acorn-import-attributes@1.9.5(acorn@8.11.3): - resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} - peerDependencies: - acorn: ^8 - dependencies: - acorn: 8.11.3 - dev: false + acorn: 8.12.1 /acorn-import-attributes@1.9.5(acorn@8.12.1): resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} @@ -6472,7 +6638,6 @@ packages: acorn: ^8 dependencies: acorn: 8.12.1 - dev: true /acorn-jsx@5.3.2(acorn@8.11.3): resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} @@ -6487,16 +6652,24 @@ packages: engines: {node: '>=0.4.0'} dev: true + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + /acorn@8.11.3: resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} engines: {node: '>=0.4.0'} hasBin: true + dev: true /acorn@8.12.1: resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} engines: {node: '>=0.4.0'} hasBin: true - dev: true /adler-32@1.3.1: resolution: {integrity: sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==} @@ -6563,6 +6736,16 @@ packages: require-from-string: 2.0.2 uri-js: 4.4.1 + /alce@1.2.0: + resolution: {integrity: sha512-XppPf2S42nO2WhvKzlwzlfcApcXHzjlod30pKmcWjRgLOtqoe5DMuqdiYoM6AgyXksc6A6pV4v1L/WW217e57w==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + esprima: 1.2.5 + estraverse: 1.9.3 + dev: true + optional: true + /ansi-align@3.0.1: resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} dependencies: @@ -6850,6 +7033,12 @@ packages: resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} dev: true + /assert-never@1.3.0: + resolution: {integrity: sha512-9Z3vxQ+berkL/JJo0dK+EY3Lp0s3NtSnP3VCLsh5HDcZPrh0M+KQRK5sWhUeyPPH+/RCxZqOxLMR+YC6vlviEQ==} + requiresBuild: true + dev: true + optional: true + /ast-types-flow@0.0.8: resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} dev: true @@ -6865,6 +7054,12 @@ packages: resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==} dev: false + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + requiresBuild: true + dev: true + optional: true + /asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -6980,7 +7175,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@babel/template': 7.24.0 - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.5 dev: true @@ -7031,6 +7226,15 @@ packages: babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4) dev: true + /babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + '@babel/types': 7.24.9 + dev: true + optional: true + /backo2@1.0.2: resolution: {integrity: sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==} requiresBuild: true @@ -7097,6 +7301,12 @@ packages: transitivePeerDependencies: - supports-color + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + requiresBuild: true + dev: true + optional: true + /boxen@7.1.1: resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} engines: {node: '>=14.16'} @@ -7266,6 +7476,15 @@ packages: engines: {node: '>=6'} dev: true + /camel-case@3.0.0: + resolution: {integrity: sha512-+MbKztAYHXPr1jNTSKQF52VpcFjwY5RkR7fxksV8Doo4KAYc5Fl4UJRgthBbTmEx8C54DqahhbLJkDwjI3PI/w==} + requiresBuild: true + dependencies: + no-case: 2.3.2 + upper-case: 1.1.3 + dev: true + optional: true + /camelcase-css@2.0.1: resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} engines: {node: '>= 6'} @@ -7319,6 +7538,16 @@ packages: escape-string-regexp: 1.0.5 supports-color: 5.5.0 + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + optional: true + /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -7335,9 +7564,45 @@ packages: engines: {node: '>=10'} dev: true + /character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + requiresBuild: true + dependencies: + is-regex: 1.1.4 + dev: true + optional: true + /chardet@0.7.0: resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + requiresBuild: true + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + dev: true + optional: true + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + requiresBuild: true + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.1.0 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: true + optional: true + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -7411,6 +7676,15 @@ packages: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} dev: false + /clean-css@4.2.4: + resolution: {integrity: sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==} + engines: {node: '>= 4.0'} + requiresBuild: true + dependencies: + source-map: 0.6.1 + dev: true + optional: true + /cli-boxes@3.0.0: resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} engines: {node: '>=10'} @@ -7570,6 +7844,13 @@ packages: dependencies: delayed-stream: 1.0.0 + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + requiresBuild: true + dev: true + optional: true + /commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -7583,6 +7864,13 @@ packages: resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} engines: {node: '>= 6'} + /commander@6.2.1: + resolution: {integrity: sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==} + engines: {node: '>= 6'} + requiresBuild: true + dev: true + optional: true + /comment-json@4.2.3: resolution: {integrity: sha512-SsxdiOf064DWoZLH799Ata6u7iV658A11PlWtZATDlXPpKGJnbJZ5Z24ybixAi+LUUqJ/GKowAejtC5GFUG7Tw==} engines: {node: '>= 6'} @@ -7634,7 +7922,6 @@ packages: dependencies: ini: 1.3.8 proto-list: 1.2.4 - dev: false /configstore@6.0.0: resolution: {integrity: sha512-cD31W1v3GqUlQvbBCGcXmd2Nj9SvLDOP1oQ0YFuLETufzSPaKp11rYBsSOm7rCsW3OnIRAFM3OxRhceaXNYHkA==} @@ -7654,6 +7941,15 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: false + /constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + requiresBuild: true + dependencies: + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 + dev: true + optional: true + /content-disposition@0.5.4: resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} engines: {node: '>= 0.6'} @@ -7801,6 +8097,19 @@ packages: shebang-command: 1.2.0 which: 1.3.1 + /cross-spawn@6.0.5: + resolution: {integrity: sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==} + engines: {node: '>=4.8'} + requiresBuild: true + dependencies: + nice-try: 1.0.5 + path-key: 2.0.1 + semver: 5.7.2 + shebang-command: 1.2.0 + which: 1.3.1 + dev: true + optional: true + /cross-spawn@7.0.3: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} @@ -7826,6 +8135,18 @@ packages: engines: {node: '>=4'} dev: false + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + requiresBuild: true + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: true + optional: true + /css-to-react-native@3.2.0: resolution: {integrity: sha512-e8RKaLXMOFii+02mOlqwjbD00KSEKqblnpO9e++1aXS1fPQOpS1YoqdVHBqPjHNoxeF2mimzVqawm2KCbEdtHQ==} dependencies: @@ -7834,6 +8155,13 @@ packages: postcss-value-parser: 4.2.0 dev: false + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + requiresBuild: true + dev: true + optional: true + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -8072,7 +8400,7 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - dev: false + requiresBuild: true /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -8147,7 +8475,6 @@ packages: /detect-indent@6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} - dev: false /detect-libc@2.0.3: resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} @@ -8163,6 +8490,12 @@ packages: resolution: {integrity: sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==} dev: false + /detect-node@2.1.0: + resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==} + requiresBuild: true + dev: true + optional: true + /dezalgo@1.0.4: resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} dependencies: @@ -8194,6 +8527,16 @@ packages: dependencies: path-type: 4.0.0 + /display-notification@2.0.0: + resolution: {integrity: sha512-TdmtlAcdqy1NU+j7zlkDdMnCL878zriLaBmoD9quOoq1ySSSGv03l0hXK5CvIFZlIfFI/hizqdQuW+Num7xuhw==} + engines: {node: '>=4'} + requiresBuild: true + dependencies: + escape-string-applescript: 1.0.0 + run-applescript: 3.2.0 + dev: true + optional: true + /dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} @@ -8211,6 +8554,12 @@ packages: esutils: 2.0.3 dev: true + /doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + requiresBuild: true + dev: true + optional: true + /dom-helpers@5.2.1: resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==} dependencies: @@ -8218,6 +8567,79 @@ packages: csstype: 3.1.3 dev: false + /dom-serializer@1.4.1: + resolution: {integrity: sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==} + requiresBuild: true + dependencies: + domelementtype: 2.3.0 + domhandler: 4.3.1 + entities: 2.2.0 + dev: true + optional: true + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + requiresBuild: true + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: true + optional: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + requiresBuild: true + dev: true + optional: true + + /domhandler@3.3.0: + resolution: {integrity: sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==} + engines: {node: '>= 4'} + requiresBuild: true + dependencies: + domelementtype: 2.3.0 + dev: true + optional: true + + /domhandler@4.3.1: + resolution: {integrity: sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==} + engines: {node: '>= 4'} + requiresBuild: true + dependencies: + domelementtype: 2.3.0 + dev: true + optional: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + requiresBuild: true + dependencies: + domelementtype: 2.3.0 + dev: true + optional: true + + /domutils@2.8.0: + resolution: {integrity: sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==} + requiresBuild: true + dependencies: + dom-serializer: 1.4.1 + domelementtype: 2.3.0 + domhandler: 4.3.1 + dev: true + optional: true + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + requiresBuild: true + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + optional: true + /dot-prop@6.0.1: resolution: {integrity: sha512-tE7ztYzXHIeyvc7N+hR3oi7FIbf/NIjVP9hmAt3yMXzrQ072/fpjGLx2GxNxGxUl5V73MEqYzioOMoVhGMJ5cA==} engines: {node: '>=10'} @@ -8262,9 +8684,31 @@ packages: safe-buffer: 5.2.1 dev: false + /editorconfig@1.0.4: + resolution: {integrity: sha512-L9Qe08KWTlqYMVvMcTIvMAdl1cDUubzRNYL+WfA4bLDMHe4nemKkpmYzkznE1FwLKu0EEmy6obgQKzMJrg4x9Q==} + engines: {node: '>=14'} + hasBin: true + requiresBuild: true + dependencies: + '@one-ini/wasm': 0.1.1 + commander: 10.0.1 + minimatch: 9.0.1 + semver: 7.6.0 + dev: true + optional: true + /ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + /ejs@3.1.10: + resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} + engines: {node: '>=0.10.0'} + hasBin: true + dependencies: + jake: 10.9.2 + dev: true + optional: true + /electron-to-chromium@1.4.731: resolution: {integrity: sha512-+TqVfZjpRz2V/5SPpmJxq9qK620SC5SqCnxQIOi7i/U08ZDcTpKbT7Xjj9FU5CbXTMUb4fywbIr8C7cGv4hcjw==} dev: true @@ -8290,6 +8734,20 @@ packages: resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} engines: {node: '>= 0.8'} + /encoding-japanese@2.0.0: + resolution: {integrity: sha512-++P0RhebUC8MJAwJOsT93dT+5oc5oPImp1HubZpAuCZ5kTLnhuuBhKHj2jJeO/Gj93idPBWmIuQ9QWMe5rX3pQ==} + engines: {node: '>=8.10.0'} + requiresBuild: true + dev: true + optional: true + + /encoding-japanese@2.1.0: + resolution: {integrity: sha512-58XySVxUgVlBikBTbQ8WdDxBDHIdXucB16LO5PBHR8t75D54wQrNo4cg+58+R1CtJfKnsVsvt9XlteRaR8xw1w==} + engines: {node: '>=8.10.0'} + requiresBuild: true + dev: true + optional: true + /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -8320,6 +8778,19 @@ packages: strip-ansi: 6.0.1 dev: false + /entities@2.2.0: + resolution: {integrity: sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==} + requiresBuild: true + dev: true + optional: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + requiresBuild: true + dev: true + optional: true + /env-paths@3.0.0: resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8511,6 +8982,13 @@ packages: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} + /escape-goat@3.0.0: + resolution: {integrity: sha512-w3PwNZJwRxlp47QGzhuEBldEqVHHhh8/tIPcl6ecf2Bou99cdAt0knihBV0Ecc7CGxYduXVBDheH1K2oADRlvw==} + engines: {node: '>=10'} + requiresBuild: true + dev: true + optional: true + /escape-goat@4.0.0: resolution: {integrity: sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==} engines: {node: '>=12'} @@ -8519,6 +8997,13 @@ packages: /escape-html@1.0.3: resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + /escape-string-applescript@1.0.0: + resolution: {integrity: sha512-4/hFwoYaC6TkpDn9A3pTC52zQPArFeXuIfhUtCGYdauTzXVP9H3BDr3oO/QzQehMpLDC7srvYgfwvImPFGfvBA==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -8844,6 +9329,14 @@ packages: eslint-visitor-keys: 3.4.3 dev: true + /esprima@1.2.5: + resolution: {integrity: sha512-S9VbPDU0adFErpDai3qDkjq8+G05ONtKzcyNrPKg/ZKa+tf879nX2KexNU95b31UoTJjRLInNBHHHjFPoCd7lQ==} + engines: {node: '>=0.4.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -8863,6 +9356,13 @@ packages: estraverse: 5.3.0 dev: true + /estraverse@1.9.3: + resolution: {integrity: sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + /estraverse@4.3.0: resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} engines: {node: '>=4.0'} @@ -8915,6 +9415,21 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} + /execa@0.10.0: + resolution: {integrity: sha512-7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==} + engines: {node: '>=4'} + requiresBuild: true + dependencies: + cross-spawn: 6.0.5 + get-stream: 3.0.0 + is-stream: 1.1.0 + npm-run-path: 2.0.2 + p-finally: 1.0.0 + signal-exit: 3.0.7 + strip-eof: 1.0.0 + dev: true + optional: true + /execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -8998,6 +9513,12 @@ packages: transitivePeerDependencies: - supports-color + /extend-object@1.0.0: + resolution: {integrity: sha512-0dHDIXC7y7LDmCh/lp1oYkmv73K25AMugQI07r8eFopkW6f7Ufn1q+ETMsJjnV9Am14SlElkqy3O92r6xEaxPw==} + requiresBuild: true + dev: true + optional: true + /extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} dev: false @@ -9106,6 +9627,14 @@ packages: tslib: 2.6.3 dev: false + /filelist@1.0.4: + resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + requiresBuild: true + dependencies: + minimatch: 5.1.6 + dev: true + optional: true + /fill-range@7.0.1: resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} engines: {node: '>=8'} @@ -9147,6 +9676,20 @@ packages: pkg-dir: 4.2.0 dev: false + /fixpack@4.0.0: + resolution: {integrity: sha512-5SM1+H2CcuJ3gGEwTiVo/+nd/hYpNj9Ch3iMDOQ58ndY+VGQ2QdvaUTkd3otjZvYnd/8LF/HkJ5cx7PBq0orCQ==} + hasBin: true + requiresBuild: true + dependencies: + alce: 1.2.0 + chalk: 3.0.0 + detect-indent: 6.1.0 + detect-newline: 3.1.0 + extend-object: 1.0.0 + rc: 1.2.8 + dev: true + optional: true + /flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -9394,7 +9937,13 @@ packages: /get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} - dev: false + + /get-stream@3.0.0: + resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} + engines: {node: '>=4'} + requiresBuild: true + dev: true + optional: true /get-stream@6.0.1: resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} @@ -9493,6 +10042,7 @@ packages: /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported dependencies: fs.realpath: 1.0.0 inflight: 1.0.6 @@ -9612,6 +10162,20 @@ packages: dev: false optional: true + /handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.19.1 + dev: true + optional: true + /hard-rejection@2.1.0: resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} engines: {node: '>=6'} @@ -9662,6 +10226,13 @@ packages: dependencies: function-bind: 1.1.2 + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + requiresBuild: true + dev: true + optional: true + /help-me@5.0.0: resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} dev: false @@ -9685,6 +10256,68 @@ packages: resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} dev: true + /html-minifier@4.0.0: + resolution: {integrity: sha512-aoGxanpFPLg7MkIl/DDFYtb0iWz7jMFGqFhvEDZga6/4QTjneiD8I/NXL1x5aaoCp7FSIT6h/OhykDdPsbtMig==} + engines: {node: '>=6'} + hasBin: true + requiresBuild: true + dependencies: + camel-case: 3.0.0 + clean-css: 4.2.4 + commander: 2.20.3 + he: 1.2.0 + param-case: 2.1.1 + relateurl: 0.2.7 + uglify-js: 3.19.1 + dev: true + optional: true + + /html-to-text@9.0.5: + resolution: {integrity: sha512-qY60FjREgVZL03vJU6IfMV4GDjGBIoOyvuFdpBDIX9yTlDw0TjxVBQp+P8NvpdIXNJvfWBTNul7fsAQJq2FNpg==} + engines: {node: '>=14'} + requiresBuild: true + dependencies: + '@selderee/plugin-htmlparser2': 0.11.0 + deepmerge: 4.3.1 + dom-serializer: 2.0.0 + htmlparser2: 8.0.2 + selderee: 0.11.0 + dev: true + optional: true + + /htmlparser2@5.0.1: + resolution: {integrity: sha512-vKZZra6CSe9qsJzh0BjBGXo8dvzNsq/oGvsjfRdOrrryfeD9UOBEEQdeoqCRmKZchF5h2zOBMQ6YuQ0uRUmdbQ==} + requiresBuild: true + dependencies: + domelementtype: 2.3.0 + domhandler: 3.3.0 + domutils: 2.8.0 + entities: 2.2.0 + dev: true + optional: true + + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + requiresBuild: true + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + optional: true + + /htmlparser2@9.1.0: + resolution: {integrity: sha512-5zfg6mHUoaer/97TxnGpxmbR7zJtPwIYFMZ/H5ucTlPZhKvtum05yiPK3Mgai3a0DyVxv7qYqoweaEd2nrYQzQ==} + requiresBuild: true + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.1.0 + entities: 4.5.0 + dev: true + optional: true + /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} dev: false @@ -9768,6 +10401,15 @@ packages: dependencies: safer-buffer: 2.1.2 + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: true + optional: true + /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} @@ -9787,8 +10429,8 @@ packages: resolution: {integrity: sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==} requiresBuild: true dependencies: - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) + acorn: 8.12.1 + acorn-import-assertions: 1.9.0(acorn@8.12.1) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 dev: false @@ -9798,8 +10440,8 @@ packages: resolution: {integrity: sha512-1LrZPDtW+atAxH42S6288qyDFNQ2YCty+2mxEPRtfazH6Z5QwkaBSTS2ods7hnVJioF6rkRfNoA6A/MstpFXLg==} requiresBuild: true dependencies: - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) + acorn: 8.12.1 + acorn-import-assertions: 1.9.0(acorn@8.12.1) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 dev: false @@ -9808,8 +10450,8 @@ packages: /import-in-the-middle@1.7.4: resolution: {integrity: sha512-Lk+qzWmiQuRPPulGQeK5qq0v32k2bHnWrRPFgqyvhw7Kkov5L6MOLOIU3pcWeujc9W4q54Cp3Q2WV16eQkc7Bg==} dependencies: - acorn: 8.11.3 - acorn-import-attributes: 1.9.5(acorn@8.11.3) + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 dev: false @@ -9817,8 +10459,8 @@ packages: /import-in-the-middle@1.8.0: resolution: {integrity: sha512-/xQjze8szLNnJ5rvHSzn+dcVXqCAU6Plbk4P24U/jwPmg1wy7IIp9OjKIO5tYue8GSPhDpPDiApQjvBUmWwhsQ==} dependencies: - acorn: 8.11.3 - acorn-import-attributes: 1.9.5(acorn@8.11.3) + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 dev: false @@ -9826,8 +10468,8 @@ packages: /import-in-the-middle@1.9.0: resolution: {integrity: sha512-Ng1SJINJDBzyUEkx9Mj32XD8G0TQCUb5TMoL9V91CTn6F3wYZLygLuhNFrv0cNMBZaeptnL1zecV6XrIdHJ+xQ==} dependencies: - acorn: 8.11.3 - acorn-import-attributes: 1.9.5(acorn@8.11.3) + acorn: 8.12.1 + acorn-import-attributes: 1.9.5(acorn@8.12.1) cjs-module-lexer: 1.2.3 module-details-from-path: 1.0.3 dev: false @@ -9866,7 +10508,7 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: false + requiresBuild: true /ini@2.0.0: resolution: {integrity: sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==} @@ -10068,6 +10710,23 @@ packages: dependencies: has-tostringtag: 1.0.2 + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + requiresBuild: true + dev: true + optional: true + + /is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} + requiresBuild: true + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 + dev: true + optional: true + /is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -10173,6 +10832,12 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + requiresBuild: true + dev: true + optional: true + /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -10191,6 +10856,13 @@ packages: dependencies: call-bind: 1.0.7 + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + /is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -10265,6 +10937,15 @@ packages: engines: {node: '>=0.10.0'} dev: false + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + is-docker: 2.2.1 + dev: true + optional: true + /isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -10284,7 +10965,7 @@ packages: engines: {node: '>=8'} dependencies: '@babel/core': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/parser': 7.24.8 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -10297,7 +10978,7 @@ packages: engines: {node: '>=10'} dependencies: '@babel/core': 7.24.4 - '@babel/parser': 7.24.4 + '@babel/parser': 7.24.8 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.0 @@ -10361,6 +11042,19 @@ packages: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + /jake@10.9.2: + resolution: {integrity: sha512-2P4SQ0HrLQ+fw6llpLnOaGAvN2Zu6778SJMrCUwns4fOoG9ayrTiZk3VV8sCPkVZF8ab0zksVpS8FDY5pRCNBA==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + async: 3.2.5 + chalk: 4.1.2 + filelist: 1.0.4 + minimatch: 3.1.2 + dev: true + optional: true + /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10724,7 +11418,7 @@ packages: '@babel/generator': 7.24.4 '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4) '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4) - '@babel/types': 7.24.0 + '@babel/types': 7.24.9 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 @@ -10850,10 +11544,29 @@ packages: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} + /js-beautify@1.15.1: + resolution: {integrity: sha512-ESjNzSlt/sWE8sciZH8kBF8BPlwXPwhR6pWKAw8bw4Bwj+iZcnKW6ONWUutJ7eObuBZQpiIb8S7OYspWrKt7rA==} + engines: {node: '>=14'} + hasBin: true + requiresBuild: true + dependencies: + config-chain: 1.1.13 + editorconfig: 1.0.4 + glob: 10.3.12 + js-cookie: 3.0.5 + nopt: 7.2.1 + dev: true + optional: true + /js-cookie@3.0.5: resolution: {integrity: sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==} engines: {node: '>=14'} - dev: false + + /js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + requiresBuild: true + dev: true + optional: true /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} @@ -10956,6 +11669,15 @@ packages: semver: 7.6.0 dev: false + /jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + requiresBuild: true + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + dev: true + optional: true + /jsx-ast-utils@3.3.5: resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} engines: {node: '>=4.0'} @@ -10966,6 +11688,22 @@ packages: object.values: 1.2.0 dev: true + /juice@10.0.0: + resolution: {integrity: sha512-9f68xmhGrnIi6DBkiiP3rUrQN33SEuaKu1+njX6VgMP+jwZAsnT33WIzlrWICL9matkhYu3OyrqSUP55YTIdGg==} + engines: {node: '>=10.0.0'} + hasBin: true + requiresBuild: true + dependencies: + cheerio: 1.0.0-rc.12 + commander: 6.2.1 + mensch: 0.3.4 + slick: 1.12.2 + web-resource-inliner: 6.0.1 + transitivePeerDependencies: + - encoding + dev: true + optional: true + /jwa@1.4.1: resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} dependencies: @@ -11031,6 +11769,12 @@ packages: package-json: 8.1.1 dev: false + /leac@0.6.0: + resolution: {integrity: sha512-y+SqErxb8h7nE/fiEX07jsbuhrpO9lL8eca7/Y1nuWV2moNlXhyd59iDGcRf6moVyDMbmTNzL40SUyrFU/yDpg==} + requiresBuild: true + dev: true + optional: true + /leven@3.1.0: resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} engines: {node: '>=6'} @@ -11044,9 +11788,55 @@ packages: type-check: 0.4.0 dev: true + /libbase64@1.2.1: + resolution: {integrity: sha512-l+nePcPbIG1fNlqMzrh68MLkX/gTxk/+vdvAb388Ssi7UuUN31MI44w4Yf33mM3Cm4xDfw48mdf3rkdHszLNew==} + requiresBuild: true + dev: true + optional: true + + /libbase64@1.3.0: + resolution: {integrity: sha512-GgOXd0Eo6phYgh0DJtjQ2tO8dc0IVINtZJeARPeiIJqge+HdsWSuaDTe8ztQ7j/cONByDZ3zeB325AHiv5O0dg==} + requiresBuild: true + dev: true + optional: true + + /libmime@5.2.0: + resolution: {integrity: sha512-X2U5Wx0YmK0rXFbk67ASMeqYIkZ6E5vY7pNWRKtnNzqjvdYYG8xtPDpCnuUEnPU9vlgNev+JoSrcaKSUaNvfsw==} + requiresBuild: true + dependencies: + encoding-japanese: 2.0.0 + iconv-lite: 0.6.3 + libbase64: 1.2.1 + libqp: 2.0.1 + dev: true + optional: true + + /libmime@5.3.5: + resolution: {integrity: sha512-nSlR1yRZ43L3cZCiWEw7ali3jY29Hz9CQQ96Oy+sSspYnIP5N54ucOPHqooBsXzwrX1pwn13VUE05q4WmzfaLg==} + requiresBuild: true + dependencies: + encoding-japanese: 2.1.0 + iconv-lite: 0.6.3 + libbase64: 1.3.0 + libqp: 2.1.0 + dev: true + optional: true + /libphonenumber-js@1.10.60: resolution: {integrity: sha512-Ctgq2lXUpEJo5j1762NOzl2xo7z7pqmVWYai0p07LvAkQ32tbPv3wb+tcUeHEiXhKU5buM4H9MXsXo6OlM6C2g==} + /libqp@2.0.1: + resolution: {integrity: sha512-Ka0eC5LkF3IPNQHJmYBWljJsw0UvM6j+QdKRbWyCdTmYwvIDE6a7bCm0UkTAL/K+3KXK5qXT/ClcInU01OpdLg==} + requiresBuild: true + dev: true + optional: true + + /libqp@2.1.0: + resolution: {integrity: sha512-O6O6/fsG5jiUVbvdgT7YX3xY3uIadR6wEZ7+vy9u7PKHAlSEB6blvC1o5pHBjgsi95Uo0aiBBdkyFecj6jtb7A==} + requiresBuild: true + dev: true + optional: true + /lilconfig@2.1.0: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} @@ -11063,6 +11853,14 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + /linkify-it@5.0.0: + resolution: {integrity: sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==} + requiresBuild: true + dependencies: + uc.micro: 2.1.0 + dev: true + optional: true + /lint-staged@15.2.2: resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==} engines: {node: '>=18.12.0'} @@ -11082,6 +11880,15 @@ packages: - supports-color dev: true + /liquidjs@10.16.1: + resolution: {integrity: sha512-1JFL/Y7ONoajrfwav37yuz5yQHU3+Pgz1XWsg9E/2T8Fp65KalNfMF8QZ3+tNETqGUIB66waOSLOi64niYZE9A==} + engines: {node: '>=14'} + hasBin: true + dependencies: + commander: 10.0.1 + dev: true + optional: true + /listr2@8.0.1: resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==} engines: {node: '>=18.0.0'} @@ -11212,6 +12019,12 @@ packages: dependencies: js-tokens: 4.0.0 + /lower-case@1.1.4: + resolution: {integrity: sha512-2Fgx1Ycm599x+WGpIYwJOvsjmXFzTSc34IwDWALRA/8AopUKAVPwfJ+h5+f85BCp0PWmmJcWzEpxOpoXycMpdA==} + requiresBuild: true + dev: true + optional: true + /lowercase-keys@3.0.0: resolution: {integrity: sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -11263,6 +12076,33 @@ packages: '@jridgewell/sourcemap-codec': 1.4.15 dev: true + /mailparser@3.7.1: + resolution: {integrity: sha512-RCnBhy5q8XtB3mXzxcAfT1huNqN93HTYYyL6XawlIKycfxM/rXPg9tXoZ7D46+SgCS1zxKzw+BayDQSvncSTTw==} + requiresBuild: true + dependencies: + encoding-japanese: 2.1.0 + he: 1.2.0 + html-to-text: 9.0.5 + iconv-lite: 0.6.3 + libmime: 5.3.5 + linkify-it: 5.0.0 + mailsplit: 5.4.0 + nodemailer: 6.9.13 + punycode.js: 2.3.1 + tlds: 1.252.0 + dev: true + optional: true + + /mailsplit@5.4.0: + resolution: {integrity: sha512-wnYxX5D5qymGIPYLwnp6h8n1+6P6vz/MJn5AzGjZ8pwICWssL+CCQjWBIToOVHASmATot4ktvlLo6CyLfOXWYA==} + requiresBuild: true + dependencies: + libbase64: 1.2.1 + libmime: 5.2.0 + libqp: 2.0.1 + dev: true + optional: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -11312,6 +12152,12 @@ packages: fs-monkey: 1.0.5 dev: true + /mensch@0.3.4: + resolution: {integrity: sha512-IAeFvcOnV9V0Yk+bFhYR07O3yNina9ANIN5MoXBKYJ/RLYPurd2d0yw14MDhpr9/momp0WofT1bPUh3hkzdi/g==} + requiresBuild: true + dev: true + optional: true + /meow@13.2.0: resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==} engines: {node: '>=18'} @@ -11404,6 +12250,15 @@ packages: dependencies: brace-expansion: 1.1.11 + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + brace-expansion: 2.0.1 + dev: true + optional: true + /minimatch@8.0.4: resolution: {integrity: sha512-W0Wvr9HyFXZRGIDgCicunpQ299OKXs9RgZfaukz4qAW/pJhcpUfupc9c+OObPOFueNy8VSrZgEmDtk6Kh4WzDA==} engines: {node: '>=16 || 14 >=14.17'} @@ -11411,6 +12266,15 @@ packages: brace-expansion: 2.0.1 dev: true + /minimatch@9.0.1: + resolution: {integrity: sha512-0jWhJpD/MdhPXwPuiRkCbfYfSKp2qnn2eOc279qI7f+osl/l+prKSrvhg157zSYvx/1nmgn2NqdT6k2Z7zSH9w==} + engines: {node: '>=16 || 14 >=14.17'} + requiresBuild: true + dependencies: + brace-expansion: 2.0.1 + dev: true + optional: true + /minimatch@9.0.3: resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} engines: {node: '>=16 || 14 >=14.17'} @@ -11470,6 +12334,433 @@ packages: engines: {node: '>= 8.0.0'} dev: false + /mjml-accordion@4.15.3: + resolution: {integrity: sha512-LPNVSj1LyUVYT9G1gWwSw3GSuDzDsQCu0tPB2uDsq4VesYNnU6v3iLCQidMiR6azmIt13OEozG700ygAUuA6Ng==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-body@4.15.3: + resolution: {integrity: sha512-7pfUOVPtmb0wC+oUOn4xBsAw4eT5DyD6xqaxj/kssu6RrFXOXgJaVnDPAI9AzIvXJ/5as9QrqRGYAddehwWpHQ==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-button@4.15.3: + resolution: {integrity: sha512-79qwn9AgdGjJR1vLnrcm2rq2AsAZkKC5JPwffTMG+Nja6zGYpTDZFZ56ekHWr/r1b5WxkukcPj2PdevUug8c+Q==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-carousel@4.15.3: + resolution: {integrity: sha512-3ju6I4l7uUhPRrJfN3yK9AMsfHvrYbRkcJ1GRphFHzUj37B2J6qJOQUpzA547Y4aeh69TSb7HFVf1t12ejQxVw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-cli@4.15.3: + resolution: {integrity: sha512-+V2TDw3tXUVEptFvLSerz125C2ogYl8klIBRY1m5BHd4JvGVf3yhx8N3PngByCzA6PGcv/eydGQN+wy34SHf0Q==} + hasBin: true + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + chokidar: 3.6.0 + glob: 10.3.12 + html-minifier: 4.0.0 + js-beautify: 1.15.1 + lodash: 4.17.21 + minimatch: 9.0.4 + mjml-core: 4.15.3 + mjml-migrate: 4.15.3 + mjml-parser-xml: 4.15.3 + mjml-validator: 4.15.3 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-column@4.15.3: + resolution: {integrity: sha512-hYdEFdJGHPbZJSEysykrevEbB07yhJGSwfDZEYDSbhQQFjV2tXrEgYcFD5EneMaowjb55e3divSJxU4c5q4Qgw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-core@4.15.3: + resolution: {integrity: sha512-Dmwk+2cgSD9L9GmTbEUNd8QxkTZtW9P7FN/ROZW/fGZD6Hq6/4TB0zEspg2Ow9eYjZXO2ofOJ3PaQEEShKV0kQ==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + cheerio: 1.0.0-rc.12 + detect-node: 2.1.0 + html-minifier: 4.0.0 + js-beautify: 1.15.1 + juice: 10.0.0 + lodash: 4.17.21 + mjml-migrate: 4.15.3 + mjml-parser-xml: 4.15.3 + mjml-validator: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-divider@4.15.3: + resolution: {integrity: sha512-vh27LQ9FG/01y0b9ntfqm+GT5AjJnDSDY9hilss2ixIUh0FemvfGRfsGVeV5UBVPBKK7Ffhvfqc7Rciob9Spzw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-group@4.15.3: + resolution: {integrity: sha512-HSu/rKnGZVKFq3ciT46vi1EOy+9mkB0HewO4+P6dP/Y0UerWkN6S3UK11Cxsj0cAp0vFwkPDCdOeEzRdpFEkzA==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-head-attributes@4.15.3: + resolution: {integrity: sha512-2ISo0r5ZKwkrvJgDou9xVPxxtXMaETe2AsAA02L89LnbB2KC0N5myNsHV0sEysTw9+CfCmgjAb0GAI5QGpxKkQ==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-head-breakpoint@4.15.3: + resolution: {integrity: sha512-Eo56FA5C2v6ucmWQL/JBJ2z641pLOom4k0wP6CMZI2utfyiJ+e2Uuinj1KTrgDcEvW4EtU9HrfAqLK9UosLZlg==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-head-font@4.15.3: + resolution: {integrity: sha512-CzV2aDPpiNIIgGPHNcBhgyedKY4SX3BJoTwOobSwZVIlEA6TAWB4Z9WwFUmQqZOgo1AkkiTHPZQvGcEhFFXH6g==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-head-html-attributes@4.15.3: + resolution: {integrity: sha512-MDNDPMBOgXUZYdxhosyrA2kudiGO8aogT0/cODyi2Ed9o/1S7W+je11JUYskQbncqhWKGxNyaP4VWa+6+vUC/g==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-head-preview@4.15.3: + resolution: {integrity: sha512-J2PxCefUVeFwsAExhrKo4lwxDevc5aKj888HBl/wN4EuWOoOg06iOGCxz4Omd8dqyFsrqvbBuPqRzQ+VycGmaA==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-head-style@4.15.3: + resolution: {integrity: sha512-9J+JuH+mKrQU65CaJ4KZegACUgNIlYmWQYx3VOBR/tyz+8kDYX7xBhKJCjQ1I4wj2Tvga3bykd89Oc2kFZ5WOw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-head-title@4.15.3: + resolution: {integrity: sha512-IM59xRtsxID4DubQ0iLmoCGXguEe+9BFG4z6y2xQDrscIa4QY3KlfqgKGT69ojW+AVbXXJPEVqrAi4/eCsLItQ==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-head@4.15.3: + resolution: {integrity: sha512-o3mRuuP/MB5fZycjD3KH/uXsnaPl7Oo8GtdbJTKtH1+O/3pz8GzGMkscTKa97l03DAG2EhGrzzLcU2A6eshwFw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-hero@4.15.3: + resolution: {integrity: sha512-9cLAPuc69yiuzNrMZIN58j+HMK1UWPaq2i3/Fg2ZpimfcGFKRcPGCbEVh0v+Pb6/J0+kf8yIO0leH20opu3AyQ==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-image@4.15.3: + resolution: {integrity: sha512-g1OhSdofIytE9qaOGdTPmRIp7JsCtgO0zbsn1Fk6wQh2gEL55Z40j/VoghslWAWTgT2OHFdBKnMvWtN6U5+d2Q==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-migrate@4.15.3: + resolution: {integrity: sha512-sr/+35RdxZroNQVegjpfRHJ5hda9XCgaS4mK2FGO+Mb1IUevKfeEPII3F/cHDpNwFeYH3kAgyqQ22ClhGLWNBA==} + hasBin: true + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + js-beautify: 1.15.1 + lodash: 4.17.21 + mjml-core: 4.15.3 + mjml-parser-xml: 4.15.3 + yargs: 17.7.2 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-navbar@4.15.3: + resolution: {integrity: sha512-VsKH/Jdlf8Yu3y7GpzQV5n7JMdpqvZvTSpF6UQXL0PWOm7k6+LX+sCZimOfpHJ+wCaaybpxokjWZ71mxOoCWoA==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-parser-xml@4.15.3: + resolution: {integrity: sha512-Tz0UX8/JVYICLjT+U8J1f/TFxIYVYjzZHeh4/Oyta0pLpRLeZlxEd71f3u3kdnulCKMP4i37pFRDmyLXAlEuLw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + detect-node: 2.1.0 + htmlparser2: 9.1.0 + lodash: 4.17.21 + dev: true + optional: true + + /mjml-preset-core@4.15.3: + resolution: {integrity: sha512-1zZS8P4O0KweWUqNS655+oNnVMPQ1Rq1GaZq5S9JfwT1Vh/m516lSmiTW9oko6gGHytt5s6Yj6oOeu5Zm8FoLw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + mjml-accordion: 4.15.3 + mjml-body: 4.15.3 + mjml-button: 4.15.3 + mjml-carousel: 4.15.3 + mjml-column: 4.15.3 + mjml-divider: 4.15.3 + mjml-group: 4.15.3 + mjml-head: 4.15.3 + mjml-head-attributes: 4.15.3 + mjml-head-breakpoint: 4.15.3 + mjml-head-font: 4.15.3 + mjml-head-html-attributes: 4.15.3 + mjml-head-preview: 4.15.3 + mjml-head-style: 4.15.3 + mjml-head-title: 4.15.3 + mjml-hero: 4.15.3 + mjml-image: 4.15.3 + mjml-navbar: 4.15.3 + mjml-raw: 4.15.3 + mjml-section: 4.15.3 + mjml-social: 4.15.3 + mjml-spacer: 4.15.3 + mjml-table: 4.15.3 + mjml-text: 4.15.3 + mjml-wrapper: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-raw@4.15.3: + resolution: {integrity: sha512-IGyHheOYyRchBLiAEgw3UM11kFNmBSMupu2BDdejC6ZiDhEAdG+tyERlsCwDPYtXanvFpGWULIu3XlsUPc+RZw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-section@4.15.3: + resolution: {integrity: sha512-JfVPRXH++Hd933gmQfG8JXXCBCR6fIzC3DwiYycvanL/aW1cEQ2EnebUfQkt5QzlYjOkJEH+JpccAsq3ln6FZQ==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-social@4.15.3: + resolution: {integrity: sha512-7sD5FXrESOxpT9Z4Oh36bS6u/geuUrMP1aCg2sjyAwbPcF1aWa2k9OcatQfpRf6pJEhUZ18y6/WBBXmMVmSzXg==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-spacer@4.15.3: + resolution: {integrity: sha512-3B7Qj+17EgDdAtZ3NAdMyOwLTX1jfmJuY7gjyhS2HtcZAmppW+cxqHUBwCKfvSRgTQiccmEvtNxaQK+tfyrZqA==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-table@4.15.3: + resolution: {integrity: sha512-FLx7DcRKTdKdcOCbMyBaeudeHaHpwPveRrBm6WyQe3LXx6FfdmOh59i71/16LFQMgBOD3N4/UJkzxLzlTJzMqQ==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-text@4.15.3: + resolution: {integrity: sha512-+C0hxCmw9kg0XzT6vhE5mFkK6y225nC8UEQcN94K0fBCjPKkM+HqZMwGX205fzdGRi+Bxa55b/VhrIVwdv+8vw==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml-validator@4.15.3: + resolution: {integrity: sha512-Xb72KdqRwjv/qM2rJpV22syyP2N3cRQ9VVDrN6u2FSzLq02buFNxmSPJ7CKhat3PrUNdVHU75KZwOf/tz4UEhA==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + dev: true + optional: true + + /mjml-wrapper@4.15.3: + resolution: {integrity: sha512-ditsCijeHJrmBmObtJmQ18ddLxv5oPyMTdPU8Di8APOnD2zPk7Z4UAuJSl7HXB45oFiivr3MJf4koFzMUSZ6Gg==} + requiresBuild: true + dependencies: + '@babel/runtime': 7.24.4 + lodash: 4.17.21 + mjml-core: 4.15.3 + mjml-section: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + + /mjml@4.15.3: + resolution: {integrity: sha512-bW2WpJxm6HS+S3Yu6tq1DUPFoTxU9sPviUSmnL7Ua+oVO3WA5ILFWqvujUlz+oeuM+HCwEyMiP5xvKNPENVjYA==} + hasBin: true + dependencies: + '@babel/runtime': 7.24.4 + mjml-cli: 4.15.3 + mjml-core: 4.15.3 + mjml-migrate: 4.15.3 + mjml-preset-core: 4.15.3 + mjml-validator: 4.15.3 + transitivePeerDependencies: + - encoding + dev: true + optional: true + /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} hasBin: true @@ -11633,6 +12924,20 @@ packages: - babel-plugin-macros dev: false + /nice-try@1.0.5: + resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} + requiresBuild: true + dev: true + optional: true + + /no-case@2.3.2: + resolution: {integrity: sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==} + requiresBuild: true + dependencies: + lower-case: 1.1.4 + dev: true + optional: true + /node-abi@3.65.0: resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} engines: {node: '>=10'} @@ -11696,13 +13001,25 @@ packages: resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} dev: true - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /node-releases@2.0.18: + resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} + + /nodemailer@6.9.13: + resolution: {integrity: sha512-7o38Yogx6krdoBf3jCAqnIN4oSQFx+fMa0I7dK1D+me9kBxx12D+/33wSb+fhOCtIxvYJ+4x4IMEhmhCKfAiOA==} + engines: {node: '>=6.0.0'} + requiresBuild: true + dev: true + optional: true + + /nodemailer@6.9.14: + resolution: {integrity: sha512-Dobp/ebDKBvz91sbtRKhcznLThrKxKt97GI2FAlAyy+fk19j73Uz3sBXolVtmcXjaorivqsbbbjDY+Jkt4/bQA==} + engines: {node: '>=6.0.0'} dev: true - /node-releases@2.0.18: - resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==} - /nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -11711,6 +13028,16 @@ packages: abbrev: 1.1.1 dev: false + /nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + requiresBuild: true + dependencies: + abbrev: 2.0.0 + dev: true + optional: true + /normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: @@ -11734,6 +13061,15 @@ packages: engines: {node: '>=14.16'} dev: false + /npm-run-path@2.0.2: + resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} + engines: {node: '>=4'} + requiresBuild: true + dependencies: + path-key: 2.0.1 + dev: true + optional: true + /npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -11756,6 +13092,14 @@ packages: set-blocking: 2.0.0 dev: false + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + requiresBuild: true + dependencies: + boolbase: 1.0.0 + dev: true + optional: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -11854,6 +13198,16 @@ packages: dependencies: mimic-fn: 4.0.0 + /open@7.4.2: + resolution: {integrity: sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + is-docker: 2.2.1 + is-wsl: 2.2.0 + dev: true + optional: true + /openai@4.38.5: resolution: {integrity: sha512-Ym5GJL98ZhLJJ7enBx53jjG3vwN/fsB+Ozh46nnRZZS9W1NiYqbwkJ+sXd3dkCIiWIgcyyOPL2Zr8SQAzbpj3g==} hasBin: true @@ -11956,6 +13310,15 @@ packages: engines: {node: '>=12.20'} dev: false + /p-event@4.2.0: + resolution: {integrity: sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + p-timeout: 3.2.0 + dev: true + optional: true + /p-filter@2.1.0: resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} engines: {node: '>=8'} @@ -11963,6 +13326,13 @@ packages: p-map: 2.1.0 dev: false + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + requiresBuild: true + dev: true + optional: true + /p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -11992,10 +13362,28 @@ packages: engines: {node: '>=6'} dev: false + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + p-finally: 1.0.0 + dev: true + optional: true + /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + /p-wait-for@3.2.0: + resolution: {integrity: sha512-wpgERjNkLrBiFmkMEjuZJEWKKDrNfHCKA1OhyN1wg1FrLkULbviEy6py1AyJUgZ72YWFbZ38FIpnqvVqAlDUwA==} + engines: {node: '>=8'} + requiresBuild: true + dependencies: + p-timeout: 3.2.0 + dev: true + optional: true + /pac-proxy-agent@7.0.1: resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} engines: {node: '>= 14'} @@ -12030,6 +13418,14 @@ packages: semver: 7.6.0 dev: false + /param-case@2.1.1: + resolution: {integrity: sha512-eQE845L6ot89sk2N8liD8HAuH4ca6Vvr7VWAWwt7+kvvG5aBcPmmphQ68JsEG2qa9n1TykS2DLeMt363AAH8/w==} + requiresBuild: true + dependencies: + no-case: 2.3.2 + dev: true + optional: true + /parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -12046,6 +13442,32 @@ packages: json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + requiresBuild: true + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: true + optional: true + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + requiresBuild: true + dependencies: + entities: 4.5.0 + dev: true + optional: true + + /parseley@0.12.1: + resolution: {integrity: sha512-e6qHKe3a9HWr0oMRVDTRhKce+bRO8VGQR3NyVwcjwrbhMmFCX9KszEV35+rn4AdilFAq9VPxP/Fe1wC9Qjd2lw==} + requiresBuild: true + dependencies: + leac: 0.6.0 + peberminta: 0.9.0 + dev: true + optional: true + /parseurl@1.3.3: resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} engines: {node: '>= 0.8'} @@ -12098,6 +13520,13 @@ packages: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + /path-key@2.0.1: + resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} + engines: {node: '>=4'} + requiresBuild: true + dev: true + optional: true + /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -12136,6 +13565,12 @@ packages: resolution: {integrity: sha512-KG8UEiEVkR3wGEb4m5yZkVCzigAD+cVEJck2CzYZO37ZGJfctvVptVO192MwrtPhzONn6go8ylnOdMhKqi4nfg==} dev: false + /peberminta@0.9.0: + resolution: {integrity: sha512-XIxfHpEuSJbITd1H3EeQwpcZbTLHc+VVr8ANI9t5sit565tsI4/xK3KWTUFE2e6QiangUkh3B0jihzmGnNrRsQ==} + requiresBuild: true + dev: true + optional: true + /pg-int8@1.0.1: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} @@ -12436,6 +13871,24 @@ packages: react-is: 18.2.0 dev: true + /preview-email@3.0.20: + resolution: {integrity: sha512-QbAokW2F3p0thQfp2WTZ0rBy+IZuCnf9gIUCLffr+8hq85esq6pzCA7S0eUdD6oTmtKROqoNeH2rXZWrRow7EA==} + engines: {node: '>=14'} + dependencies: + ci-info: 3.9.0 + display-notification: 2.0.0 + fixpack: 4.0.0 + get-port: 5.1.1 + mailparser: 3.7.1 + nodemailer: 6.9.14 + open: 7.4.2 + p-event: 4.2.0 + p-wait-for: 3.2.0 + pug: 3.0.3 + uuid: 9.0.1 + dev: true + optional: true + /prisma@5.12.1: resolution: {integrity: sha512-SkMnb6wyIxTv9ACqiHBI2u9gD6y98qXRoCoLEnZsF6yee5Qg828G+ARrESN+lQHdw4maSZFFSBPPDpvSiVTo0Q==} engines: {node: '>=16.13'} @@ -12456,6 +13909,14 @@ packages: engines: {node: '>= 0.6.0'} dev: false + /promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + requiresBuild: true + dependencies: + asap: 2.0.6 + dev: true + optional: true + /prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -12473,7 +13934,7 @@ packages: /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} - dev: false + requiresBuild: true /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} @@ -12513,6 +13974,120 @@ packages: /pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + /pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + requiresBuild: true + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + dev: true + optional: true + + /pug-code-gen@3.0.3: + resolution: {integrity: sha512-cYQg0JW0w32Ux+XTeZnBEeuWrAY7/HNE6TWnhiHGnnRYlCgyAUPoyh9KzCMa9WhcJlJ1AtQqpEYHc+vbCzA+Aw==} + requiresBuild: true + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + dev: true + optional: true + + /pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + requiresBuild: true + dev: true + optional: true + + /pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + requiresBuild: true + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.8 + dev: true + optional: true + + /pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + requiresBuild: true + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + dev: true + optional: true + + /pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + requiresBuild: true + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + dev: true + optional: true + + /pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + requiresBuild: true + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + dev: true + optional: true + + /pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + requiresBuild: true + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + dev: true + optional: true + + /pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + requiresBuild: true + dev: true + optional: true + + /pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + requiresBuild: true + dependencies: + pug-error: 2.1.0 + dev: true + optional: true + + /pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + requiresBuild: true + dev: true + optional: true + + /pug@3.0.3: + resolution: {integrity: sha512-uBi6kmc9f3SZ3PXxqcHiUZLmIXgfgWooKWXcwSGwQd2Zi5Rb0bT14+8CJjJgI8AB+nndLaNgHGrcc6bPIB665g==} + dependencies: + pug-code-gen: 3.0.3 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + dev: true + optional: true + /pump@3.0.0: resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} dependencies: @@ -12520,6 +14095,13 @@ packages: once: 1.4.0 dev: false + /punycode.js@2.3.1: + resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} + engines: {node: '>=6'} + requiresBuild: true + dev: true + optional: true + /punycode@2.3.1: resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} engines: {node: '>=6'} @@ -13112,7 +14694,6 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: false /react-confetti-boom@1.0.0(react-dom@18.2.0)(react@18.2.0): resolution: {integrity: sha512-JPCs1tx36xduFdMORaRLLvFJABAQUgjEqKvqZiBZr8bUkHsCzbHeesnfQwZU1LExmGiYVFGIJS/tiR4OUTktww==} @@ -13475,6 +15056,13 @@ packages: rc: 1.2.8 dev: false + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + requiresBuild: true + dev: true + optional: true + /repeat-string@1.6.1: resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} engines: {node: '>=0.10'} @@ -13629,6 +15217,15 @@ packages: fsevents: 2.3.3 dev: true + /run-applescript@3.2.0: + resolution: {integrity: sha512-Ep0RsvAjnRcBX1p5vogbaBdAGu/8j/ewpvGqnQYunnLd9SM0vWcPJewPKNnWFggf0hF0pwIgwV5XK7qQ7UZ8Qg==} + engines: {node: '>=4'} + requiresBuild: true + dependencies: + execa: 0.10.0 + dev: true + optional: true + /run-async@2.4.1: resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} engines: {node: '>=0.12.0'} @@ -13702,6 +15299,14 @@ packages: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} dev: false + /selderee@0.11.0: + resolution: {integrity: sha512-5TF+l7p4+OsnP8BCCvSyZiSPc4x4//p5uPwK8TCnVPJYRmU2aYKMpOXvw8zM5a5JvuuCGN1jmsMwuU2W02ukfA==} + requiresBuild: true + dependencies: + parseley: 0.12.1 + dev: true + optional: true + /semver-diff@4.0.0: resolution: {integrity: sha512-0Ju4+6A8iOnpL/Thra7dZsSlOHYAHIeMxfhWQRI1/VLcT3WDBZKKtQt/QkBOsiIN9ZpuvHE6cGZ0x4glCMmfiA==} engines: {node: '>=12'} @@ -13768,6 +15373,7 @@ packages: /set-function-length@1.2.2: resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} engines: {node: '>= 0.4'} + requiresBuild: true dependencies: define-data-property: 1.1.4 es-errors: 1.3.0 @@ -13837,6 +15443,7 @@ packages: /shebang-regex@1.0.0: resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} engines: {node: '>=0.10.0'} + requiresBuild: true /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} @@ -13902,6 +15509,12 @@ packages: is-fullwidth-code-point: 5.0.0 dev: true + /slick@1.12.2: + resolution: {integrity: sha512-4qdtOGcBjral6YIBCWJ0ljFSKNLz9KkhbWtuGvUyRowl1kxfuE1x/Z/aJcaiilpb3do9bl5K7/1h9XC5wWpY/A==} + requiresBuild: true + dev: true + optional: true + /smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -14205,6 +15818,13 @@ packages: engines: {node: '>=8'} dev: true + /strip-eof@1.0.0: + resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + /strip-final-newline@2.0.0: resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} engines: {node: '>=6'} @@ -14224,7 +15844,7 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - dev: false + requiresBuild: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -14515,7 +16135,7 @@ packages: hasBin: true dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.11.3 + acorn: 8.12.1 commander: 2.20.3 source-map-support: 0.5.21 dev: true @@ -14563,6 +16183,13 @@ packages: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} dev: false + /tlds@1.252.0: + resolution: {integrity: sha512-GA16+8HXvqtfEnw/DTcwB0UU354QE1n3+wh08oFjr6Znl7ZLAeUgYzCcK+/CCrOyE0vnHR8/pu3XXG3vDijXpQ==} + hasBin: true + requiresBuild: true + dev: true + optional: true + /tmp@0.0.33: resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} engines: {node: '>=0.6.0'} @@ -14591,8 +16218,15 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + /token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + requiresBuild: true + dev: true + optional: true + /tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + requiresBuild: true /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} @@ -15042,6 +16676,20 @@ packages: hasBin: true dev: true + /uc.micro@2.1.0: + resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} + requiresBuild: true + dev: true + optional: true + + /uglify-js@3.19.1: + resolution: {integrity: sha512-y/2wiW+ceTYR2TSSptAhfnEtpLaQ4Ups5zrjB2d3kuVxHj16j/QJwPl5PvuGy9uARb39J0+iKxcRPvtpsx4A4A==} + engines: {node: '>=0.8.0'} + hasBin: true + requiresBuild: true + dev: true + optional: true + /uid@2.0.2: resolution: {integrity: sha512-u3xV3X7uzvi5b1MncmZo3i2Aw222Zk1keqLA1YkHldREkAhAqi65wuPfe7lHx8H/Wzy+8CE7S7uS3jekIM5s8g==} engines: {node: '>=8'} @@ -15130,6 +16778,12 @@ packages: xdg-basedir: 5.1.0 dev: false + /upper-case@1.1.3: + resolution: {integrity: sha512-WRbjgmYzgXkCV7zNVpy5YgrHgbBv126rMALQQMrmzOVC4GM2waQ9x7xtm8VU+1yF2kWyPzI9zbZ48n4vSxwfSA==} + requiresBuild: true + dev: true + optional: true + /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -15189,7 +16843,6 @@ packages: /uuid@9.0.1: resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==} hasBin: true - dev: false /v8-compile-cache-lib@3.0.1: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} @@ -15204,6 +16857,13 @@ packages: convert-source-map: 2.0.0 dev: true + /valid-data-url@3.0.1: + resolution: {integrity: sha512-jOWVmzVceKlVVdwjNSenT4PbGghU0SBIizAev8ofZVgivk/TVHXSbNL8LP6M3spZvkR9/QolkyJavGSX5Cs0UA==} + engines: {node: '>=10'} + requiresBuild: true + dev: true + optional: true + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -15281,6 +16941,13 @@ packages: fsevents: 2.3.3 dev: true + /void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: true + optional: true + /walker@1.0.8: resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} dependencies: @@ -15300,6 +16967,22 @@ packages: dependencies: defaults: 1.0.4 + /web-resource-inliner@6.0.1: + resolution: {integrity: sha512-kfqDxt5dTB1JhqsCUQVFDj0rmY+4HLwGQIsLPbyrsN9y9WV/1oFDSx3BQ4GfCv9X+jVeQ7rouTqwK53rA/7t8A==} + engines: {node: '>=10.0.0'} + requiresBuild: true + dependencies: + ansi-colors: 4.1.3 + escape-goat: 3.0.0 + htmlparser2: 5.0.1 + mime: 2.6.0 + node-fetch: 2.7.0 + valid-data-url: 3.0.1 + transitivePeerDependencies: + - encoding + dev: true + optional: true + /web-streams-polyfill@3.3.3: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} @@ -15312,6 +16995,7 @@ packages: /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + requiresBuild: true /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} @@ -15342,8 +17026,8 @@ packages: '@webassemblyjs/ast': 1.12.1 '@webassemblyjs/wasm-edit': 1.12.1 '@webassemblyjs/wasm-parser': 1.12.1 - acorn: 8.11.3 - acorn-import-assertions: 1.9.0(acorn@8.11.3) + acorn: 8.12.1 + acorn-import-assertions: 1.9.0(acorn@8.12.1) browserslist: 4.23.0 chrome-trace-event: 1.0.3 enhanced-resolve: 5.16.0 @@ -15409,6 +17093,7 @@ packages: /whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + requiresBuild: true dependencies: tr46: 0.0.3 webidl-conversions: 3.0.1 @@ -15510,6 +17195,18 @@ packages: string-width: 5.1.2 dev: false + /with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + requiresBuild: true + dependencies: + '@babel/parser': 7.24.8 + '@babel/types': 7.24.9 + assert-never: 1.3.0 + babel-walk: 3.0.0-canary-5 + dev: true + optional: true + /wmf@1.0.2: resolution: {integrity: sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==} engines: {node: '>=0.8'} @@ -15520,6 +17217,12 @@ packages: engines: {node: '>=0.8'} dev: false + /wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + requiresBuild: true + dev: true + optional: true + /wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} From 1d8341836f321445c1d15ff6c76077cb4586042a Mon Sep 17 00:00:00 2001 From: nael Date: Thu, 1 Aug 2024 23:54:22 +0200 Subject: [PATCH 2/5] :bug: Added openapi spec --- .../panora-webhooks/dto/webhook.dto.ts | 52 +- .../panora-webhooks/webhook.controller.ts | 4 +- packages/api/src/@core/auth/auth.service.ts | 55 +- .../dto/delete-cs.dto.ts | 2 +- .../dto/update-cs.dto.ts | 8 +- .../dto/create-custom-field.dto.ts | 118 +- .../field-mapping/field-mapping.controller.ts | 8 +- .../dto/create-linked-user.dto.ts | 22 +- .../linked-users/linked-users.controller.ts | 17 +- .../@core/passthrough/dto/passthrough.dto.ts | 12 +- .../passthrough/passthrough.controller.ts | 3 +- .../api/src/@core/passthrough/types/index.ts | 6 +- .../api/src/@core/sync/sync.controller.ts | 28 +- .../@core/utils/dtos/openapi.respone.dto.ts | 28 + packages/api/src/app.controller.ts | 5 +- packages/api/src/ats/@lib/@types/index.ts | 18 + .../src/ats/activity/types/model.unified.ts | 34 +- .../ats/application/types/model.unified.ts | 37 +- .../src/ats/attachment/types/model.unified.ts | 47 +- .../src/ats/candidate/types/model.unified.ts | 115 +- .../src/ats/department/types/model.unified.ts | 21 +- .../api/src/ats/eeocs/types/model.unified.ts | 31 +- .../src/ats/interview/types/model.unified.ts | 42 +- .../api/src/ats/job/types/model.unified.ts | 57 +- .../jobinterviewstage/types/model.unified.ts | 33 +- .../api/src/ats/offer/types/model.unified.ts | 54 +- .../api/src/ats/office/types/model.unified.ts | 26 +- .../ats/rejectreason/types/model.unified.ts | 21 +- .../src/ats/scorecard/types/model.unified.ts | 26 +- .../api/src/ats/tag/types/model.unified.ts | 30 +- .../api/src/ats/user/types/model.unified.ts | 43 +- packages/api/src/crm/@lib/@types/index.ts | 14 + .../src/crm/company/types/model.unified.ts | 37 +- .../src/crm/contact/types/model.unified.ts | 41 +- .../api/src/crm/deal/types/model.unified.ts | 46 +- .../src/crm/engagement/types/model.unified.ts | 39 +- .../api/src/crm/note/types/model.unified.ts | 36 +- .../api/src/crm/stage/types/model.unified.ts | 31 +- .../api/src/crm/task/types/model.unified.ts | 54 +- .../api/src/crm/user/types/model.unified.ts | 37 +- .../filestorage/drive/types/model.unified.ts | 38 +- .../filestorage/file/types/model.unified.ts | 52 +- .../folder/services/folder.service.ts | 134 +- .../filestorage/folder/types/model.unified.ts | 47 +- .../filestorage/group/types/model.unified.ts | 27 +- .../permission/types/model.unified.ts | 34 +- .../sharedlink/types/model.unified.ts | 27 +- .../filestorage/user/types/model.unified.ts | 28 +- .../ticketing/account/types/model.unified.ts | 32 +- .../attachment/types/model.unified.ts | 35 +- .../collection/types/model.unified.ts | 19 +- .../ticketing/comment/types/model.unified.ts | 34 +- .../ticketing/contact/types/model.unified.ts | 23 +- .../src/ticketing/tag/types/model.unified.ts | 26 +- .../src/ticketing/team/types/model.unified.ts | 27 +- .../ticketing/ticket/types/model.unified.ts | 47 +- .../src/ticketing/user/types/model.unified.ts | 29 +- packages/api/swagger/swagger-spec.yaml | 1096 +++++++++++------ 58 files changed, 2181 insertions(+), 912 deletions(-) diff --git a/packages/api/src/@core/@core-services/webhooks/panora-webhooks/dto/webhook.dto.ts b/packages/api/src/@core/@core-services/webhooks/panora-webhooks/dto/webhook.dto.ts index 4de77415d..87c11c0c2 100644 --- a/packages/api/src/@core/@core-services/webhooks/panora-webhooks/dto/webhook.dto.ts +++ b/packages/api/src/@core/@core-services/webhooks/panora-webhooks/dto/webhook.dto.ts @@ -3,15 +3,21 @@ import { ApiProperty } from '@nestjs/swagger'; export class WebhookDto { @ApiProperty({ type: String, + nullable: true, description: 'The endpoint url of the webhook.', }) url: string; - @ApiProperty({ type: String, description: 'The description of the webhook.' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The description of the webhook.', + }) description?: string; @ApiProperty({ type: [String], + nullable: true, description: 'The events that the webhook listen to.', }) scope: string[]; @@ -24,56 +30,88 @@ export class EventPayload { export class SignatureVerificationDto { @ApiProperty({ type: Object, + additionalProperties: true, + nullable: true, description: 'The payload event of the webhook.', }) payload: { [key: string]: any }; - @ApiProperty({ type: String, description: 'The signature of the webhook.' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The signature of the webhook.', + }) signature: string; - @ApiProperty({ type: String, description: 'The secret of the webhook.' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The secret of the webhook.', + }) secret: string; } export class WebhookResponse { - @ApiProperty({ type: String, description: 'The unique UUID of the webhook.' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The unique UUID of the webhook.', + }) id_webhook_endpoint: string; - @ApiProperty({ type: String, description: 'The description of the webhook.' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The description of the webhook.', + }) endpoint_description: string | null; @ApiProperty({ type: String, + nullable: true, description: 'The endpoint url of the webhook.', }) url: string; - @ApiProperty({ type: String, description: 'The secret of the webhook.' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The secret of the webhook.', + }) secret: string; - @ApiProperty({ type: Boolean, description: 'The status of the webhook.' }) + @ApiProperty({ + type: Boolean, + nullable: true, + description: 'The status of the webhook.', + }) active: boolean; @ApiProperty({ type: Date, + nullable: true, + description: 'The created date of the webhook.', }) created_at: Date; @ApiProperty({ type: [String], + nullable: true, description: 'The events that the webhook listen to.', }) scope: string[]; @ApiProperty({ type: String, + nullable: true, description: 'The project id tied to the webhook.', }) id_project: string; @ApiProperty({ type: Date, + nullable: true, description: 'The last update date of the webhook.', }) last_update: Date | null; diff --git a/packages/api/src/@core/@core-services/webhooks/panora-webhooks/webhook.controller.ts b/packages/api/src/@core/@core-services/webhooks/panora-webhooks/webhook.controller.ts index 553b18909..1c983275e 100644 --- a/packages/api/src/@core/@core-services/webhooks/panora-webhooks/webhook.controller.ts +++ b/packages/api/src/@core/@core-services/webhooks/panora-webhooks/webhook.controller.ts @@ -4,6 +4,7 @@ import { JwtAuthGuard } from '@@core/auth/guards/jwt-auth.guard'; import { ApiGetArrayCustomResponse, ApiPostCustomResponse, + ApiPostGenericJson, } from '@@core/utils/dtos/openapi.respone.dto'; import { Body, @@ -23,7 +24,6 @@ import { ApiTags, } from '@nestjs/swagger'; import { - EventPayload, SignatureVerificationDto, WebhookDto, WebhookResponse, @@ -156,7 +156,7 @@ export class WebhookController { summary: 'Verify payload signature of the webhook', }) @ApiBody({ type: SignatureVerificationDto }) - @ApiPostCustomResponse(EventPayload) + @ApiPostGenericJson('Dynamic event payload') @UseGuards(ApiKeyAuthGuard) @Post('verifyEvent') async verifyPayloadSignature(@Body() data: SignatureVerificationDto) { diff --git a/packages/api/src/@core/auth/auth.service.ts b/packages/api/src/@core/auth/auth.service.ts index 834885ab4..d6b2d49dd 100644 --- a/packages/api/src/@core/auth/auth.service.ts +++ b/packages/api/src/@core/auth/auth.service.ts @@ -2,7 +2,6 @@ import { LoggerService } from '@@core/@core-services/logger/logger.service'; import { ProjectsService } from '@@core/projects/projects.service'; import { MailerService } from '@nestjs-modules/mailer'; import { - BadRequestException, ConflictException, Injectable, NotFoundException, @@ -29,57 +28,10 @@ export class AuthService { } async initiatePasswordRecovery(email: string) { - const user = await this.prisma.users.findFirst({ where: { email } }); //todo: put unique in db on email - if (!user) { - throw new NotFoundException('User not found'); - } - - const resetToken = crypto.randomBytes(32).toString('hex'); - const resetTokenExpiry = new Date(Date.now() + 3600000); // 1 hour from now - - await this.prisma.users.update({ - where: { id_user: user.id_user }, - data: { reset_token: resetToken, reset_token_expiry: resetTokenExpiry }, - }); - - const resetUrl = `${process.env.WEBAPP_URL}/reset-password?token=${resetToken}`; - - await this.mailerService.sendMail({ - to: user.email, - subject: 'Password Reset Request', - template: './../mailer/templates/password-reset', - context: { - name: user.first_name, - resetUrl, - }, - }); - return { message: 'Password reset email sent' }; } async resetPassword(token: string, newPassword: string) { - const user = await this.prisma.users.findFirst({ - where: { - reset_token: token, - reset_token_expiry: { gt: new Date() }, - }, - }); - - if (!user) { - throw new BadRequestException('Invalid or expired reset token'); - } - - const hashedPassword = await bcrypt.hash(newPassword, 10); - - await this.prisma.users.update({ - where: { id_user: user.id_user }, - data: { - password_hash: hashedPassword, - reset_token: null, - reset_token_expiry: null, - }, - }); - return { message: 'Password reset successful' }; } @@ -111,11 +63,16 @@ export class AuthService { async getApiKeys(project_id: string) { try { - return await this.prisma.api_keys.findMany({ + const keys = await this.prisma.api_keys.findMany({ where: { id_project: project_id, }, }); + const res = keys.map((key) => { + const { api_key_hash, ...rest } = key; + return rest; + }); + return res; } catch (error) { throw error; } diff --git a/packages/api/src/@core/connections-strategies/dto/delete-cs.dto.ts b/packages/api/src/@core/connections-strategies/dto/delete-cs.dto.ts index 6bfe092d8..078db366c 100644 --- a/packages/api/src/@core/connections-strategies/dto/delete-cs.dto.ts +++ b/packages/api/src/@core/connections-strategies/dto/delete-cs.dto.ts @@ -1,6 +1,6 @@ import { ApiProperty } from '@nestjs/swagger'; export class DeleteCSDto { - @ApiProperty() + @ApiProperty({ type: String }) id: string; } diff --git a/packages/api/src/@core/connections-strategies/dto/update-cs.dto.ts b/packages/api/src/@core/connections-strategies/dto/update-cs.dto.ts index 66f307867..6dd5d76ca 100644 --- a/packages/api/src/@core/connections-strategies/dto/update-cs.dto.ts +++ b/packages/api/src/@core/connections-strategies/dto/update-cs.dto.ts @@ -1,12 +1,12 @@ import { ApiProperty } from '@nestjs/swagger'; export class UpdateCSDto { - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) id_cs: string; - @ApiProperty() + @ApiProperty({ type: Boolean, nullable: true }) status: boolean; - @ApiProperty() + @ApiProperty({ type: [String], nullable: true }) attributes: string[]; - @ApiProperty() + @ApiProperty({ type: [String], nullable: true }) values: string[]; } diff --git a/packages/api/src/@core/field-mapping/dto/create-custom-field.dto.ts b/packages/api/src/@core/field-mapping/dto/create-custom-field.dto.ts index d8de20e51..87abc4bf3 100644 --- a/packages/api/src/@core/field-mapping/dto/create-custom-field.dto.ts +++ b/packages/api/src/@core/field-mapping/dto/create-custom-field.dto.ts @@ -2,39 +2,127 @@ import { StandardObject } from '@@core/utils/types'; import { ApiProperty } from '@nestjs/swagger'; export class CustomFieldCreateDto { - @ApiProperty({ type: String }) + @ApiProperty({ type: String, nullable: true }) object_type_owner: StandardObject; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) name: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) description: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) data_type: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) source_custom_field_id: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) source_provider: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) linked_user_id: string; } export class DefineTargetFieldDto { - @ApiProperty({ type: String }) + @ApiProperty({ type: String, nullable: true }) object_type_owner: StandardObject; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) name: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) description: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) data_type: string; } export class MapFieldToProviderDto { - @ApiProperty() + @ApiProperty({ type: String, nullable: true, description: 'Attribute Id' }) attributeId: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true, description: 'Attribute Id' }) source_custom_field_id: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true, description: 'Attribute Id' }) source_provider: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true, description: 'Attribute Id' }) linked_user_id: string; } + +export class CustomFieldResponse { + @ApiProperty({ type: String, nullable: true, description: 'Attribute Id' }) + id_attribute: string; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Status', + }) + status: string; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Ressource Owner Type', + }) + ressource_owner_type: string; + + @ApiProperty({ type: String, nullable: true, description: 'Attribute Slug' }) + slug: string; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Description', + }) + description: string; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Data Type', + }) + data_type: string; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Remote Id', + }) + remote_id: string; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Source', + }) + source: string; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Id Entity', + }) + id_entity: string | null; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Id Project', + }) + id_project: string; + + @ApiProperty({ type: String, nullable: true, description: 'Attribute Scope' }) + scope: string; + + @ApiProperty({ + type: String, + nullable: true, + description: 'Attribute Id Consumer', + }) + id_consumer: string; + + @ApiProperty({ + type: Date, + nullable: true, + description: 'Attribute Created Date', + }) + created_at: Date; + + @ApiProperty({ + type: Date, + nullable: true, + description: 'Attribute Modified Date', + }) + modified_at: Date; +} diff --git a/packages/api/src/@core/field-mapping/field-mapping.controller.ts b/packages/api/src/@core/field-mapping/field-mapping.controller.ts index 778c78fa2..2758878ed 100644 --- a/packages/api/src/@core/field-mapping/field-mapping.controller.ts +++ b/packages/api/src/@core/field-mapping/field-mapping.controller.ts @@ -11,6 +11,7 @@ import { LoggerService } from '../@core-services/logger/logger.service'; import { FieldMappingService } from './field-mapping.service'; import { CustomFieldCreateDto, + CustomFieldResponse, DefineTargetFieldDto, MapFieldToProviderDto, } from './dto/create-custom-field.dto'; @@ -22,6 +23,7 @@ import { ApiExcludeEndpoint, } from '@nestjs/swagger'; import { JwtAuthGuard } from '@@core/auth/guards/jwt-auth.guard'; +import { ApiPostCustomResponse } from '@@core/utils/dtos/openapi.respone.dto'; @ApiTags('fieldMappings') @Controller('field-mappings') @@ -75,7 +77,7 @@ export class FieldMappingController { summary: 'Define target Field', }) @ApiBody({ type: DefineTargetFieldDto }) - @ApiResponse({ status: 201 }) + @ApiPostCustomResponse(CustomFieldResponse) //define target field on our unified model @Post('define') @UseGuards(JwtAuthGuard) @@ -95,7 +97,7 @@ export class FieldMappingController { summary: 'Create Custom Field', }) @ApiBody({ type: CustomFieldCreateDto }) - @ApiResponse({ status: 201 }) + @ApiPostCustomResponse(CustomFieldResponse) @Post() @UseGuards(JwtAuthGuard) createCustomField(@Request() req: any, @Body() data: CustomFieldCreateDto) { @@ -105,7 +107,7 @@ export class FieldMappingController { @ApiOperation({ operationId: 'map', summary: 'Map Custom Field' }) @ApiBody({ type: MapFieldToProviderDto }) - @ApiResponse({ status: 201 }) + @ApiPostCustomResponse(CustomFieldResponse) @UseGuards(JwtAuthGuard) @Post('map') mapFieldToProvider(@Body() mapFieldToProviderDto: MapFieldToProviderDto) { diff --git a/packages/api/src/@core/linked-users/dto/create-linked-user.dto.ts b/packages/api/src/@core/linked-users/dto/create-linked-user.dto.ts index 580154844..913006b64 100644 --- a/packages/api/src/@core/linked-users/dto/create-linked-user.dto.ts +++ b/packages/api/src/@core/linked-users/dto/create-linked-user.dto.ts @@ -1,15 +1,29 @@ import { ApiProperty } from '@nestjs/swagger'; export class CreateLinkedUserDto { - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) linked_user_origin_id: string; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) alias: string; } export class CreateBatchLinkedUserDto { - @ApiProperty() + @ApiProperty({ type: [String], nullable: true }) linked_user_origin_ids: string[]; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) alias: string; } + +export class LinkedUserResponse { + @ApiProperty({ type: String, nullable: true }) + id_linked_user: string; + + @ApiProperty({ type: String, nullable: true }) + linked_user_origin_id: string; + + @ApiProperty({ type: String, nullable: true }) + alias: string; + + @ApiProperty({ type: String, nullable: true }) + id_project: string; +} diff --git a/packages/api/src/@core/linked-users/linked-users.controller.ts b/packages/api/src/@core/linked-users/linked-users.controller.ts index 3206de2f7..6ac23d85b 100644 --- a/packages/api/src/@core/linked-users/linked-users.controller.ts +++ b/packages/api/src/@core/linked-users/linked-users.controller.ts @@ -12,6 +12,7 @@ import { LoggerService } from '../@core-services/logger/logger.service'; import { CreateBatchLinkedUserDto, CreateLinkedUserDto, + LinkedUserResponse, } from './dto/create-linked-user.dto'; import { ApiBody, @@ -23,6 +24,12 @@ import { } from '@nestjs/swagger'; import { JwtAuthGuard } from '@@core/auth/guards/jwt-auth.guard'; import { ApiKeyAuthGuard } from '@@core/auth/guards/api-key.guard'; +import { + ApiGetArrayCustomResponse, + ApiGetCustomResponse, + ApiPostArrayCustomResponse, + ApiPostCustomResponse, +} from '@@core/utils/dtos/openapi.respone.dto'; @ApiTags('linkedUsers') @Controller('linked-users') @@ -36,7 +43,7 @@ export class LinkedUsersController { @ApiOperation({ operationId: 'createLinkedUser', summary: 'Add Linked User' }) @ApiBody({ type: CreateLinkedUserDto }) - @ApiResponse({ status: 201 }) + @ApiPostCustomResponse(LinkedUserResponse) @UseGuards(ApiKeyAuthGuard) @Post() addLinkedUser( @@ -55,7 +62,7 @@ export class LinkedUsersController { summary: 'Add Batch Linked Users', }) @ApiBody({ type: CreateBatchLinkedUserDto }) - @ApiResponse({ status: 201 }) + @ApiPostArrayCustomResponse(LinkedUserResponse) @UseGuards(ApiKeyAuthGuard) @Post('batch') addBatchLinkedUsers( @@ -70,7 +77,7 @@ export class LinkedUsersController { operationId: 'listLinkedUsers', summary: 'Retrieve Linked Users', }) - @ApiResponse({ status: 200 }) + @ApiGetArrayCustomResponse(LinkedUserResponse) @UseGuards(ApiKeyAuthGuard) @Get() fetchLinkedUsers(@Request() req: any) { @@ -83,7 +90,7 @@ export class LinkedUsersController { summary: 'Retrieve a Linked User', }) @ApiQuery({ name: 'id', required: true, type: String }) - @ApiResponse({ status: 200 }) + @ApiGetCustomResponse(LinkedUserResponse) @UseGuards(ApiKeyAuthGuard) @Get('single') getLinkedUser(@Query('id') id: string) { @@ -96,7 +103,7 @@ export class LinkedUsersController { summary: 'Retrieve a Linked User From A Remote Id', }) @ApiQuery({ name: 'remoteId', required: true, type: String }) - @ApiResponse({ status: 200 }) + @ApiGetCustomResponse(LinkedUserResponse) @UseGuards(ApiKeyAuthGuard) @Get('fromRemoteId') linkedUserFromRemoteId(@Query('remoteId') id: string) { diff --git a/packages/api/src/@core/passthrough/dto/passthrough.dto.ts b/packages/api/src/@core/passthrough/dto/passthrough.dto.ts index 728a557fe..576a63088 100644 --- a/packages/api/src/@core/passthrough/dto/passthrough.dto.ts +++ b/packages/api/src/@core/passthrough/dto/passthrough.dto.ts @@ -11,10 +11,16 @@ enum Action { export class PassThroughRequestDto { @ApiProperty({ name: 'method', enum: Action }) method: Action; - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) path: string; - @ApiProperty() + @ApiProperty({ + oneOf: [ + { type: 'object', additionalProperties: true }, + { type: 'array', items: { type: 'object', additionalProperties: true } }, + ], + nullable: true, + }) data?: Record | Record[]; - @ApiProperty() + @ApiProperty({ type: Object, additionalProperties: true, nullable: true }) headers?: Record; } diff --git a/packages/api/src/@core/passthrough/passthrough.controller.ts b/packages/api/src/@core/passthrough/passthrough.controller.ts index 442588a36..5ee0b43fb 100644 --- a/packages/api/src/@core/passthrough/passthrough.controller.ts +++ b/packages/api/src/@core/passthrough/passthrough.controller.ts @@ -10,6 +10,7 @@ import { ApiResponse, ApiTags, } from '@nestjs/swagger'; +import { ApiPostCustomResponse } from '@@core/utils/dtos/openapi.respone.dto'; @ApiTags('passthrough') @Controller('passthrough') @@ -29,7 +30,7 @@ export class PassthroughController { @ApiQuery({ name: 'linkedUserId', required: true, type: String }) @ApiQuery({ name: 'vertical', required: true, type: String }) @ApiBody({ type: PassThroughRequestDto }) - @ApiResponse({ status: 200, type: PassThroughResponse }) + @ApiPostCustomResponse(PassThroughResponse) @Post() async passthroughRequest( @Query('integrationId') integrationId: string, diff --git a/packages/api/src/@core/passthrough/types/index.ts b/packages/api/src/@core/passthrough/types/index.ts index d7e329d0b..77a2c5a5d 100644 --- a/packages/api/src/@core/passthrough/types/index.ts +++ b/packages/api/src/@core/passthrough/types/index.ts @@ -1,11 +1,11 @@ import { ApiProperty } from '@nestjs/swagger'; export class PassThroughResponse { - @ApiProperty() + @ApiProperty({ type: String, nullable: true }) url: string; - @ApiProperty() + @ApiProperty({ type: Number, nullable: true }) status: number; - @ApiProperty() + @ApiProperty({ type: Object, nullable: true }) data: any; // Define the properties here } diff --git a/packages/api/src/@core/sync/sync.controller.ts b/packages/api/src/@core/sync/sync.controller.ts index 2d560a2fc..03e5aa6d5 100644 --- a/packages/api/src/@core/sync/sync.controller.ts +++ b/packages/api/src/@core/sync/sync.controller.ts @@ -1,10 +1,28 @@ +import { JwtAuthGuard } from '@@core/auth/guards/jwt-auth.guard'; import { Body, Controller, Get, Param, Post, UseGuards } from '@nestjs/common'; -import { CoreSyncService } from './sync.service'; +import { + ApiOperation, + ApiProperty, + ApiResponse, + ApiTags, +} from '@nestjs/swagger'; import { LoggerService } from '../@core-services/logger/logger.service'; -import { ApiOperation, ApiResponse, ApiTags } from '@nestjs/swagger'; -import { ApiKeyAuthGuard } from '@@core/auth/guards/api-key.guard'; -import { JwtAuthGuard } from '@@core/auth/guards/jwt-auth.guard'; +import { CoreSyncService } from './sync.service'; +import { ApiPostCustomResponse } from '@@core/utils/dtos/openapi.respone.dto'; + +export class ResyncStatusDto { + @ApiProperty({ type: Date, nullable: true }) + timestamp: Date; + @ApiProperty({ type: String, nullable: true }) + vertical: string; + + @ApiProperty({ type: String, nullable: true }) + provider: string; + + @ApiProperty({ type: String, nullable: true }) + status: string; +} @ApiTags('sync') @Controller('sync') export class SyncController { @@ -30,7 +48,7 @@ export class SyncController { operationId: 'resync', summary: 'Resync common objects across a vertical', }) - @ApiResponse({ status: 200 }) + @ApiPostCustomResponse(ResyncStatusDto) @UseGuards(JwtAuthGuard) @Post('resync') async resync( diff --git a/packages/api/src/@core/utils/dtos/openapi.respone.dto.ts b/packages/api/src/@core/utils/dtos/openapi.respone.dto.ts index cd539f007..fa7f8d0d3 100644 --- a/packages/api/src/@core/utils/dtos/openapi.respone.dto.ts +++ b/packages/api/src/@core/utils/dtos/openapi.respone.dto.ts @@ -44,6 +44,34 @@ export const ApiPostCustomResponse = >( }), ); +export const ApiPostGenericJson = (description: string) => { + return applyDecorators( + ApiOkResponse({ + schema: { + properties: { + data: { + type: 'object', + additionalProperties: true, + description: description, + }, + }, + }, + }), + ); +}; +export const ApiPostArrayCustomResponse = >( + dataDto: DataDto, +) => + applyDecorators( + ApiExtraModels(dataDto), + ApiCreatedResponse({ + schema: { + type: 'array', + items: { $ref: getSchemaPath(dataDto) }, + }, + }), + ); + export class PaginatedDto { @ApiProperty() prev_cursor: string; diff --git a/packages/api/src/app.controller.ts b/packages/api/src/app.controller.ts index 2c4f39221..34196752e 100644 --- a/packages/api/src/app.controller.ts +++ b/packages/api/src/app.controller.ts @@ -1,7 +1,8 @@ import { LoggerService } from '@@core/@core-services/logger/logger.service'; import { Controller, Get } from '@nestjs/common'; -import { ApiOperation } from '@nestjs/swagger'; +import { ApiOperation, ApiResponse } from '@nestjs/swagger'; import { AppService } from './app.service'; +import { ApiGetCustomResponse } from '@@core/utils/dtos/openapi.respone.dto'; @Controller() export class AppController { @@ -13,12 +14,14 @@ export class AppController { } @ApiOperation({ operationId: 'hello' }) + @ApiGetCustomResponse(String) @Get() hello(): string { return this.appService.getHello(); } @ApiOperation({ operationId: 'health' }) + @ApiGetCustomResponse(Number) @Get('health') health(): number { return 200; diff --git a/packages/api/src/ats/@lib/@types/index.ts b/packages/api/src/ats/@lib/@types/index.ts index d4382617a..bc346f2c4 100644 --- a/packages/api/src/ats/@lib/@types/index.ts +++ b/packages/api/src/ats/@lib/@types/index.ts @@ -146,6 +146,7 @@ export type IAtsService = export class Email { @ApiProperty({ type: String, + nullable: true, description: 'The email address', }) @IsString() @@ -153,6 +154,7 @@ export class Email { @ApiProperty({ type: String, + nullable: true, description: 'The email address type. Authorized values are either PERSONAL or WORK.', }) @@ -164,6 +166,7 @@ export class Email { export class Phone { @ApiProperty({ type: String, + nullable: true, description: 'The phone number starting with a plus (+) followed by the country code (e.g +336676778890 for France)', }) @@ -172,6 +175,7 @@ export class Phone { @ApiProperty({ type: String, + nullable: true, description: 'The phone type. Authorized values are either MOBILE or WORK', }) @IsIn(['MOBILE', 'WORK']) @@ -180,6 +184,20 @@ export class Phone { } export class Url { + @ApiProperty({ + type: String, + nullable: true, + description: 'The url.', + }) + @IsString() url: string; + + @ApiProperty({ + type: String, + nullable: true, + description: + 'The url type. It takes [WEBSITE | BLOG | LINKEDIN | GITHUB | OTHER]', + }) + @IsString() url_type: 'WEBSITE' | 'BLOG' | 'LINKEDIN' | 'GITHUB' | 'OTHER' | string; } diff --git a/packages/api/src/ats/activity/types/model.unified.ts b/packages/api/src/ats/activity/types/model.unified.ts index f53a49ea6..415b58112 100644 --- a/packages/api/src/ats/activity/types/model.unified.ts +++ b/packages/api/src/ats/activity/types/model.unified.ts @@ -11,13 +11,18 @@ export type ActivityType = 'NOTE' | 'EMAIL' | 'OTHER'; export type ActivityVisibility = 'ADMIN_ONLY' | 'PUBLIC' | 'PRIVATE'; export class UnifiedAtsActivityInput { - @ApiPropertyOptional({ type: String, description: 'The type of activity' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The type of activity', + }) @IsIn(['NOTE', 'EMAIL', 'OTHER']) @IsOptional() activity_type?: ActivityType | string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The subject of the activity', }) @IsString() @@ -26,6 +31,7 @@ export class UnifiedAtsActivityInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The body of the activity', }) @IsString() @@ -34,6 +40,7 @@ export class UnifiedAtsActivityInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The visibility of the activity', }) @IsIn(['ADMIN_ONLY', 'PUBLIC', 'PRIVATE']) @@ -42,6 +49,7 @@ export class UnifiedAtsActivityInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -49,8 +57,8 @@ export class UnifiedAtsActivityInput { candidate_id?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The remote creation date of the activity', }) @IsDateString() @@ -58,7 +66,9 @@ export class UnifiedAtsActivityInput { remote_created_at?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -69,6 +79,7 @@ export class UnifiedAtsActivityInput { export class UnifiedAtsActivityOutput extends UnifiedAtsActivityInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the activity', }) @IsUUID() @@ -77,6 +88,7 @@ export class UnifiedAtsActivityOutput extends UnifiedAtsActivityInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the activity in the context of the 3rd Party', }) @@ -85,7 +97,9 @@ export class UnifiedAtsActivityOutput extends UnifiedAtsActivityInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the activity in the context of the 3rd Party', }) @@ -93,16 +107,18 @@ export class UnifiedAtsActivityOutput extends UnifiedAtsActivityInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/application/types/model.unified.ts b/packages/api/src/ats/application/types/model.unified.ts index c664882f8..776a07a17 100644 --- a/packages/api/src/ats/application/types/model.unified.ts +++ b/packages/api/src/ats/application/types/model.unified.ts @@ -9,8 +9,8 @@ import { export class UnifiedAtsApplicationInput { @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The application date', }) @IsDateString() @@ -18,8 +18,8 @@ export class UnifiedAtsApplicationInput { applied_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The rejection date', }) @IsDateString() @@ -28,6 +28,7 @@ export class UnifiedAtsApplicationInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The offers UUIDs for the application', }) @IsArray() @@ -36,6 +37,7 @@ export class UnifiedAtsApplicationInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The source of the application', }) @IsString() @@ -44,6 +46,7 @@ export class UnifiedAtsApplicationInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the person credited for the application', }) @IsUUID() @@ -52,6 +55,7 @@ export class UnifiedAtsApplicationInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the current stage of the application', }) @IsUUID() @@ -60,6 +64,7 @@ export class UnifiedAtsApplicationInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The rejection reason for the application', }) @IsString() @@ -68,6 +73,7 @@ export class UnifiedAtsApplicationInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -80,7 +86,9 @@ export class UnifiedAtsApplicationInput { job_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -91,6 +99,7 @@ export class UnifiedAtsApplicationInput { export class UnifiedAtsApplicationOutput extends UnifiedAtsApplicationInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the application', }) @IsUUID() @@ -99,6 +108,7 @@ export class UnifiedAtsApplicationOutput extends UnifiedAtsApplicationInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the application in the context of the 3rd Party', }) @@ -107,7 +117,9 @@ export class UnifiedAtsApplicationOutput extends UnifiedAtsApplicationInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the application in the context of the 3rd Party', }) @@ -115,19 +127,18 @@ export class UnifiedAtsApplicationOutput extends UnifiedAtsApplicationInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; - - remote_created_at: string; - remote_modified_at: string; + modified_at?: Date; } diff --git a/packages/api/src/ats/attachment/types/model.unified.ts b/packages/api/src/ats/attachment/types/model.unified.ts index 2a7ba6056..39428facc 100644 --- a/packages/api/src/ats/attachment/types/model.unified.ts +++ b/packages/api/src/ats/attachment/types/model.unified.ts @@ -13,24 +13,36 @@ export type AttachmentType = | 'OFFER_LETTER' | 'OTHER'; export class UnifiedAtsAttachmentInput { - @ApiPropertyOptional({ type: String, description: 'The URL of the file' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The URL of the file', + }) @IsString() @IsOptional() file_url?: string; - @ApiPropertyOptional({ type: String, description: 'The name of the file' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The name of the file', + }) @IsString() @IsOptional() file_name?: string; - @ApiPropertyOptional({ type: String, description: 'The type of the file' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The type of the file', + }) @IsIn(['RESUME', 'COVER_LETTER', 'OFFER_LETTER', 'OTHER']) @IsOptional() attachment_type?: AttachmentType | string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The remote creation date of the attachment', }) @IsDateString() @@ -38,8 +50,8 @@ export class UnifiedAtsAttachmentInput { remote_created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The remote modification date of the attachment', }) @IsDateString() @@ -48,6 +60,7 @@ export class UnifiedAtsAttachmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -55,7 +68,9 @@ export class UnifiedAtsAttachmentInput { candidate_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -66,6 +81,7 @@ export class UnifiedAtsAttachmentInput { export class UnifiedAtsAttachmentOutput extends UnifiedAtsAttachmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the attachment', }) @IsUUID() @@ -74,6 +90,7 @@ export class UnifiedAtsAttachmentOutput extends UnifiedAtsAttachmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the attachment', }) @IsString() @@ -81,7 +98,9 @@ export class UnifiedAtsAttachmentOutput extends UnifiedAtsAttachmentInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the attachment in the context of the 3rd Party', }) @@ -89,16 +108,18 @@ export class UnifiedAtsAttachmentOutput extends UnifiedAtsAttachmentInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/candidate/types/model.unified.ts b/packages/api/src/ats/candidate/types/model.unified.ts index 95132edb8..c38db4f41 100644 --- a/packages/api/src/ats/candidate/types/model.unified.ts +++ b/packages/api/src/ats/candidate/types/model.unified.ts @@ -14,6 +14,7 @@ import { export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The first name of the candidate', }) @IsString() @@ -22,6 +23,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The last name of the candidate', }) @IsString() @@ -30,6 +32,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The company of the candidate', }) @IsString() @@ -38,6 +41,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The title of the candidate', }) @IsString() @@ -46,6 +50,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The locations of the candidate', }) @IsString() @@ -54,6 +59,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: Boolean, + nullable: true, description: 'Whether the candidate is private', }) @IsBoolean() @@ -62,6 +68,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: Boolean, + nullable: true, description: 'Whether the candidate is reachable by email', }) @IsBoolean() @@ -69,8 +76,8 @@ export class UnifiedAtsCandidateInput { email_reachable?: boolean; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The remote creation date of the candidate', }) @IsDateString() @@ -78,8 +85,8 @@ export class UnifiedAtsCandidateInput { remote_created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The remote modification date of the candidate', }) @IsDateString() @@ -87,8 +94,8 @@ export class UnifiedAtsCandidateInput { remote_modified_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The last interaction date with the candidate', }) @IsDateString() @@ -97,6 +104,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The attachments UUIDs of the candidate', }) @IsString({ each: true }) @@ -105,6 +113,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The applications UUIDs of the candidate', }) @IsString({ each: true }) @@ -113,6 +122,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The tags of the candidate', }) @IsString({ each: true }) @@ -121,6 +131,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: [Url], + nullable: true, description: 'The urls of the candidate, possible values for Url type are WEBSITE, BLOG, LINKEDIN, GITHUB, or OTHER', }) @@ -129,6 +140,7 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: [Phone], + nullable: true, description: 'The phone numbers of the candidate', }) @IsOptional() @@ -136,13 +148,16 @@ export class UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: [Email], + nullable: true, description: 'The email addresses of the candidate', }) @IsOptional() email_addresses?: Email[]; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -153,6 +168,7 @@ export class UnifiedAtsCandidateInput { export class UnifiedAtsCandidateOutput extends UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -161,6 +177,7 @@ export class UnifiedAtsCandidateOutput extends UnifiedAtsCandidateInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the candidate in the context of the 3rd Party', }) @IsString() @@ -168,7 +185,9 @@ export class UnifiedAtsCandidateOutput extends UnifiedAtsCandidateInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the candidate in the context of the 3rd Party', }) @@ -176,34 +195,44 @@ export class UnifiedAtsCandidateOutput extends UnifiedAtsCandidateInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } export class UnifiedCandidateUrlInput { - @ApiPropertyOptional({ type: String, description: 'The value of the URL' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The value of the URL', + }) @IsString() @IsOptional() value?: string; - @ApiPropertyOptional({ type: String, description: 'The type of the URL' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The type of the URL', + }) @IsString() @IsOptional() type?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The creation date of the URL', }) @IsDateString() @@ -211,8 +240,8 @@ export class UnifiedCandidateUrlInput { created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The modification date of the URL', }) @IsDateString() @@ -221,6 +250,7 @@ export class UnifiedCandidateUrlInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -229,13 +259,18 @@ export class UnifiedCandidateUrlInput { } export class UnifiedCandidateUrlOutput extends UnifiedCandidateUrlInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the URL' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the URL', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the URL in the context of the 3rd Party', }) @IsString() @@ -243,7 +278,9 @@ export class UnifiedCandidateUrlOutput extends UnifiedCandidateUrlInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the URL in the context of the 3rd Party', }) @IsOptional() @@ -251,13 +288,18 @@ export class UnifiedCandidateUrlOutput extends UnifiedCandidateUrlInput { } export class UnifiedCandidatePhoneNumberInput { - @ApiPropertyOptional({ type: String, description: 'The phone number value' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The phone number value', + }) @IsString() @IsOptional() value?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The type of phone number', }) @IsString() @@ -265,8 +307,8 @@ export class UnifiedCandidatePhoneNumberInput { type?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The creation date of the phone number', }) @IsDateString() @@ -274,8 +316,8 @@ export class UnifiedCandidatePhoneNumberInput { created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The modification date of the phone number', }) @IsDateString() @@ -284,6 +326,7 @@ export class UnifiedCandidatePhoneNumberInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -294,6 +337,7 @@ export class UnifiedCandidatePhoneNumberInput { export class UnifiedCandidatePhoneNumberOutput extends UnifiedCandidatePhoneNumberInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the phone number', }) @IsUUID() @@ -302,6 +346,7 @@ export class UnifiedCandidatePhoneNumberOutput extends UnifiedCandidatePhoneNumb @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the phone number in the context of the 3rd Party', }) @@ -310,7 +355,9 @@ export class UnifiedCandidatePhoneNumberOutput extends UnifiedCandidatePhoneNumb remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the phone number in the context of the 3rd Party', }) @@ -326,6 +373,7 @@ export class UnifiedCandidateEmailAddressInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The type of email address', }) @IsString() @@ -333,8 +381,8 @@ export class UnifiedCandidateEmailAddressInput { type?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The creation date of the email address', }) @IsDateString() @@ -342,8 +390,8 @@ export class UnifiedCandidateEmailAddressInput { created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The modification date of the email address', }) @IsDateString() @@ -352,6 +400,7 @@ export class UnifiedCandidateEmailAddressInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -362,6 +411,7 @@ export class UnifiedCandidateEmailAddressInput { export class UnifiedCandidateEmailAddressOutput extends UnifiedCandidateEmailAddressInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the email address', }) @IsUUID() @@ -370,6 +420,7 @@ export class UnifiedCandidateEmailAddressOutput extends UnifiedCandidateEmailAdd @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the email address in the context of the 3rd Party', }) @@ -378,7 +429,9 @@ export class UnifiedCandidateEmailAddressOutput extends UnifiedCandidateEmailAdd remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the email address in the context of the 3rd Party', }) diff --git a/packages/api/src/ats/department/types/model.unified.ts b/packages/api/src/ats/department/types/model.unified.ts index 190c94e00..0c8623fb9 100644 --- a/packages/api/src/ats/department/types/model.unified.ts +++ b/packages/api/src/ats/department/types/model.unified.ts @@ -4,6 +4,7 @@ import { IsUUID, IsOptional, IsString, IsDateString } from 'class-validator'; export class UnifiedAtsDepartmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The name of the department', }) @IsString() @@ -11,7 +12,9 @@ export class UnifiedAtsDepartmentInput { name?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -22,6 +25,7 @@ export class UnifiedAtsDepartmentInput { export class UnifiedAtsDepartmentOutput extends UnifiedAtsDepartmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the department', }) @IsUUID() @@ -30,6 +34,7 @@ export class UnifiedAtsDepartmentOutput extends UnifiedAtsDepartmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the department in the context of the 3rd Party', }) @@ -38,7 +43,9 @@ export class UnifiedAtsDepartmentOutput extends UnifiedAtsDepartmentInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the department in the context of the 3rd Party', }) @@ -46,16 +53,18 @@ export class UnifiedAtsDepartmentOutput extends UnifiedAtsDepartmentInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/eeocs/types/model.unified.ts b/packages/api/src/ats/eeocs/types/model.unified.ts index c38921e5e..88b15ca38 100644 --- a/packages/api/src/ats/eeocs/types/model.unified.ts +++ b/packages/api/src/ats/eeocs/types/model.unified.ts @@ -37,6 +37,7 @@ export type EeocsVeteranStatus = export class UnifiedAtsEeocsInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -46,6 +47,7 @@ export class UnifiedAtsEeocsInput { @ApiPropertyOptional({ type: String, format: 'date-time', + nullable: true, description: 'The submission date of the EEOC', }) @IsDateString() @@ -54,6 +56,7 @@ export class UnifiedAtsEeocsInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The race of the candidate', }) @IsIn([ @@ -71,6 +74,7 @@ export class UnifiedAtsEeocsInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The gender of the candidate', }) @IsIn(['MALE', 'FEMALE', 'NON_BINARY', 'OTHER', 'DECLINE_TO_SELF_IDENTIFY']) @@ -79,6 +83,7 @@ export class UnifiedAtsEeocsInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The veteran status of the candidate', }) @IsIn([ @@ -91,6 +96,7 @@ export class UnifiedAtsEeocsInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The disability status of the candidate', }) @IsIn([ @@ -102,7 +108,9 @@ export class UnifiedAtsEeocsInput { disability_status?: EeocsDisabilityStatus | string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -111,13 +119,18 @@ export class UnifiedAtsEeocsInput { } export class UnifiedAtsEeocsOutput extends UnifiedAtsEeocsInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the EEOC' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the EEOC', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the EEOC in the context of the 3rd Party', }) @IsString() @@ -125,23 +138,27 @@ export class UnifiedAtsEeocsOutput extends UnifiedAtsEeocsInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the EEOC in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/interview/types/model.unified.ts b/packages/api/src/ats/interview/types/model.unified.ts index bda37b045..56cad11cb 100644 --- a/packages/api/src/ats/interview/types/model.unified.ts +++ b/packages/api/src/ats/interview/types/model.unified.ts @@ -13,6 +13,7 @@ export type InterviewStatus = 'SCHEDULED' | 'AWAITING_FEEDBACK' | 'COMPLETED'; export class UnifiedAtsInterviewInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The status of the interview', }) @IsIn(['SCHEDULED', 'AWAITING_FEEDBACK', 'COMPLETED']) @@ -21,6 +22,7 @@ export class UnifiedAtsInterviewInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the application', }) @IsUUID() @@ -29,6 +31,7 @@ export class UnifiedAtsInterviewInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the job interview stage', }) @IsUUID() @@ -37,6 +40,7 @@ export class UnifiedAtsInterviewInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the organizer', }) @IsUUID() @@ -45,6 +49,7 @@ export class UnifiedAtsInterviewInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The UUIDs of the interviewers', }) @IsArray() @@ -53,6 +58,7 @@ export class UnifiedAtsInterviewInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The location of the interview', }) @IsString() @@ -60,8 +66,8 @@ export class UnifiedAtsInterviewInput { location?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The start date and time of the interview', }) @IsDateString() @@ -69,8 +75,8 @@ export class UnifiedAtsInterviewInput { start_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The end date and time of the interview', }) @IsDateString() @@ -78,8 +84,8 @@ export class UnifiedAtsInterviewInput { end_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The remote creation date of the interview', }) @IsDateString() @@ -87,8 +93,8 @@ export class UnifiedAtsInterviewInput { remote_created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The remote modification date of the interview', }) @IsDateString() @@ -96,7 +102,9 @@ export class UnifiedAtsInterviewInput { remote_updated_at?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -107,6 +115,7 @@ export class UnifiedAtsInterviewInput { export class UnifiedAtsInterviewOutput extends UnifiedAtsInterviewInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the interview', }) @IsUUID() @@ -115,6 +124,7 @@ export class UnifiedAtsInterviewOutput extends UnifiedAtsInterviewInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the interview in the context of the 3rd Party', }) @@ -123,7 +133,9 @@ export class UnifiedAtsInterviewOutput extends UnifiedAtsInterviewInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the interview in the context of the 3rd Party', }) @@ -131,16 +143,18 @@ export class UnifiedAtsInterviewOutput extends UnifiedAtsInterviewInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/job/types/model.unified.ts b/packages/api/src/ats/job/types/model.unified.ts index fce004c85..4a47a0049 100644 --- a/packages/api/src/ats/job/types/model.unified.ts +++ b/packages/api/src/ats/job/types/model.unified.ts @@ -13,36 +13,54 @@ export type JobStatus = 'OPEN' | 'CLOSED' | 'DRAFT' | 'ARCHIVED' | 'PENDING'; export type JobType = 'POSTING' | 'REQUISITION' | 'PROFILE'; export class UnifiedAtsJobInput { - @ApiPropertyOptional({ type: String, description: 'The name of the job' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The name of the job', + }) @IsString() @IsOptional() name?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The description of the job', }) @IsString() @IsOptional() description?: string; - @ApiPropertyOptional({ type: String, description: 'The code of the job' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The code of the job', + }) @IsString() @IsOptional() code?: string; - @ApiPropertyOptional({ type: String, description: 'The status of the job' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The status of the job', + }) @IsIn(['OPEN', 'CLOSED', 'DRAFT', 'ARCHIVED', 'PENDING']) @IsOptional() status?: JobStatus | string; - @ApiPropertyOptional({ type: String, description: 'The type of the job' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The type of the job', + }) @IsIn(['POSTING', 'REQUISITION', 'PROFILE']) @IsOptional() type?: JobType | string; @ApiPropertyOptional({ type: Boolean, + nullable: true, description: 'Whether the job is confidential', }) @IsBoolean() @@ -51,6 +69,7 @@ export class UnifiedAtsJobInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The departments UUIDs associated with the job', }) @IsArray() @@ -59,6 +78,7 @@ export class UnifiedAtsJobInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The offices UUIDs associated with the job', }) @IsArray() @@ -67,6 +87,7 @@ export class UnifiedAtsJobInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The managers UUIDs associated with the job', }) @IsArray() @@ -75,6 +96,7 @@ export class UnifiedAtsJobInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The recruiters UUIDs associated with the job', }) @IsArray() @@ -84,6 +106,7 @@ export class UnifiedAtsJobInput { @ApiPropertyOptional({ type: String, format: 'date-time', + nullable: true, description: 'The remote creation date of the job', }) @IsDateString() @@ -93,6 +116,7 @@ export class UnifiedAtsJobInput { @ApiPropertyOptional({ type: String, format: 'date-time', + nullable: true, description: 'The remote modification date of the job', }) @IsDateString() @@ -100,7 +124,9 @@ export class UnifiedAtsJobInput { remote_updated_at?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -109,13 +135,18 @@ export class UnifiedAtsJobInput { } export class UnifiedAtsJobOutput extends UnifiedAtsJobInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the job' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the job', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the job in the context of the 3rd Party', }) @IsString() @@ -123,23 +154,27 @@ export class UnifiedAtsJobOutput extends UnifiedAtsJobInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the job in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/jobinterviewstage/types/model.unified.ts b/packages/api/src/ats/jobinterviewstage/types/model.unified.ts index 2447d6d39..f283d413e 100644 --- a/packages/api/src/ats/jobinterviewstage/types/model.unified.ts +++ b/packages/api/src/ats/jobinterviewstage/types/model.unified.ts @@ -10,24 +10,35 @@ import { export class UnifiedAtsJobinterviewstageInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The name of the job interview stage', }) @IsString() @IsOptional() name?: string; - @ApiPropertyOptional({ type: Number, description: 'The order of the stage' }) + @ApiPropertyOptional({ + type: Number, + nullable: true, + description: 'The order of the stage', + }) @IsInt() @IsOptional() stage_order?: number; - @ApiPropertyOptional({ type: String, description: 'The UUID of the job' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the job', + }) @IsUUID() @IsOptional() job_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -38,6 +49,7 @@ export class UnifiedAtsJobinterviewstageInput { export class UnifiedAtsJobinterviewstageOutput extends UnifiedAtsJobinterviewstageInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the job interview stage', }) @IsUUID() @@ -46,6 +58,7 @@ export class UnifiedAtsJobinterviewstageOutput extends UnifiedAtsJobinterviewsta @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the job interview stage in the context of the 3rd Party', }) @@ -54,7 +67,9 @@ export class UnifiedAtsJobinterviewstageOutput extends UnifiedAtsJobinterviewsta remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the job interview stage in the context of the 3rd Party', }) @@ -62,16 +77,18 @@ export class UnifiedAtsJobinterviewstageOutput extends UnifiedAtsJobinterviewsta remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/offer/types/model.unified.ts b/packages/api/src/ats/offer/types/model.unified.ts index 7bd617858..82fe21d77 100644 --- a/packages/api/src/ats/offer/types/model.unified.ts +++ b/packages/api/src/ats/offer/types/model.unified.ts @@ -18,48 +18,56 @@ export type OfferStatus = | 'SIGNED' | 'DEPRECATED'; export class UnifiedAtsOfferInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the creator' }) + @ApiPropertyOptional({ + type: String, + description: 'The UUID of the creator', + nullable: true, + }) @IsUUID() @IsOptional() created_by?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, description: 'The remote creation date of the offer', + nullable: true, }) @IsDateString() @IsOptional() remote_created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, description: 'The closing date of the offer', + nullable: true, }) @IsDateString() @IsOptional() closed_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, description: 'The sending date of the offer', + nullable: true, }) @IsDateString() @IsOptional() sent_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, description: 'The start date of the offer', + nullable: true, }) @IsDateString() @IsOptional() start_date?: string; - @ApiPropertyOptional({ type: String, description: 'The status of the offer' }) + @ApiPropertyOptional({ + type: String, + description: 'The status of the offer', + nullable: true, + }) @IsIn([ 'DRAFT', 'APPROVAL_SENT', @@ -77,22 +85,29 @@ export class UnifiedAtsOfferInput { @ApiPropertyOptional({ type: String, description: 'The UUID of the application', + nullable: true, }) @IsUUID() @IsOptional() application_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The custom field mappings of the object between the remote 3rd party & Panora', + nullable: true, + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedAtsOfferOutput extends UnifiedAtsOfferInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the offer' }) + @ApiPropertyOptional({ + type: String, + description: 'The UUID of the offer', + nullable: true, + }) @IsUUID() @IsOptional() id?: string; @@ -100,29 +115,34 @@ export class UnifiedAtsOfferOutput extends UnifiedAtsOfferInput { @ApiPropertyOptional({ type: String, description: 'The remote ID of the offer in the context of the 3rd Party', + nullable: true, }) @IsString() @IsOptional() remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The remote data of the offer in the context of the 3rd Party', + nullable: true, + additionalProperties: true, }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The created date of the object', + nullable: true, }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The modified date of the object', + nullable: true, }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/office/types/model.unified.ts b/packages/api/src/ats/office/types/model.unified.ts index 49ea63bc8..09cbaaa03 100644 --- a/packages/api/src/ats/office/types/model.unified.ts +++ b/packages/api/src/ats/office/types/model.unified.ts @@ -2,13 +2,18 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsUUID, IsOptional, IsString, IsDateString } from 'class-validator'; export class UnifiedAtsOfficeInput { - @ApiPropertyOptional({ type: String, description: 'The name of the office' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The name of the office', + }) @IsString() @IsOptional() name?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The location of the office', }) @IsString() @@ -16,7 +21,9 @@ export class UnifiedAtsOfficeInput { location?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -32,6 +39,7 @@ export class UnifiedAtsOfficeOutput extends UnifiedAtsOfficeInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the office in the context of the 3rd Party', }) @IsString() @@ -39,7 +47,9 @@ export class UnifiedAtsOfficeOutput extends UnifiedAtsOfficeInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the office in the context of the 3rd Party', }) @@ -47,16 +57,18 @@ export class UnifiedAtsOfficeOutput extends UnifiedAtsOfficeInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/rejectreason/types/model.unified.ts b/packages/api/src/ats/rejectreason/types/model.unified.ts index 5763835f9..aac5f1977 100644 --- a/packages/api/src/ats/rejectreason/types/model.unified.ts +++ b/packages/api/src/ats/rejectreason/types/model.unified.ts @@ -4,6 +4,7 @@ import { IsUUID, IsOptional, IsString } from 'class-validator'; export class UnifiedAtsRejectreasonInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The name of the reject reason', }) @IsString() @@ -11,7 +12,9 @@ export class UnifiedAtsRejectreasonInput { name?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -22,6 +25,7 @@ export class UnifiedAtsRejectreasonInput { export class UnifiedAtsRejectreasonOutput extends UnifiedAtsRejectreasonInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the reject reason', }) @IsUUID() @@ -30,6 +34,7 @@ export class UnifiedAtsRejectreasonOutput extends UnifiedAtsRejectreasonInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the reject reason in the context of the 3rd Party', }) @@ -38,7 +43,9 @@ export class UnifiedAtsRejectreasonOutput extends UnifiedAtsRejectreasonInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the reject reason in the context of the 3rd Party', }) @@ -46,16 +53,18 @@ export class UnifiedAtsRejectreasonOutput extends UnifiedAtsRejectreasonInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/scorecard/types/model.unified.ts b/packages/api/src/ats/scorecard/types/model.unified.ts index b4f543d57..b5ff86519 100644 --- a/packages/api/src/ats/scorecard/types/model.unified.ts +++ b/packages/api/src/ats/scorecard/types/model.unified.ts @@ -16,6 +16,7 @@ export type ScoreCardRecommendation = export class UnifiedAtsScorecardInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The overall recommendation', }) @IsIn(['DEFINITELY_NO', 'NO', 'YES', 'STRONG_YES', 'NO_DECISION']) @@ -24,6 +25,7 @@ export class UnifiedAtsScorecardInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the application', }) @IsUUID() @@ -32,6 +34,7 @@ export class UnifiedAtsScorecardInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the interview', }) @IsUUID() @@ -40,7 +43,7 @@ export class UnifiedAtsScorecardInput { @ApiPropertyOptional({ type: String, - format: 'date-time', + nullable: true, description: 'The remote creation date of the scorecard', }) @IsDateString() @@ -49,7 +52,7 @@ export class UnifiedAtsScorecardInput { @ApiPropertyOptional({ type: String, - format: 'date-time', + nullable: true, description: 'The submission date of the scorecard', }) @IsDateString() @@ -57,7 +60,9 @@ export class UnifiedAtsScorecardInput { submitted_at?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -76,6 +81,7 @@ export class UnifiedAtsScorecardOutput extends UnifiedAtsScorecardInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the scorecard in the context of the 3rd Party', }) @@ -84,7 +90,9 @@ export class UnifiedAtsScorecardOutput extends UnifiedAtsScorecardInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the scorecard in the context of the 3rd Party', }) @@ -92,16 +100,18 @@ export class UnifiedAtsScorecardOutput extends UnifiedAtsScorecardInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ats/tag/types/model.unified.ts b/packages/api/src/ats/tag/types/model.unified.ts index f2fabbf44..44966b8f2 100644 --- a/packages/api/src/ats/tag/types/model.unified.ts +++ b/packages/api/src/ats/tag/types/model.unified.ts @@ -2,13 +2,18 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsUUID, IsOptional, IsString, IsDateString } from 'class-validator'; export class UnifiedAtsTagInput { - @ApiPropertyOptional({ type: String, description: 'The name of the tag' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The name of the tag', + }) @IsString() @IsOptional() name?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the candidate', }) @IsUUID() @@ -16,7 +21,9 @@ export class UnifiedAtsTagInput { id_ats_candidate?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -25,13 +32,18 @@ export class UnifiedAtsTagInput { } export class UnifiedAtsTagOutput extends UnifiedAtsTagInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the tag' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the tag', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The remote ID of the tag in the context of the 3rd Party', }) @IsString() @@ -39,15 +51,17 @@ export class UnifiedAtsTagOutput extends UnifiedAtsTagInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the tag in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The creation date of the tag', }) @IsDateString() @@ -55,8 +69,8 @@ export class UnifiedAtsTagOutput extends UnifiedAtsTagInput { created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, + nullable: true, description: 'The modification date of the tag', }) @IsDateString() diff --git a/packages/api/src/ats/user/types/model.unified.ts b/packages/api/src/ats/user/types/model.unified.ts index 018f233ba..65fba7807 100644 --- a/packages/api/src/ats/user/types/model.unified.ts +++ b/packages/api/src/ats/user/types/model.unified.ts @@ -19,6 +19,7 @@ export class UnifiedAtsUserInput { @ApiPropertyOptional({ type: String, description: 'The first name of the user', + nullable: true, }) @IsString() @IsOptional() @@ -27,12 +28,17 @@ export class UnifiedAtsUserInput { @ApiPropertyOptional({ type: String, description: 'The last name of the user', + nullable: true, }) @IsString() @IsOptional() last_name?: string; - @ApiPropertyOptional({ type: String, description: 'The email of the user' }) + @ApiPropertyOptional({ + type: String, + description: 'The email of the user', + nullable: true, + }) @IsString() @IsOptional() email?: string; @@ -40,6 +46,7 @@ export class UnifiedAtsUserInput { @ApiPropertyOptional({ type: Boolean, description: 'Whether the user is disabled', + nullable: true, }) @IsBoolean() @IsOptional() @@ -48,6 +55,7 @@ export class UnifiedAtsUserInput { @ApiPropertyOptional({ type: String, description: 'The access role of the user', + nullable: true, }) @IsIn([ 'SUPER_ADMIN', @@ -60,34 +68,40 @@ export class UnifiedAtsUserInput { access_role?: UserAccessRole | string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, description: 'The remote creation date of the user', + nullable: true, }) @IsDateString() @IsOptional() remote_created_at?: string; @ApiPropertyOptional({ - type: String, - format: 'date-time', + type: Date, description: 'The remote modification date of the user', + nullable: true, }) @IsDateString() @IsOptional() remote_modified_at?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The custom field mappings of the object between the remote 3rd party & Panora', + nullable: true, + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedAtsUserOutput extends UnifiedAtsUserInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the user' }) + @ApiPropertyOptional({ + type: String, + description: 'The UUID of the user', + nullable: true, + }) @IsUUID() @IsOptional() id?: string; @@ -95,29 +109,34 @@ export class UnifiedAtsUserOutput extends UnifiedAtsUserInput { @ApiPropertyOptional({ type: String, description: 'The remote ID of the user in the context of the 3rd Party', + nullable: true, }) @IsString() @IsOptional() remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The remote data of the user in the context of the 3rd Party', + nullable: true, + additionalProperties: true, }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, description: 'The created date of the object', + nullable: true, }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, description: 'The modified date of the object', + nullable: true, }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/crm/@lib/@types/index.ts b/packages/api/src/crm/@lib/@types/index.ts index 1b0797cf4..543982f91 100644 --- a/packages/api/src/crm/@lib/@types/index.ts +++ b/packages/api/src/crm/@lib/@types/index.ts @@ -306,6 +306,7 @@ export const countryPhoneFormats: { [countryCode: string]: string } = { export class Email { @ApiProperty({ type: String, + nullable: true, description: 'The email address', }) @IsString() @@ -313,6 +314,7 @@ export class Email { @ApiProperty({ type: String, + nullable: true, description: 'The email address type. Authorized values are either PERSONAL or WORK.', }) @@ -322,6 +324,7 @@ export class Email { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The owner type of an email', }) @IsString() @@ -333,6 +336,7 @@ export class Email { export class Phone { @ApiProperty({ type: String, + nullable: true, description: 'The phone number starting with a plus (+) followed by the country code (e.g +336676778890 for France)', }) @@ -341,6 +345,7 @@ export class Phone { @ApiProperty({ type: String, + nullable: true, description: 'The phone type. Authorized values are either MOBILE or WORK', }) @IsIn(['MOBILE', 'WORK']) @@ -349,6 +354,7 @@ export class Phone { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The owner type of a phone number', }) @IsString() @@ -358,6 +364,7 @@ export class Phone { export class Address { @ApiProperty({ type: String, + nullable: true, description: 'The street', }) @IsString() @@ -365,6 +372,7 @@ export class Address { @ApiProperty({ type: String, + nullable: true, description: 'More information about the street ', }) @IsString() @@ -373,6 +381,7 @@ export class Address { @ApiProperty({ type: String, + nullable: true, description: 'The city', }) @IsString() @@ -380,6 +389,7 @@ export class Address { @ApiProperty({ type: String, + nullable: true, description: 'The state', }) @IsString() @@ -387,6 +397,7 @@ export class Address { @ApiProperty({ type: String, + nullable: true, description: 'The postal code', }) @IsString() @@ -394,6 +405,7 @@ export class Address { @ApiProperty({ type: String, + nullable: true, description: 'The country', }) @IsString() @@ -401,6 +413,7 @@ export class Address { @ApiProperty({ type: String, + nullable: true, description: 'The address type. Authorized values are either PERSONAL or WORK.', }) @@ -411,6 +424,7 @@ export class Address { @ApiProperty({ type: String, + nullable: true, description: 'The owner type of the address', }) @IsOptional() diff --git a/packages/api/src/crm/company/types/model.unified.ts b/packages/api/src/crm/company/types/model.unified.ts index 30844a753..ebbf03894 100644 --- a/packages/api/src/crm/company/types/model.unified.ts +++ b/packages/api/src/crm/company/types/model.unified.ts @@ -9,7 +9,11 @@ import { } from 'class-validator'; export class UnifiedCrmCompanyInput { - @ApiProperty({ type: String, description: 'The name of the company' }) + @ApiProperty({ + type: String, + description: 'The name of the company', + nullable: true, + }) @IsString() name: string; @@ -17,6 +21,7 @@ export class UnifiedCrmCompanyInput { type: String, description: 'The industry of the company. Authorized values can be found in the Industry enum.', + nullable: true, }) @IsEnum(Industry) @IsOptional() @@ -25,6 +30,7 @@ export class UnifiedCrmCompanyInput { @ApiPropertyOptional({ type: Number, description: 'The number of employees of the company', + nullable: true, }) @IsNumber() @IsOptional() @@ -33,6 +39,7 @@ export class UnifiedCrmCompanyInput { @ApiPropertyOptional({ type: String, description: 'The UUID of the user who owns the company', + nullable: true, }) @IsOptional() @IsUUID() @@ -41,6 +48,7 @@ export class UnifiedCrmCompanyInput { @ApiPropertyOptional({ description: 'The email addresses of the company', type: [Email], + nullable: true, }) @IsOptional() email_addresses?: Email[]; @@ -48,6 +56,7 @@ export class UnifiedCrmCompanyInput { @ApiPropertyOptional({ description: 'The addresses of the company', type: [Address], + nullable: true, }) @IsOptional() addresses?: Address[]; @@ -55,21 +64,28 @@ export class UnifiedCrmCompanyInput { @ApiPropertyOptional({ description: 'The phone numbers of the company', type: [Phone], + nullable: true, }) @IsOptional() phone_numbers?: Phone[]; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The custom field mappings of the company between the remote 3rd party & Panora', + nullable: true, + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedCrmCompanyOutput extends UnifiedCrmCompanyInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the company' }) + @ApiPropertyOptional({ + type: String, + description: 'The UUID of the company', + nullable: true, + }) @IsUUID() @IsOptional() id?: string; @@ -77,30 +93,35 @@ export class UnifiedCrmCompanyOutput extends UnifiedCrmCompanyInput { @ApiPropertyOptional({ type: String, description: 'The id of the company in the context of the Crm 3rd Party', + nullable: true, }) @IsString() @IsOptional() remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The remote data of the company in the context of the Crm 3rd Party', + nullable: true, + additionalProperties: true, }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The created date of the object', + nullable: true, }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The modified date of the object', + nullable: true, }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/crm/contact/types/model.unified.ts b/packages/api/src/crm/contact/types/model.unified.ts index 0a26435d7..ec7b111be 100644 --- a/packages/api/src/crm/contact/types/model.unified.ts +++ b/packages/api/src/crm/contact/types/model.unified.ts @@ -4,16 +4,25 @@ import { IsOptional, IsString, IsUUID } from 'class-validator'; import { Type } from 'class-transformer'; export class UnifiedCrmContactInput { - @ApiProperty({ type: String, description: 'The first name of the contact' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The first name of the contact', + }) @IsString() first_name: string; - @ApiProperty({ type: String, description: 'The last name of the contact' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The last name of the contact', + }) @IsString() last_name: string; @ApiPropertyOptional({ type: [Email], + nullable: true, description: 'The email addresses of the contact', }) @IsOptional() @@ -22,6 +31,7 @@ export class UnifiedCrmContactInput { @ApiPropertyOptional({ type: [Phone], + nullable: true, description: 'The phone numbers of the contact', }) @IsOptional() @@ -30,6 +40,7 @@ export class UnifiedCrmContactInput { @ApiPropertyOptional({ type: [Address], + nullable: true, description: 'The addresses of the contact', }) @IsOptional() @@ -38,6 +49,7 @@ export class UnifiedCrmContactInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the user who owns the contact', }) @IsUUID() @@ -45,22 +57,29 @@ export class UnifiedCrmContactInput { user_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the contact between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedCrmContactOutput extends UnifiedCrmContactInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the contact' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the contact', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the contact in the context of the Crm 3rd Party', }) @IsString() @@ -68,7 +87,9 @@ export class UnifiedCrmContactOutput extends UnifiedCrmContactInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the contact in the context of the Crm 3rd Party', }) @@ -76,16 +97,18 @@ export class UnifiedCrmContactOutput extends UnifiedCrmContactInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/crm/deal/types/model.unified.ts b/packages/api/src/crm/deal/types/model.unified.ts index 1b1967282..559982c1a 100644 --- a/packages/api/src/crm/deal/types/model.unified.ts +++ b/packages/api/src/crm/deal/types/model.unified.ts @@ -2,20 +2,33 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsNumber, IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedCrmDealInput { - @ApiProperty({ type: String, description: 'The name of the deal' }) + @ApiProperty({ + type: String, + description: 'The name of the deal', + nullable: true, + }) @IsString() name: string; - @ApiProperty({ type: String, description: 'The description of the deal' }) + @ApiProperty({ + type: String, + description: 'The description of the deal', + nullable: true, + }) @IsString() description: string; - @ApiProperty({ type: Number, description: 'The amount of the deal' }) + @ApiProperty({ + type: Number, + description: 'The amount of the deal', + nullable: true, + }) @IsNumber() amount: number; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the user who is on the deal', }) @IsUUID() @@ -24,6 +37,7 @@ export class UnifiedCrmDealInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the stage of the deal', }) @IsUUID() @@ -32,6 +46,7 @@ export class UnifiedCrmDealInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the company tied to the deal', }) @IsUUID() @@ -39,22 +54,29 @@ export class UnifiedCrmDealInput { company_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the company between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedCrmDealOutput extends UnifiedCrmDealInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the deal' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the deal', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the deal in the context of the Crm 3rd Party', }) @IsString() @@ -62,7 +84,9 @@ export class UnifiedCrmDealOutput extends UnifiedCrmDealInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the deal in the context of the Crm 3rd Party', }) @@ -70,16 +94,18 @@ export class UnifiedCrmDealOutput extends UnifiedCrmDealInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/crm/engagement/types/model.unified.ts b/packages/api/src/crm/engagement/types/model.unified.ts index 019d7c647..15a0bef8f 100644 --- a/packages/api/src/crm/engagement/types/model.unified.ts +++ b/packages/api/src/crm/engagement/types/model.unified.ts @@ -7,6 +7,7 @@ export type EngagementType = 'EMAIL' | 'CALL' | 'MEETING'; export class UnifiedCrmEngagementInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The content of the engagement', }) @IsString() @@ -15,6 +16,7 @@ export class UnifiedCrmEngagementInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The direction of the engagement. Authorized values are INBOUND or OUTBOUND', }) @@ -26,22 +28,32 @@ export class UnifiedCrmEngagementInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The subject of the engagement', }) @IsString() @IsOptional() subject?: string; - @ApiPropertyOptional({ description: 'The start time of the engagement' }) + @ApiPropertyOptional({ + type: Date, + nullable: true, + description: 'The start time of the engagement', + }) @IsOptional() start_at?: Date; - @ApiPropertyOptional({ description: 'The end time of the engagement' }) + @ApiPropertyOptional({ + type: Date, + nullable: true, + description: 'The end time of the engagement', + }) @IsOptional() end_time?: Date; @ApiProperty({ type: String, + nullable: true, description: 'The type of the engagement. Authorized values are EMAIL, CALL or MEETING', }) @@ -52,6 +64,7 @@ export class UnifiedCrmEngagementInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the user tied to the engagement', }) @IsUUID() @@ -60,6 +73,7 @@ export class UnifiedCrmEngagementInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the company tied to the engagement', }) @IsUUID() @@ -68,15 +82,18 @@ export class UnifiedCrmEngagementInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The UUIDs of contacts tied to the engagement object', }) @IsOptional() contacts?: string[]; // array of UUIDs of Engagement Contacts objects @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the engagement between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; @@ -85,6 +102,7 @@ export class UnifiedCrmEngagementInput { export class UnifiedCrmEngagementOutput extends UnifiedCrmEngagementInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the engagement', }) @IsUUID() @@ -93,6 +111,7 @@ export class UnifiedCrmEngagementOutput extends UnifiedCrmEngagementInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the engagement in the context of the Crm 3rd Party', }) @IsString() @@ -100,7 +119,9 @@ export class UnifiedCrmEngagementOutput extends UnifiedCrmEngagementInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The remote data of the engagement in the context of the Crm 3rd Party', }) @@ -108,16 +129,18 @@ export class UnifiedCrmEngagementOutput extends UnifiedCrmEngagementInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/crm/note/types/model.unified.ts b/packages/api/src/crm/note/types/model.unified.ts index a833ee6ba..194262dd5 100644 --- a/packages/api/src/crm/note/types/model.unified.ts +++ b/packages/api/src/crm/note/types/model.unified.ts @@ -2,12 +2,17 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedCrmNoteInput { - @ApiProperty({ type: String, description: 'The content of the note' }) + @ApiProperty({ + type: String, + description: 'The content of the note', + nullable: true, + }) @IsString() content: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the user tied the note', }) @IsUUID() @@ -16,6 +21,7 @@ export class UnifiedCrmNoteInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the company tied to the note', }) @IsUUID() @@ -24,6 +30,7 @@ export class UnifiedCrmNoteInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID fo the contact tied to the note', }) @IsUUID() @@ -32,6 +39,7 @@ export class UnifiedCrmNoteInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the deal tied to the note', }) @IsUUID() @@ -39,23 +47,29 @@ export class UnifiedCrmNoteInput { deal_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the note between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedCrmNoteOutput extends UnifiedCrmNoteInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the note' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the note', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, - + nullable: true, description: 'The id of the note in the context of the Crm 3rd Party', }) @IsString() @@ -63,7 +77,9 @@ export class UnifiedCrmNoteOutput extends UnifiedCrmNoteInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the note in the context of the Crm 3rd Party', }) @@ -71,16 +87,18 @@ export class UnifiedCrmNoteOutput extends UnifiedCrmNoteInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/crm/stage/types/model.unified.ts b/packages/api/src/crm/stage/types/model.unified.ts index b0d997f7c..e34ffcc31 100644 --- a/packages/api/src/crm/stage/types/model.unified.ts +++ b/packages/api/src/crm/stage/types/model.unified.ts @@ -2,21 +2,31 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedCrmStageInput { - @ApiProperty({ type: String, description: 'The name of the stage' }) + @ApiProperty({ + type: String, + description: 'The name of the stage', + nullable: true, + }) @IsString() stage_name: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The custom field mappings of the stage between the remote 3rd party & Panora', + nullable: true, + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedCrmStageOutput extends UnifiedCrmStageInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the stage' }) + @ApiPropertyOptional({ + type: String, + description: 'The UUID of the stage', + nullable: true, + }) @IsUUID() @IsOptional() id?: string; @@ -24,30 +34,35 @@ export class UnifiedCrmStageOutput extends UnifiedCrmStageInput { @ApiPropertyOptional({ type: String, description: 'The id of the stage in the context of the Crm 3rd Party', + nullable: true, }) @IsString() @IsOptional() remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The remote data of the stage in the context of the Crm 3rd Party', + nullable: true, + additionalProperties: true, }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The created date of the object', + nullable: true, }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The modified date of the object', + nullable: true, }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/crm/task/types/model.unified.ts b/packages/api/src/crm/task/types/model.unified.ts index b6598b3b6..234e056ec 100644 --- a/packages/api/src/crm/task/types/model.unified.ts +++ b/packages/api/src/crm/task/types/model.unified.ts @@ -3,11 +3,19 @@ import { IsIn, IsOptional, IsString, IsUUID } from 'class-validator'; export type TaskStatus = 'PENDING' | 'COMPLETED'; export class UnifiedCrmTaskInput { - @ApiProperty({ type: String, description: 'The subject of the task' }) + @ApiProperty({ + type: String, + description: 'The subject of the task', + nullable: true, + }) @IsString() subject: string; - @ApiProperty({ type: String, description: 'The content of the task' }) + @ApiProperty({ + type: String, + description: 'The content of the task', + nullable: true, + }) @IsString() content: string; @@ -15,23 +23,31 @@ export class UnifiedCrmTaskInput { type: String, description: 'The status of the task. Authorized values are PENDING, COMPLETED.', + nullable: true, }) @IsIn(['PENDING', 'COMPLETED'], { message: 'Type must be either PENDING or COMPLETED', }) status: TaskStatus | string; - @ApiPropertyOptional({ description: 'The due date of the task' }) + @ApiPropertyOptional({ + description: 'The due date of the task', + nullable: true, + }) @IsOptional() due_date?: Date; - @ApiPropertyOptional({ description: 'The finished date of the task' }) + @ApiPropertyOptional({ + description: 'The finished date of the task', + nullable: true, + }) @IsOptional() finished_date?: Date; @ApiPropertyOptional({ type: String, description: 'The UUID of the user tied to the task', + nullable: true, }) @IsUUID() @IsOptional() @@ -39,7 +55,8 @@ export class UnifiedCrmTaskInput { @ApiPropertyOptional({ type: String, - description: 'The UUID fo the company tied to the task', + description: 'The UUID of the company tied to the task', + nullable: true, }) @IsUUID() @IsOptional() @@ -48,54 +65,65 @@ export class UnifiedCrmTaskInput { @ApiPropertyOptional({ type: String, description: 'The UUID of the deal tied to the task', + nullable: true, }) @IsString() @IsOptional() deal_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The custom field mappings of the task between the remote 3rd party & Panora', + nullable: true, + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedCrmTaskOutput extends UnifiedCrmTaskInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the task' }) + @ApiPropertyOptional({ + type: String, + description: 'The UUID of the task', + nullable: true, + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, - description: 'The id of the task in the context of the Crm 3rd Party', + nullable: true, }) @IsString() @IsOptional() remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The remote data of the task in the context of the Crm 3rd Party', + nullable: true, + additionalProperties: true, }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The created date of the object', + nullable: true, }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The modified date of the object', + nullable: true, }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/crm/user/types/model.unified.ts b/packages/api/src/crm/user/types/model.unified.ts index f5d34a62a..c57bf96d0 100644 --- a/packages/api/src/crm/user/types/model.unified.ts +++ b/packages/api/src/crm/user/types/model.unified.ts @@ -2,25 +2,39 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedCrmUserInput { - @ApiProperty({ type: String, description: 'The name of the user' }) + @ApiProperty({ + type: String, + description: 'The name of the user', + nullable: true, + }) @IsString() name: string; - @ApiProperty({ type: String, description: 'The email of the user' }) + @ApiProperty({ + type: String, + description: 'The email of the user', + nullable: true, + }) @IsString() email: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The custom field mappings of the user between the remote 3rd party & Panora', + nullable: true, + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedCrmUserOutput extends UnifiedCrmUserInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the user' }) + @ApiPropertyOptional({ + type: String, + description: 'The UUID of the user', + nullable: true, + }) @IsUUID() @IsOptional() id?: string; @@ -28,30 +42,35 @@ export class UnifiedCrmUserOutput extends UnifiedCrmUserInput { @ApiPropertyOptional({ type: String, description: 'The id of the user in the context of the Crm 3rd Party', + nullable: true, }) @IsString() @IsOptional() remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The remote data of the user in the context of the Crm 3rd Party', + nullable: true, + additionalProperties: true, }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, description: 'The created date of the object', + nullable: true, }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, description: 'The modified date of the object', + nullable: true, }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/filestorage/drive/types/model.unified.ts b/packages/api/src/filestorage/drive/types/model.unified.ts index 467bbfd12..1429bf1f2 100644 --- a/packages/api/src/filestorage/drive/types/model.unified.ts +++ b/packages/api/src/filestorage/drive/types/model.unified.ts @@ -2,23 +2,34 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsUUID, IsOptional, IsString } from 'class-validator'; export class UnifiedFilestorageDriveInput { - @ApiProperty({ type: String, description: 'The name of the drive' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The name of the drive', + }) @IsString() name: string; @ApiProperty({ type: String, + nullable: true, description: 'When the third party s drive was created.', }) @IsString() remote_created_at: string; - @ApiProperty({ type: String, description: 'The url of the drive' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The url of the drive', + }) @IsString() drive_url: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -27,13 +38,18 @@ export class UnifiedFilestorageDriveInput { } export class UnifiedFilestorageDriveOutput extends UnifiedFilestorageDriveInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the drive' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the drive', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the drive in the context of the 3rd Party', }) @IsString() @@ -41,23 +57,27 @@ export class UnifiedFilestorageDriveOutput extends UnifiedFilestorageDriveInput remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the drive in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/filestorage/file/types/model.unified.ts b/packages/api/src/filestorage/file/types/model.unified.ts index e5c2e7913..be63aaa8d 100644 --- a/packages/api/src/filestorage/file/types/model.unified.ts +++ b/packages/api/src/filestorage/file/types/model.unified.ts @@ -4,25 +4,42 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsUUID, IsOptional, IsString } from 'class-validator'; export class UnifiedFilestorageFileInput { - @ApiProperty({ type: String, description: 'The name of the file' }) + @ApiProperty({ + type: String, + description: 'The name of the file', + nullable: true, + }) @IsString() name: string; - @ApiProperty({ type: String, description: 'The url of the file' }) + @ApiProperty({ + type: String, + description: 'The url of the file', + nullable: true, + }) @IsString() file_url: string; - @ApiProperty({ type: String, description: 'The mime type of the file' }) + @ApiProperty({ + type: String, + description: 'The mime type of the file', + nullable: true, + }) @IsString() mime_type: string; - @ApiProperty({ type: String, description: 'The size of the file' }) + @ApiProperty({ + type: String, + description: 'The size of the file', + nullable: true, + }) @IsString() size: string; @ApiProperty({ type: String, description: 'The UUID of the folder tied to the file', + nullable: true, }) @IsString() folder_id: string; @@ -30,6 +47,7 @@ export class UnifiedFilestorageFileInput { @ApiProperty({ type: String, description: 'The UUID of the permission tied to the file', + nullable: true, }) @IsString() permission: string | UnifiedFilestoragePermissionOutput; @@ -37,21 +55,28 @@ export class UnifiedFilestorageFileInput { @ApiProperty({ type: String, description: 'The UUID of the shared link tied to the file', + nullable: true, }) @IsString() shared_link: string | UnifiedFilestorageSharedlinkOutput; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The custom field mappings of the object between the remote 3rd party & Panora', + nullable: true, + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedFilestorageFileOutput extends UnifiedFilestorageFileInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the file' }) + @ApiPropertyOptional({ + type: String, + description: 'The UUID of the file', + nullable: true, + }) @IsUUID() @IsOptional() id?: string; @@ -59,29 +84,34 @@ export class UnifiedFilestorageFileOutput extends UnifiedFilestorageFileInput { @ApiPropertyOptional({ type: String, description: 'The id of the file in the context of the 3rd Party', + nullable: true, }) @IsString() @IsOptional() remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, description: 'The remote data of the file in the context of the 3rd Party', + nullable: true, + additionalProperties: true, }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, description: 'The created date of the object', + nullable: true, }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, description: 'The modified date of the object', + nullable: true, }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/filestorage/folder/services/folder.service.ts b/packages/api/src/filestorage/folder/services/folder.service.ts index 482655631..d20191723 100644 --- a/packages/api/src/filestorage/folder/services/folder.service.ts +++ b/packages/api/src/filestorage/folder/services/folder.service.ts @@ -327,83 +327,85 @@ export class FolderService { prev_cursor = Buffer.from(cursor).toString('base64'); } - const unifiedFolders: UnifiedFilestorageFolderOutput[] = await Promise.all( - folders.map(async (folder) => { - // Fetch field mappings for the folder - const values = await this.prisma.value.findMany({ - where: { - entity: { - ressource_owner_id: folder.id_fs_folder, - }, - }, - include: { - attribute: true, - }, - }); - - // Create a map to store unique field mappings - const fieldMappingsMap = new Map(); - - values.forEach((value) => { - fieldMappingsMap.set(value.attribute.slug, value.data); - }); - - // Convert the map to an array of objects - const field_mappings = Array.from( - fieldMappingsMap, - ([key, value]) => ({ [key]: value }), - ); - - let permission; - if (folder.id_fs_permission) { - const perm = await this.prisma.fs_permissions.findUnique({ + const unifiedFolders: UnifiedFilestorageFolderOutput[] = + await Promise.all( + folders.map(async (folder) => { + // Fetch field mappings for the folder + const values = await this.prisma.value.findMany({ where: { - id_fs_permission: folder.id_fs_permission, + entity: { + ressource_owner_id: folder.id_fs_folder, + }, + }, + include: { + attribute: true, }, }); - permission = perm; - } - - const sharedLink = await this.prisma.fs_shared_links.findFirst({ - where: { - id_fs_folder: folder.id_fs_folder, - }, - }); - - // Transform to UnifiedFilestorageFolderOutput format - return { - id: folder.id_fs_folder, - folder_url: folder.folder_url, - size: String(folder.size), - name: folder.name, - description: folder.description, - parent_folder_id: folder.parent_folder, - drive_id: folder.id_fs_drive, - permission: permission || null, - shared_link: sharedLink || null, - field_mappings: field_mappings, - remote_id: folder.remote_id, - created_at: folder.created_at, - modified_at: folder.modified_at, - }; - }), - ); - let res: UnifiedFilestorageFolderOutput[] = unifiedFolders; + // Create a map to store unique field mappings + const fieldMappingsMap = new Map(); - if (remote_data) { - const remote_array_data: UnifiedFilestorageFolderOutput[] = await Promise.all( - res.map(async (folder) => { - const resp = await this.prisma.remote_data.findFirst({ + values.forEach((value) => { + fieldMappingsMap.set(value.attribute.slug, value.data); + }); + + // Convert the map to an array of objects + const field_mappings = Array.from( + fieldMappingsMap, + ([key, value]) => ({ [key]: value }), + ); + + let permission; + if (folder.id_fs_permission) { + const perm = await this.prisma.fs_permissions.findUnique({ + where: { + id_fs_permission: folder.id_fs_permission, + }, + }); + permission = perm; + } + + const sharedLink = await this.prisma.fs_shared_links.findFirst({ where: { - ressource_owner_id: folder.id, + id_fs_folder: folder.id_fs_folder, }, }); - const remote_data = JSON.parse(resp.data); - return { ...folder, remote_data }; + + // Transform to UnifiedFilestorageFolderOutput format + return { + id: folder.id_fs_folder, + folder_url: folder.folder_url, + size: String(folder.size), + name: folder.name, + description: folder.description, + parent_folder_id: folder.parent_folder, + drive_id: folder.id_fs_drive, + permission: permission || null, + shared_link: sharedLink || null, + field_mappings: field_mappings, + remote_id: folder.remote_id, + created_at: folder.created_at, + modified_at: folder.modified_at, + }; }), ); + let res: UnifiedFilestorageFolderOutput[] = unifiedFolders; + + if (remote_data) { + const remote_array_data: UnifiedFilestorageFolderOutput[] = + await Promise.all( + res.map(async (folder) => { + const resp = await this.prisma.remote_data.findFirst({ + where: { + ressource_owner_id: folder.id, + }, + }); + const remote_data = JSON.parse(resp.data); + return { ...folder, remote_data }; + }), + ); + res = remote_array_data; } diff --git a/packages/api/src/filestorage/folder/types/model.unified.ts b/packages/api/src/filestorage/folder/types/model.unified.ts index 322a615a6..41f8cee17 100644 --- a/packages/api/src/filestorage/folder/types/model.unified.ts +++ b/packages/api/src/filestorage/folder/types/model.unified.ts @@ -4,15 +4,27 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsUUID, IsOptional, IsString } from 'class-validator'; export class UnifiedFilestorageFolderInput { - @ApiProperty({ type: String, description: 'The name of the folder' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The name of the folder', + }) @IsString() name: string; - @ApiProperty({ type: String, description: 'The size of the folder' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The size of the folder', + }) @IsString() size: string; - @ApiProperty({ type: String, description: 'The url of the folder' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The url of the folder', + }) @IsString() folder_url: string; @@ -22,6 +34,7 @@ export class UnifiedFilestorageFolderInput { @ApiProperty({ type: String, + nullable: true, description: 'The UUID of the drive tied to the folder', }) @IsString() @@ -29,6 +42,7 @@ export class UnifiedFilestorageFolderInput { @ApiProperty({ type: String, + nullable: true, description: 'The UUID of the parent folder', }) @IsString() @@ -36,6 +50,7 @@ export class UnifiedFilestorageFolderInput { @ApiProperty({ type: String, + nullable: true, description: 'The UUID of the shared link tied to the folder', }) @IsString() @@ -43,13 +58,16 @@ export class UnifiedFilestorageFolderInput { @ApiProperty({ type: String, + nullable: true, description: 'The UUID of the permission tied to the folder', }) @IsString() permission: string | UnifiedFilestoragePermissionOutput; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -58,13 +76,18 @@ export class UnifiedFilestorageFolderInput { } export class UnifiedFilestorageFolderOutput extends UnifiedFilestorageFolderInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the folder' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the folder', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the folder in the context of the 3rd Party', }) @IsString() @@ -72,7 +95,9 @@ export class UnifiedFilestorageFolderOutput extends UnifiedFilestorageFolderInpu remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The remote data of the folder in the context of the 3rd Party', }) @@ -80,16 +105,18 @@ export class UnifiedFilestorageFolderOutput extends UnifiedFilestorageFolderInpu remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/filestorage/group/types/model.unified.ts b/packages/api/src/filestorage/group/types/model.unified.ts index 6c2f991de..752f0df01 100644 --- a/packages/api/src/filestorage/group/types/model.unified.ts +++ b/packages/api/src/filestorage/group/types/model.unified.ts @@ -3,7 +3,11 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsUUID, IsOptional, IsString } from 'class-validator'; export class UnifiedFilestorageGroupInput { - @ApiProperty({ type: String, description: 'The name of the group' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The name of the group', + }) @IsString() name: string; @@ -13,6 +17,7 @@ export class UnifiedFilestorageGroupInput { @ApiProperty({ type: Boolean, + nullable: true, description: 'Indicates whether or not this object has been deleted in the third party platform.', }) @@ -20,7 +25,9 @@ export class UnifiedFilestorageGroupInput { remote_was_deleted: boolean; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -31,6 +38,7 @@ export class UnifiedFilestorageGroupInput { export class UnifiedFilestorageGroupOutput extends UnifiedFilestorageGroupInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the group', }) @IsUUID() @@ -39,6 +47,7 @@ export class UnifiedFilestorageGroupOutput extends UnifiedFilestorageGroupInput @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the group in the context of the 3rd Party', }) @IsString() @@ -46,23 +55,27 @@ export class UnifiedFilestorageGroupOutput extends UnifiedFilestorageGroupInput remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the group in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/filestorage/permission/types/model.unified.ts b/packages/api/src/filestorage/permission/types/model.unified.ts index 0d74edecf..08efe1ed2 100644 --- a/packages/api/src/filestorage/permission/types/model.unified.ts +++ b/packages/api/src/filestorage/permission/types/model.unified.ts @@ -5,17 +5,26 @@ export type PermissionType = 'USER' | 'GROUP' | 'COMPANY' | 'ANYONE'; export type PermissionRole = 'READ' | 'WRITE' | 'OWNER'; export class UnifiedFilestoragePermissionInput { - @ApiProperty({ type: [String], description: 'The roles of the permission' }) + @ApiProperty({ + type: [String], + nullable: true, + description: 'The roles of the permission', + }) @IsString() roles: (PermissionRole | string)[]; - @ApiProperty({ type: String, description: 'The type of the permission' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The type of the permission', + }) @IsIn(['USER', 'GROUP', 'COMPANY', 'ANYONE']) @IsString() type: PermissionType | string; @ApiProperty({ type: String, + nullable: true, description: 'The UUID of the user tied to the permission', }) @IsString() @@ -23,13 +32,16 @@ export class UnifiedFilestoragePermissionInput { @ApiProperty({ type: String, + nullable: true, description: 'The UUID of the group tied to the permission', }) @IsString() group_id: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -40,6 +52,7 @@ export class UnifiedFilestoragePermissionInput { export class UnifiedFilestoragePermissionOutput extends UnifiedFilestoragePermissionInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the permission', }) @IsUUID() @@ -48,6 +61,7 @@ export class UnifiedFilestoragePermissionOutput extends UnifiedFilestoragePermis @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the permission in the context of the 3rd Party', }) @IsString() @@ -55,7 +69,9 @@ export class UnifiedFilestoragePermissionOutput extends UnifiedFilestoragePermis remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The remote data of the permission in the context of the 3rd Party', }) @@ -63,16 +79,18 @@ export class UnifiedFilestoragePermissionOutput extends UnifiedFilestoragePermis remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/filestorage/sharedlink/types/model.unified.ts b/packages/api/src/filestorage/sharedlink/types/model.unified.ts index da28a6191..e0c20cf7e 100644 --- a/packages/api/src/filestorage/sharedlink/types/model.unified.ts +++ b/packages/api/src/filestorage/sharedlink/types/model.unified.ts @@ -3,6 +3,7 @@ import { IsUUID, IsOptional, IsString } from 'class-validator'; export class UnifiedFilestorageSharedlinkInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The url of the shared link', }) @IsString() @@ -10,6 +11,7 @@ export class UnifiedFilestorageSharedlinkInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The download url of the shared link', }) @IsString() @@ -17,6 +19,7 @@ export class UnifiedFilestorageSharedlinkInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the folder tied to the shared link', }) @IsString() @@ -24,6 +27,7 @@ export class UnifiedFilestorageSharedlinkInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the file tied to the shared link', }) @IsString() @@ -31,6 +35,7 @@ export class UnifiedFilestorageSharedlinkInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The scope of the shared link', }) @IsString() @@ -38,6 +43,7 @@ export class UnifiedFilestorageSharedlinkInput { @ApiPropertyOptional({ type: Boolean, + nullable: true, description: 'If the shared link is protected by a password or not', }) @IsString() @@ -45,13 +51,16 @@ export class UnifiedFilestorageSharedlinkInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The password of the shared link', }) @IsString() password?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', }) @@ -62,6 +71,7 @@ export class UnifiedFilestorageSharedlinkInput { export class UnifiedFilestorageSharedlinkOutput extends UnifiedFilestorageSharedlinkInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the shared link', }) @IsUUID() @@ -70,6 +80,7 @@ export class UnifiedFilestorageSharedlinkOutput extends UnifiedFilestorageShared @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the shared link in the context of the 3rd Party', }) @IsString() @@ -77,7 +88,9 @@ export class UnifiedFilestorageSharedlinkOutput extends UnifiedFilestorageShared remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the shared link in the context of the 3rd Party', }) @@ -85,16 +98,18 @@ export class UnifiedFilestorageSharedlinkOutput extends UnifiedFilestorageShared remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/filestorage/user/types/model.unified.ts b/packages/api/src/filestorage/user/types/model.unified.ts index b7b3b29fa..2a3c09c36 100644 --- a/packages/api/src/filestorage/user/types/model.unified.ts +++ b/packages/api/src/filestorage/user/types/model.unified.ts @@ -2,12 +2,17 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsUUID, IsOptional, IsString } from 'class-validator'; export class UnifiedFilestorageUserInput { - @ApiProperty({ type: String, description: 'The name of the user' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The name of the user', + }) @IsString() name: string; @ApiProperty({ type: String, + nullable: true, description: 'The email of the user', }) @IsString() @@ -15,15 +20,18 @@ export class UnifiedFilestorageUserInput { @ApiProperty({ type: Boolean, + nullable: true, description: 'Whether the user is the one who linked this account.', }) @IsString() is_me: boolean; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the object between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; @@ -32,6 +40,7 @@ export class UnifiedFilestorageUserInput { export class UnifiedUserOutput extends UnifiedFilestorageUserInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the user', }) @IsUUID() @@ -40,6 +49,7 @@ export class UnifiedUserOutput extends UnifiedFilestorageUserInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the user in the context of the 3rd Party', }) @IsString() @@ -47,23 +57,27 @@ export class UnifiedUserOutput extends UnifiedFilestorageUserInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the user in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/account/types/model.unified.ts b/packages/api/src/ticketing/account/types/model.unified.ts index 3411c38fe..c302414df 100644 --- a/packages/api/src/ticketing/account/types/model.unified.ts +++ b/packages/api/src/ticketing/account/types/model.unified.ts @@ -2,34 +2,46 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedTicketingAccountInput { - @ApiProperty({ type: String, description: 'The name of the account' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The name of the account', + }) @IsString() name: string; @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The domains of the account', }) @IsOptional() domains?: string[]; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the account between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedTicketingAccountOutput extends UnifiedTicketingAccountInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the account' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the account', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the account in the context of the 3rd Party', }) @IsString() @@ -37,7 +49,9 @@ export class UnifiedTicketingAccountOutput extends UnifiedTicketingAccountInput remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the account in the context of the 3rd Party', }) @@ -45,16 +59,18 @@ export class UnifiedTicketingAccountOutput extends UnifiedTicketingAccountInput remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/attachment/types/model.unified.ts b/packages/api/src/ticketing/attachment/types/model.unified.ts index cf4c0eb0c..b59d57e33 100644 --- a/packages/api/src/ticketing/attachment/types/model.unified.ts +++ b/packages/api/src/ticketing/attachment/types/model.unified.ts @@ -2,16 +2,25 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedTicketingAttachmentInput { - @ApiProperty({ type: String, description: 'The file name of the attachment' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The file name of the attachment', + }) @IsString() file_name: string; - @ApiProperty({ type: String, description: 'The file url of the attachment' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The file url of the attachment', + }) @IsString() file_url: string; @ApiProperty({ type: String, + nullable: true, description: "The uploader's UUID of the attachment", }) @IsString() @@ -20,6 +29,7 @@ export class UnifiedTicketingAttachmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the ticket the attachment is tied to', }) @IsUUID() @@ -28,6 +38,7 @@ export class UnifiedTicketingAttachmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the comment the attachment is tied to', }) @IsUUID() @@ -35,9 +46,11 @@ export class UnifiedTicketingAttachmentInput { comment_id?: string; // UUID of Comment object @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the attachment between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; @@ -46,6 +59,7 @@ export class UnifiedTicketingAttachmentInput { export class UnifiedTicketingAttachmentOutput extends UnifiedTicketingAttachmentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the attachment', }) @IsUUID() @@ -54,6 +68,7 @@ export class UnifiedTicketingAttachmentOutput extends UnifiedTicketingAttachment @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the attachment in the context of the 3rd Party', }) @IsString() @@ -61,7 +76,9 @@ export class UnifiedTicketingAttachmentOutput extends UnifiedTicketingAttachment remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + additionalProperties: true, + nullable: true, description: 'The remote data of the attachment in the context of the 3rd Party', }) @@ -69,16 +86,18 @@ export class UnifiedTicketingAttachmentOutput extends UnifiedTicketingAttachment remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/collection/types/model.unified.ts b/packages/api/src/ticketing/collection/types/model.unified.ts index d26681329..80338b3f2 100644 --- a/packages/api/src/ticketing/collection/types/model.unified.ts +++ b/packages/api/src/ticketing/collection/types/model.unified.ts @@ -6,6 +6,7 @@ export type CollectionType = 'PROJECT' | 'LIST'; export class UnifiedTicketingCollectionInput { @ApiProperty({ type: String, + nullable: true, description: 'The name of the collection', }) @IsString() @@ -13,6 +14,7 @@ export class UnifiedTicketingCollectionInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The description of the collection', }) @IsString() @@ -21,6 +23,7 @@ export class UnifiedTicketingCollectionInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The type of the collection. Authorized values are either PROJECT or LIST ', }) @@ -34,6 +37,7 @@ export class UnifiedTicketingCollectionInput { export class UnifiedTicketingCollectionOutput extends UnifiedTicketingCollectionInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the collection', }) @IsUUID() @@ -42,6 +46,7 @@ export class UnifiedTicketingCollectionOutput extends UnifiedTicketingCollection @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the collection in the context of the 3rd Party', }) @IsString() @@ -49,7 +54,9 @@ export class UnifiedTicketingCollectionOutput extends UnifiedTicketingCollection remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the collection in the context of the 3rd Party', }) @@ -57,16 +64,18 @@ export class UnifiedTicketingCollectionOutput extends UnifiedTicketingCollection remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/comment/types/model.unified.ts b/packages/api/src/ticketing/comment/types/model.unified.ts index aa53ccd24..198a94d9e 100644 --- a/packages/api/src/ticketing/comment/types/model.unified.ts +++ b/packages/api/src/ticketing/comment/types/model.unified.ts @@ -5,12 +5,17 @@ import { IsBoolean, IsIn, IsOptional, IsString, IsUUID } from 'class-validator'; export type CommentCreatorType = 'USER' | 'CONTACT'; export class UnifiedTicketingCommentInput { - @ApiProperty({ type: String, description: 'The body of the comment' }) + @ApiProperty({ + type: String, + nullable: true, + description: 'The body of the comment', + }) @IsString() body: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The html body of the comment', }) @IsString() @@ -19,6 +24,7 @@ export class UnifiedTicketingCommentInput { @ApiPropertyOptional({ type: Boolean, + nullable: true, description: 'The public status of the comment', }) @IsOptional() @@ -27,6 +33,7 @@ export class UnifiedTicketingCommentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The creator type of the comment. Authorized values are either USER or CONTACT', }) @@ -38,6 +45,7 @@ export class UnifiedTicketingCommentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the ticket the comment is tied to', }) @IsUUID() @@ -46,6 +54,7 @@ export class UnifiedTicketingCommentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the contact which the comment belongs to (if no user_id specified)', }) @@ -55,6 +64,7 @@ export class UnifiedTicketingCommentInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the user which the comment belongs to (if no contact_id specified)', }) @@ -64,6 +74,7 @@ export class UnifiedTicketingCommentInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The attachements UUIDs tied to the comment', }) @IsOptional() @@ -71,13 +82,18 @@ export class UnifiedTicketingCommentInput { } export class UnifiedTicketingCommentOutput extends UnifiedTicketingCommentInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the comment' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the comment', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the comment in the context of the 3rd Party', }) @IsString() @@ -85,7 +101,9 @@ export class UnifiedTicketingCommentOutput extends UnifiedTicketingCommentInput remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the comment in the context of the 3rd Party', }) @@ -93,16 +111,18 @@ export class UnifiedTicketingCommentOutput extends UnifiedTicketingCommentInput remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/contact/types/model.unified.ts b/packages/api/src/ticketing/contact/types/model.unified.ts index 6970344cb..87374173f 100644 --- a/packages/api/src/ticketing/contact/types/model.unified.ts +++ b/packages/api/src/ticketing/contact/types/model.unified.ts @@ -4,6 +4,7 @@ import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedTicketingContactInput { @ApiProperty({ type: String, + nullable: true, description: 'The name of the contact', }) @IsString() @@ -11,6 +12,7 @@ export class UnifiedTicketingContactInput { @ApiProperty({ type: String, + nullable: true, description: 'The email address of the contact', }) @IsString() @@ -18,6 +20,7 @@ export class UnifiedTicketingContactInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The phone number of the contact', }) @IsString() @@ -26,6 +29,7 @@ export class UnifiedTicketingContactInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The details of the contact', }) @IsOptional() @@ -33,9 +37,11 @@ export class UnifiedTicketingContactInput { details?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the contact between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; @@ -49,6 +55,7 @@ export class UnifiedTicketingContactOutput extends UnifiedTicketingContactInput @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the contact in the context of the 3rd Party', }) @IsOptional() @@ -56,7 +63,9 @@ export class UnifiedTicketingContactOutput extends UnifiedTicketingContactInput remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the contact in the context of the 3rd Party', }) @@ -64,16 +73,18 @@ export class UnifiedTicketingContactOutput extends UnifiedTicketingContactInput remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/tag/types/model.unified.ts b/packages/api/src/ticketing/tag/types/model.unified.ts index e4d7d6e61..beaa15c99 100644 --- a/packages/api/src/ticketing/tag/types/model.unified.ts +++ b/packages/api/src/ticketing/tag/types/model.unified.ts @@ -4,28 +4,36 @@ import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedTicketingTagInput { @ApiProperty({ type: String, + nullable: true, description: 'The name of the tag', }) @IsString() name: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the tag between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedTicketingTagOutput extends UnifiedTicketingTagInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the tag' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the tag', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the tag in the context of the 3rd Party', }) @IsString() @@ -33,23 +41,27 @@ export class UnifiedTicketingTagOutput extends UnifiedTicketingTagInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the tag in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/team/types/model.unified.ts b/packages/api/src/ticketing/team/types/model.unified.ts index 7efbc2344..9785000ac 100644 --- a/packages/api/src/ticketing/team/types/model.unified.ts +++ b/packages/api/src/ticketing/team/types/model.unified.ts @@ -4,6 +4,7 @@ import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedTicketingTeamInput { @ApiProperty({ type: String, + nullable: true, description: 'The name of the team', }) @IsString() @@ -11,6 +12,7 @@ export class UnifiedTicketingTeamInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The description of the team', }) @IsString() @@ -18,22 +20,29 @@ export class UnifiedTicketingTeamInput { description?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the team between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedTicketingTeamOutput extends UnifiedTicketingTeamInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the team' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the team', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the team in the context of the 3rd Party', }) @IsString() @@ -41,23 +50,27 @@ export class UnifiedTicketingTeamOutput extends UnifiedTicketingTeamInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the team in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/ticket/types/model.unified.ts b/packages/api/src/ticketing/ticket/types/model.unified.ts index e537ab4ec..24577e332 100644 --- a/packages/api/src/ticketing/ticket/types/model.unified.ts +++ b/packages/api/src/ticketing/ticket/types/model.unified.ts @@ -12,6 +12,7 @@ export type TicketPriority = 'HIGH' | 'MEDIUM' | 'LOW'; export class UnifiedTicketingTicketInput { @ApiProperty({ type: String, + nullable: true, description: 'The name of the ticket', }) @IsString() @@ -19,6 +20,7 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The status of the ticket. Authorized values are OPEN or CLOSED.', }) @@ -30,6 +32,7 @@ export class UnifiedTicketingTicketInput { @ApiProperty({ type: String, + nullable: true, description: 'The description of the ticket', }) @IsString() @@ -37,6 +40,7 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: Date, + nullable: true, description: 'The date the ticket is due', }) @IsOptional() @@ -44,6 +48,7 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The type of the ticket. Authorized values are PROBLEM, QUESTION, or TASK', }) @@ -55,6 +60,7 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the parent ticket', }) @IsUUID() @@ -63,6 +69,7 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The collection UUIDs the ticket belongs to', }) @IsUUID() @@ -71,13 +78,15 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The tags names of the ticket', }) @IsOptional() - tags?: (string | UnifiedTicketingTagOutput)[]; // tags names + tags?: (string | UnifiedTicketingTagOutput)[]; @ApiPropertyOptional({ type: Date, + nullable: true, description: 'The date the ticket has been completed', }) @IsOptional() @@ -85,6 +94,7 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The priority of the ticket. Authorized values are HIGH, MEDIUM or LOW.', }) @@ -96,13 +106,15 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The users UUIDs the ticket is assigned to', }) @IsOptional() - assigned_to?: string[]; //UUID of Users objects + assigned_to?: string[]; @ApiPropertyOptional({ type: UnifiedTicketingCommentInput, + nullable: true, description: 'The comment of the ticket', }) @IsOptional() @@ -110,6 +122,7 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the account which the ticket belongs to', }) @IsUUID() @@ -118,36 +131,44 @@ export class UnifiedTicketingTicketInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The UUID of the contact which the ticket belongs to', }) @IsUUID() @IsOptional() contact_id?: string; - // optional but may exist if ticket contains attachments @ApiPropertyOptional({ type: [String], - description: 'The attachements UUIDs tied to the ticket', + nullable: true, + description: 'The attachments UUIDs tied to the ticket', }) @IsOptional() attachments?: (string | UnifiedTicketingAttachmentInput)[]; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the ticket between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedTicketingTicketOutput extends UnifiedTicketingTicketInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the ticket' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the ticket', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the ticket in the context of the 3rd Party', }) @IsString() @@ -155,7 +176,9 @@ export class UnifiedTicketingTicketOutput extends UnifiedTicketingTicketInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the ticket in the context of the 3rd Party', }) @@ -163,16 +186,18 @@ export class UnifiedTicketingTicketOutput extends UnifiedTicketingTicketInput { remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/src/ticketing/user/types/model.unified.ts b/packages/api/src/ticketing/user/types/model.unified.ts index b9be5c616..22cc29204 100644 --- a/packages/api/src/ticketing/user/types/model.unified.ts +++ b/packages/api/src/ticketing/user/types/model.unified.ts @@ -4,6 +4,7 @@ import { IsOptional, IsString, IsUUID } from 'class-validator'; export class UnifiedTicketingUserInput { @ApiProperty({ type: String, + nullable: true, description: 'The name of the user', }) @IsString() @@ -11,6 +12,7 @@ export class UnifiedTicketingUserInput { @ApiProperty({ type: String, + nullable: true, description: 'The email address of the user', }) @IsString() @@ -18,6 +20,7 @@ export class UnifiedTicketingUserInput { @ApiPropertyOptional({ type: [String], + nullable: true, description: 'The teams whose the user is part of', }) @IsOptional() @@ -25,6 +28,7 @@ export class UnifiedTicketingUserInput { @ApiPropertyOptional({ type: String, + nullable: true, description: 'The account or organization the user is part of', }) @IsUUID() @@ -32,22 +36,29 @@ export class UnifiedTicketingUserInput { account_id?: string; @ApiProperty({ - type: {}, + type: Object, + nullable: true, description: 'The custom field mappings of the user between the remote 3rd party & Panora', + additionalProperties: true, }) @IsOptional() field_mappings?: Record; } export class UnifiedTicketingUserOutput extends UnifiedTicketingUserInput { - @ApiPropertyOptional({ type: String, description: 'The UUID of the user' }) + @ApiPropertyOptional({ + type: String, + nullable: true, + description: 'The UUID of the user', + }) @IsUUID() @IsOptional() id?: string; @ApiPropertyOptional({ type: String, + nullable: true, description: 'The id of the user in the context of the 3rd Party', }) @IsString() @@ -55,23 +66,27 @@ export class UnifiedTicketingUserOutput extends UnifiedTicketingUserInput { remote_id?: string; @ApiPropertyOptional({ - type: {}, + type: Object, + nullable: true, + additionalProperties: true, description: 'The remote data of the user in the context of the 3rd Party', }) @IsOptional() remote_data?: Record; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The created date of the object', }) @IsOptional() - created_at?: any; + created_at?: Date; @ApiPropertyOptional({ - type: {}, + type: Date, + nullable: true, description: 'The modified date of the object', }) @IsOptional() - modified_at?: any; + modified_at?: Date; } diff --git a/packages/api/swagger/swagger-spec.yaml b/packages/api/swagger/swagger-spec.yaml index c62e16d0d..dd065bcdd 100644 --- a/packages/api/swagger/swagger-spec.yaml +++ b/packages/api/swagger/swagger-spec.yaml @@ -8,6 +8,10 @@ paths: responses: '200': description: '' + content: + application/json: + schema: + type: string /health: get: operationId: health @@ -16,6 +20,10 @@ paths: responses: '200': description: '' + content: + application/json: + schema: + type: number /webhook: get: operationId: listWebhooks @@ -63,6 +71,8 @@ paths: schema: type: string responses: + '200': + description: '' '201': description: '' content: @@ -81,6 +91,8 @@ paths: schema: type: string responses: + '200': + description: '' '201': description: '' content: @@ -500,6 +512,8 @@ paths: responses: '200': description: '' + '201': + description: '' tags: *ref_9 x-speakeasy-group: sync /crm/companies: @@ -1878,6 +1892,12 @@ paths: application/json: schema: $ref: '#/components/schemas/PassThroughResponse' + '201': + description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/PassThroughResponse' tags: - passthrough /hris/bankinfos: @@ -8018,6 +8038,7 @@ components: description: The unique UUID of the webhook. endpoint_description: type: string + nullable: true description: The description of the webhook. url: type: string @@ -8043,6 +8064,7 @@ components: last_update: format: date-time type: string + nullable: true description: The last update date of the webhook. required: - id_webhook_endpoint @@ -8070,7 +8092,6 @@ components: type: string required: - url - - description - scope EventPayload: type: object @@ -8079,7 +8100,7 @@ components: type: object properties: payload: - type: object + type: object description: The payload event of the webhook. signature: type: string @@ -8111,32 +8132,40 @@ components: properties: body: type: string + nullable: true description: The body of the comment html_body: type: string + nullable: true description: The html body of the comment is_private: type: boolean + nullable: true description: The public status of the comment creator_type: type: string + nullable: true description: >- The creator type of the comment. Authorized values are either USER or CONTACT ticket_id: type: string + nullable: true description: The UUID of the ticket the comment is tied to contact_id: type: string + nullable: true description: >- The UUID of the contact which the comment belongs to (if no user_id specified) user_id: type: string + nullable: true description: >- The UUID of the user which the comment belongs to (if no contact_id specified) attachments: + nullable: true description: The attachements UUIDs tied to the comment type: array items: @@ -8148,29 +8177,37 @@ components: properties: name: type: string + nullable: true description: The name of the ticket status: type: string + nullable: true description: The status of the ticket. Authorized values are OPEN or CLOSED. description: type: string + nullable: true description: The description of the ticket due_date: format: date-time type: string + nullable: true description: The date the ticket is due type: type: string + nullable: true description: >- The type of the ticket. Authorized values are PROBLEM, QUESTION, or TASK parent_ticket: type: string + nullable: true description: The UUID of the parent ticket collections: type: string + nullable: true description: The collection UUIDs the ticket belongs to tags: + nullable: true description: The tags names of the ticket type: array items: @@ -8178,85 +8215,106 @@ components: completed_at: format: date-time type: string + nullable: true description: The date the ticket has been completed priority: type: string + nullable: true description: >- The priority of the ticket. Authorized values are HIGH, MEDIUM or LOW. assigned_to: + nullable: true description: The users UUIDs the ticket is assigned to type: array items: type: string comment: + nullable: true description: The comment of the ticket allOf: - $ref: '#/components/schemas/UnifiedTicketingCommentInput' account_id: type: string + nullable: true description: The UUID of the account which the ticket belongs to contact_id: type: string + nullable: true description: The UUID of the contact which the ticket belongs to attachments: - description: The attachements UUIDs tied to the ticket + nullable: true + description: The attachments UUIDs tied to the ticket type: array items: type: string field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the ticket between the remote 3rd party + & Panora id: type: string + nullable: true description: The UUID of the ticket remote_id: type: string + nullable: true description: The id of the ticket in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the ticket in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - description - - field_mappings - - remote_data - - created_at - - modified_at UnifiedTicketingTicketInput: type: object properties: name: type: string + nullable: true description: The name of the ticket status: type: string + nullable: true description: The status of the ticket. Authorized values are OPEN or CLOSED. description: type: string + nullable: true description: The description of the ticket due_date: format: date-time type: string + nullable: true description: The date the ticket is due type: type: string + nullable: true description: >- The type of the ticket. Authorized values are PROBLEM, QUESTION, or TASK parent_ticket: type: string + nullable: true description: The UUID of the parent ticket collections: type: string + nullable: true description: The collection UUIDs the ticket belongs to tags: + nullable: true description: The tags names of the ticket type: array items: @@ -8264,156 +8322,193 @@ components: completed_at: format: date-time type: string + nullable: true description: The date the ticket has been completed priority: type: string + nullable: true description: >- The priority of the ticket. Authorized values are HIGH, MEDIUM or LOW. assigned_to: + nullable: true description: The users UUIDs the ticket is assigned to type: array items: type: string comment: + nullable: true description: The comment of the ticket allOf: - $ref: '#/components/schemas/UnifiedTicketingCommentInput' account_id: type: string + nullable: true description: The UUID of the account which the ticket belongs to contact_id: type: string + nullable: true description: The UUID of the contact which the ticket belongs to attachments: - description: The attachements UUIDs tied to the ticket + nullable: true + description: The attachments UUIDs tied to the ticket type: array items: type: string field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the ticket between the remote 3rd party + & Panora required: - name - description - - field_mappings UnifiedTicketingUserOutput: type: object properties: name: type: string + nullable: true description: The name of the user email_address: type: string + nullable: true description: The email address of the user teams: + nullable: true description: The teams whose the user is part of type: array items: type: string account_id: type: string + nullable: true description: The account or organization the user is part of field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the user between the remote 3rd party & + Panora id: type: string + nullable: true description: The UUID of the user remote_id: type: string + nullable: true description: The id of the user in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the user in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - email_address - field_mappings - - remote_data - - created_at - - modified_at UnifiedTicketingAccountOutput: type: object properties: name: type: string + nullable: true description: The name of the account domains: + nullable: true description: The domains of the account type: array items: type: string field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the account between the remote 3rd + party & Panora id: type: string + nullable: true description: The UUID of the account remote_id: type: string + nullable: true description: The id of the account in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the account in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - - field_mappings - - remote_data - - created_at - - modified_at UnifiedTicketingContactOutput: type: object properties: name: type: string + nullable: true description: The name of the contact email_address: type: string + nullable: true description: The email address of the contact phone_number: type: string + nullable: true description: The phone number of the contact details: type: string + nullable: true description: The details of the contact field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the contact between the remote 3rd + party & Panora id: type: string description: The UUID of the contact remote_id: type: string + nullable: true description: The id of the contact in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the contact in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - email_address - - field_mappings - - remote_data - - created_at - - modified_at Email: type: object properties: @@ -8490,736 +8585,905 @@ components: name: type: string description: The name of the company + nullable: true industry: type: string description: >- The industry of the company. Authorized values can be found in the Industry enum. + nullable: true number_of_employees: type: number description: The number of employees of the company + nullable: true user_id: type: string description: The UUID of the user who owns the company + nullable: true email_addresses: description: The email addresses of the company + nullable: true type: array items: $ref: '#/components/schemas/Email' addresses: description: The addresses of the company + nullable: true type: array items: $ref: '#/components/schemas/Address' phone_numbers: description: The phone numbers of the company + nullable: true type: array items: $ref: '#/components/schemas/Phone' field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the company between the remote 3rd + party & Panora + nullable: true id: type: string description: The UUID of the company + nullable: true remote_id: type: string description: The id of the company in the context of the Crm 3rd Party + nullable: true remote_data: type: object - properties: {} + description: The remote data of the company in the context of the Crm 3rd Party + nullable: true created_at: type: object - properties: {} + description: The created date of the object + nullable: true modified_at: type: object - properties: {} + description: The modified date of the object + nullable: true required: - name - - field_mappings - - remote_data - - created_at - - modified_at UnifiedCrmCompanyInput: type: object properties: name: type: string description: The name of the company + nullable: true industry: type: string description: >- The industry of the company. Authorized values can be found in the Industry enum. + nullable: true number_of_employees: type: number description: The number of employees of the company + nullable: true user_id: type: string description: The UUID of the user who owns the company + nullable: true email_addresses: description: The email addresses of the company + nullable: true type: array items: $ref: '#/components/schemas/Email' addresses: description: The addresses of the company + nullable: true type: array items: $ref: '#/components/schemas/Address' phone_numbers: description: The phone numbers of the company + nullable: true type: array items: $ref: '#/components/schemas/Phone' field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the company between the remote 3rd + party & Panora + nullable: true required: - name - - field_mappings UnifiedCrmContactOutput: type: object properties: first_name: type: string + nullable: true description: The first name of the contact last_name: type: string + nullable: true description: The last name of the contact email_addresses: + nullable: true description: The email addresses of the contact type: array items: $ref: '#/components/schemas/Email' phone_numbers: + nullable: true description: The phone numbers of the contact type: array items: $ref: '#/components/schemas/Phone' addresses: + nullable: true description: The addresses of the contact type: array items: $ref: '#/components/schemas/Address' user_id: type: string + nullable: true description: The UUID of the user who owns the contact field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the contact between the remote 3rd + party & Panora id: type: string + nullable: true description: The UUID of the contact remote_id: type: string + nullable: true description: The id of the contact in the context of the Crm 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the contact in the context of the Crm 3rd Party created_at: type: object - properties: {} + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - first_name - last_name - - field_mappings - - remote_data - - created_at - - modified_at UnifiedCrmContactInput: type: object properties: first_name: type: string + nullable: true description: The first name of the contact last_name: type: string + nullable: true description: The last name of the contact email_addresses: + nullable: true description: The email addresses of the contact type: array items: $ref: '#/components/schemas/Email' phone_numbers: + nullable: true description: The phone numbers of the contact type: array items: $ref: '#/components/schemas/Phone' addresses: + nullable: true description: The addresses of the contact type: array items: $ref: '#/components/schemas/Address' user_id: type: string + nullable: true description: The UUID of the user who owns the contact field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the contact between the remote 3rd + party & Panora required: - first_name - last_name - - field_mappings UnifiedCrmDealOutput: type: object properties: name: type: string description: The name of the deal + nullable: true description: type: string description: The description of the deal + nullable: true amount: type: number description: The amount of the deal + nullable: true user_id: type: string + nullable: true description: The UUID of the user who is on the deal stage_id: type: string + nullable: true description: The UUID of the stage of the deal company_id: type: string + nullable: true description: The UUID of the company tied to the deal field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the company between the remote 3rd + party & Panora id: type: string + nullable: true description: The UUID of the deal remote_id: type: string + nullable: true description: The id of the deal in the context of the Crm 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the deal in the context of the Crm 3rd Party created_at: type: object - properties: {} + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - description - amount - - field_mappings - - remote_data - - created_at - - modified_at UnifiedCrmDealInput: type: object properties: name: type: string description: The name of the deal + nullable: true description: type: string description: The description of the deal + nullable: true amount: type: number description: The amount of the deal + nullable: true user_id: type: string + nullable: true description: The UUID of the user who is on the deal stage_id: type: string + nullable: true description: The UUID of the stage of the deal company_id: type: string + nullable: true description: The UUID of the company tied to the deal field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the company between the remote 3rd + party & Panora required: - name - description - amount - - field_mappings UnifiedCrmEngagementOutput: type: object properties: content: type: string + nullable: true description: The content of the engagement direction: type: string + nullable: true description: >- The direction of the engagement. Authorized values are INBOUND or OUTBOUND subject: type: string + nullable: true description: The subject of the engagement start_at: format: date-time type: string + nullable: true description: The start time of the engagement end_time: format: date-time type: string + nullable: true description: The end time of the engagement type: type: string + nullable: true description: >- The type of the engagement. Authorized values are EMAIL, CALL or MEETING user_id: type: string + nullable: true description: The UUID of the user tied to the engagement company_id: type: string + nullable: true description: The UUID of the company tied to the engagement contacts: + nullable: true description: The UUIDs of contacts tied to the engagement object type: array items: type: string field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the engagement between the remote 3rd + party & Panora id: type: string + nullable: true description: The UUID of the engagement remote_id: type: string + nullable: true description: The id of the engagement in the context of the Crm 3rd Party remote_data: type: object - properties: {} + nullable: true + description: >- + The remote data of the engagement in the context of the Crm 3rd + Party created_at: type: object - properties: {} + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - type - - field_mappings - - remote_data - - created_at - - modified_at UnifiedCrmEngagementInput: type: object properties: content: type: string + nullable: true description: The content of the engagement direction: type: string + nullable: true description: >- The direction of the engagement. Authorized values are INBOUND or OUTBOUND subject: type: string + nullable: true description: The subject of the engagement start_at: format: date-time type: string + nullable: true description: The start time of the engagement end_time: format: date-time type: string + nullable: true description: The end time of the engagement type: type: string + nullable: true description: >- The type of the engagement. Authorized values are EMAIL, CALL or MEETING user_id: type: string + nullable: true description: The UUID of the user tied to the engagement company_id: type: string + nullable: true description: The UUID of the company tied to the engagement contacts: + nullable: true description: The UUIDs of contacts tied to the engagement object type: array items: type: string field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the engagement between the remote 3rd + party & Panora required: - type - - field_mappings UnifiedCrmNoteOutput: type: object properties: content: type: string description: The content of the note + nullable: true user_id: type: string + nullable: true description: The UUID of the user tied the note company_id: type: string + nullable: true description: The UUID of the company tied to the note contact_id: type: string + nullable: true description: The UUID fo the contact tied to the note deal_id: type: string + nullable: true description: The UUID of the deal tied to the note field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the note between the remote 3rd party & + Panora id: type: string + nullable: true description: The UUID of the note remote_id: type: string + nullable: true description: The id of the note in the context of the Crm 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the note in the context of the Crm 3rd Party created_at: type: object - properties: {} + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - content - - field_mappings - - remote_data - - created_at - - modified_at UnifiedCrmNoteInput: type: object properties: content: type: string description: The content of the note + nullable: true user_id: type: string + nullable: true description: The UUID of the user tied the note company_id: type: string + nullable: true description: The UUID of the company tied to the note contact_id: type: string + nullable: true description: The UUID fo the contact tied to the note deal_id: type: string + nullable: true description: The UUID of the deal tied to the note field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the note between the remote 3rd party & + Panora required: - content - - field_mappings UnifiedCrmStageOutput: type: object properties: stage_name: type: string description: The name of the stage + nullable: true field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the stage between the remote 3rd party + & Panora + nullable: true id: type: string description: The UUID of the stage + nullable: true remote_id: type: string description: The id of the stage in the context of the Crm 3rd Party + nullable: true remote_data: type: object - properties: {} + description: The remote data of the stage in the context of the Crm 3rd Party + nullable: true created_at: type: object - properties: {} + description: The created date of the object + nullable: true modified_at: type: object - properties: {} + description: The modified date of the object + nullable: true required: - stage_name - - field_mappings - - remote_data - - created_at - - modified_at UnifiedCrmTaskOutput: type: object properties: subject: type: string description: The subject of the task + nullable: true content: type: string description: The content of the task + nullable: true status: type: string description: The status of the task. Authorized values are PENDING, COMPLETED. + nullable: true due_date: format: date-time type: string description: The due date of the task + nullable: true finished_date: format: date-time type: string description: The finished date of the task + nullable: true user_id: type: string description: The UUID of the user tied to the task + nullable: true company_id: type: string - description: The UUID fo the company tied to the task + description: The UUID of the company tied to the task + nullable: true deal_id: type: string description: The UUID of the deal tied to the task + nullable: true field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the task between the remote 3rd party & + Panora + nullable: true id: type: string description: The UUID of the task + nullable: true remote_id: type: string description: The id of the task in the context of the Crm 3rd Party + nullable: true remote_data: type: object - properties: {} + description: The remote data of the task in the context of the Crm 3rd Party + nullable: true created_at: type: object - properties: {} + description: The created date of the object + nullable: true modified_at: type: object - properties: {} + description: The modified date of the object + nullable: true required: - subject - content - status - - field_mappings - - remote_data - - created_at - - modified_at UnifiedCrmTaskInput: type: object properties: subject: type: string description: The subject of the task + nullable: true content: type: string description: The content of the task + nullable: true status: type: string description: The status of the task. Authorized values are PENDING, COMPLETED. + nullable: true due_date: format: date-time type: string description: The due date of the task + nullable: true finished_date: format: date-time type: string description: The finished date of the task + nullable: true user_id: type: string description: The UUID of the user tied to the task + nullable: true company_id: type: string - description: The UUID fo the company tied to the task + description: The UUID of the company tied to the task + nullable: true deal_id: type: string description: The UUID of the deal tied to the task + nullable: true field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the task between the remote 3rd party & + Panora + nullable: true required: - subject - content - status - - field_mappings UnifiedCrmUserOutput: type: object properties: name: type: string description: The name of the user + nullable: true email: type: string description: The email of the user + nullable: true field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the user between the remote 3rd party & + Panora + nullable: true id: type: string description: The UUID of the user + nullable: true remote_id: type: string description: The id of the user in the context of the Crm 3rd Party + nullable: true remote_data: type: object - properties: {} + description: The remote data of the user in the context of the Crm 3rd Party + nullable: true created_at: type: object - properties: {} + description: The created date of the object + nullable: true modified_at: type: object - properties: {} + description: The modified date of the object + nullable: true required: - name - email - - field_mappings - - remote_data - - created_at - - modified_at UnifiedTicketingCollectionOutput: type: object properties: name: type: string + nullable: true description: The name of the collection description: type: string + nullable: true description: The description of the collection collection_type: type: string + nullable: true description: >- The type of the collection. Authorized values are either PROJECT or LIST id: type: string + nullable: true description: The UUID of the collection remote_id: type: string + nullable: true description: The id of the collection in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the collection in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - - remote_data - - created_at - - modified_at UnifiedTicketingCommentOutput: type: object properties: body: type: string + nullable: true description: The body of the comment html_body: type: string + nullable: true description: The html body of the comment is_private: type: boolean + nullable: true description: The public status of the comment creator_type: type: string + nullable: true description: >- The creator type of the comment. Authorized values are either USER or CONTACT ticket_id: type: string + nullable: true description: The UUID of the ticket the comment is tied to contact_id: type: string + nullable: true description: >- The UUID of the contact which the comment belongs to (if no user_id specified) user_id: type: string + nullable: true description: >- The UUID of the user which the comment belongs to (if no contact_id specified) attachments: + nullable: true description: The attachements UUIDs tied to the comment type: array items: type: string id: type: string + nullable: true description: The UUID of the comment remote_id: type: string + nullable: true description: The id of the comment in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the comment in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - body - - remote_data - - created_at - - modified_at UnifiedTicketingTagOutput: type: object properties: name: type: string + nullable: true description: The name of the tag field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the tag between the remote 3rd party & + Panora id: type: string + nullable: true description: The UUID of the tag remote_id: type: string + nullable: true description: The id of the tag in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the tag in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - - field_mappings - - remote_data - - created_at - - modified_at UnifiedTicketingTeamOutput: type: object properties: name: type: string + nullable: true description: The name of the team description: type: string + nullable: true description: The description of the team field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the team between the remote 3rd party & + Panora id: type: string + nullable: true description: The UUID of the team remote_id: type: string + nullable: true description: The id of the team in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the team in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - - field_mappings - - remote_data - - created_at - - modified_at CreateLinkedUserDto: type: object properties: @@ -9452,7 +9716,9 @@ components: description: The remote creation date of the activity field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the activity @@ -9461,18 +9727,13 @@ components: description: The remote ID of the activity in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the activity in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsActivityInput: type: object properties: @@ -9497,9 +9758,9 @@ components: description: The remote creation date of the activity field_mappings: type: object - properties: {} - required: - - field_mappings + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora UnifiedAtsApplicationOutput: type: object properties: @@ -9536,7 +9797,9 @@ components: description: The UUID of the job field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the application @@ -9545,18 +9808,13 @@ components: description: The remote ID of the application in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the application in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsApplicationInput: type: object properties: @@ -9593,9 +9851,9 @@ components: description: The UUID of the job field_mappings: type: object - properties: {} - required: - - field_mappings + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora UnifiedAtsAttachmentOutput: type: object properties: @@ -9621,7 +9879,9 @@ components: description: The UUID of the candidate field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the attachment @@ -9630,18 +9890,13 @@ components: description: The remote ID of the attachment remote_data: type: object - properties: {} + description: The remote data of the attachment in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsAttachmentInput: type: object properties: @@ -9667,9 +9922,9 @@ components: description: The UUID of the candidate field_mappings: type: object - properties: {} - required: - - field_mappings + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora Url: type: object properties: {} @@ -9743,7 +9998,9 @@ components: $ref: '#/components/schemas/Email' field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the candidate @@ -9752,18 +10009,13 @@ components: description: The id of the candidate in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the candidate in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsCandidateInput: type: object properties: @@ -9834,9 +10086,9 @@ components: $ref: '#/components/schemas/Email' field_mappings: type: object - properties: {} - required: - - field_mappings + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora UnifiedAtsDepartmentOutput: type: object properties: @@ -9845,7 +10097,9 @@ components: description: The name of the department field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the department @@ -9854,18 +10108,13 @@ components: description: The remote ID of the department in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the department in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsInterviewOutput: type: object properties: @@ -9907,7 +10156,9 @@ components: description: The remote modification date of the interview field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the interview @@ -9916,18 +10167,13 @@ components: description: The remote ID of the interview in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the interview in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsInterviewInput: type: object properties: @@ -9969,9 +10215,9 @@ components: description: The remote modification date of the interview field_mappings: type: object - properties: {} - required: - - field_mappings + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora UnifiedAtsJobinterviewstageOutput: type: object properties: @@ -9986,7 +10232,9 @@ components: description: The UUID of the job field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the job interview stage @@ -9997,55 +10245,62 @@ components: Party remote_data: type: object - properties: {} + description: >- + The remote data of the job interview stage in the context of the 3rd + Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsJobOutput: type: object properties: name: type: string + nullable: true description: The name of the job description: type: string + nullable: true description: The description of the job code: type: string + nullable: true description: The code of the job status: type: string + nullable: true description: The status of the job type: type: string + nullable: true description: The type of the job confidential: type: boolean + nullable: true description: Whether the job is confidential departments: + nullable: true description: The departments UUIDs associated with the job type: array items: type: string offices: + nullable: true description: The offices UUIDs associated with the job type: array items: type: string managers: + nullable: true description: The managers UUIDs associated with the job type: array items: type: string recruiters: + nullable: true description: The recruiters UUIDs associated with the job type: array items: @@ -10053,85 +10308,102 @@ components: remote_created_at: type: string format: date-time + nullable: true description: The remote creation date of the job remote_updated_at: type: string format: date-time + nullable: true description: The remote modification date of the job field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string + nullable: true description: The UUID of the job remote_id: type: string + nullable: true description: The remote ID of the job in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the job in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + format: date-time + type: string + nullable: true + description: The modified date of the object UnifiedAtsOfferOutput: type: object properties: created_by: type: string description: The UUID of the creator + nullable: true remote_created_at: type: string format: date-time description: The remote creation date of the offer + nullable: true closed_at: type: string format: date-time description: The closing date of the offer + nullable: true sent_at: type: string format: date-time description: The sending date of the offer + nullable: true start_date: type: string format: date-time description: The start date of the offer + nullable: true status: type: string description: The status of the offer + nullable: true application_id: type: string description: The UUID of the application + nullable: true field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora + nullable: true id: type: string description: The UUID of the offer + nullable: true remote_id: type: string description: The remote ID of the offer in the context of the 3rd Party + nullable: true remote_data: type: object - properties: {} + description: The remote data of the offer in the context of the 3rd Party + nullable: true created_at: type: object - properties: {} + description: The created date of the object + nullable: true modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object + nullable: true UnifiedAtsOfficeOutput: type: object properties: @@ -10143,7 +10415,9 @@ components: description: The location of the office field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the office @@ -10152,18 +10426,13 @@ components: description: The remote ID of the office in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the office in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsRejectreasonOutput: type: object properties: @@ -10172,7 +10441,9 @@ components: description: The name of the reject reason field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the reject reason @@ -10181,18 +10452,13 @@ components: description: The remote ID of the reject reason in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the reject reason in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsScorecardOutput: type: object properties: @@ -10215,7 +10481,9 @@ components: description: The submission date of the scorecard field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the scorecard @@ -10224,18 +10492,13 @@ components: description: The remote ID of the scorecard in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the scorecard in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object UnifiedAtsTagOutput: type: object properties: @@ -10247,7 +10510,9 @@ components: description: The UUID of the candidate field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the tag @@ -10256,7 +10521,7 @@ components: description: The remote ID of the tag in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the tag in the context of the 3rd Party created_at: type: string format: date-time @@ -10265,103 +10530,121 @@ components: type: string format: date-time description: The modification date of the tag - required: - - field_mappings - - remote_data UnifiedAtsUserOutput: type: object properties: first_name: type: string description: The first name of the user + nullable: true last_name: type: string description: The last name of the user + nullable: true email: type: string description: The email of the user + nullable: true disabled: type: boolean description: Whether the user is disabled + nullable: true access_role: type: string description: The access role of the user + nullable: true remote_created_at: type: string format: date-time description: The remote creation date of the user + nullable: true remote_modified_at: type: string format: date-time description: The remote modification date of the user + nullable: true field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora + nullable: true id: type: string description: The UUID of the user + nullable: true remote_id: type: string description: The remote ID of the user in the context of the 3rd Party + nullable: true remote_data: type: object - properties: {} + description: The remote data of the user in the context of the 3rd Party + nullable: true created_at: type: object - properties: {} + description: The created date of the object + nullable: true modified_at: type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + description: The modified date of the object + nullable: true UnifiedAtsEeocsOutput: type: object properties: candidate_id: type: string + nullable: true description: The UUID of the candidate submitted_at: type: string format: date-time + nullable: true description: The submission date of the EEOC race: type: string + nullable: true description: The race of the candidate gender: type: string + nullable: true description: The gender of the candidate veteran_status: type: string + nullable: true description: The veteran status of the candidate disability_status: type: string + nullable: true description: The disability status of the candidate field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string + nullable: true description: The UUID of the EEOC remote_id: type: string + nullable: true description: The remote ID of the EEOC in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the EEOC in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} - required: - - field_mappings - - remote_data - - created_at - - modified_at + format: date-time + type: string + nullable: true + description: The modified date of the object UnifiedAccountingAccountOutput: type: object properties: {} @@ -10451,81 +10734,105 @@ components: properties: name: type: string + nullable: true description: The name of the drive remote_created_at: type: string + nullable: true description: When the third party s drive was created. drive_url: type: string + nullable: true description: The url of the drive field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string + nullable: true description: The UUID of the drive remote_id: type: string + nullable: true description: The id of the drive in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the drive in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - remote_created_at - drive_url - - field_mappings - - remote_data - - created_at - - modified_at UnifiedFilestorageFileOutput: type: object properties: name: type: string description: The name of the file + nullable: true file_url: type: string description: The url of the file + nullable: true mime_type: type: string description: The mime type of the file + nullable: true size: type: string description: The size of the file + nullable: true folder_id: type: string description: The UUID of the folder tied to the file + nullable: true permission: type: string description: The UUID of the permission tied to the file + nullable: true shared_link: type: string description: The UUID of the shared link tied to the file + nullable: true field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora + nullable: true id: type: string description: The UUID of the file + nullable: true remote_id: type: string description: The id of the file in the context of the 3rd Party + nullable: true remote_data: type: object - properties: {} + description: The remote data of the file in the context of the 3rd Party + nullable: true created_at: type: object - properties: {} + description: The created date of the object + nullable: true modified_at: type: object - properties: {} + description: The modified date of the object + nullable: true required: - name - file_url @@ -10534,37 +10841,43 @@ components: - folder_id - permission - shared_link - - field_mappings - - remote_data - - created_at - - modified_at UnifiedFilestorageFileInput: type: object properties: name: type: string description: The name of the file + nullable: true file_url: type: string description: The url of the file + nullable: true mime_type: type: string description: The mime type of the file + nullable: true size: type: string description: The size of the file + nullable: true folder_id: type: string description: The UUID of the folder tied to the file + nullable: true permission: type: string description: The UUID of the permission tied to the file + nullable: true shared_link: type: string description: The UUID of the shared link tied to the file + nullable: true field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora + nullable: true required: - name - file_url @@ -10573,7 +10886,6 @@ components: - folder_id - permission - shared_link - - field_mappings UnifiedFilestorageFolderOutput: type: object properties: @@ -10603,7 +10915,9 @@ components: description: The UUID of the permission tied to the folder field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string description: The UUID of the folder @@ -10612,13 +10926,13 @@ components: description: The id of the folder in the context of the 3rd Party remote_data: type: object - properties: {} + description: The remote data of the folder in the context of the 3rd Party created_at: type: object - properties: {} + description: The created date of the object modified_at: type: object - properties: {} + description: The modified date of the object required: - name - size @@ -10628,10 +10942,6 @@ components: - parent_folder_id - shared_link - permission - - field_mappings - - remote_data - - created_at - - modified_at UnifiedFilestorageFolderInput: type: object properties: @@ -10661,7 +10971,9 @@ components: description: The UUID of the permission tied to the folder field_mappings: type: object - properties: {} + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora required: - name - size @@ -10671,12 +10983,12 @@ components: - parent_folder_id - shared_link - permission - - field_mappings UnifiedFilestorageGroupOutput: type: object properties: name: type: string + nullable: true description: The name of the group users: description: Uuids of users of the group @@ -10685,143 +10997,177 @@ components: type: string remote_was_deleted: type: boolean + nullable: true description: >- Indicates whether or not this object has been deleted in the third party platform. field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string + nullable: true description: The UUID of the group remote_id: type: string + nullable: true description: The id of the group in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the group in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - users - remote_was_deleted - - field_mappings - - remote_data - - created_at - - modified_at UnifiedUserOutput: type: object properties: name: type: string + nullable: true description: The name of the user email: type: string + nullable: true description: The email of the user is_me: type: boolean + nullable: true description: Whether the user is the one who linked this account. field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the object between the remote 3rd party + & Panora id: type: string + nullable: true description: The UUID of the user remote_id: type: string + nullable: true description: The id of the user in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the user in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - name - email - is_me - - field_mappings - - remote_data - - created_at - - modified_at UnifiedTicketingAttachmentOutput: type: object properties: file_name: type: string + nullable: true description: The file name of the attachment file_url: type: string + nullable: true description: The file url of the attachment uploader: type: string + nullable: true description: The uploader's UUID of the attachment ticket_id: type: string + nullable: true description: The UUID of the ticket the attachment is tied to comment_id: type: string + nullable: true description: The UUID of the comment the attachment is tied to field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the attachment between the remote 3rd + party & Panora id: type: string + nullable: true description: The UUID of the attachment remote_id: type: string + nullable: true description: The id of the attachment in the context of the 3rd Party remote_data: type: object - properties: {} + nullable: true + description: The remote data of the attachment in the context of the 3rd Party created_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The created date of the object modified_at: - type: object - properties: {} + format: date-time + type: string + nullable: true + description: The modified date of the object required: - file_name - file_url - uploader - - field_mappings - - remote_data - - created_at - - modified_at UnifiedTicketingAttachmentInput: type: object properties: file_name: type: string + nullable: true description: The file name of the attachment file_url: type: string + nullable: true description: The file url of the attachment uploader: type: string + nullable: true description: The uploader's UUID of the attachment ticket_id: type: string + nullable: true description: The UUID of the ticket the attachment is tied to comment_id: type: string + nullable: true description: The UUID of the comment the attachment is tied to field_mappings: type: object - properties: {} + nullable: true + description: >- + The custom field mappings of the attachment between the remote 3rd + party & Panora required: - file_name - file_url - uploader - - field_mappings x-speakeasy-name-override: - operationId: ^retrieve.* methodNameOverride: retrieve From 19dbf853a5d17d57bb51e1491370348f464a102d Mon Sep 17 00:00:00 2001 From: nael Date: Fri, 2 Aug 2024 00:43:10 +0200 Subject: [PATCH 3/5] :fire: Added spec --- .../services/application.service.ts | 116 +-- .../ats/application/types/model.unified.ts | 16 + packages/api/swagger/swagger-spec.yaml | 750 +++++++++++++++--- 3 files changed, 728 insertions(+), 154 deletions(-) diff --git a/packages/api/src/ats/application/services/application.service.ts b/packages/api/src/ats/application/services/application.service.ts index e8a8b27fe..c1ea3ed41 100644 --- a/packages/api/src/ats/application/services/application.service.ts +++ b/packages/api/src/ats/application/services/application.service.ts @@ -324,71 +324,73 @@ export class ApplicationService { prev_cursor = Buffer.from(cursor).toString('base64'); } - const unifiedApplications: UnifiedAtsApplicationOutput[] = await Promise.all( - applications.map(async (application) => { - const values = await this.prisma.value.findMany({ - where: { - entity: { ressource_owner_id: application.id_ats_application }, - }, - include: { attribute: true }, - }); - - const fieldMappingsMap = new Map(); - values.forEach((value) => { - fieldMappingsMap.set(value.attribute.slug, value.data); - }); - - const field_mappings = Array.from( - fieldMappingsMap, - ([key, value]) => ({ [key]: value }), - ); + const unifiedApplications: UnifiedAtsApplicationOutput[] = + await Promise.all( + applications.map(async (application) => { + const values = await this.prisma.value.findMany({ + where: { + entity: { ressource_owner_id: application.id_ats_application }, + }, + include: { attribute: true }, + }); - const resOffers = await this.prisma.ats_offers.findMany({ - where: { - id_ats_application: application.id_ats_application, - }, - }); - let offers; - if (resOffers && resOffers.length > 0) { - offers = resOffers.map((off) => { - return off.id_ats_offer; + const fieldMappingsMap = new Map(); + values.forEach((value) => { + fieldMappingsMap.set(value.attribute.slug, value.data); }); - } - - return { - id: application.id_ats_application, - applied_at: String(application.applied_at) || null, - rejected_at: String(application.rejected_at) || null, - offers: offers || null, - source: application.source || null, - credited_to: application.credited_to || null, - current_stage: application.current_stage || null, - reject_reason: application.reject_reason || null, - candidate_id: application.id_ats_candidate || null, - job_id: application.id_ats_job || null, - field_mappings: field_mappings, - remote_id: application.remote_id || null, - created_at: application.created_at || null, - modified_at: application.modified_at || null, - remote_created_at: null, - remote_modified_at: null, - }; - }), - ); - let res: UnifiedAtsApplicationOutput[] = unifiedApplications; + const field_mappings = Array.from( + fieldMappingsMap, + ([key, value]) => ({ [key]: value }), + ); - if (remote_data) { - const remote_array_data: UnifiedAtsApplicationOutput[] = await Promise.all( - res.map(async (application) => { - const resp = await this.prisma.remote_data.findFirst({ - where: { ressource_owner_id: application.id }, + const resOffers = await this.prisma.ats_offers.findMany({ + where: { + id_ats_application: application.id_ats_application, + }, }); - const remote_data = JSON.parse(resp.data); - return { ...application, remote_data }; + let offers; + if (resOffers && resOffers.length > 0) { + offers = resOffers.map((off) => { + return off.id_ats_offer; + }); + } + + return { + id: application.id_ats_application, + applied_at: String(application.applied_at) || null, + rejected_at: String(application.rejected_at) || null, + offers: offers || null, + source: application.source || null, + credited_to: application.credited_to || null, + current_stage: application.current_stage || null, + reject_reason: application.reject_reason || null, + candidate_id: application.id_ats_candidate || null, + job_id: application.id_ats_job || null, + field_mappings: field_mappings, + remote_id: application.remote_id || null, + created_at: application.created_at || null, + modified_at: application.modified_at || null, + remote_created_at: null, + remote_modified_at: null, + }; }), ); + let res: UnifiedAtsApplicationOutput[] = unifiedApplications; + + if (remote_data) { + const remote_array_data: UnifiedAtsApplicationOutput[] = + await Promise.all( + res.map(async (application) => { + const resp = await this.prisma.remote_data.findFirst({ + where: { ressource_owner_id: application.id }, + }); + const remote_data = JSON.parse(resp.data); + return { ...application, remote_data }; + }), + ); + res = remote_array_data; } diff --git a/packages/api/src/ats/application/types/model.unified.ts b/packages/api/src/ats/application/types/model.unified.ts index 776a07a17..7dbd102a6 100644 --- a/packages/api/src/ats/application/types/model.unified.ts +++ b/packages/api/src/ats/application/types/model.unified.ts @@ -141,4 +141,20 @@ export class UnifiedAtsApplicationOutput extends UnifiedAtsApplicationInput { }) @IsOptional() modified_at?: Date; + + @ApiPropertyOptional({ + type: Date, + nullable: true, + description: 'The remote created date of the object', + }) + @IsOptional() + remote_created_at?: string; + + @ApiPropertyOptional({ + type: Date, + nullable: true, + description: 'The remote modified date of the object', + }) + @IsOptional() + remote_modified_at?: string; } diff --git a/packages/api/swagger/swagger-spec.yaml b/packages/api/swagger/swagger-spec.yaml index dd065bcdd..7c32fddb5 100644 --- a/packages/api/swagger/swagger-spec.yaml +++ b/packages/api/swagger/swagger-spec.yaml @@ -11,7 +11,7 @@ paths: content: application/json: schema: - type: string + $ref: '#/components/schemas/String' /health: get: operationId: health @@ -23,7 +23,7 @@ paths: content: application/json: schema: - type: number + $ref: '#/components/schemas/Number' /webhook: get: operationId: listWebhooks @@ -113,12 +113,18 @@ paths: schema: $ref: '#/components/schemas/SignatureVerificationDto' responses: - '201': + '200': description: '' content: application/json: schema: - $ref: '#/components/schemas/EventPayload' + properties: + data: + type: object + additionalProperties: true + description: Dynamic event payload + '201': + description: '' tags: *ref_0 x-speakeasy-group: webhook /ticketing/tickets: @@ -510,10 +516,12 @@ paths: summary: Resync common objects across a vertical parameters: [] responses: - '200': - description: '' '201': description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/ResyncStatusDto' tags: *ref_9 x-speakeasy-group: sync /crm/companies: @@ -1752,6 +1760,10 @@ paths: responses: '201': description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/LinkedUserResponse' tags: &ref_34 - linkedUsers x-speakeasy-group: linkedUsers @@ -1762,6 +1774,12 @@ paths: responses: '200': description: '' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/LinkedUserResponse' tags: *ref_34 x-speakeasy-group: linkedUsers /linked-users/batch: @@ -1778,6 +1796,12 @@ paths: responses: '201': description: '' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/LinkedUserResponse' tags: *ref_34 x-speakeasy-group: linkedUsers /linked-users/single: @@ -1793,6 +1817,10 @@ paths: responses: '200': description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/LinkedUserResponse' tags: *ref_34 x-speakeasy-group: linkedUsers /linked-users/fromRemoteId: @@ -1808,6 +1836,10 @@ paths: responses: '200': description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/LinkedUserResponse' tags: *ref_34 x-speakeasy-group: linkedUsers /field-mappings/define: @@ -1824,6 +1856,10 @@ paths: responses: '201': description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldResponse' tags: &ref_35 - fieldMappings x-speakeasy-group: fieldMappings @@ -1841,6 +1877,10 @@ paths: responses: '201': description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldResponse' tags: *ref_35 x-speakeasy-group: fieldMappings /field-mappings/map: @@ -1857,6 +1897,10 @@ paths: responses: '201': description: '' + content: + application/json: + schema: + $ref: '#/components/schemas/CustomFieldResponse' tags: *ref_35 x-speakeasy-group: fieldMappings /passthrough: @@ -1886,12 +1930,6 @@ paths: schema: $ref: '#/components/schemas/PassThroughRequestDto' responses: - '200': - description: '' - content: - application/json: - schema: - $ref: '#/components/schemas/PassThroughResponse' '201': description: '' content: @@ -8030,11 +8068,18 @@ components: type: http scheme: bearer schemas: + String: + type: object + properties: {} + Number: + type: object + properties: {} WebhookResponse: type: object properties: id_webhook_endpoint: type: string + nullable: true description: The unique UUID of the webhook. endpoint_description: type: string @@ -8042,24 +8087,30 @@ components: description: The description of the webhook. url: type: string + nullable: true description: The endpoint url of the webhook. secret: type: string + nullable: true description: The secret of the webhook. active: type: boolean + nullable: true description: The status of the webhook. created_at: format: date-time type: string + nullable: true description: The created date of the webhook. scope: + nullable: true description: The events that the webhook listen to. type: array items: type: string id_project: type: string + nullable: true description: The project id tied to the webhook. last_update: format: date-time @@ -8081,11 +8132,14 @@ components: properties: url: type: string + nullable: true description: The endpoint url of the webhook. description: type: string + nullable: true description: The description of the webhook. scope: + nullable: true description: The events that the webhook listen to. type: array items: @@ -8093,20 +8147,21 @@ components: required: - url - scope - EventPayload: - type: object - properties: {} SignatureVerificationDto: type: object properties: payload: - type: object + type: object + additionalProperties: true + nullable: true description: The payload event of the webhook. signature: type: string + nullable: true description: The signature of the webhook. secret: type: string + nullable: true description: The secret of the webhook. required: - payload @@ -8254,6 +8309,7 @@ components: description: >- The custom field mappings of the ticket between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -8265,6 +8321,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the ticket in the context of the 3rd Party created_at: format: date-time @@ -8361,6 +8418,7 @@ components: description: >- The custom field mappings of the ticket between the remote 3rd party & Panora + additionalProperties: true required: - name - description @@ -8391,6 +8449,7 @@ components: description: >- The custom field mappings of the user between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -8402,6 +8461,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the user in the context of the 3rd Party created_at: format: date-time @@ -8436,6 +8496,7 @@ components: description: >- The custom field mappings of the account between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -8447,6 +8508,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the account in the context of the 3rd Party created_at: format: date-time @@ -8485,6 +8547,7 @@ components: description: >- The custom field mappings of the contact between the remote 3rd party & Panora + additionalProperties: true id: type: string description: The UUID of the contact @@ -8495,6 +8558,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the contact in the context of the 3rd Party created_at: format: date-time @@ -8509,19 +8573,43 @@ components: required: - name - email_address + ResyncStatusDto: + type: object + properties: + timestamp: + format: date-time + type: string + nullable: true + vertical: + type: string + nullable: true + provider: + type: string + nullable: true + status: + type: string + nullable: true + required: + - timestamp + - vertical + - provider + - status Email: type: object properties: email_address: type: string + nullable: true description: The email address email_address_type: type: string + nullable: true description: >- The email address type. Authorized values are either PERSONAL or WORK. owner_type: type: string + nullable: true description: The owner type of an email required: - email_address @@ -8531,27 +8619,35 @@ components: properties: street_1: type: string + nullable: true description: The street street_2: type: string + nullable: true description: 'More information about the street ' city: type: string + nullable: true description: The city state: type: string + nullable: true description: The state postal_code: type: string + nullable: true description: The postal code country: type: string + nullable: true description: The country address_type: type: string + nullable: true description: The address type. Authorized values are either PERSONAL or WORK. owner_type: type: string + nullable: true description: The owner type of the address required: - street_1 @@ -8567,14 +8663,17 @@ components: properties: phone_number: type: string + nullable: true description: >- The phone number starting with a plus (+) followed by the country code (e.g +336676778890 for France) phone_type: type: string + nullable: true description: The phone type. Authorized values are either MOBILE or WORK owner_type: type: string + nullable: true description: The owner type of a phone number required: - phone_number @@ -8624,6 +8723,7 @@ components: The custom field mappings of the company between the remote 3rd party & Panora nullable: true + additionalProperties: true id: type: string description: The UUID of the company @@ -8636,6 +8736,7 @@ components: type: object description: The remote data of the company in the context of the Crm 3rd Party nullable: true + additionalProperties: true created_at: type: object description: The created date of the object @@ -8691,6 +8792,7 @@ components: The custom field mappings of the company between the remote 3rd party & Panora nullable: true + additionalProperties: true required: - name UnifiedCrmContactOutput: @@ -8732,6 +8834,7 @@ components: description: >- The custom field mappings of the contact between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -8743,9 +8846,11 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the contact in the context of the Crm 3rd Party created_at: - type: object + format: date-time + type: string nullable: true description: The created date of the object modified_at: @@ -8795,6 +8900,7 @@ components: description: >- The custom field mappings of the contact between the remote 3rd party & Panora + additionalProperties: true required: - first_name - last_name @@ -8831,6 +8937,7 @@ components: description: >- The custom field mappings of the company between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -8842,9 +8949,11 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the deal in the context of the Crm 3rd Party created_at: - type: object + format: date-time + type: string nullable: true description: The created date of the object modified_at: @@ -8889,6 +8998,7 @@ components: description: >- The custom field mappings of the company between the remote 3rd party & Panora + additionalProperties: true required: - name - description @@ -8946,6 +9056,7 @@ components: description: >- The custom field mappings of the engagement between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -8956,12 +9067,14 @@ components: description: The id of the engagement in the context of the Crm 3rd Party remote_data: type: object + additionalProperties: true nullable: true description: >- The remote data of the engagement in the context of the Crm 3rd Party created_at: - type: object + format: date-time + type: string nullable: true description: The created date of the object modified_at: @@ -9024,6 +9137,7 @@ components: description: >- The custom field mappings of the engagement between the remote 3rd party & Panora + additionalProperties: true required: - type UnifiedCrmNoteOutput: @@ -9055,6 +9169,7 @@ components: description: >- The custom field mappings of the note between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -9066,9 +9181,11 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the note in the context of the Crm 3rd Party created_at: - type: object + format: date-time + type: string nullable: true description: The created date of the object modified_at: @@ -9107,6 +9224,7 @@ components: description: >- The custom field mappings of the note between the remote 3rd party & Panora + additionalProperties: true required: - content UnifiedCrmStageOutput: @@ -9122,6 +9240,7 @@ components: The custom field mappings of the stage between the remote 3rd party & Panora nullable: true + additionalProperties: true id: type: string description: The UUID of the stage @@ -9134,6 +9253,7 @@ components: type: object description: The remote data of the stage in the context of the Crm 3rd Party nullable: true + additionalProperties: true created_at: type: object description: The created date of the object @@ -9187,6 +9307,7 @@ components: The custom field mappings of the task between the remote 3rd party & Panora nullable: true + additionalProperties: true id: type: string description: The UUID of the task @@ -9199,6 +9320,7 @@ components: type: object description: The remote data of the task in the context of the Crm 3rd Party nullable: true + additionalProperties: true created_at: type: object description: The created date of the object @@ -9254,6 +9376,7 @@ components: The custom field mappings of the task between the remote 3rd party & Panora nullable: true + additionalProperties: true required: - subject - content @@ -9275,6 +9398,7 @@ components: The custom field mappings of the user between the remote 3rd party & Panora nullable: true + additionalProperties: true id: type: string description: The UUID of the user @@ -9287,12 +9411,15 @@ components: type: object description: The remote data of the user in the context of the Crm 3rd Party nullable: true + additionalProperties: true created_at: - type: object + format: date-time + type: string description: The created date of the object nullable: true modified_at: - type: object + format: date-time + type: string description: The modified date of the object nullable: true required: @@ -9326,6 +9453,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the collection in the context of the 3rd Party created_at: format: date-time @@ -9393,6 +9521,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the comment in the context of the 3rd Party created_at: format: date-time @@ -9419,6 +9548,7 @@ components: description: >- The custom field mappings of the tag between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -9430,6 +9560,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the tag in the context of the 3rd Party created_at: format: date-time @@ -9460,6 +9591,7 @@ components: description: >- The custom field mappings of the team between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -9471,6 +9603,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the team in the context of the 3rd Party created_at: format: date-time @@ -9484,13 +9617,35 @@ components: description: The modified date of the object required: - name + LinkedUserResponse: + type: object + properties: + id_linked_user: + type: string + nullable: true + linked_user_origin_id: + type: string + nullable: true + alias: + type: string + nullable: true + id_project: + type: string + nullable: true + required: + - id_linked_user + - linked_user_origin_id + - alias + - id_project CreateLinkedUserDto: type: object properties: linked_user_origin_id: type: string + nullable: true alias: type: string + nullable: true required: - linked_user_origin_id - alias @@ -9498,25 +9653,107 @@ components: type: object properties: linked_user_origin_ids: + nullable: true type: array items: type: string alias: type: string + nullable: true required: - linked_user_origin_ids - alias + CustomFieldResponse: + type: object + properties: + id_attribute: + type: string + nullable: true + description: Attribute Id + status: + type: string + nullable: true + description: Attribute Status + ressource_owner_type: + type: string + nullable: true + description: Attribute Ressource Owner Type + slug: + type: string + nullable: true + description: Attribute Slug + description: + type: string + nullable: true + description: Attribute Description + data_type: + type: string + nullable: true + description: Attribute Data Type + remote_id: + type: string + nullable: true + description: Attribute Remote Id + source: + type: string + nullable: true + description: Attribute Source + id_entity: + type: string + nullable: true + description: Attribute Id Entity + id_project: + type: string + nullable: true + description: Attribute Id Project + scope: + type: string + nullable: true + description: Attribute Scope + id_consumer: + type: string + nullable: true + description: Attribute Id Consumer + created_at: + format: date-time + type: string + nullable: true + description: Attribute Created Date + modified_at: + format: date-time + type: string + nullable: true + description: Attribute Modified Date + required: + - id_attribute + - status + - ressource_owner_type + - slug + - description + - data_type + - remote_id + - source + - id_entity + - id_project + - scope + - id_consumer + - created_at + - modified_at DefineTargetFieldDto: type: object properties: object_type_owner: type: string + nullable: true name: type: string + nullable: true description: type: string + nullable: true data_type: type: string + nullable: true required: - object_type_owner - name @@ -9527,18 +9764,25 @@ components: properties: object_type_owner: type: string + nullable: true name: type: string + nullable: true description: type: string + nullable: true data_type: type: string + nullable: true source_custom_field_id: type: string + nullable: true source_provider: type: string + nullable: true linked_user_id: type: string + nullable: true required: - object_type_owner - name @@ -9552,17 +9796,41 @@ components: properties: attributeId: type: string + nullable: true + description: Attribute Id source_custom_field_id: type: string + nullable: true + description: Attribute Id source_provider: type: string + nullable: true + description: Attribute Id linked_user_id: type: string + nullable: true + description: Attribute Id required: - attributeId - source_custom_field_id - source_provider - linked_user_id + PassThroughResponse: + type: object + properties: + url: + type: string + nullable: true + status: + type: number + nullable: true + data: + type: object + nullable: true + required: + - url + - status + - data PassThroughRequestDto: type: object properties: @@ -9576,26 +9844,23 @@ components: type: string path: type: string + nullable: true data: - type: object + oneOf: + - type: object + additionalProperties: true + - type: array + items: + type: object + additionalProperties: true + nullable: true headers: type: object + additionalProperties: true + nullable: true required: - method - path - PassThroughResponse: - type: object - properties: - url: - type: string - status: - type: number - data: - type: object - required: - - url - - status - - data UnifiedHrisBankinfoOutput: type: object properties: {} @@ -9697,67 +9962,91 @@ components: properties: activity_type: type: string + nullable: true description: The type of activity subject: type: string + nullable: true description: The subject of the activity body: type: string + nullable: true description: The body of the activity visibility: type: string + nullable: true description: The visibility of the activity candidate_id: type: string + nullable: true description: The UUID of the candidate remote_created_at: - type: string format: date-time + type: string + nullable: true description: The remote creation date of the activity field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the activity remote_id: type: string + nullable: true description: The remote ID of the activity in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the activity in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsActivityInput: type: object properties: activity_type: type: string + nullable: true description: The type of activity subject: type: string + nullable: true description: The subject of the activity body: type: string + nullable: true description: The body of the activity visibility: type: string + nullable: true description: The visibility of the activity candidate_id: type: string + nullable: true description: The UUID of the candidate remote_created_at: - type: string format: date-time + type: string + nullable: true description: The remote creation date of the activity field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora @@ -9765,92 +10054,130 @@ components: type: object properties: applied_at: - type: string format: date-time + type: string + nullable: true description: The application date rejected_at: - type: string format: date-time + type: string + nullable: true description: The rejection date offers: + nullable: true description: The offers UUIDs for the application type: array items: type: string source: type: string + nullable: true description: The source of the application credited_to: type: string + nullable: true description: The UUID of the person credited for the application current_stage: type: string + nullable: true description: The UUID of the current stage of the application reject_reason: type: string + nullable: true description: The rejection reason for the application candidate_id: type: string + nullable: true description: The UUID of the candidate job_id: type: string description: The UUID of the job field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the application remote_id: type: string + nullable: true description: The remote ID of the application in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the application in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object + remote_created_at: + format: date-time + type: string + nullable: true + description: The remote created date of the object + remote_modified_at: + format: date-time + type: string + nullable: true + description: The remote modified date of the object UnifiedAtsApplicationInput: type: object properties: applied_at: - type: string format: date-time + type: string + nullable: true description: The application date rejected_at: - type: string format: date-time + type: string + nullable: true description: The rejection date offers: + nullable: true description: The offers UUIDs for the application type: array items: type: string source: type: string + nullable: true description: The source of the application credited_to: type: string + nullable: true description: The UUID of the person credited for the application current_stage: type: string + nullable: true description: The UUID of the current stage of the application reject_reason: type: string + nullable: true description: The rejection reason for the application candidate_id: type: string + nullable: true description: The UUID of the candidate job_id: type: string description: The UUID of the job field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora @@ -9859,127 +10186,176 @@ components: properties: file_url: type: string + nullable: true description: The URL of the file file_name: type: string + nullable: true description: The name of the file attachment_type: type: string + nullable: true description: The type of the file remote_created_at: - type: string format: date-time + type: string + nullable: true description: The remote creation date of the attachment remote_modified_at: - type: string format: date-time + type: string + nullable: true description: The remote modification date of the attachment candidate_id: type: string + nullable: true description: The UUID of the candidate field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the attachment remote_id: type: string + nullable: true description: The remote ID of the attachment remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the attachment in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsAttachmentInput: type: object properties: file_url: type: string + nullable: true description: The URL of the file file_name: type: string + nullable: true description: The name of the file attachment_type: type: string + nullable: true description: The type of the file remote_created_at: - type: string format: date-time + type: string + nullable: true description: The remote creation date of the attachment remote_modified_at: - type: string format: date-time + type: string + nullable: true description: The remote modification date of the attachment candidate_id: type: string + nullable: true description: The UUID of the candidate field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora Url: type: object - properties: {} + properties: + url: + type: string + nullable: true + description: The url. + url_type: + type: string + nullable: true + description: The url type. It takes [WEBSITE | BLOG | LINKEDIN | GITHUB | OTHER] + required: + - url + - url_type UnifiedAtsCandidateOutput: type: object properties: first_name: type: string + nullable: true description: The first name of the candidate last_name: type: string + nullable: true description: The last name of the candidate company: type: string + nullable: true description: The company of the candidate title: type: string + nullable: true description: The title of the candidate locations: type: string + nullable: true description: The locations of the candidate is_private: type: boolean + nullable: true description: Whether the candidate is private email_reachable: type: boolean + nullable: true description: Whether the candidate is reachable by email remote_created_at: - type: string format: date-time + type: string + nullable: true description: The remote creation date of the candidate remote_modified_at: - type: string format: date-time + type: string + nullable: true description: The remote modification date of the candidate last_interaction_at: - type: string format: date-time + type: string + nullable: true description: The last interaction date with the candidate attachments: + nullable: true description: The attachments UUIDs of the candidate type: array items: type: string applications: + nullable: true description: The applications UUIDs of the candidate type: array items: type: string tags: + nullable: true description: The tags of the candidate type: array items: type: string urls: + nullable: true description: >- The urls of the candidate, possible values for Url type are WEBSITE, BLOG, LINKEDIN, GITHUB, or OTHER @@ -9987,87 +10363,113 @@ components: items: $ref: '#/components/schemas/Url' phone_numbers: + nullable: true description: The phone numbers of the candidate type: array items: $ref: '#/components/schemas/Phone' email_addresses: + nullable: true description: The email addresses of the candidate type: array items: $ref: '#/components/schemas/Email' field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the candidate remote_id: type: string + nullable: true description: The id of the candidate in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the candidate in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsCandidateInput: type: object properties: first_name: type: string + nullable: true description: The first name of the candidate last_name: type: string + nullable: true description: The last name of the candidate company: type: string + nullable: true description: The company of the candidate title: type: string + nullable: true description: The title of the candidate locations: type: string + nullable: true description: The locations of the candidate is_private: type: boolean + nullable: true description: Whether the candidate is private email_reachable: type: boolean + nullable: true description: Whether the candidate is reachable by email remote_created_at: - type: string format: date-time + type: string + nullable: true description: The remote creation date of the candidate remote_modified_at: - type: string format: date-time + type: string + nullable: true description: The remote modification date of the candidate last_interaction_at: - type: string format: date-time + type: string + nullable: true description: The last interaction date with the candidate attachments: + nullable: true description: The attachments UUIDs of the candidate type: array items: type: string applications: + nullable: true description: The applications UUIDs of the candidate type: array items: type: string tags: + nullable: true description: The tags of the candidate type: array items: type: string urls: + nullable: true description: >- The urls of the candidate, possible values for Url type are WEBSITE, BLOG, LINKEDIN, GITHUB, or OTHER @@ -10075,17 +10477,21 @@ components: items: $ref: '#/components/schemas/Url' phone_numbers: + nullable: true description: The phone numbers of the candidate type: array items: $ref: '#/components/schemas/Phone' email_addresses: + nullable: true description: The email addresses of the candidate type: array items: $ref: '#/components/schemas/Email' field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora @@ -10094,127 +10500,170 @@ components: properties: name: type: string + nullable: true description: The name of the department field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the department remote_id: type: string + nullable: true description: The remote ID of the department in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the department in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsInterviewOutput: type: object properties: status: type: string + nullable: true description: The status of the interview application_id: type: string + nullable: true description: The UUID of the application job_interview_stage_id: type: string + nullable: true description: The UUID of the job interview stage organized_by: type: string + nullable: true description: The UUID of the organizer interviewers: + nullable: true description: The UUIDs of the interviewers type: array items: type: string location: type: string + nullable: true description: The location of the interview start_at: - type: string format: date-time + type: string + nullable: true description: The start date and time of the interview end_at: - type: string format: date-time + type: string + nullable: true description: The end date and time of the interview remote_created_at: - type: string format: date-time + type: string + nullable: true description: The remote creation date of the interview remote_updated_at: - type: string format: date-time + type: string + nullable: true description: The remote modification date of the interview field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the interview remote_id: type: string + nullable: true description: The remote ID of the interview in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the interview in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsInterviewInput: type: object properties: status: type: string + nullable: true description: The status of the interview application_id: type: string + nullable: true description: The UUID of the application job_interview_stage_id: type: string + nullable: true description: The UUID of the job interview stage organized_by: type: string + nullable: true description: The UUID of the organizer interviewers: + nullable: true description: The UUIDs of the interviewers type: array items: type: string location: type: string + nullable: true description: The location of the interview start_at: - type: string format: date-time + type: string + nullable: true description: The start date and time of the interview end_at: - type: string format: date-time + type: string + nullable: true description: The end date and time of the interview remote_created_at: - type: string format: date-time + type: string + nullable: true description: The remote creation date of the interview remote_updated_at: - type: string format: date-time + type: string + nullable: true description: The remote modification date of the interview field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora @@ -10223,36 +10672,49 @@ components: properties: name: type: string + nullable: true description: The name of the job interview stage stage_order: type: number + nullable: true description: The order of the stage job_id: type: string + nullable: true description: The UUID of the job field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the job interview stage remote_id: type: string + nullable: true description: >- The remote ID of the job interview stage in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: >- The remote data of the job interview stage in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsJobOutput: type: object @@ -10317,6 +10779,7 @@ components: description: The remote modification date of the job field_mappings: type: object + additionalProperties: true nullable: true description: >- The custom field mappings of the object between the remote 3rd party @@ -10332,6 +10795,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the job in the context of the 3rd Party created_at: format: date-time @@ -10351,23 +10815,23 @@ components: description: The UUID of the creator nullable: true remote_created_at: - type: string format: date-time + type: string description: The remote creation date of the offer nullable: true closed_at: - type: string format: date-time + type: string description: The closing date of the offer nullable: true sent_at: - type: string format: date-time + type: string description: The sending date of the offer nullable: true start_date: - type: string format: date-time + type: string description: The start date of the offer nullable: true status: @@ -10384,6 +10848,7 @@ components: The custom field mappings of the object between the remote 3rd party & Panora nullable: true + additionalProperties: true id: type: string description: The UUID of the offer @@ -10396,6 +10861,7 @@ components: type: object description: The remote data of the offer in the context of the 3rd Party nullable: true + additionalProperties: true created_at: type: object description: The created date of the object @@ -10409,12 +10875,16 @@ components: properties: name: type: string + nullable: true description: The name of the office location: type: string + nullable: true description: The location of the office field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora @@ -10423,64 +10893,87 @@ components: description: The UUID of the office remote_id: type: string + nullable: true description: The remote ID of the office in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the office in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsRejectreasonOutput: type: object properties: name: type: string + nullable: true description: The name of the reject reason field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the reject reason remote_id: type: string + nullable: true description: The remote ID of the reject reason in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the reject reason in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsScorecardOutput: type: object properties: overall_recommendation: type: string + nullable: true description: The overall recommendation application_id: type: string + nullable: true description: The UUID of the application interview_id: type: string + nullable: true description: The UUID of the interview remote_created_at: type: string - format: date-time + nullable: true description: The remote creation date of the scorecard submitted_at: type: string - format: date-time + nullable: true description: The submission date of the scorecard field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora @@ -10489,46 +10982,63 @@ components: description: The UUID of the scorecard remote_id: type: string + nullable: true description: The remote ID of the scorecard in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the scorecard in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object UnifiedAtsTagOutput: type: object properties: name: type: string + nullable: true description: The name of the tag id_ats_candidate: type: string + nullable: true description: The UUID of the candidate field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the tag remote_id: type: string + nullable: true description: The remote ID of the tag in the context of the 3rd Party remote_data: type: object + nullable: true + additionalProperties: true description: The remote data of the tag in the context of the 3rd Party created_at: - type: string format: date-time + type: string + nullable: true description: The creation date of the tag modified_at: - type: string format: date-time + type: string + nullable: true description: The modification date of the tag UnifiedAtsUserOutput: type: object @@ -10554,13 +11064,13 @@ components: description: The access role of the user nullable: true remote_created_at: - type: string format: date-time + type: string description: The remote creation date of the user nullable: true remote_modified_at: - type: string format: date-time + type: string description: The remote modification date of the user nullable: true field_mappings: @@ -10569,6 +11079,7 @@ components: The custom field mappings of the object between the remote 3rd party & Panora nullable: true + additionalProperties: true id: type: string description: The UUID of the user @@ -10581,12 +11092,15 @@ components: type: object description: The remote data of the user in the context of the 3rd Party nullable: true + additionalProperties: true created_at: - type: object + format: date-time + type: string description: The created date of the object nullable: true modified_at: - type: object + format: date-time + type: string description: The modified date of the object nullable: true UnifiedAtsEeocsOutput: @@ -10619,6 +11133,7 @@ components: description: The disability status of the candidate field_mappings: type: object + additionalProperties: true nullable: true description: >- The custom field mappings of the object between the remote 3rd party @@ -10634,6 +11149,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the EEOC in the context of the 3rd Party created_at: format: date-time @@ -10746,6 +11262,7 @@ components: description: The url of the drive field_mappings: type: object + additionalProperties: true nullable: true description: >- The custom field mappings of the object between the remote 3rd party @@ -10761,6 +11278,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the drive in the context of the 3rd Party created_at: format: date-time @@ -10813,6 +11331,7 @@ components: The custom field mappings of the object between the remote 3rd party & Panora nullable: true + additionalProperties: true id: type: string description: The UUID of the file @@ -10825,12 +11344,15 @@ components: type: object description: The remote data of the file in the context of the 3rd Party nullable: true + additionalProperties: true created_at: - type: object + format: date-time + type: string description: The created date of the object nullable: true modified_at: - type: object + format: date-time + type: string description: The modified date of the object nullable: true required: @@ -10878,6 +11400,7 @@ components: The custom field mappings of the object between the remote 3rd party & Panora nullable: true + additionalProperties: true required: - name - file_url @@ -10891,47 +11414,64 @@ components: properties: name: type: string + nullable: true description: The name of the folder size: type: string + nullable: true description: The size of the folder folder_url: type: string + nullable: true description: The url of the folder description: type: string description: The description of the folder drive_id: type: string + nullable: true description: The UUID of the drive tied to the folder parent_folder_id: type: string + nullable: true description: The UUID of the parent folder shared_link: type: string + nullable: true description: The UUID of the shared link tied to the folder permission: type: string + nullable: true description: The UUID of the permission tied to the folder field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora id: type: string + nullable: true description: The UUID of the folder remote_id: type: string + nullable: true description: The id of the folder in the context of the 3rd Party remote_data: type: object + additionalProperties: true + nullable: true description: The remote data of the folder in the context of the 3rd Party created_at: - type: object + format: date-time + type: string + nullable: true description: The created date of the object modified_at: - type: object + format: date-time + type: string + nullable: true description: The modified date of the object required: - name @@ -10947,30 +11487,39 @@ components: properties: name: type: string + nullable: true description: The name of the folder size: type: string + nullable: true description: The size of the folder folder_url: type: string + nullable: true description: The url of the folder description: type: string description: The description of the folder drive_id: type: string + nullable: true description: The UUID of the drive tied to the folder parent_folder_id: type: string + nullable: true description: The UUID of the parent folder shared_link: type: string + nullable: true description: The UUID of the shared link tied to the folder permission: type: string + nullable: true description: The UUID of the permission tied to the folder field_mappings: type: object + additionalProperties: true + nullable: true description: >- The custom field mappings of the object between the remote 3rd party & Panora @@ -11003,6 +11552,7 @@ components: party platform. field_mappings: type: object + additionalProperties: true nullable: true description: >- The custom field mappings of the object between the remote 3rd party @@ -11018,6 +11568,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the group in the context of the 3rd Party created_at: format: date-time @@ -11054,6 +11605,7 @@ components: description: >- The custom field mappings of the object between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -11065,6 +11617,7 @@ components: remote_data: type: object nullable: true + additionalProperties: true description: The remote data of the user in the context of the 3rd Party created_at: format: date-time @@ -11109,6 +11662,7 @@ components: description: >- The custom field mappings of the attachment between the remote 3rd party & Panora + additionalProperties: true id: type: string nullable: true @@ -11119,6 +11673,7 @@ components: description: The id of the attachment in the context of the 3rd Party remote_data: type: object + additionalProperties: true nullable: true description: The remote data of the attachment in the context of the 3rd Party created_at: @@ -11164,6 +11719,7 @@ components: description: >- The custom field mappings of the attachment between the remote 3rd party & Panora + additionalProperties: true required: - file_name - file_url From 9049e94867a2dee79d5c4a6761a30af3c1d454e3 Mon Sep 17 00:00:00 2001 From: nael Date: Fri, 2 Aug 2024 02:11:47 +0200 Subject: [PATCH 4/5] :pencil2: Added updated spec --- packages/api/src/main.ts | 17 ++++++----------- packages/api/swagger/swagger-spec.yaml | 26 +++++++++++--------------- 2 files changed, 17 insertions(+), 26 deletions(-) diff --git a/packages/api/src/main.ts b/packages/api/src/main.ts index 4f8a30ea3..0280cb482 100644 --- a/packages/api/src/main.ts +++ b/packages/api/src/main.ts @@ -1,18 +1,13 @@ import '@@core/@core-services/sentry/instrument'; -import * as Sentry from '@sentry/node'; -import { - BaseExceptionFilter, - HttpAdapterHost, - NestFactory, -} from '@nestjs/core'; -import { AppModule } from './app.module'; -import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger'; -import { Logger, LoggerErrorInterceptor } from 'nestjs-pino'; -import * as fs from 'fs'; -import * as cookieParser from 'cookie-parser'; +import { NestFactory } from '@nestjs/core'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; import { useContainer } from 'class-validator'; +import * as cookieParser from 'cookie-parser'; import * as cors from 'cors'; +import * as fs from 'fs'; import * as yaml from 'js-yaml'; +import { Logger, LoggerErrorInterceptor } from 'nestjs-pino'; +import { AppModule } from './app.module'; function addSpeakeasyGroup(document: any) { for (const path in document.paths) { diff --git a/packages/api/swagger/swagger-spec.yaml b/packages/api/swagger/swagger-spec.yaml index 6b3a71908..182669691 100644 --- a/packages/api/swagger/swagger-spec.yaml +++ b/packages/api/swagger/swagger-spec.yaml @@ -40,7 +40,6 @@ paths: $ref: '#/components/schemas/WebhookResponse' tags: &ref_0 - webhooks - x-speakeasy-group: webhook post: operationId: createWebhookPublic summary: Add webhook metadata @@ -59,7 +58,6 @@ paths: schema: $ref: '#/components/schemas/WebhookResponse' tags: *ref_0 - x-speakeasy-group: webhook /webhooks/{id}: delete: operationId: delete @@ -100,7 +98,7 @@ paths: schema: $ref: '#/components/schemas/WebhookResponse' tags: *ref_0 - x-speakeasy-group: webhook + x-speakeasy-group: webhooks.{id} /webhooks/verifyEvent: post: operationId: verifyEvent @@ -1766,7 +1764,6 @@ paths: $ref: '#/components/schemas/LinkedUserResponse' tags: &ref_34 - linkedUsers - x-speakeasy-group: linkedUsers get: operationId: listLinkedUsers summary: List Linked Users @@ -1781,7 +1778,6 @@ paths: items: $ref: '#/components/schemas/LinkedUserResponse' tags: *ref_34 - x-speakeasy-group: linkedUsers /linked_users/batch: post: operationId: importBatch @@ -1803,7 +1799,7 @@ paths: items: $ref: '#/components/schemas/LinkedUserResponse' tags: *ref_34 - x-speakeasy-group: linkedUsers + x-speakeasy-group: linked_users.batch /linked_users/single: get: operationId: retrieveLinkedUser @@ -1822,7 +1818,7 @@ paths: schema: $ref: '#/components/schemas/LinkedUserResponse' tags: *ref_34 - x-speakeasy-group: linkedUsers + x-speakeasy-group: linked_users.single /linked_users/fromRemoteId: get: operationId: remoteId @@ -1841,7 +1837,7 @@ paths: schema: $ref: '#/components/schemas/LinkedUserResponse' tags: *ref_34 - x-speakeasy-group: linkedUsers + x-speakeasy-group: linked_users.fromremoteid /field_mappings/define: post: operationId: definitions @@ -1862,7 +1858,7 @@ paths: $ref: '#/components/schemas/CustomFieldResponse' tags: &ref_35 - fieldMappings - x-speakeasy-group: fieldMappings + x-speakeasy-group: field_mappings.define /field_mappings: post: operationId: defineCustomField @@ -1882,7 +1878,6 @@ paths: schema: $ref: '#/components/schemas/CustomFieldResponse' tags: *ref_35 - x-speakeasy-group: fieldMappings /field_mappings/map: post: operationId: map @@ -1902,7 +1897,7 @@ paths: schema: $ref: '#/components/schemas/CustomFieldResponse' tags: *ref_35 - x-speakeasy-group: fieldMappings + x-speakeasy-group: field_mappings.map /passthrough: post: operationId: request @@ -8060,12 +8055,13 @@ servers: description: Production server - url: https://api-sandbox.panora.dev description: Sandbox server + - url: https://api-dev.panora.dev + description: Development server components: securitySchemes: - apiKey: - type: apiKey - name: x-api-key - in: header + bearer: + type: http + scheme: bearer schemas: String: type: object From 1faf9bcba9254e2b3438a26cb099d67d9786e1fe Mon Sep 17 00:00:00 2001 From: nael Date: Fri, 2 Aug 2024 02:21:56 +0200 Subject: [PATCH 5/5] :bug: Fix build --- .../components/Auth/CustomLoginComponent/ResetPasswordForm.tsx | 2 +- apps/webapp/src/hooks/create/useCreateBatchLinkedUser.tsx | 2 +- apps/webapp/src/hooks/create/useCreateWebhook.tsx | 2 +- apps/webapp/src/hooks/delete/useDeleteWebhook.tsx | 2 +- apps/webapp/src/hooks/update/useUpdateWebhookStatus.tsx | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/apps/webapp/src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx b/apps/webapp/src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx index 483cd12a0..8b1353cbb 100644 --- a/apps/webapp/src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx +++ b/apps/webapp/src/components/Auth/CustomLoginComponent/ResetPasswordForm.tsx @@ -26,7 +26,7 @@ const formSchema = z.object({ path: ["confirmPassword"], }); -const ResetPasswordForm = ({ token }) => { +const ResetPasswordForm = ({ token }: {token: string}) => { const router = useRouter(); const { func } = useResetPassword(); const [showPassword, setShowPassword] = useState(false); diff --git a/apps/webapp/src/hooks/create/useCreateBatchLinkedUser.tsx b/apps/webapp/src/hooks/create/useCreateBatchLinkedUser.tsx index 551188c46..03d69dc72 100644 --- a/apps/webapp/src/hooks/create/useCreateBatchLinkedUser.tsx +++ b/apps/webapp/src/hooks/create/useCreateBatchLinkedUser.tsx @@ -9,7 +9,7 @@ interface ILinkedUserDto { } const useCreateBatchLinkedUser = () => { const add = async (linkedUserData: ILinkedUserDto) => { - const response = await fetch(`${config.API_URL}/linked-users/internal/batch`, { + const response = await fetch(`${config.API_URL}/linked_users/internal/batch`, { method: 'POST', body: JSON.stringify(linkedUserData), headers: { diff --git a/apps/webapp/src/hooks/create/useCreateWebhook.tsx b/apps/webapp/src/hooks/create/useCreateWebhook.tsx index 00eff7bd4..e5b67c808 100644 --- a/apps/webapp/src/hooks/create/useCreateWebhook.tsx +++ b/apps/webapp/src/hooks/create/useCreateWebhook.tsx @@ -9,7 +9,7 @@ interface IWebhookDto { } const useCreateWebhook = () => { const add = async (data: IWebhookDto) => { - const response = await fetch(`${config.API_URL}/webhook/internal`, { + const response = await fetch(`${config.API_URL}/webhooks/internal`, { method: 'POST', body: JSON.stringify(data), headers: { diff --git a/apps/webapp/src/hooks/delete/useDeleteWebhook.tsx b/apps/webapp/src/hooks/delete/useDeleteWebhook.tsx index 5ee7c13fb..5166e357a 100644 --- a/apps/webapp/src/hooks/delete/useDeleteWebhook.tsx +++ b/apps/webapp/src/hooks/delete/useDeleteWebhook.tsx @@ -8,7 +8,7 @@ interface IWebhookDto { const useDeleteWebhook = () => { const remove = async (webhookData: IWebhookDto) => { - const response = await fetch(`${config.API_URL}/webhook/internal/${webhookData.id_webhook}`, { + const response = await fetch(`${config.API_URL}/webhooks/internal/${webhookData.id_webhook}`, { method: 'DELETE', headers: { 'Content-Type': 'application/json', diff --git a/apps/webapp/src/hooks/update/useUpdateWebhookStatus.tsx b/apps/webapp/src/hooks/update/useUpdateWebhookStatus.tsx index 537c7b87b..21e73f625 100644 --- a/apps/webapp/src/hooks/update/useUpdateWebhookStatus.tsx +++ b/apps/webapp/src/hooks/update/useUpdateWebhookStatus.tsx @@ -8,7 +8,7 @@ interface IWebhookUpdateDto { } const useUpdateWebhookStatus = () => { const update = async (data: IWebhookUpdateDto) => { - const response = await fetch(`${config.API_URL}/webhook/internal/${data.id}`, { + const response = await fetch(`${config.API_URL}/webhooks/internal/${data.id}`, { method: 'PUT', body: JSON.stringify({active: data.active}), headers: {