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;
+ }
+ }
+}