diff --git a/src/controllers/DonationController.ts b/src/controllers/DonationController.ts index 0babc14..18c9525 100644 --- a/src/controllers/DonationController.ts +++ b/src/controllers/DonationController.ts @@ -4,6 +4,7 @@ import { Repository, getConnectionManager } from 'typeorm'; import { DonationIdsNotMatchingError, DonationNotFoundError } from '../errors/DonationErrors'; import { DonorNotFoundError } from '../errors/DonorErrors'; import { RunnerNotFoundError } from '../errors/RunnerErrors'; +import { CreateAnonymousDonation } from '../models/actions/create/CreateAnonymousDonation'; import { CreateDistanceDonation } from '../models/actions/create/CreateDistanceDonation'; import { CreateFixedDonation } from '../models/actions/create/CreateFixedDonation'; import { UpdateDistanceDonation } from '../models/actions/update/UpdateDistanceDonation'; @@ -11,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'; @@ -35,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(); @@ -56,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).' }) @@ -76,6 +80,17 @@ export class DonationController { return (await this.donationRepository.findOne({ id: donation.id }, { relations: ['donor'] })).toResponse(); } + @Post('/anonymous') + @Authorized("DONATION:CREATE") + @ResponseSchema(ResponseDonation) + @ResponseSchema(DonorNotFoundError, { statusCode: 404 }) + @OpenAPI({ description: 'Create a anonymous donation' }) + async postAnonymous(@Body({ validate: true }) createDonation: CreateAnonymousDonation) { + let donation = await createDonation.toEntity(); + donation = await this.fixedDonationRepository.save(donation); + return (await this.donationRepository.findOne({ id: donation.id })).toResponse(); + } + @Post('/distance') @Authorized("DONATION:CREATE") @ResponseSchema(ResponseDistanceDonation) diff --git a/src/models/actions/create/CreateAnonymousDonation.ts b/src/models/actions/create/CreateAnonymousDonation.ts new file mode 100644 index 0000000..29bfbc9 --- /dev/null +++ b/src/models/actions/create/CreateAnonymousDonation.ts @@ -0,0 +1,29 @@ +import { IsInt, IsPositive } from 'class-validator'; +import { FixedDonation } from '../../entities/FixedDonation'; +import { CreateDonation } from './CreateDonation'; + +/** + * This class is used to create a new FixedDonation entity from a json body (post request). + */ +export class CreateAnonymousDonation extends CreateDonation { + + /** + * The donation's amount. + * The unit is your currency's smallest unit (default: euro cent). + */ + @IsInt() + @IsPositive() + amount: number; + + /** + * Creates a new FixedDonation entity from this. + */ + public async toEntity(): Promise { + let newDonation = new FixedDonation; + + newDonation.amount = this.amount; + newDonation.paidAmount = this.amount; + + return newDonation; + } +} \ No newline at end of file diff --git a/src/models/actions/create/CreateDistanceDonation.ts b/src/models/actions/create/CreateDistanceDonation.ts index 133e71b..9df2cd8 100644 --- a/src/models/actions/create/CreateDistanceDonation.ts +++ b/src/models/actions/create/CreateDistanceDonation.ts @@ -10,6 +10,20 @@ import { CreateDonation } from './CreateDonation'; */ export class CreateDistanceDonation extends CreateDonation { + /** + * The donation's associated donor's id. + * This is important to link donations to donors. + */ + @IsInt() + @IsPositive() + donor: number; + + /** + * The donation's paid amount in the smalles unit of your currency (default: euro cent). + */ + @IsInt() + paidAmount?: number; + /** * The donation's associated runner's id. * This is important to link the runner's distance ran to the donation. diff --git a/src/models/actions/create/CreateDonation.ts b/src/models/actions/create/CreateDonation.ts index 4297b12..e54a1be 100644 --- a/src/models/actions/create/CreateDonation.ts +++ b/src/models/actions/create/CreateDonation.ts @@ -1,4 +1,4 @@ -import { IsInt, IsOptional, IsPositive } from 'class-validator'; +import { Exclude } from 'class-transformer'; import { getConnection } from 'typeorm'; import { Donation } from '../../entities/Donation'; import { Donor } from '../../entities/Donor'; @@ -7,20 +7,10 @@ import { Donor } from '../../entities/Donor'; * This class is used to create a new Donation entity from a json body (post request). */ export abstract class CreateDonation { - /** - * The donation's associated donor's id. - * This is important to link donations to donors. - */ - @IsInt() - @IsPositive() - @IsOptional() + @Exclude() donor: number; - /** - * The donation's paid amount in the smalles unit of your currency (default: euro cent). - */ - @IsInt() - @IsOptional() + @Exclude() paidAmount?: number; /** diff --git a/src/models/actions/create/CreateFixedDonation.ts b/src/models/actions/create/CreateFixedDonation.ts index bfdca9f..9721982 100644 --- a/src/models/actions/create/CreateFixedDonation.ts +++ b/src/models/actions/create/CreateFixedDonation.ts @@ -6,6 +6,21 @@ import { CreateDonation } from './CreateDonation'; * This class is used to create a new FixedDonation entity from a json body (post request). */ export class CreateFixedDonation extends CreateDonation { + + /** + * The donation's associated donor's id. + * This is important to link donations to donors. + */ + @IsInt() + @IsPositive() + donor: number; + + /** + * The donation's paid amount in the smalles unit of your currency (default: euro cent). + */ + @IsInt() + paidAmount?: number; + /** * The donation's amount. * The unit is your currency's smallest unit (default: euro cent). 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; + } + } +}