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
+96 -3
View File
@@ -1,13 +1,24 @@
import { Body, Controller, Middlewares, Post, Response, Route, SuccessResponse } from "tsoa";
import { ApiVoidResult } from "../../Models/Api.VoidResult.type";
import { CreateRatingParams, PendingRatingItem, PendingRatingsByUserParams } from "../../Models/Ratings/Ratings.Interface";
import {
CountRatingsByUserParams,
CountRatingsByUserResult,
CreateRatingParams,
PendingRatingItem,
PendingRatingsByUserParams,
ProfessionalRatingSummaryByUserParams,
RatingTargetReviewItem,
RatingTargetReviewsParams,
RatingTargetSummaryParams,
RatingTargetSummaryResult,
} from "../../Models/Ratings/Ratings.Interface";
import { ApiValidationError } from "../../Models/Server.Error.model";
import { authenticateMiddleware } from "../../middleware/authentication";
import { rateLimiter } from "../../middleware/ratelimiter";
import { ratingRateLimiter } from "../../middleware/ratelimiter";
import { RatingsService } from "./Ratings.Service";
@Route("ratings/create")
@Middlewares([rateLimiter, authenticateMiddleware])
@Middlewares([ratingRateLimiter, authenticateMiddleware])
export class CreateRatingController extends Controller {
@Response<ApiValidationError>(500, "Ha ocurrido un error")
@SuccessResponse(200, "Calificación creada con éxito")
@@ -45,3 +56,85 @@ export class PendingRatingsByUserController extends Controller {
}
}
}
@Route("ratings/count-by-user")
@Middlewares([authenticateMiddleware])
export class CountRatingsByUserController extends Controller {
@Response<ApiValidationError>(500, "Ha ocurrido un error")
@SuccessResponse(200, "Busqueda completada con exito")
@Post()
public async countByUser(
@Body() requestBody: CountRatingsByUserParams
): Promise<CountRatingsByUserResult | ApiValidationError> {
try {
const ratingsCount = await new RatingsService().countByUser(requestBody);
this.setStatus(200);
return ratingsCount;
} catch (e) {
const errorOccurred: Error = e as Error;
this.setStatus(500);
return new ApiValidationError(500, errorOccurred.message);
}
}
}
@Route("ratings/professional-summary-by-user")
@Middlewares([authenticateMiddleware])
export class ProfessionalRatingSummaryByUserController extends Controller {
@Response<ApiValidationError>(500, "Ha ocurrido un error")
@SuccessResponse(200, "Busqueda completada con exito")
@Post()
public async professionalSummaryByUser(
@Body() requestBody: ProfessionalRatingSummaryByUserParams
): Promise<RatingTargetSummaryResult | ApiValidationError> {
try {
const ratingSummary = await new RatingsService().professionalSummaryByUser(requestBody);
this.setStatus(200);
return ratingSummary;
} catch (e) {
const errorOccurred: Error = e as Error;
this.setStatus(500);
return new ApiValidationError(500, errorOccurred.message);
}
}
}
@Route("ratings/target-summary")
export class RatingTargetSummaryController extends Controller {
@Response<ApiValidationError>(500, "Ha ocurrido un error")
@SuccessResponse(200, "Busqueda completada con exito")
@Post()
public async summaryByTarget(
@Body() requestBody: RatingTargetSummaryParams
): Promise<RatingTargetSummaryResult | ApiValidationError> {
try {
const ratingSummary = await new RatingsService().summaryByTarget(requestBody);
this.setStatus(200);
return ratingSummary;
} catch (e) {
const errorOccurred: Error = e as Error;
this.setStatus(500);
return new ApiValidationError(500, errorOccurred.message);
}
}
}
@Route("ratings/target-reviews")
export class RatingTargetReviewsController extends Controller {
@Response<ApiValidationError>(500, "Ha ocurrido un error")
@SuccessResponse(200, "Busqueda completada con exito")
@Post()
public async reviewsByTarget(
@Body() requestBody: RatingTargetReviewsParams
): Promise<RatingTargetReviewItem[] | ApiValidationError> {
try {
const ratingReviews = await new RatingsService().reviewsByTarget(requestBody);
this.setStatus(200);
return ratingReviews;
} catch (e) {
const errorOccurred: Error = e as Error;
this.setStatus(500);
return new ApiValidationError(500, errorOccurred.message);
}
}
}
+33 -1
View File
@@ -1,6 +1,18 @@
import { connect } from "mongoose";
import RatingsList from "../../Models/Ratings/Ratings";
import { CreateRatingParams, IRating, PendingRatingItem, PendingRatingsByUserParams } from "../../Models/Ratings/Ratings.Interface";
import {
CountRatingsByUserParams,
CountRatingsByUserResult,
CreateRatingParams,
IRating,
PendingRatingItem,
PendingRatingsByUserParams,
ProfessionalRatingSummaryByUserParams,
RatingTargetSummaryParams,
RatingTargetSummaryResult,
RatingTargetReviewItem,
RatingTargetReviewsParams,
} from "../../Models/Ratings/Ratings.Interface";
export class RatingsService {
public async createRating(data: CreateRatingParams): Promise<IRating> {
@@ -12,4 +24,24 @@ export class RatingsService {
await connect(`${process.env.DATABASE_CONNECTION}`);
return await RatingsList.pendingByUser(data);
}
public async countByUser(data: CountRatingsByUserParams): Promise<CountRatingsByUserResult> {
await connect(`${process.env.DATABASE_CONNECTION}`);
return await RatingsList.countByUser(data);
}
public async professionalSummaryByUser(data: ProfessionalRatingSummaryByUserParams): Promise<RatingTargetSummaryResult> {
await connect(`${process.env.DATABASE_CONNECTION}`);
return await RatingsList.professionalSummaryByUser(data);
}
public async summaryByTarget(data: RatingTargetSummaryParams): Promise<RatingTargetSummaryResult> {
await connect(`${process.env.DATABASE_CONNECTION}`);
return await RatingsList.summaryByTarget(data);
}
public async reviewsByTarget(data: RatingTargetReviewsParams): Promise<RatingTargetReviewItem[]> {
await connect(`${process.env.DATABASE_CONNECTION}`);
return await RatingsList.reviewsByTarget(data);
}
}