feat: implement rating summary service methods and integrate rating display components into the organization header and pending ratings page

This commit is contained in:
2026-07-22 12:13:50 -03:00
parent 383a5bc6b4
commit da3c3abb52
27 changed files with 1334 additions and 104 deletions
+80
View File
@@ -2,10 +2,17 @@ import ApiRequest from "@services/Api.Service";
import { ApiVoidResult } from "@core/Models/Api.VoidResult.type";
import { ApiError } from "@core/Models/Server.Error.model";
import {
CountRatingsByUserParams,
CountRatingsByUserResult,
CreateRatingParams,
PendingRatingItem,
PendingRatingsByUserParams,
ProfessionalRatingSummaryByUserParams,
RATING_COMMENT_MAX_LENGTH,
RatingTargetSummaryParams,
RatingTargetSummaryResult,
RatingTargetReviewItem,
RatingTargetReviewsParams,
RatingTargetType,
} from "@core/Models/Ratings.model";
import * as Yup from "yup";
@@ -14,6 +21,14 @@ const schemaPendingRatingsByUser = Yup.object().shape({
sessionUser: Yup.string().required("Para ver tus calificaciones pendientes debes iniciar sesión."),
});
const schemaCountRatingsByUser = Yup.object().shape({
sessionUser: Yup.string().required("Para ver tus opiniones realizadas debes iniciar sesión."),
});
const schemaProfessionalRatingSummaryByUser = Yup.object().shape({
sessionUser: Yup.string().required("Para ver tu puntaje profesional debes iniciar sesión."),
});
const schemaCreateRating = Yup.object().shape({
appointmentId: Yup.string().required("No se ha proporcionado el turno."),
targetType: Yup.string()
@@ -25,6 +40,17 @@ const schemaCreateRating = Yup.object().shape({
sessionUser: Yup.string().required("Para calificar debes iniciar sesión."),
});
const schemaRatingTargetSummary = Yup.object().shape({
targetType: Yup.string()
.oneOf(Object.values(RatingTargetType), "El tipo de calificación no es válido.")
.required("No se ha proporcionado el tipo de calificación."),
targetId: Yup.string().required("No se ha proporcionado el item calificado."),
});
const schemaRatingTargetReviews = schemaRatingTargetSummary.shape({
limit: Yup.number().integer().min(1).max(20),
});
export const pendingRatingsByUser = async (data: PendingRatingsByUserParams): Promise<PendingRatingItem[]> => {
return new Promise<PendingRatingItem[]>((resolve, reject) => {
schemaPendingRatingsByUser
@@ -38,6 +64,34 @@ export const pendingRatingsByUser = async (data: PendingRatingsByUserParams): Pr
});
};
export const countRatingsByUser = async (data: CountRatingsByUserParams): Promise<CountRatingsByUserResult> => {
return new Promise<CountRatingsByUserResult>((resolve, reject) => {
schemaCountRatingsByUser
.validate(data, { abortEarly: true })
.then(() => {
resolve(ApiRequest.post<CountRatingsByUserResult>("ratings/count-by-user", data));
})
.catch((error) => {
reject(new ApiError(500, error.message));
});
});
};
export const professionalRatingSummaryByUser = async (
data: ProfessionalRatingSummaryByUserParams
): Promise<RatingTargetSummaryResult> => {
return new Promise<RatingTargetSummaryResult>((resolve, reject) => {
schemaProfessionalRatingSummaryByUser
.validate(data, { abortEarly: true })
.then(() => {
resolve(ApiRequest.post<RatingTargetSummaryResult>("ratings/professional-summary-by-user", data));
})
.catch((error) => {
reject(new ApiError(500, error.message));
});
});
};
export const createRating = async (data: CreateRatingParams): Promise<ApiVoidResult> => {
return new Promise<ApiVoidResult>((resolve, reject) => {
schemaCreateRating
@@ -50,3 +104,29 @@ export const createRating = async (data: CreateRatingParams): Promise<ApiVoidRes
});
});
};
export const ratingTargetSummary = async (data: RatingTargetSummaryParams): Promise<RatingTargetSummaryResult> => {
return new Promise<RatingTargetSummaryResult>((resolve, reject) => {
schemaRatingTargetSummary
.validate(data, { abortEarly: true })
.then(() => {
resolve(ApiRequest.post<RatingTargetSummaryResult>("ratings/target-summary", data));
})
.catch((error) => {
reject(new ApiError(500, error.message));
});
});
};
export const ratingTargetReviews = async (data: RatingTargetReviewsParams): Promise<RatingTargetReviewItem[]> => {
return new Promise<RatingTargetReviewItem[]>((resolve, reject) => {
schemaRatingTargetReviews
.validate(data, { abortEarly: true })
.then(() => {
resolve(ApiRequest.post<RatingTargetReviewItem[]>("ratings/target-reviews", data));
})
.catch((error) => {
reject(new ApiError(500, error.message));
});
});
};