base con autenticacion, registro, modulo encuestas
This commit is contained in:
212
apps/web/feactures/surveys/schemas/survey.ts
Normal file
212
apps/web/feactures/surveys/schemas/survey.ts
Normal file
@@ -0,0 +1,212 @@
|
||||
import { any, z } from 'zod';
|
||||
|
||||
// Question types
|
||||
export enum QuestionType {
|
||||
TITLE = 'title',
|
||||
SIMPLE = 'simple',
|
||||
MULTIPLE_CHOICE = 'multiple_choice',
|
||||
SINGLE_CHOICE = 'single_choice',
|
||||
SELECT = 'select'
|
||||
}
|
||||
|
||||
// Base question schema
|
||||
const baseQuestionSchema = z.object({
|
||||
id: z.string(),
|
||||
type: z.nativeEnum(QuestionType),
|
||||
required: z.boolean().default(false),
|
||||
position: z.number()
|
||||
});
|
||||
|
||||
// Title question
|
||||
export const titleQuestionSchema = baseQuestionSchema.extend({
|
||||
type: z.literal(QuestionType.TITLE),
|
||||
content: z.string()
|
||||
});
|
||||
|
||||
// Simple question (text input)
|
||||
export const simpleQuestionSchema = baseQuestionSchema.extend({
|
||||
type: z.literal(QuestionType.SIMPLE),
|
||||
question: z.string()
|
||||
});
|
||||
|
||||
// Option-based questions
|
||||
const optionSchema = z.object({
|
||||
id: z.string(),
|
||||
text: z.string()
|
||||
});
|
||||
|
||||
// Multiple choice question
|
||||
export const multipleChoiceQuestionSchema = baseQuestionSchema.extend({
|
||||
type: z.literal(QuestionType.MULTIPLE_CHOICE),
|
||||
question: z.string(),
|
||||
options: z.array(optionSchema)
|
||||
});
|
||||
|
||||
// Single choice question
|
||||
export const singleChoiceQuestionSchema = baseQuestionSchema.extend({
|
||||
type: z.literal(QuestionType.SINGLE_CHOICE),
|
||||
question: z.string(),
|
||||
options: z.array(optionSchema)
|
||||
});
|
||||
|
||||
// Select question
|
||||
export const selectQuestionSchema = baseQuestionSchema.extend({
|
||||
type: z.literal(QuestionType.SELECT),
|
||||
question: z.string(),
|
||||
options: z.array(optionSchema)
|
||||
});
|
||||
|
||||
// Union of all question types
|
||||
export const questionSchema = z.discriminatedUnion('type', [
|
||||
titleQuestionSchema,
|
||||
simpleQuestionSchema,
|
||||
multipleChoiceQuestionSchema,
|
||||
singleChoiceQuestionSchema,
|
||||
selectQuestionSchema
|
||||
]);
|
||||
|
||||
// Survey schema
|
||||
export const surveySchema = z.object({
|
||||
id: z.number().optional(),
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
targetAudience: z.string(),
|
||||
closingDate: z.date().optional(),
|
||||
published: z.boolean(),
|
||||
questions: z.array(questionSchema),
|
||||
created_at: z.string().optional(),
|
||||
updated_at: z.string().optional(),
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Survey Answer request schema
|
||||
export const surveyAnswerMutateSchema = z.object({
|
||||
surveyId: z.string(),
|
||||
answers: z.array(
|
||||
z.object({
|
||||
questionId: z.string(),
|
||||
value: z.union([z.string(), z.array(z.string())])
|
||||
})
|
||||
),
|
||||
|
||||
});
|
||||
|
||||
// Types based on schemas
|
||||
export type Question = z.infer<typeof questionSchema>;
|
||||
export type TitleQuestion = z.infer<typeof titleQuestionSchema>;
|
||||
export type SimpleQuestion = z.infer<typeof simpleQuestionSchema>;
|
||||
export type MultipleChoiceQuestion = z.infer<typeof multipleChoiceQuestionSchema>;
|
||||
export type SingleChoiceQuestion = z.infer<typeof singleChoiceQuestionSchema>;
|
||||
export type SelectQuestion = z.infer<typeof selectQuestionSchema>;
|
||||
export type Survey = z.infer<typeof surveySchema>;
|
||||
export type SurveyResponse = z.infer<typeof surveyAnswerMutateSchema>;
|
||||
|
||||
|
||||
export const surveyApiSchema = z.object({
|
||||
id: z.number().optional(),
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
targetAudience: z.string(),
|
||||
closingDate: z.string().transform((str) => str ? new Date(str) : null),
|
||||
published: z.boolean(),
|
||||
questions: z.array(questionSchema),
|
||||
created_at: z.string().optional(),
|
||||
updated_at: z.string().optional(),
|
||||
});
|
||||
export type SurveyTable = z.infer<typeof surveyApiSchema>;
|
||||
|
||||
|
||||
// Api response schemas
|
||||
export const surveysApiResponseSchema = z.object({
|
||||
message: z.string(),
|
||||
data: z.array(surveyApiSchema),
|
||||
meta: z.object({
|
||||
page: z.number(),
|
||||
limit: z.number(),
|
||||
totalCount: z.number(),
|
||||
totalPages: z.number(),
|
||||
hasNextPage: z.boolean(),
|
||||
hasPreviousPage: z.boolean(),
|
||||
nextPage: z.number().nullable(),
|
||||
previousPage: z.number().nullable(),
|
||||
}),
|
||||
});
|
||||
|
||||
|
||||
// Survey response schema
|
||||
export const surveyAnswerApiResponseSchema = z.object({
|
||||
id: z.number().optional(),
|
||||
surveyId: z.number(),
|
||||
userId: z.number(),
|
||||
answers: z.array(
|
||||
z.object({
|
||||
questionId: z.string(),
|
||||
value: z.union([z.string(), z.array(z.string())])
|
||||
})
|
||||
),
|
||||
created_at: z.string().optional(),
|
||||
updated_at: z.string().optional(),
|
||||
});
|
||||
|
||||
|
||||
// Response schemas for the API create, update
|
||||
export const SurveyAnswerMutate = z.object({
|
||||
message: z.string(),
|
||||
data: surveyAnswerApiResponseSchema,
|
||||
});
|
||||
|
||||
// Response schemas for the API create, update
|
||||
export const suveryApiMutationResponseSchema = z.object({
|
||||
message: z.string(),
|
||||
data: surveyApiSchema,
|
||||
});
|
||||
|
||||
// Response schemas for the API create, update
|
||||
export const suveryResponseDeleteSchema = z.object({
|
||||
message: z.string(),
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
// Schema For User Survey Answer
|
||||
export const surveyAnswerQuerySchema = z.object({
|
||||
surverId: z.number(),
|
||||
title: z.string(),
|
||||
description: z.string(),
|
||||
created_at: z.string().transform((str) => str ? new Date(str) : null),
|
||||
closingDate: z.string().transform((str) => str ? new Date(str) : null),
|
||||
targetAudience: z.string(),
|
||||
user_id: z.number().nullable(),
|
||||
});
|
||||
|
||||
export const surveyAnswerQuerySchema2 = z.object({
|
||||
surveys: z.any(),
|
||||
answers_surveys: z.any().optional()
|
||||
// surverId: z.number(),
|
||||
// title: z.string(),
|
||||
// description: z.string(),
|
||||
// created_at: z.string().transform((str) => str ? new Date(str) : null),
|
||||
// closingDate: z.string().transform((str) => str ? new Date(str) : null),
|
||||
// targetAudience: z.string(),
|
||||
// user_id: z.number().nullable(),
|
||||
});
|
||||
|
||||
// Api response schemas
|
||||
export const surveysApiResponseForUserSchema = z.object({
|
||||
message: z.string(),
|
||||
data: z.array(surveyAnswerQuerySchema2),
|
||||
meta: z.object({
|
||||
page: z.number(),
|
||||
limit: z.number(),
|
||||
totalCount: z.number(),
|
||||
totalPages: z.number(),
|
||||
hasNextPage: z.boolean(),
|
||||
hasPreviousPage: z.boolean(),
|
||||
nextPage: z.number().nullable(),
|
||||
previousPage: z.number().nullable(),
|
||||
}),
|
||||
});
|
||||
export type SurveyAnswerForUser = z.infer<typeof surveyAnswerQuerySchema2>;
|
||||
6
apps/web/feactures/surveys/schemas/surveys-options.ts
Normal file
6
apps/web/feactures/surveys/schemas/surveys-options.ts
Normal file
@@ -0,0 +1,6 @@
|
||||
export const PUBLISHED_TYPES = {
|
||||
published: 'Publicada',
|
||||
draft: 'Borrador',
|
||||
} as const;
|
||||
|
||||
export type PublishedType = keyof typeof PUBLISHED_TYPES;
|
||||
Reference in New Issue
Block a user