From 0dbcd3f428cff8facd00de09491f206f0ba215f6 Mon Sep 17 00:00:00 2001 From: Alexandre78R Date: Wed, 11 Jun 2025 22:25:02 +0200 Subject: [PATCH] fixed captcha and dockerfile frontend mode build one --- .env.sample | 3 +- .../images/{ => captcha}/car-voiture-1.jpg | Bin .../images/{ => captcha}/car-voiture-10.png | Bin .../images/{ => captcha}/car-voiture-2.jpg | Bin .../images/{ => captcha}/car-voiture-3.jpg | Bin .../images/{ => captcha}/car-voiture-4.jpg | Bin .../images/{ => captcha}/car-voiture-5.jpg | Bin .../images/{ => captcha}/car-voiture-6.png | Bin .../images/{ => captcha}/car-voiture-7.jpg | Bin .../images/{ => captcha}/car-voiture-8.jpg | Bin .../images/{ => captcha}/car-voiture-9.jpg | Bin .../src/images/{ => captcha}/cat-chat-1.jpg | Bin .../src/images/{ => captcha}/cat-chat-10.jpg | Bin .../src/images/{ => captcha}/cat-chat-11.png | Bin .../src/images/{ => captcha}/cat-chat-2.jpg | Bin .../src/images/{ => captcha}/cat-chat-3.jpg | Bin .../src/images/{ => captcha}/cat-chat-4.jpg | Bin .../src/images/{ => captcha}/cat-chat-5.jpg | Bin .../src/images/{ => captcha}/cat-chat-6.jpg | Bin .../src/images/{ => captcha}/cat-chat-7.jpg | Bin .../src/images/{ => captcha}/cat-chat-8.jpg | Bin .../src/images/{ => captcha}/cat-chat-9.jpg | Bin .../src/images/{ => captcha}/dog-chien-1.jpg | Bin .../src/images/{ => captcha}/dog-chien-10.jpg | Bin .../src/images/{ => captcha}/dog-chien-2.jpg | Bin .../src/images/{ => captcha}/dog-chien-3.jpg | Bin .../src/images/{ => captcha}/dog-chien-4.jpg | Bin .../src/images/{ => captcha}/dog-chien-5.jpg | Bin .../src/images/{ => captcha}/dog-chien-6.jpg | Bin .../src/images/{ => captcha}/dog-chien-7.jpg | Bin .../src/images/{ => captcha}/dog-chien-8.jpg | Bin .../src/images/{ => captcha}/dog-chien-9.jpg | Bin backend/src/index.ts | 2 +- backend/src/resolvers/captcha.resolver.ts | 2 +- .../tests/routes/badge-project.test-not.ts | 1 - docker-compose.yml | 2 + frontend/src/components/Captcha/Captcha.tsx | 3 + frontend/src/types/graphql.ts | 179 +++++++++++++++++- 38 files changed, 184 insertions(+), 8 deletions(-) rename backend/src/images/{ => captcha}/car-voiture-1.jpg (100%) rename backend/src/images/{ => captcha}/car-voiture-10.png (100%) rename backend/src/images/{ => captcha}/car-voiture-2.jpg (100%) rename backend/src/images/{ => captcha}/car-voiture-3.jpg (100%) rename backend/src/images/{ => captcha}/car-voiture-4.jpg (100%) rename backend/src/images/{ => captcha}/car-voiture-5.jpg (100%) rename backend/src/images/{ => captcha}/car-voiture-6.png (100%) rename backend/src/images/{ => captcha}/car-voiture-7.jpg (100%) rename backend/src/images/{ => captcha}/car-voiture-8.jpg (100%) rename backend/src/images/{ => captcha}/car-voiture-9.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-1.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-10.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-11.png (100%) rename backend/src/images/{ => captcha}/cat-chat-2.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-3.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-4.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-5.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-6.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-7.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-8.jpg (100%) rename backend/src/images/{ => captcha}/cat-chat-9.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-1.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-10.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-2.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-3.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-4.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-5.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-6.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-7.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-8.jpg (100%) rename backend/src/images/{ => captcha}/dog-chien-9.jpg (100%) diff --git a/.env.sample b/.env.sample index 4c1102de..be13e163 100644 --- a/.env.sample +++ b/.env.sample @@ -1,3 +1,4 @@ NEXT_PUBLIC_API_TOKEN="" JWT_SECRET="" -NODE_ENV="" \ No newline at end of file +NODE_ENV="" +NEXT_PUBLIC_API_URL="" \ No newline at end of file diff --git a/backend/src/images/car-voiture-1.jpg b/backend/src/images/captcha/car-voiture-1.jpg similarity index 100% rename from backend/src/images/car-voiture-1.jpg rename to backend/src/images/captcha/car-voiture-1.jpg diff --git a/backend/src/images/car-voiture-10.png b/backend/src/images/captcha/car-voiture-10.png similarity index 100% rename from backend/src/images/car-voiture-10.png rename to backend/src/images/captcha/car-voiture-10.png diff --git a/backend/src/images/car-voiture-2.jpg b/backend/src/images/captcha/car-voiture-2.jpg similarity index 100% rename from backend/src/images/car-voiture-2.jpg rename to backend/src/images/captcha/car-voiture-2.jpg diff --git a/backend/src/images/car-voiture-3.jpg b/backend/src/images/captcha/car-voiture-3.jpg similarity index 100% rename from backend/src/images/car-voiture-3.jpg rename to backend/src/images/captcha/car-voiture-3.jpg diff --git a/backend/src/images/car-voiture-4.jpg b/backend/src/images/captcha/car-voiture-4.jpg similarity index 100% rename from backend/src/images/car-voiture-4.jpg rename to backend/src/images/captcha/car-voiture-4.jpg diff --git a/backend/src/images/car-voiture-5.jpg b/backend/src/images/captcha/car-voiture-5.jpg similarity index 100% rename from backend/src/images/car-voiture-5.jpg rename to backend/src/images/captcha/car-voiture-5.jpg diff --git a/backend/src/images/car-voiture-6.png b/backend/src/images/captcha/car-voiture-6.png similarity index 100% rename from backend/src/images/car-voiture-6.png rename to backend/src/images/captcha/car-voiture-6.png diff --git a/backend/src/images/car-voiture-7.jpg b/backend/src/images/captcha/car-voiture-7.jpg similarity index 100% rename from backend/src/images/car-voiture-7.jpg rename to backend/src/images/captcha/car-voiture-7.jpg diff --git a/backend/src/images/car-voiture-8.jpg b/backend/src/images/captcha/car-voiture-8.jpg similarity index 100% rename from backend/src/images/car-voiture-8.jpg rename to backend/src/images/captcha/car-voiture-8.jpg diff --git a/backend/src/images/car-voiture-9.jpg b/backend/src/images/captcha/car-voiture-9.jpg similarity index 100% rename from backend/src/images/car-voiture-9.jpg rename to backend/src/images/captcha/car-voiture-9.jpg diff --git a/backend/src/images/cat-chat-1.jpg b/backend/src/images/captcha/cat-chat-1.jpg similarity index 100% rename from backend/src/images/cat-chat-1.jpg rename to backend/src/images/captcha/cat-chat-1.jpg diff --git a/backend/src/images/cat-chat-10.jpg b/backend/src/images/captcha/cat-chat-10.jpg similarity index 100% rename from backend/src/images/cat-chat-10.jpg rename to backend/src/images/captcha/cat-chat-10.jpg diff --git a/backend/src/images/cat-chat-11.png b/backend/src/images/captcha/cat-chat-11.png similarity index 100% rename from backend/src/images/cat-chat-11.png rename to backend/src/images/captcha/cat-chat-11.png diff --git a/backend/src/images/cat-chat-2.jpg b/backend/src/images/captcha/cat-chat-2.jpg similarity index 100% rename from backend/src/images/cat-chat-2.jpg rename to backend/src/images/captcha/cat-chat-2.jpg diff --git a/backend/src/images/cat-chat-3.jpg b/backend/src/images/captcha/cat-chat-3.jpg similarity index 100% rename from backend/src/images/cat-chat-3.jpg rename to backend/src/images/captcha/cat-chat-3.jpg diff --git a/backend/src/images/cat-chat-4.jpg b/backend/src/images/captcha/cat-chat-4.jpg similarity index 100% rename from backend/src/images/cat-chat-4.jpg rename to backend/src/images/captcha/cat-chat-4.jpg diff --git a/backend/src/images/cat-chat-5.jpg b/backend/src/images/captcha/cat-chat-5.jpg similarity index 100% rename from backend/src/images/cat-chat-5.jpg rename to backend/src/images/captcha/cat-chat-5.jpg diff --git a/backend/src/images/cat-chat-6.jpg b/backend/src/images/captcha/cat-chat-6.jpg similarity index 100% rename from backend/src/images/cat-chat-6.jpg rename to backend/src/images/captcha/cat-chat-6.jpg diff --git a/backend/src/images/cat-chat-7.jpg b/backend/src/images/captcha/cat-chat-7.jpg similarity index 100% rename from backend/src/images/cat-chat-7.jpg rename to backend/src/images/captcha/cat-chat-7.jpg diff --git a/backend/src/images/cat-chat-8.jpg b/backend/src/images/captcha/cat-chat-8.jpg similarity index 100% rename from backend/src/images/cat-chat-8.jpg rename to backend/src/images/captcha/cat-chat-8.jpg diff --git a/backend/src/images/cat-chat-9.jpg b/backend/src/images/captcha/cat-chat-9.jpg similarity index 100% rename from backend/src/images/cat-chat-9.jpg rename to backend/src/images/captcha/cat-chat-9.jpg diff --git a/backend/src/images/dog-chien-1.jpg b/backend/src/images/captcha/dog-chien-1.jpg similarity index 100% rename from backend/src/images/dog-chien-1.jpg rename to backend/src/images/captcha/dog-chien-1.jpg diff --git a/backend/src/images/dog-chien-10.jpg b/backend/src/images/captcha/dog-chien-10.jpg similarity index 100% rename from backend/src/images/dog-chien-10.jpg rename to backend/src/images/captcha/dog-chien-10.jpg diff --git a/backend/src/images/dog-chien-2.jpg b/backend/src/images/captcha/dog-chien-2.jpg similarity index 100% rename from backend/src/images/dog-chien-2.jpg rename to backend/src/images/captcha/dog-chien-2.jpg diff --git a/backend/src/images/dog-chien-3.jpg b/backend/src/images/captcha/dog-chien-3.jpg similarity index 100% rename from backend/src/images/dog-chien-3.jpg rename to backend/src/images/captcha/dog-chien-3.jpg diff --git a/backend/src/images/dog-chien-4.jpg b/backend/src/images/captcha/dog-chien-4.jpg similarity index 100% rename from backend/src/images/dog-chien-4.jpg rename to backend/src/images/captcha/dog-chien-4.jpg diff --git a/backend/src/images/dog-chien-5.jpg b/backend/src/images/captcha/dog-chien-5.jpg similarity index 100% rename from backend/src/images/dog-chien-5.jpg rename to backend/src/images/captcha/dog-chien-5.jpg diff --git a/backend/src/images/dog-chien-6.jpg b/backend/src/images/captcha/dog-chien-6.jpg similarity index 100% rename from backend/src/images/dog-chien-6.jpg rename to backend/src/images/captcha/dog-chien-6.jpg diff --git a/backend/src/images/dog-chien-7.jpg b/backend/src/images/captcha/dog-chien-7.jpg similarity index 100% rename from backend/src/images/dog-chien-7.jpg rename to backend/src/images/captcha/dog-chien-7.jpg diff --git a/backend/src/images/dog-chien-8.jpg b/backend/src/images/captcha/dog-chien-8.jpg similarity index 100% rename from backend/src/images/dog-chien-8.jpg rename to backend/src/images/captcha/dog-chien-8.jpg diff --git a/backend/src/images/dog-chien-9.jpg b/backend/src/images/captcha/dog-chien-9.jpg similarity index 100% rename from backend/src/images/dog-chien-9.jpg rename to backend/src/images/captcha/dog-chien-9.jpg diff --git a/backend/src/index.ts b/backend/src/index.ts index 5ec03499..88831c21 100644 --- a/backend/src/index.ts +++ b/backend/src/index.ts @@ -70,7 +70,7 @@ async function main() { const imageId = req.params.id; const filename = captchaImageMap[imageId]; if (filename) { - const imagePath = path.join(__dirname, 'images', filename); + const imagePath = path.join(__dirname, 'images/captcha', filename); res.sendFile(imagePath); } else { res.status(404).send('Image not found'); diff --git a/backend/src/resolvers/captcha.resolver.ts b/backend/src/resolvers/captcha.resolver.ts index f18fe597..63b99bcf 100644 --- a/backend/src/resolvers/captcha.resolver.ts +++ b/backend/src/resolvers/captcha.resolver.ts @@ -28,7 +28,7 @@ export class CaptchaResolver { const id = uuidv4(); - const imagesDir = path.join(__dirname, '..', 'images'); + const imagesDir = path.join(__dirname, '..', 'images/captcha'); const files = fs.readdirSync(imagesDir); diff --git a/backend/tests/routes/badge-project.test-not.ts b/backend/tests/routes/badge-project.test-not.ts index 172522f2..53165af5 100644 --- a/backend/tests/routes/badge-project.test-not.ts +++ b/backend/tests/routes/badge-project.test-not.ts @@ -1,4 +1,3 @@ -import request from 'supertest'; import express from 'express'; import { PrismaClient } from '@prisma/client'; import { Request, Response } from 'express'; diff --git a/docker-compose.yml b/docker-compose.yml index e222105f..8c5868fe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,6 +20,7 @@ services: context: ./frontend args: NEXT_PUBLIC_API_TOKEN: ${NEXT_PUBLIC_API_TOKEN} + NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} ports: - 3000:3000 volumes: @@ -30,6 +31,7 @@ services: - WATCHPACK_POLLING=true - NEXT_PUBLIC_IMAGE_URL=http://localhost:8000 - NEXT_PUBLIC_API_TOKEN=${NEXT_PUBLIC_API_TOKEN} + - NEXT_PUBLIC_API_URL=${NEXT_PUBLIC_API_URL} - API_URL=${API_URL} - NODE_ENV=development env_file: diff --git a/frontend/src/components/Captcha/Captcha.tsx b/frontend/src/components/Captcha/Captcha.tsx index 9520109f..10386a4f 100644 --- a/frontend/src/components/Captcha/Captcha.tsx +++ b/frontend/src/components/Captcha/Captcha.tsx @@ -97,6 +97,7 @@ const CaptchaModal: React.FC = ({ const imageUrls = response.data.generateCaptcha.images.map( (img) => img.url ); + console.log("imageUrls", imageUrls) preloadImages(imageUrls).then(() => { setImages(response.data.generateCaptcha.images); setChallengeType(response.data.generateCaptcha.challengeType); @@ -108,6 +109,7 @@ const CaptchaModal: React.FC = ({ } }) .catch((error) => { + console.log("error", error); showAlert("error", getErrorMessage(error)); setLoading(false); setCheckRefresh(false); @@ -127,6 +129,7 @@ const CaptchaModal: React.FC = ({ generateCaptcha .refetch() .then((response) => { + console.log(response) if (response.data) { const imageUrls = response.data.generateCaptcha.images.map( (img) => img.url diff --git a/frontend/src/types/graphql.ts b/frontend/src/types/graphql.ts index 2c6d9a72..f5d2ac70 100644 --- a/frontend/src/types/graphql.ts +++ b/frontend/src/types/graphql.ts @@ -15,6 +15,29 @@ export type Scalars = { Boolean: { input: boolean; output: boolean; } Int: { input: number; output: number; } Float: { input: number; output: number; } + DateTimeISO: { input: any; output: any; } +}; + +export type BackupFileInfo = { + __typename?: 'BackupFileInfo'; + createdAt: Scalars['DateTimeISO']['output']; + fileName: Scalars['String']['output']; + modifiedAt: Scalars['DateTimeISO']['output']; + sizeBytes: Scalars['Int']['output']; +}; + +export type BackupFilesResponse = { + __typename?: 'BackupFilesResponse'; + code: Scalars['Int']['output']; + files?: Maybe>; + message: Scalars['String']['output']; +}; + +export type BackupResponse = { + __typename?: 'BackupResponse'; + code: Scalars['Int']['output']; + message: Scalars['String']['output']; + path: Scalars['String']['output']; }; export type CaptchaImage = { @@ -75,6 +98,21 @@ export type CreateEducationInput = { year: Scalars['Int']['input']; }; +export type CreateExperienceInput = { + business: Scalars['String']['input']; + employmentContractEN: Scalars['String']['input']; + employmentContractFR: Scalars['String']['input']; + endDateEN: Scalars['String']['input']; + endDateFR: Scalars['String']['input']; + jobEN: Scalars['String']['input']; + jobFR: Scalars['String']['input']; + month: Scalars['Float']['input']; + startDateEN: Scalars['String']['input']; + startDateFR: Scalars['String']['input']; + typeEN: Scalars['String']['input']; + typeFR: Scalars['String']['input']; +}; + export type CreateProjectInput = { contentDisplay: Scalars['String']['input']; descriptionEN: Scalars['String']['input']; @@ -91,6 +129,13 @@ export type CreateSkillInput = { name: Scalars['String']['input']; }; +export type CreateUserInput = { + email: Scalars['String']['input']; + firstname: Scalars['String']['input']; + lastname: Scalars['String']['input']; + role: Scalars['String']['input']; +}; + export type Education = { __typename?: 'Education'; diplomaLevelEN: Scalars['String']['output']; @@ -127,14 +172,14 @@ export type EducationsResponse = { export type Experience = { __typename?: 'Experience'; business: Scalars['String']['output']; - employmentContractEN?: Maybe; - employmentContractFR?: Maybe; + employmentContractEN: Scalars['String']['output']; + employmentContractFR: Scalars['String']['output']; endDateEN: Scalars['String']['output']; endDateFR: Scalars['String']['output']; id: Scalars['ID']['output']; jobEN: Scalars['String']['output']; jobFR: Scalars['String']['output']; - month?: Maybe; + month: Scalars['Float']['output']; startDateEN: Scalars['String']['output']; startDateFR: Scalars['String']['output']; typeEN: Scalars['String']['output']; @@ -155,6 +200,37 @@ export type ExperiencesResponse = { message: Scalars['String']['output']; }; +export type GlobalStats = { + __typename?: 'GlobalStats'; + totalEducations: Scalars['Int']['output']; + totalExperiences: Scalars['Int']['output']; + totalProjects: Scalars['Int']['output']; + totalSkills: Scalars['Int']['output']; + totalUsers: Scalars['Int']['output']; + usersByRoleAdmin: Scalars['Int']['output']; + usersByRoleEditor: Scalars['Int']['output']; + usersByRoleView: Scalars['Int']['output']; +}; + +export type GlobalStatsResponse = { + __typename?: 'GlobalStatsResponse'; + code: Scalars['Int']['output']; + message: Scalars['String']['output']; + stats?: Maybe; +}; + +export type LoginInput = { + email: Scalars['String']['input']; + password: Scalars['String']['input']; +}; + +export type LoginResponse = { + __typename?: 'LoginResponse'; + code: Scalars['Int']['output']; + message: Scalars['String']['output']; + token?: Maybe; +}; + export type MessageType = { __typename?: 'MessageType'; label: Scalars['String']['output']; @@ -164,24 +240,39 @@ export type MessageType = { export type Mutation = { __typename?: 'Mutation'; + changePassword: Response; clearCaptcha: Scalars['Boolean']['output']; createCategory: CategoryResponse; createEducation: EducationResponse; + createExperience: ExperienceResponse; createProject: ProjectResponse; createSkill: SubItemResponse; + deleteBackupFile: Response; deleteCategory: CategoryResponse; deleteEducation: EducationResponse; + deleteExperience: ExperienceResponse; deleteProject: Response; deleteSkill: SubItemResponse; + generateDatabaseBackup: BackupResponse; + login: LoginResponse; + logout: Response; + registerUser: UserResponse; sendContact: MessageType; updateCategory: CategoryResponse; updateEducation: EducationResponse; + updateExperience: ExperienceResponse; updateProject: ProjectResponse; updateSkill: SubItemResponse; validateCaptcha: ValidationResponse; }; +export type MutationChangePasswordArgs = { + email: Scalars['String']['input']; + newPassword: Scalars['String']['input']; +}; + + export type MutationClearCaptchaArgs = { idCaptcha: Scalars['String']['input']; }; @@ -197,6 +288,11 @@ export type MutationCreateEducationArgs = { }; +export type MutationCreateExperienceArgs = { + data: CreateExperienceInput; +}; + + export type MutationCreateProjectArgs = { data: CreateProjectInput; }; @@ -207,6 +303,11 @@ export type MutationCreateSkillArgs = { }; +export type MutationDeleteBackupFileArgs = { + fileName: Scalars['String']['input']; +}; + + export type MutationDeleteCategoryArgs = { id: Scalars['Int']['input']; }; @@ -217,6 +318,11 @@ export type MutationDeleteEducationArgs = { }; +export type MutationDeleteExperienceArgs = { + id: Scalars['Int']['input']; +}; + + export type MutationDeleteProjectArgs = { id: Scalars['Int']['input']; }; @@ -227,6 +333,16 @@ export type MutationDeleteSkillArgs = { }; +export type MutationLoginArgs = { + data: LoginInput; +}; + + +export type MutationRegisterUserArgs = { + data: CreateUserInput; +}; + + export type MutationSendContactArgs = { data: ContactFrom; }; @@ -243,6 +359,11 @@ export type MutationUpdateEducationArgs = { }; +export type MutationUpdateExperienceArgs = { + data: UpdateExperienceInput; +}; + + export type MutationUpdateProjectArgs = { data: UpdateProjectInput; }; @@ -293,9 +414,12 @@ export type Query = { experienceById: ExperienceResponse; experienceList: ExperiencesResponse; generateCaptcha: CaptchaResponse; + getGlobalStats: GlobalStatsResponse; + listBackupFiles: BackupFilesResponse; projectById: ProjectResponse; projectList: ProjectsResponse; skillList: CategoryResponse; + userList: UsersResponse; }; @@ -319,6 +443,13 @@ export type Response = { message: Scalars['String']['output']; }; +/** User roles */ +export enum Role { + Admin = 'admin', + Editor = 'editor', + View = 'view' +} + export type Skill = { __typename?: 'Skill'; categoryEN: Scalars['String']['output']; @@ -365,6 +496,22 @@ export type UpdateEducationInput = { year?: InputMaybe; }; +export type UpdateExperienceInput = { + business?: InputMaybe; + employmentContractEN?: InputMaybe; + employmentContractFR?: InputMaybe; + endDateEN?: InputMaybe; + endDateFR?: InputMaybe; + id: Scalars['Int']['input']; + jobEN?: InputMaybe; + jobFR?: InputMaybe; + month?: InputMaybe; + startDateEN?: InputMaybe; + startDateFR?: InputMaybe; + typeEN?: InputMaybe; + typeFR?: InputMaybe; +}; + export type UpdateProjectInput = { contentDisplay?: InputMaybe; descriptionEN?: InputMaybe; @@ -382,6 +529,30 @@ export type UpdateSkillInput = { name?: InputMaybe; }; +export type User = { + __typename?: 'User'; + email: Scalars['String']['output']; + firstname: Scalars['String']['output']; + id: Scalars['ID']['output']; + isPasswordChange: Scalars['Boolean']['output']; + lastname: Scalars['String']['output']; + role: Role; +}; + +export type UserResponse = { + __typename?: 'UserResponse'; + code: Scalars['Int']['output']; + message: Scalars['String']['output']; + user?: Maybe; +}; + +export type UsersResponse = { + __typename?: 'UsersResponse'; + code: Scalars['Int']['output']; + message: Scalars['String']['output']; + users?: Maybe>; +}; + export type ValidationResponse = { __typename?: 'ValidationResponse'; isValid: Scalars['Boolean']['output']; @@ -423,7 +594,7 @@ export type GetEducationsListQuery = { __typename?: 'Query', educationList: { __ export type GetExperiencesListQueryVariables = Exact<{ [key: string]: never; }>; -export type GetExperiencesListQuery = { __typename?: 'Query', experienceList: { __typename?: 'ExperiencesResponse', message: string, code: number, experiences?: Array<{ __typename?: 'Experience', employmentContractEN?: string | null, business: string, employmentContractFR?: string | null, endDateEN: string, endDateFR: string, jobEN: string, id: string, jobFR: string, month?: number | null, startDateEN: string, startDateFR: string, typeEN: string, typeFR: string }> | null } }; +export type GetExperiencesListQuery = { __typename?: 'Query', experienceList: { __typename?: 'ExperiencesResponse', message: string, code: number, experiences?: Array<{ __typename?: 'Experience', employmentContractEN: string, business: string, employmentContractFR: string, endDateEN: string, endDateFR: string, jobEN: string, id: string, jobFR: string, month: number, startDateEN: string, startDateFR: string, typeEN: string, typeFR: string }> | null } }; export type GetProjectsListQueryVariables = Exact<{ [key: string]: never; }>;