Compare commits
6 Commits
1.3.11
...
CreateAnon
| Author | SHA1 | Date | |
|---|---|---|---|
|
f4bf309821
|
|||
|
02b1cb9904
|
|||
|
7697acff82
|
|||
|
9875b4f392
|
|||
|
ce9b765b81
|
|||
|
2ab6e985e3
|
@@ -1,3 +1,4 @@
|
|||||||
|
import consola from 'consola';
|
||||||
import { config as configDotenv } from 'dotenv';
|
import { config as configDotenv } from 'dotenv';
|
||||||
import { CountryCode } from 'libphonenumber-js';
|
import { CountryCode } from 'libphonenumber-js';
|
||||||
import ValidatorJS from 'validator';
|
import ValidatorJS from 'validator';
|
||||||
@@ -20,12 +21,15 @@ export const config = {
|
|||||||
}
|
}
|
||||||
let errors = 0
|
let errors = 0
|
||||||
if (typeof config.internal_port !== "number") {
|
if (typeof config.internal_port !== "number") {
|
||||||
|
consola.error("Error: APP_PORT is not a number")
|
||||||
errors++
|
errors++
|
||||||
}
|
}
|
||||||
if (typeof config.development !== "boolean") {
|
if (typeof config.development !== "boolean") {
|
||||||
|
consola.error("Error: NODE_ENV is not a boolean")
|
||||||
errors++
|
errors++
|
||||||
}
|
}
|
||||||
if (config.mailer_url == "" || config.mailer_key == "") {
|
if (config.mailer_url == "" || config.mailer_key == "") {
|
||||||
|
consola.error("Error: invalid mailer config")
|
||||||
errors++;
|
errors++;
|
||||||
}
|
}
|
||||||
function getPhoneCodeLocale(): CountryCode {
|
function getPhoneCodeLocale(): CountryCode {
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import { Repository, getConnectionManager } from 'typeorm';
|
|||||||
import { DonationIdsNotMatchingError, DonationNotFoundError } from '../errors/DonationErrors';
|
import { DonationIdsNotMatchingError, DonationNotFoundError } from '../errors/DonationErrors';
|
||||||
import { DonorNotFoundError } from '../errors/DonorErrors';
|
import { DonorNotFoundError } from '../errors/DonorErrors';
|
||||||
import { RunnerNotFoundError } from '../errors/RunnerErrors';
|
import { RunnerNotFoundError } from '../errors/RunnerErrors';
|
||||||
|
import { CreateAnonymousDonation } from '../models/actions/create/CreateAnonymousDonation';
|
||||||
import { CreateDistanceDonation } from '../models/actions/create/CreateDistanceDonation';
|
import { CreateDistanceDonation } from '../models/actions/create/CreateDistanceDonation';
|
||||||
import { CreateFixedDonation } from '../models/actions/create/CreateFixedDonation';
|
import { CreateFixedDonation } from '../models/actions/create/CreateFixedDonation';
|
||||||
import { UpdateDistanceDonation } from '../models/actions/update/UpdateDistanceDonation';
|
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 { DistanceDonation } from '../models/entities/DistanceDonation';
|
||||||
import { Donation } from '../models/entities/Donation';
|
import { Donation } from '../models/entities/Donation';
|
||||||
import { FixedDonation } from '../models/entities/FixedDonation';
|
import { FixedDonation } from '../models/entities/FixedDonation';
|
||||||
|
import { ResponseAnonymousDonation } from '../models/responses/ResponseAnonymousDonation';
|
||||||
import { ResponseDistanceDonation } from '../models/responses/ResponseDistanceDonation';
|
import { ResponseDistanceDonation } from '../models/responses/ResponseDistanceDonation';
|
||||||
import { ResponseDonation } from '../models/responses/ResponseDonation';
|
import { ResponseDonation } from '../models/responses/ResponseDonation';
|
||||||
import { ResponseEmpty } from '../models/responses/ResponseEmpty';
|
import { ResponseEmpty } from '../models/responses/ResponseEmpty';
|
||||||
@@ -35,6 +37,7 @@ export class DonationController {
|
|||||||
@Authorized("DONATION:GET")
|
@Authorized("DONATION:GET")
|
||||||
@ResponseSchema(ResponseDonation, { isArray: true })
|
@ResponseSchema(ResponseDonation, { isArray: true })
|
||||||
@ResponseSchema(ResponseDistanceDonation, { isArray: true })
|
@ResponseSchema(ResponseDistanceDonation, { isArray: true })
|
||||||
|
@ResponseSchema(ResponseAnonymousDonation, { isArray: true })
|
||||||
@OpenAPI({ description: 'Lists all donations (fixed or distance based) from all donors. <br> This includes the donations\'s runner\'s distance ran(if distance donation).' })
|
@OpenAPI({ description: 'Lists all donations (fixed or distance based) from all donors. <br> 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) {
|
async getAll(@QueryParam("page", { required: false }) page: number, @QueryParam("page_size", { required: false }) page_size: number = 100) {
|
||||||
let responseDonations: ResponseDonation[] = new Array<ResponseDonation>();
|
let responseDonations: ResponseDonation[] = new Array<ResponseDonation>();
|
||||||
@@ -56,6 +59,7 @@ export class DonationController {
|
|||||||
@Authorized("DONATION:GET")
|
@Authorized("DONATION:GET")
|
||||||
@ResponseSchema(ResponseDonation)
|
@ResponseSchema(ResponseDonation)
|
||||||
@ResponseSchema(ResponseDistanceDonation)
|
@ResponseSchema(ResponseDistanceDonation)
|
||||||
|
@ResponseSchema(ResponseAnonymousDonation)
|
||||||
@ResponseSchema(DonationNotFoundError, { statusCode: 404 })
|
@ResponseSchema(DonationNotFoundError, { statusCode: 404 })
|
||||||
@OnUndefined(DonationNotFoundError)
|
@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).' })
|
@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();
|
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')
|
@Post('/distance')
|
||||||
@Authorized("DONATION:CREATE")
|
@Authorized("DONATION:CREATE")
|
||||||
@ResponseSchema(ResponseDistanceDonation)
|
@ResponseSchema(ResponseDistanceDonation)
|
||||||
|
|||||||
29
src/models/actions/create/CreateAnonymousDonation.ts
Normal file
29
src/models/actions/create/CreateAnonymousDonation.ts
Normal file
@@ -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<FixedDonation> {
|
||||||
|
let newDonation = new FixedDonation;
|
||||||
|
|
||||||
|
newDonation.amount = this.amount;
|
||||||
|
newDonation.paidAmount = this.amount;
|
||||||
|
|
||||||
|
return newDonation;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -10,6 +10,20 @@ import { CreateDonation } from './CreateDonation';
|
|||||||
*/
|
*/
|
||||||
export class CreateDistanceDonation extends 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.
|
* The donation's associated runner's id.
|
||||||
* This is important to link the runner's distance ran to the donation.
|
* This is important to link the runner's distance ran to the donation.
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { IsInt, IsOptional, IsPositive } from 'class-validator';
|
import { Exclude } from 'class-transformer';
|
||||||
import { getConnection } from 'typeorm';
|
import { getConnection } from 'typeorm';
|
||||||
import { DonorNotFoundError } from '../../../errors/DonorErrors';
|
|
||||||
import { Donation } from '../../entities/Donation';
|
import { Donation } from '../../entities/Donation';
|
||||||
import { Donor } from '../../entities/Donor';
|
import { Donor } from '../../entities/Donor';
|
||||||
|
|
||||||
@@ -8,19 +7,10 @@ import { Donor } from '../../entities/Donor';
|
|||||||
* This class is used to create a new Donation entity from a json body (post request).
|
* This class is used to create a new Donation entity from a json body (post request).
|
||||||
*/
|
*/
|
||||||
export abstract class CreateDonation {
|
export abstract class CreateDonation {
|
||||||
/**
|
@Exclude()
|
||||||
* The donation's associated donor's id.
|
|
||||||
* This is important to link donations to donors.
|
|
||||||
*/
|
|
||||||
@IsInt()
|
|
||||||
@IsPositive()
|
|
||||||
donor: number;
|
donor: number;
|
||||||
|
|
||||||
/**
|
@Exclude()
|
||||||
* The donation's paid amount in the smalles unit of your currency (default: euro cent).
|
|
||||||
*/
|
|
||||||
@IsInt()
|
|
||||||
@IsOptional()
|
|
||||||
paidAmount?: number;
|
paidAmount?: number;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -33,9 +23,6 @@ export abstract class CreateDonation {
|
|||||||
*/
|
*/
|
||||||
public async getDonor(): Promise<Donor> {
|
public async getDonor(): Promise<Donor> {
|
||||||
const donor = await getConnection().getRepository(Donor).findOne({ id: this.donor });
|
const donor = await getConnection().getRepository(Donor).findOne({ id: this.donor });
|
||||||
if (!donor) {
|
|
||||||
throw new DonorNotFoundError();
|
|
||||||
}
|
|
||||||
return donor;
|
return donor;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -6,6 +6,21 @@ import { CreateDonation } from './CreateDonation';
|
|||||||
* This class is used to create a new FixedDonation entity from a json body (post request).
|
* This class is used to create a new FixedDonation entity from a json body (post request).
|
||||||
*/
|
*/
|
||||||
export class CreateFixedDonation extends CreateDonation {
|
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 donation's amount.
|
||||||
* The unit is your currency's smallest unit (default: euro cent).
|
* The unit is your currency's smallest unit (default: euro cent).
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import {
|
import {
|
||||||
IsInt,
|
IsInt
|
||||||
IsNotEmpty
|
|
||||||
} from "class-validator";
|
} from "class-validator";
|
||||||
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm";
|
||||||
import { ResponseDonation } from '../responses/ResponseDonation';
|
import { ResponseDonation } from '../responses/ResponseDonation';
|
||||||
@@ -24,7 +23,6 @@ export abstract class Donation {
|
|||||||
/**
|
/**
|
||||||
* The donations's donor.
|
* The donations's donor.
|
||||||
*/
|
*/
|
||||||
@IsNotEmpty()
|
|
||||||
@ManyToOne(() => Donor, donor => donor.donations)
|
@ManyToOne(() => Donor, donor => donor.donations)
|
||||||
donor: Donor;
|
donor: Donor;
|
||||||
|
|
||||||
|
|||||||
58
src/models/responses/ResponseAnonymousDonation.ts
Normal file
58
src/models/responses/ResponseAnonymousDonation.ts
Normal file
@@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user