From f4bf309821c140f2bc0ae8b6d96c7458fcc80978 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Mon, 28 Apr 2025 19:35:07 +0200 Subject: [PATCH] feat(donations): Implement response type to indicate possible missing donor --- src/controllers/DonationController.ts | 3 + .../responses/ResponseAnonymousDonation.ts | 58 +++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 src/models/responses/ResponseAnonymousDonation.ts diff --git a/src/controllers/DonationController.ts b/src/controllers/DonationController.ts index 4428639..18c9525 100644 --- a/src/controllers/DonationController.ts +++ b/src/controllers/DonationController.ts @@ -12,6 +12,7 @@ import { UpdateFixedDonation } from '../models/actions/update/UpdateFixedDonatio import { DistanceDonation } from '../models/entities/DistanceDonation'; import { Donation } from '../models/entities/Donation'; import { FixedDonation } from '../models/entities/FixedDonation'; +import { ResponseAnonymousDonation } from '../models/responses/ResponseAnonymousDonation'; import { ResponseDistanceDonation } from '../models/responses/ResponseDistanceDonation'; import { ResponseDonation } from '../models/responses/ResponseDonation'; import { ResponseEmpty } from '../models/responses/ResponseEmpty'; @@ -36,6 +37,7 @@ export class DonationController { @Authorized("DONATION:GET") @ResponseSchema(ResponseDonation, { isArray: true }) @ResponseSchema(ResponseDistanceDonation, { isArray: true }) + @ResponseSchema(ResponseAnonymousDonation, { isArray: true }) @OpenAPI({ description: 'Lists all donations (fixed or distance based) from all donors.
This includes the donations\'s runner\'s distance ran(if distance donation).' }) async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) { let responseDonations: ResponseDonation[] = new Array(); @@ -57,6 +59,7 @@ export class DonationController { @Authorized("DONATION:GET") @ResponseSchema(ResponseDonation) @ResponseSchema(ResponseDistanceDonation) + @ResponseSchema(ResponseAnonymousDonation) @ResponseSchema(DonationNotFoundError, { statusCode: 404 }) @OnUndefined(DonationNotFoundError) @OpenAPI({ description: 'Lists all information about the donation whose id got provided. This includes the donation\'s runner\'s distance ran (if distance donation).' }) diff --git a/src/models/responses/ResponseAnonymousDonation.ts b/src/models/responses/ResponseAnonymousDonation.ts new file mode 100644 index 0000000..aa0e024 --- /dev/null +++ b/src/models/responses/ResponseAnonymousDonation.ts @@ -0,0 +1,58 @@ +import { IsInt, IsPositive } from "class-validator"; +import { Donation } from '../entities/Donation'; +import { DonationStatus } from '../enums/DonationStatus'; +import { ResponseObjectType } from '../enums/ResponseObjectType'; +import { IResponse } from './IResponse'; + +/** + * Defines the donation response. +*/ +export class ResponseAnonymousDonation implements IResponse { + + /** + * The responseType. + * This contains the type of class/entity this response contains. + */ + responseType: ResponseObjectType = ResponseObjectType.DONATION; + + /** + * The donation's payment status. + * Provides you with a quick indicator of it's payment status. + */ + status: DonationStatus; + + /** + * The donation's id. + */ + @IsInt() + @IsPositive() + id: number; + + /** + * The donation's amount in the smalles unit of your currency (default: euro cent). + */ + @IsInt() + amount: number; + + /** + * The donation's paid amount in the smalles unit of your currency (default: euro cent). + */ + @IsInt() + paidAmount: number; + + /** + * Creates a ResponseDonation object from a scan. + * @param donation The donation the response shall be build for. + */ + public constructor(donation: Donation) { + this.id = donation.id; + this.amount = donation.amount; + this.paidAmount = donation.paidAmount || 0; + if (this.paidAmount < this.amount) { + this.status = DonationStatus.OPEN; + } + else { + this.status = DonationStatus.PAID; + } + } +}