From 7fbe649dc90f4bb9f240c5a80fed447048e5e105 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 16:45:49 +0100 Subject: [PATCH 01/21] Switched Address to embedded entity ref #105 --- src/models/entities/Address.ts | 27 +-------------------------- 1 file changed, 1 insertion(+), 26 deletions(-) diff --git a/src/models/entities/Address.ts b/src/models/entities/Address.ts index dbb7eb3..d2dd961 100644 --- a/src/models/entities/Address.ts +++ b/src/models/entities/Address.ts @@ -1,36 +1,17 @@ import { - IsInt, IsNotEmpty, IsOptional, IsPostalCode, IsString } from "class-validator"; -import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; +import { Column } from "typeorm"; import { config } from '../../config'; -import { IAddressUser } from './IAddressUser'; /** * Defines the Address entity. * Implemented this way to prevent any formatting differences. */ -@Entity() export class Address { - /** - * Autogenerated unique id (primary key). - */ - @PrimaryGeneratedColumn() - @IsInt() - id: number; - - /** - * The address's description. - * Optional and mostly for UX. - */ - @Column({ nullable: true }) - @IsString() - @IsOptional() - description?: string; - /** * The address's first line. * Containing the street and house number. @@ -75,12 +56,6 @@ export class Address { @IsNotEmpty() country: string; - /** - * Used to link the address to participants. - */ - @OneToMany(() => IAddressUser, addressUser => addressUser.address, { nullable: true }) - addressUsers: IAddressUser[]; - /** * Turns this entity into it's response class. */ From 673dea2e5754e99ff77f7556d4fc03d4cca28a94 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 16:48:20 +0100 Subject: [PATCH 02/21] Removed (now useless) relations ref #105 --- src/controllers/RunnerOrganisationController.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/controllers/RunnerOrganisationController.ts b/src/controllers/RunnerOrganisationController.ts index 15c12ff..fbbd03a 100644 --- a/src/controllers/RunnerOrganisationController.ts +++ b/src/controllers/RunnerOrganisationController.ts @@ -29,7 +29,7 @@ export class RunnerOrganisationController { @OpenAPI({ description: 'Lists all organisations.
This includes their address, contact and teams (if existing/associated).' }) async getAll() { let responseTeams: ResponseRunnerOrganisation[] = new Array(); - const runners = await this.runnerOrganisationRepository.find({ relations: ['address', 'contact', 'teams'] }); + const runners = await this.runnerOrganisationRepository.find({ relations: ['contact', 'teams'] }); runners.forEach(runner => { responseTeams.push(new ResponseRunnerOrganisation(runner)); }); @@ -43,7 +43,7 @@ export class RunnerOrganisationController { @OnUndefined(RunnerOrganisationNotFoundError) @OpenAPI({ description: 'Lists all information about the organisation whose id got provided.' }) async getOne(@Param('id') id: number) { - let runnerOrg = await this.runnerOrganisationRepository.findOne({ id: id }, { relations: ['address', 'contact', 'teams'] }); + let runnerOrg = await this.runnerOrganisationRepository.findOne({ id: id }, { relations: ['contact', 'teams'] }); if (!runnerOrg) { throw new RunnerOrganisationNotFoundError(); } return new ResponseRunnerOrganisation(runnerOrg); } @@ -62,7 +62,7 @@ export class RunnerOrganisationController { runnerOrganisation = await this.runnerOrganisationRepository.save(runnerOrganisation); - return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(runnerOrganisation, { relations: ['address', 'contact', 'teams'] })); + return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(runnerOrganisation, { relations: ['contact', 'teams'] })); } @Put('/:id') @@ -84,7 +84,7 @@ export class RunnerOrganisationController { await this.runnerOrganisationRepository.save(await updateOrganisation.update(oldRunnerOrganisation)); - return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(id, { relations: ['address', 'contact', 'teams'] })); + return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(id, { relations: ['contact', 'teams'] })); } @Delete('/:id') @@ -98,7 +98,7 @@ export class RunnerOrganisationController { async remove(@Param("id") id: number, @QueryParam("force") force: boolean) { let organisation = await this.runnerOrganisationRepository.findOne({ id: id }); if (!organisation) { return null; } - let runnerOrganisation = await this.runnerOrganisationRepository.findOne(organisation, { relations: ['address', 'contact', 'runners', 'teams'] }); + let runnerOrganisation = await this.runnerOrganisationRepository.findOne(organisation, { relations: ['contact', 'runners', 'teams'] }); if (!force) { if (runnerOrganisation.teams.length != 0) { From e2651728c5abf2273bf51a7652c51d55d8fa0a2f Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 16:50:04 +0100 Subject: [PATCH 03/21] Removed the IAddressUser Interface entity ref #105 - It was only needed b/c addresses were implemented as their own class --- src/models/entities/GroupContact.ts | 7 +++---- src/models/entities/IAddressUser.ts | 20 -------------------- src/models/entities/Participant.ts | 7 +++---- src/models/entities/RunnerOrganisation.ts | 7 +++---- 4 files changed, 9 insertions(+), 32 deletions(-) delete mode 100644 src/models/entities/IAddressUser.ts diff --git a/src/models/entities/GroupContact.ts b/src/models/entities/GroupContact.ts index f650259..d2b0abe 100644 --- a/src/models/entities/GroupContact.ts +++ b/src/models/entities/GroupContact.ts @@ -7,10 +7,9 @@ import { IsString } from "class-validator"; -import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; +import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; import { config } from '../../config'; import { Address } from "./Address"; -import { IAddressUser } from './IAddressUser'; import { RunnerGroup } from "./RunnerGroup"; /** @@ -18,7 +17,7 @@ import { RunnerGroup } from "./RunnerGroup"; * Mainly it's own class to reduce duplicate code and enable contact's to be associated with multiple groups. */ @Entity() -export class GroupContact implements IAddressUser { +export class GroupContact { /** * Autogenerated unique id (primary key). */ @@ -55,7 +54,7 @@ export class GroupContact implements IAddressUser { * This is a address object to prevent any formatting differences. */ @IsOptional() - @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) + @Column(type => Address) address?: Address; /** diff --git a/src/models/entities/IAddressUser.ts b/src/models/entities/IAddressUser.ts deleted file mode 100644 index 3d8eaf9..0000000 --- a/src/models/entities/IAddressUser.ts +++ /dev/null @@ -1,20 +0,0 @@ -import { Entity, ManyToOne, PrimaryColumn } from 'typeorm'; -import { Address } from './Address'; - -/** - * The interface(tm) all entities using addresses have to implement. - * This is a abstract class, because apparently typeorm can't really work with interfaces :/ - */ -@Entity() -export abstract class IAddressUser { - @PrimaryColumn() - id: number; - - @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) - address?: Address - - /** - * Turns this entity into it's response class. - */ - public abstract toResponse(); -} diff --git a/src/models/entities/Participant.ts b/src/models/entities/Participant.ts index fa40a8f..ccf7656 100644 --- a/src/models/entities/Participant.ts +++ b/src/models/entities/Participant.ts @@ -7,11 +7,10 @@ import { IsString } from "class-validator"; -import { Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm"; +import { Column, Entity, PrimaryGeneratedColumn, TableInheritance } from "typeorm"; import { config } from '../../config'; import { ResponseParticipant } from '../responses/ResponseParticipant'; import { Address } from "./Address"; -import { IAddressUser } from './IAddressUser'; /** * Defines the Participant entity. @@ -19,7 +18,7 @@ import { IAddressUser } from './IAddressUser'; */ @Entity() @TableInheritance({ column: { name: "type", type: "varchar" } }) -export abstract class Participant implements IAddressUser { +export abstract class Participant { /** * Autogenerated unique id (primary key). */ @@ -55,7 +54,7 @@ export abstract class Participant implements IAddressUser { * The participant's address. * This is a address object to prevent any formatting differences. */ - @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) + @Column(type => Address) address?: Address; /** diff --git a/src/models/entities/RunnerOrganisation.ts b/src/models/entities/RunnerOrganisation.ts index ebae8fd..e5f3330 100644 --- a/src/models/entities/RunnerOrganisation.ts +++ b/src/models/entities/RunnerOrganisation.ts @@ -1,8 +1,7 @@ import { IsInt, IsOptional } from "class-validator"; -import { ChildEntity, ManyToOne, OneToMany } from "typeorm"; +import { ChildEntity, Column, OneToMany } from "typeorm"; import { ResponseRunnerOrganisation } from '../responses/ResponseRunnerOrganisation'; import { Address } from './Address'; -import { IAddressUser } from './IAddressUser'; import { Runner } from './Runner'; import { RunnerGroup } from "./RunnerGroup"; import { RunnerTeam } from "./RunnerTeam"; @@ -12,13 +11,13 @@ import { RunnerTeam } from "./RunnerTeam"; * This usually is a school, club or company. */ @ChildEntity() -export class RunnerOrganisation extends RunnerGroup implements IAddressUser { +export class RunnerOrganisation extends RunnerGroup { /** * The organisations's address. */ @IsOptional() - @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) + @Column(type => Address) address?: Address; /** From dafac06bc84d1b237096a561b3adcd3ca5cb1dd8 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 16:53:18 +0100 Subject: [PATCH 04/21] Updated the responseclasses to use the new address implementation ref #105 --- src/models/responses/ResponseParticipant.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/models/responses/ResponseParticipant.ts b/src/models/responses/ResponseParticipant.ts index 148bcff..93a6918 100644 --- a/src/models/responses/ResponseParticipant.ts +++ b/src/models/responses/ResponseParticipant.ts @@ -1,4 +1,5 @@ -import { IsInt, IsString } from "class-validator"; +import { IsInt, IsObject, IsOptional, IsString } from "class-validator"; +import { Address } from '../entities/Address'; import { Participant } from '../entities/Participant'; /** @@ -41,6 +42,13 @@ export abstract class ResponseParticipant { @IsString() email?: string; + /** + * The participant's address. + */ + @IsOptional() + @IsObject() + address?: Address; + /** * Creates a ResponseParticipant object from a participant. * @param participant The participant the response shall be build for. @@ -52,5 +60,6 @@ export abstract class ResponseParticipant { this.lastname = participant.lastname; this.phone = participant.phone; this.email = participant.email; + this.address = participant.address; } } From 2cd15d25e934a5439bfea4de901f136e360e17f6 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 16:55:30 +0100 Subject: [PATCH 05/21] Switched the create classes over to the new address implementation ref #105 --- src/models/actions/create/CreateDonor.ts | 2 +- .../actions/create/CreateGroupContact.ts | 19 ++++-------------- .../actions/create/CreateParticipant.ts | 18 +++-------------- src/models/actions/create/CreateRunner.ts | 2 +- .../create/CreateRunnerOrganisation.ts | 20 ++++--------------- 5 files changed, 13 insertions(+), 48 deletions(-) diff --git a/src/models/actions/create/CreateDonor.ts b/src/models/actions/create/CreateDonor.ts index 791461a..a99d139 100644 --- a/src/models/actions/create/CreateDonor.ts +++ b/src/models/actions/create/CreateDonor.ts @@ -26,8 +26,8 @@ export class CreateDonor extends CreateParticipant { newDonor.lastname = this.lastname; newDonor.phone = this.phone; newDonor.email = this.email; - newDonor.address = await this.getAddress(); newDonor.receiptNeeded = this.receiptNeeded; + newDonor.address = this.address; if (this.receiptNeeded == true && this.address == null) { throw new DonorReceiptAddressNeededError() diff --git a/src/models/actions/create/CreateGroupContact.ts b/src/models/actions/create/CreateGroupContact.ts index b9a9d41..f74d633 100644 --- a/src/models/actions/create/CreateGroupContact.ts +++ b/src/models/actions/create/CreateGroupContact.ts @@ -1,7 +1,5 @@ -import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; +import { IsEmail, IsNotEmpty, IsObject, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; import { config } from '../../../config'; -import { AddressNotFoundError } from '../../../errors/AddressErrors'; import { Address } from '../../entities/Address'; import { GroupContact } from '../../entities/GroupContact'; @@ -33,9 +31,9 @@ export class CreateGroupContact { /** * The new contact's address's id. */ - @IsInt() @IsOptional() - address?: number; + @IsObject() + address?: Address; /** * The contact's phone number. @@ -52,15 +50,6 @@ export class CreateGroupContact { @IsEmail() email?: string; - /** - * Gets the new contact's address by it's id. - */ - public async getAddress(): Promise
{ - if (!this.address) { return null; } - let address = await getConnectionManager().get().getRepository(Address).findOne({ id: this.address }); - if (!address) { throw new AddressNotFoundError; } - return address; - } /** * Creates a new Address entity from this. @@ -72,7 +61,7 @@ export class CreateGroupContact { contact.lastname = this.lastname; contact.email = this.email; contact.phone = this.phone; - contact.address = await this.getAddress(); + contact.address = this.address; return null; } } \ No newline at end of file diff --git a/src/models/actions/create/CreateParticipant.ts b/src/models/actions/create/CreateParticipant.ts index 6518666..16ef7cc 100644 --- a/src/models/actions/create/CreateParticipant.ts +++ b/src/models/actions/create/CreateParticipant.ts @@ -1,7 +1,5 @@ -import { IsEmail, IsInt, IsNotEmpty, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; +import { IsEmail, IsNotEmpty, IsObject, IsOptional, IsPhoneNumber, IsString } from 'class-validator'; import { config } from '../../../config'; -import { AddressNotFoundError } from '../../../errors/AddressErrors'; import { Address } from '../../entities/Address'; /** @@ -49,17 +47,7 @@ export abstract class CreateParticipant { /** * The new participant's address's id. */ - @IsInt() @IsOptional() - address?: number; - - /** - * Gets the new participant's address by it's id. - */ - public async getAddress(): Promise
{ - if (!this.address) { return null; } - let address = await getConnectionManager().get().getRepository(Address).findOne({ id: this.address }); - if (!address) { throw new AddressNotFoundError; } - return address; - } + @IsObject() + address?: Address; } \ No newline at end of file diff --git a/src/models/actions/create/CreateRunner.ts b/src/models/actions/create/CreateRunner.ts index 2286fdf..83d9ca9 100644 --- a/src/models/actions/create/CreateRunner.ts +++ b/src/models/actions/create/CreateRunner.ts @@ -30,7 +30,7 @@ export class CreateRunner extends CreateParticipant { newRunner.phone = this.phone; newRunner.email = this.email; newRunner.group = await this.getGroup(); - newRunner.address = await this.getAddress(); + newRunner.address = this.address; return newRunner; } diff --git a/src/models/actions/create/CreateRunnerOrganisation.ts b/src/models/actions/create/CreateRunnerOrganisation.ts index 1938eee..eba73b6 100644 --- a/src/models/actions/create/CreateRunnerOrganisation.ts +++ b/src/models/actions/create/CreateRunnerOrganisation.ts @@ -1,6 +1,4 @@ -import { IsInt, IsOptional } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; -import { AddressNotFoundError } from '../../../errors/AddressErrors'; +import { IsObject, IsOptional } from 'class-validator'; import { Address } from '../../entities/Address'; import { RunnerOrganisation } from '../../entities/RunnerOrganisation'; import { CreateRunnerGroup } from './CreateRunnerGroup'; @@ -12,19 +10,9 @@ export class CreateRunnerOrganisation extends CreateRunnerGroup { /** * The new organisation's address's id. */ - @IsInt() @IsOptional() - address?: number; - - /** - * Gets the org's address by it's id. - */ - public async getAddress(): Promise
{ - if (!this.address) { return null; } - let address = await getConnectionManager().get().getRepository(Address).findOne({ id: this.address }); - if (!address) { throw new AddressNotFoundError; } - return address; - } + @IsObject() + address?: Address; /** * Creates a new RunnerOrganisation entity from this. @@ -34,7 +22,7 @@ export class CreateRunnerOrganisation extends CreateRunnerGroup { newRunnerOrganisation.name = this.name; newRunnerOrganisation.contact = await this.getContact(); - newRunnerOrganisation.address = await this.getAddress(); + newRunnerOrganisation.address = this.address; return newRunnerOrganisation; } From d0df5dd641ac17f1fd8ad6bd8b46afa9dd2745c3 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 16:56:46 +0100 Subject: [PATCH 06/21] Switched the update classes over to the new address implementation ref #105 --- src/models/actions/update/UpdateDonor.ts | 2 +- src/models/actions/update/UpdateRunner.ts | 2 +- .../update/UpdateRunnerOrganisation.ts | 20 ++++--------------- 3 files changed, 6 insertions(+), 18 deletions(-) diff --git a/src/models/actions/update/UpdateDonor.ts b/src/models/actions/update/UpdateDonor.ts index 8c77ff1..e01f61a 100644 --- a/src/models/actions/update/UpdateDonor.ts +++ b/src/models/actions/update/UpdateDonor.ts @@ -33,7 +33,7 @@ export class UpdateDonor extends CreateParticipant { donor.phone = this.phone; donor.email = this.email; donor.receiptNeeded = this.receiptNeeded; - donor.address = await this.getAddress(); + donor.address = this.address; if (this.receiptNeeded == true && this.address == null) { throw new DonorReceiptAddressNeededError() diff --git a/src/models/actions/update/UpdateRunner.ts b/src/models/actions/update/UpdateRunner.ts index e9e323b..cb24f1f 100644 --- a/src/models/actions/update/UpdateRunner.ts +++ b/src/models/actions/update/UpdateRunner.ts @@ -35,7 +35,7 @@ export class UpdateRunner extends CreateParticipant { runner.phone = this.phone; runner.email = this.email; runner.group = await this.getGroup(); - runner.address = await this.getAddress(); + runner.address = this.address; return runner; } diff --git a/src/models/actions/update/UpdateRunnerOrganisation.ts b/src/models/actions/update/UpdateRunnerOrganisation.ts index 20656ec..6023b84 100644 --- a/src/models/actions/update/UpdateRunnerOrganisation.ts +++ b/src/models/actions/update/UpdateRunnerOrganisation.ts @@ -1,6 +1,4 @@ -import { IsInt, IsOptional } from 'class-validator'; -import { getConnectionManager } from 'typeorm'; -import { AddressNotFoundError } from '../../../errors/AddressErrors'; +import { IsInt, IsObject, IsOptional } from 'class-validator'; import { Address } from '../../entities/Address'; import { RunnerOrganisation } from '../../entities/RunnerOrganisation'; import { CreateRunnerGroup } from '../create/CreateRunnerGroup'; @@ -20,19 +18,9 @@ export class UpdateRunnerOrganisation extends CreateRunnerGroup { /** * The updated organisation's address's id. */ - @IsInt() @IsOptional() - address?: number; - - /** - * Loads the organisation's address based on it's id. - */ - public async getAddress(): Promise
{ - if (!this.address) { return null; } - let address = await getConnectionManager().get().getRepository(Address).findOne({ id: this.address }); - if (!address) { throw new AddressNotFoundError; } - return address; - } + @IsObject() + address?: Address; /** * Updates a provided RunnerOrganisation entity based on this. @@ -41,7 +29,7 @@ export class UpdateRunnerOrganisation extends CreateRunnerGroup { organisation.name = this.name; organisation.contact = await this.getContact(); - organisation.address = await this.getAddress(); + organisation.address = this.address; return organisation; } From 8bc01d3f2406ce8e58c2ab2963c858495c510dcf Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 16:57:58 +0100 Subject: [PATCH 07/21] Updated comments ref #105 --- src/models/actions/create/CreateGroupContact.ts | 2 +- src/models/actions/create/CreateParticipant.ts | 2 +- src/models/actions/create/CreateRunnerOrganisation.ts | 2 +- src/models/actions/update/UpdateRunnerOrganisation.ts | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/models/actions/create/CreateGroupContact.ts b/src/models/actions/create/CreateGroupContact.ts index f74d633..c38682a 100644 --- a/src/models/actions/create/CreateGroupContact.ts +++ b/src/models/actions/create/CreateGroupContact.ts @@ -29,7 +29,7 @@ export class CreateGroupContact { lastname: string; /** - * The new contact's address's id. + * The new contact's address. */ @IsOptional() @IsObject() diff --git a/src/models/actions/create/CreateParticipant.ts b/src/models/actions/create/CreateParticipant.ts index 16ef7cc..8e008e7 100644 --- a/src/models/actions/create/CreateParticipant.ts +++ b/src/models/actions/create/CreateParticipant.ts @@ -45,7 +45,7 @@ export abstract class CreateParticipant { email?: string; /** - * The new participant's address's id. + * The new participant's address. */ @IsOptional() @IsObject() diff --git a/src/models/actions/create/CreateRunnerOrganisation.ts b/src/models/actions/create/CreateRunnerOrganisation.ts index eba73b6..8edcebb 100644 --- a/src/models/actions/create/CreateRunnerOrganisation.ts +++ b/src/models/actions/create/CreateRunnerOrganisation.ts @@ -8,7 +8,7 @@ import { CreateRunnerGroup } from './CreateRunnerGroup'; */ export class CreateRunnerOrganisation extends CreateRunnerGroup { /** - * The new organisation's address's id. + * The new organisation's address. */ @IsOptional() @IsObject() diff --git a/src/models/actions/update/UpdateRunnerOrganisation.ts b/src/models/actions/update/UpdateRunnerOrganisation.ts index 6023b84..ef52c2c 100644 --- a/src/models/actions/update/UpdateRunnerOrganisation.ts +++ b/src/models/actions/update/UpdateRunnerOrganisation.ts @@ -16,7 +16,7 @@ export class UpdateRunnerOrganisation extends CreateRunnerGroup { id: number; /** - * The updated organisation's address's id. + * The updated organisation's address. */ @IsOptional() @IsObject() From 58ae9b589aef3580f4b8558c3d5ddbd7171e7915 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 16:58:55 +0100 Subject: [PATCH 08/21] Removed the address errors ref #105 --- src/errors/AddressErrors.ts | 24 ------------------------ 1 file changed, 24 deletions(-) delete mode 100644 src/errors/AddressErrors.ts diff --git a/src/errors/AddressErrors.ts b/src/errors/AddressErrors.ts deleted file mode 100644 index 27f2e5f..0000000 --- a/src/errors/AddressErrors.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { IsString } from 'class-validator'; -import { NotAcceptableError, NotFoundError } from 'routing-controllers'; - -/** - * Error to throw, when to provided address doesn't belong to the accepted types. - */ -export class AddressWrongTypeError extends NotAcceptableError { - @IsString() - name = "AddressWrongTypeError" - - @IsString() - message = "The address must be an existing address's id. \n You provided a object of another type." -} - -/** - * Error to throw, when a non-existent address get's loaded. - */ -export class AddressNotFoundError extends NotFoundError { - @IsString() - name = "AddressNotFoundError" - - @IsString() - message = "The address you provided couldn't be located in the system. \n Please check your request." -} \ No newline at end of file From 2a465f88c58c0b4be3ecd99d96a04c177a40b312 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 17:03:05 +0100 Subject: [PATCH 09/21] Removed old create address class ref #105 --- src/models/actions/create/CreateAddress.ts | 69 ---------------------- src/models/entities/Address.ts | 2 +- 2 files changed, 1 insertion(+), 70 deletions(-) delete mode 100644 src/models/actions/create/CreateAddress.ts diff --git a/src/models/actions/create/CreateAddress.ts b/src/models/actions/create/CreateAddress.ts deleted file mode 100644 index 0241301..0000000 --- a/src/models/actions/create/CreateAddress.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { IsNotEmpty, IsOptional, IsPostalCode, IsString } from 'class-validator'; -import { config } from '../../../config'; -import { Address } from '../../entities/Address'; - -/** - * This classed is used to create a new Address entity from a json body (post request). - */ -export class CreateAddress { - /** - * The newaddress's description. - */ - @IsString() - @IsOptional() - description?: string; - - /** - * The new address's first line. - * Containing the street and house number. - */ - @IsString() - @IsNotEmpty() - address1: string; - - /** - * The new address's second line. - * Containing optional information. - */ - @IsString() - @IsOptional() - address2?: string; - - /** - * The new address's postal code. - * This will get checked against the postal code syntax for the configured country. - */ - @IsString() - @IsNotEmpty() - @IsPostalCode(config.postalcode_validation_countrycode) - postalcode: string; - - /** - * The new address's city. - */ - @IsString() - @IsNotEmpty() - city: string; - - /** - * The new address's country. - */ - @IsString() - @IsNotEmpty() - country: string; - - /** - * Creates a new Address entity from this. - */ - public async toEntity(): Promise
{ - let newAddress: Address = new Address(); - - newAddress.address1 = this.address1; - newAddress.address2 = this.address2; - newAddress.postalcode = this.postalcode; - newAddress.city = this.city; - newAddress.country = this.country; - - return newAddress; - } -} \ No newline at end of file diff --git a/src/models/entities/Address.ts b/src/models/entities/Address.ts index d2dd961..ed0d624 100644 --- a/src/models/entities/Address.ts +++ b/src/models/entities/Address.ts @@ -8,7 +8,7 @@ import { Column } from "typeorm"; import { config } from '../../config'; /** - * Defines the Address entity. + * Defines the Address class. * Implemented this way to prevent any formatting differences. */ export class Address { From ae7c5ff0c387e9337d01a9dd819a4dddc208f6dd Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 18:28:19 +0100 Subject: [PATCH 10/21] Added address validity check ref #105 --- src/models/actions/create/CreateDonor.ts | 2 +- src/models/entities/Address.ts | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/models/actions/create/CreateDonor.ts b/src/models/actions/create/CreateDonor.ts index a99d139..5143a2c 100644 --- a/src/models/actions/create/CreateDonor.ts +++ b/src/models/actions/create/CreateDonor.ts @@ -29,7 +29,7 @@ export class CreateDonor extends CreateParticipant { newDonor.receiptNeeded = this.receiptNeeded; newDonor.address = this.address; - if (this.receiptNeeded == true && this.address == null) { + if (this.receiptNeeded == true && this.address.isValidAddress == false) { throw new DonorReceiptAddressNeededError() } diff --git a/src/models/entities/Address.ts b/src/models/entities/Address.ts index ed0d624..9ccc026 100644 --- a/src/models/entities/Address.ts +++ b/src/models/entities/Address.ts @@ -57,9 +57,10 @@ export class Address { country: string; /** - * Turns this entity into it's response class. + * Checks if this is a valid address */ - public toResponse() { - return new Error("NotImplemented"); + public get isValidAddress(): Boolean { + if (!this.address1 || !this.city || !this.country || !this.postalcode) { return false; } + return true; } } From 8dbee32eeec8ee3d013e4446e8f53544ee4cb577 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 18:34:53 +0100 Subject: [PATCH 11/21] Test's now accept the new address format ref #105 --- src/tests/donors/donor_add.spec.ts | 10 ---------- src/tests/runnerOrgs/org_add.spec.ts | 16 ++++++++++++++-- src/tests/runnerOrgs/org_delete.spec.ts | 16 ++++++++++++++-- src/tests/runnerOrgs/org_update.spec.ts | 8 +++++++- src/tests/runnerTeams/team_update.spec.ts | 1 - src/tests/runners/runner_update.spec.ts | 6 +----- 6 files changed, 36 insertions(+), 21 deletions(-) diff --git a/src/tests/donors/donor_add.spec.ts b/src/tests/donors/donor_add.spec.ts index 954fd2e..3226b8c 100644 --- a/src/tests/donors/donor_add.spec.ts +++ b/src/tests/donors/donor_add.spec.ts @@ -29,16 +29,6 @@ describe('POST /api/donors with errors', () => { expect(res2.status).toEqual(400); expect(res2.headers['content-type']).toContain("application/json") }); - it('creating a new donor with a invalid address should return 404', async () => { - const res2 = await axios.post(base + '/api/donors', { - "firstname": "first", - "middlename": "middle", - "lastname": "last", - "address": 99999999999999999999999999 - }, axios_config); - expect(res2.status).toEqual(404); - expect(res2.headers['content-type']).toContain("application/json") - }); it('creating a new donor with a invalid phone number should return 400', async () => { const res2 = await axios.post(base + '/api/donors', { "firstname": "first", diff --git a/src/tests/runnerOrgs/org_add.spec.ts b/src/tests/runnerOrgs/org_add.spec.ts index 6ee0606..9d939ef 100644 --- a/src/tests/runnerOrgs/org_add.spec.ts +++ b/src/tests/runnerOrgs/org_add.spec.ts @@ -56,7 +56,13 @@ describe('adding + getting from all orgs', () => { expect(added_org).toEqual({ "name": "test123", "contact": null, - "address": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, "teams": [] }) }); @@ -83,7 +89,13 @@ describe('adding + getting explicitly', () => { expect(added_org2).toEqual({ "name": "test123", "contact": null, - "address": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, "teams": [] }) }); diff --git a/src/tests/runnerOrgs/org_delete.spec.ts b/src/tests/runnerOrgs/org_delete.spec.ts index 08891f8..d28faa1 100644 --- a/src/tests/runnerOrgs/org_delete.spec.ts +++ b/src/tests/runnerOrgs/org_delete.spec.ts @@ -44,7 +44,13 @@ describe('adding + deletion (successfull)', () => { expect(added_org2).toEqual({ "name": "test123", "contact": null, - "address": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, "teams": [] }); }); @@ -121,7 +127,13 @@ describe('adding + deletion with teams still existing (with force)', () => { expect(added_org2).toEqual({ "name": "test123", "contact": null, - "address": null + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, }); }); it('check if org really was deleted', async () => { diff --git a/src/tests/runnerOrgs/org_update.spec.ts b/src/tests/runnerOrgs/org_update.spec.ts index e6a1055..3db1254 100644 --- a/src/tests/runnerOrgs/org_update.spec.ts +++ b/src/tests/runnerOrgs/org_update.spec.ts @@ -42,7 +42,13 @@ describe('adding + updating name', () => { expect(added_org2).toEqual({ "name": "testlelele", "contact": null, - "address": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null, + }, "teams": [] }) }); diff --git a/src/tests/runnerTeams/team_update.spec.ts b/src/tests/runnerTeams/team_update.spec.ts index 7acacd7..0257bfd 100644 --- a/src/tests/runnerTeams/team_update.spec.ts +++ b/src/tests/runnerTeams/team_update.spec.ts @@ -123,7 +123,6 @@ describe('add+update parent org (valid)', () => { let updated_team = res4.data; expect(res4.status).toEqual(200); expect(res4.headers['content-type']).toContain("application/json") - delete added_org2.address; delete added_org2.contact; delete added_org2.teams; expect(updated_team.parentGroup).toEqual(added_org2) diff --git a/src/tests/runners/runner_update.spec.ts b/src/tests/runners/runner_update.spec.ts index 39acc5f..92c80e7 100644 --- a/src/tests/runners/runner_update.spec.ts +++ b/src/tests/runners/runner_update.spec.ts @@ -44,7 +44,6 @@ describe('Update runner name after adding', () => { expect(res3.status).toEqual(200); expect(res3.headers['content-type']).toContain("application/json") updated_runner = res3.data; - delete added_org.address; delete added_org.contact; delete added_org.teams; runnercopy.group = added_org; @@ -56,7 +55,6 @@ describe('Update runner group after adding', () => { let added_org_id; let added_org_2; let added_runner; - let updated_runner; it('creating a new org with just a name should return 200', async () => { const res1 = await axios.post(base + '/api/organisations', { "name": "test123" @@ -81,7 +79,6 @@ describe('Update runner group after adding', () => { "name": "test123" }, axios_config); added_org_2 = res3.data - delete added_org_2.address; delete added_org_2.contact; delete added_org_2.teams; expect(res3.status).toEqual(200); @@ -92,8 +89,7 @@ describe('Update runner group after adding', () => { const res3 = await axios.put(base + '/api/runners/' + added_runner.id, added_runner, axios_config); expect(res3.status).toEqual(200); expect(res3.headers['content-type']).toContain("application/json") - updated_runner = res3.data - expect(updated_runner.group).toEqual(added_org_2); + expect(res3.data.group).toEqual(added_org_2); }); }); // --------------- From 4824547dde4d7f90e9e2377a26df34cabf082fdb Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 18:52:57 +0100 Subject: [PATCH 12/21] Fixed donor address check ref #105 --- src/models/actions/create/CreateDonor.ts | 3 ++- src/models/actions/update/UpdateDonor.ts | 4 ++-- src/models/entities/Address.ts | 5 +++-- src/tests/donors/donor_update.spec.ts | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/models/actions/create/CreateDonor.ts b/src/models/actions/create/CreateDonor.ts index 5143a2c..2a9051f 100644 --- a/src/models/actions/create/CreateDonor.ts +++ b/src/models/actions/create/CreateDonor.ts @@ -1,5 +1,6 @@ import { IsBoolean, IsOptional } from 'class-validator'; import { DonorReceiptAddressNeededError } from '../../../errors/DonorErrors'; +import { Address } from '../../entities/Address'; import { Donor } from '../../entities/Donor'; import { CreateParticipant } from './CreateParticipant'; @@ -29,7 +30,7 @@ export class CreateDonor extends CreateParticipant { newDonor.receiptNeeded = this.receiptNeeded; newDonor.address = this.address; - if (this.receiptNeeded == true && this.address.isValidAddress == false) { + if (this.receiptNeeded == true && Address.isValidAddress(newDonor.address) == false) { throw new DonorReceiptAddressNeededError() } diff --git a/src/models/actions/update/UpdateDonor.ts b/src/models/actions/update/UpdateDonor.ts index e01f61a..3896309 100644 --- a/src/models/actions/update/UpdateDonor.ts +++ b/src/models/actions/update/UpdateDonor.ts @@ -1,5 +1,6 @@ import { IsBoolean, IsInt, IsOptional } from 'class-validator'; import { DonorReceiptAddressNeededError } from '../../../errors/DonorErrors'; +import { Address } from '../../entities/Address'; import { Donor } from '../../entities/Donor'; import { CreateParticipant } from '../create/CreateParticipant'; @@ -34,8 +35,7 @@ export class UpdateDonor extends CreateParticipant { donor.email = this.email; donor.receiptNeeded = this.receiptNeeded; donor.address = this.address; - - if (this.receiptNeeded == true && this.address == null) { + if (this.receiptNeeded == true && Address.isValidAddress(donor.address) == false) { throw new DonorReceiptAddressNeededError() } diff --git a/src/models/entities/Address.ts b/src/models/entities/Address.ts index 9ccc026..f25b5e8 100644 --- a/src/models/entities/Address.ts +++ b/src/models/entities/Address.ts @@ -59,8 +59,9 @@ export class Address { /** * Checks if this is a valid address */ - public get isValidAddress(): Boolean { - if (!this.address1 || !this.city || !this.country || !this.postalcode) { return false; } + public static isValidAddress(address: Address): Boolean { + if (address == null) { return false; } + if (address.address1 == null || address.city == null || address.country == null || address.postalcode == null) { return false; } return true; } } diff --git a/src/tests/donors/donor_update.spec.ts b/src/tests/donors/donor_update.spec.ts index 26f6eb6..a317adc 100644 --- a/src/tests/donors/donor_update.spec.ts +++ b/src/tests/donors/donor_update.spec.ts @@ -60,7 +60,7 @@ describe('Update donor without address but receiptNeeded=true should fail', () = it('creating a new donor with only needed params should return 200', async () => { const res2 = await axios.post(base + '/api/donors', { "firstname": "first", - "lastname": "last", + "lastname": "testtest", }, axios_config); added_donor = res2.data; expect(res2.status).toEqual(200); From f245840cde5726611197b00730aca72ea133c427 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 18:59:06 +0100 Subject: [PATCH 13/21] Implemented postal code validation for the validaton function ref #105 --- src/models/entities/Address.ts | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/models/entities/Address.ts b/src/models/entities/Address.ts index f25b5e8..038f5d6 100644 --- a/src/models/entities/Address.ts +++ b/src/models/entities/Address.ts @@ -5,6 +5,7 @@ import { IsString } from "class-validator"; import { Column } from "typeorm"; +import ValidatorJS from 'validator'; import { config } from '../../config'; /** @@ -62,6 +63,7 @@ export class Address { public static isValidAddress(address: Address): Boolean { if (address == null) { return false; } if (address.address1 == null || address.city == null || address.country == null || address.postalcode == null) { return false; } + if (ValidatorJS.isPostalCode(address.postalcode, config.postalcode_validation_countrycode) == false) { return false; } return true; } } From 9dc9ce37d8fbfc92842e4e05bbde68398324a186 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 20:12:17 +0100 Subject: [PATCH 14/21] Implemented deep address validation ref #105 --- src/errors/AddressErrors.ts | 57 +++++++++++++++++++ src/models/actions/create/CreateDonor.ts | 2 +- .../actions/create/CreateGroupContact.ts | 3 +- src/models/actions/create/CreateRunner.ts | 2 + .../create/CreateRunnerOrganisation.ts | 1 + src/models/actions/update/UpdateDonor.ts | 1 + src/models/actions/update/UpdateRunner.ts | 2 + .../update/UpdateRunnerOrganisation.ts | 1 + src/models/entities/Address.ts | 16 ++++++ 9 files changed, 83 insertions(+), 2 deletions(-) create mode 100644 src/errors/AddressErrors.ts diff --git a/src/errors/AddressErrors.ts b/src/errors/AddressErrors.ts new file mode 100644 index 0000000..300bb31 --- /dev/null +++ b/src/errors/AddressErrors.ts @@ -0,0 +1,57 @@ +import { IsString } from 'class-validator'; +import { BadRequestError } from 'routing-controllers'; + +/** + * Error to throw when an address's postal code fails validation. + */ +export class AddressPostalCodeInvalidError extends BadRequestError { + @IsString() + name = "AddressPostalCodeInvalidError" + + @IsString() + message = "The postal code you provided is invalid. \n Please check if your postal code follows the postal code validation guidelines." +} + +/** + * Error to throw when an non-empty address's first line isn't set. + */ +export class AddressFirstLineEmptyError extends BadRequestError { + @IsString() + name = "AddressFirstLineEmptyError" + + @IsString() + message = "You provided a empty first address line. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country" +} + +/** + * Error to throw when an non-empty address's postal code isn't set. + */ +export class AddressPostalCodeEmptyError extends BadRequestError { + @IsString() + name = "AddressPostalCodeEmptyError" + + @IsString() + message = "You provided a empty postal code. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country" +} + +/** + * Error to throw when an non-empty address's city isn't set. + */ +export class AddressCityEmptyError extends BadRequestError { + @IsString() + name = "AddressCityEmptyError" + + @IsString() + message = "You provided a empty city. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country" +} + +/** + * Error to throw when an non-empty address's country isn't set. + */ +export class AddressCountryEmptyError extends BadRequestError { + @IsString() + name = "AddressCountryEmptyError" + + @IsString() + message = "You provided a empty country. \n If you want an empty address please set all propertys to null. \n For non-empty addresses the following fields have to be set: address1, postalcode, city, country" +} \ No newline at end of file diff --git a/src/models/actions/create/CreateDonor.ts b/src/models/actions/create/CreateDonor.ts index 2a9051f..397a8d7 100644 --- a/src/models/actions/create/CreateDonor.ts +++ b/src/models/actions/create/CreateDonor.ts @@ -29,7 +29,7 @@ export class CreateDonor extends CreateParticipant { newDonor.email = this.email; newDonor.receiptNeeded = this.receiptNeeded; newDonor.address = this.address; - + Address.validate(newDonor.address); if (this.receiptNeeded == true && Address.isValidAddress(newDonor.address) == false) { throw new DonorReceiptAddressNeededError() } diff --git a/src/models/actions/create/CreateGroupContact.ts b/src/models/actions/create/CreateGroupContact.ts index c38682a..c6538e8 100644 --- a/src/models/actions/create/CreateGroupContact.ts +++ b/src/models/actions/create/CreateGroupContact.ts @@ -62,6 +62,7 @@ export class CreateGroupContact { contact.email = this.email; contact.phone = this.phone; contact.address = this.address; - return null; + Address.validate(contact.address); + return contact; } } \ No newline at end of file diff --git a/src/models/actions/create/CreateRunner.ts b/src/models/actions/create/CreateRunner.ts index 83d9ca9..9916ba8 100644 --- a/src/models/actions/create/CreateRunner.ts +++ b/src/models/actions/create/CreateRunner.ts @@ -3,6 +3,7 @@ import { getConnectionManager } from 'typeorm'; import { RunnerGroupNotFoundError } from '../../../errors/RunnerGroupErrors'; import { RunnerOrganisationWrongTypeError } from '../../../errors/RunnerOrganisationErrors'; import { RunnerTeamNeedsParentError } from '../../../errors/RunnerTeamErrors'; +import { Address } from '../../entities/Address'; import { Runner } from '../../entities/Runner'; import { RunnerGroup } from '../../entities/RunnerGroup'; import { CreateParticipant } from './CreateParticipant'; @@ -31,6 +32,7 @@ export class CreateRunner extends CreateParticipant { newRunner.email = this.email; newRunner.group = await this.getGroup(); newRunner.address = this.address; + Address.validate(newRunner.address); return newRunner; } diff --git a/src/models/actions/create/CreateRunnerOrganisation.ts b/src/models/actions/create/CreateRunnerOrganisation.ts index 8edcebb..e99d851 100644 --- a/src/models/actions/create/CreateRunnerOrganisation.ts +++ b/src/models/actions/create/CreateRunnerOrganisation.ts @@ -23,6 +23,7 @@ export class CreateRunnerOrganisation extends CreateRunnerGroup { newRunnerOrganisation.name = this.name; newRunnerOrganisation.contact = await this.getContact(); newRunnerOrganisation.address = this.address; + Address.validate(newRunnerOrganisation.address); return newRunnerOrganisation; } diff --git a/src/models/actions/update/UpdateDonor.ts b/src/models/actions/update/UpdateDonor.ts index 3896309..db6a745 100644 --- a/src/models/actions/update/UpdateDonor.ts +++ b/src/models/actions/update/UpdateDonor.ts @@ -35,6 +35,7 @@ export class UpdateDonor extends CreateParticipant { donor.email = this.email; donor.receiptNeeded = this.receiptNeeded; donor.address = this.address; + Address.validate(donor.address); if (this.receiptNeeded == true && Address.isValidAddress(donor.address) == false) { throw new DonorReceiptAddressNeededError() } diff --git a/src/models/actions/update/UpdateRunner.ts b/src/models/actions/update/UpdateRunner.ts index cb24f1f..1202ad0 100644 --- a/src/models/actions/update/UpdateRunner.ts +++ b/src/models/actions/update/UpdateRunner.ts @@ -2,6 +2,7 @@ import { IsInt, IsPositive } from 'class-validator'; import { getConnectionManager } from 'typeorm'; import { RunnerGroupNotFoundError } from '../../../errors/RunnerGroupErrors'; import { RunnerTeamNeedsParentError } from '../../../errors/RunnerTeamErrors'; +import { Address } from '../../entities/Address'; import { Runner } from '../../entities/Runner'; import { RunnerGroup } from '../../entities/RunnerGroup'; import { CreateParticipant } from '../create/CreateParticipant'; @@ -36,6 +37,7 @@ export class UpdateRunner extends CreateParticipant { runner.email = this.email; runner.group = await this.getGroup(); runner.address = this.address; + Address.validate(runner.address); return runner; } diff --git a/src/models/actions/update/UpdateRunnerOrganisation.ts b/src/models/actions/update/UpdateRunnerOrganisation.ts index ef52c2c..e53ade1 100644 --- a/src/models/actions/update/UpdateRunnerOrganisation.ts +++ b/src/models/actions/update/UpdateRunnerOrganisation.ts @@ -30,6 +30,7 @@ export class UpdateRunnerOrganisation extends CreateRunnerGroup { organisation.name = this.name; organisation.contact = await this.getContact(); organisation.address = this.address; + Address.validate(organisation.address); return organisation; } diff --git a/src/models/entities/Address.ts b/src/models/entities/Address.ts index 038f5d6..ea35f7c 100644 --- a/src/models/entities/Address.ts +++ b/src/models/entities/Address.ts @@ -7,6 +7,7 @@ import { import { Column } from "typeorm"; import ValidatorJS from 'validator'; import { config } from '../../config'; +import { AddressCityEmptyError, AddressCountryEmptyError, AddressFirstLineEmptyError, AddressPostalCodeEmptyError, AddressPostalCodeInvalidError } from '../../errors/AddressErrors'; /** * Defines the Address class. @@ -66,4 +67,19 @@ export class Address { if (ValidatorJS.isPostalCode(address.postalcode, config.postalcode_validation_countrycode) == false) { return false; } return true; } + + /** + * This function validates addresses. + * This is a workaround for non-existant class validation for embedded entities. + * @param address The address that shall get validated. + */ + public static validate(address: Address) { + if (address == null) { return; } + if (address.address1 == null && address.city == null && address.country == null && address.postalcode == null) { return; } + if (address.address1 == null) { throw new AddressFirstLineEmptyError(); } + if (address.postalcode == null) { throw new AddressPostalCodeEmptyError(); } + if (address.city == null) { throw new AddressCityEmptyError(); } + if (address.country == null) { throw new AddressCountryEmptyError(); } + if (ValidatorJS.isPostalCode(address.postalcode.toString(), config.postalcode_validation_countrycode) == false) { throw new AddressPostalCodeInvalidError(); } + } } From 57b9c2babcd68d69d1cbb240a86c2897717ba758 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 20:19:09 +0100 Subject: [PATCH 15/21] Implemented adress deletion (through reset) ref #105 --- src/models/actions/update/UpdateDonor.ts | 3 ++- src/models/actions/update/UpdateRunner.ts | 3 ++- src/models/actions/update/UpdateRunnerOrganisation.ts | 3 ++- src/models/entities/Address.ts | 8 ++++++++ 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/models/actions/update/UpdateDonor.ts b/src/models/actions/update/UpdateDonor.ts index db6a745..7b6fcfa 100644 --- a/src/models/actions/update/UpdateDonor.ts +++ b/src/models/actions/update/UpdateDonor.ts @@ -34,7 +34,8 @@ export class UpdateDonor extends CreateParticipant { donor.phone = this.phone; donor.email = this.email; donor.receiptNeeded = this.receiptNeeded; - donor.address = this.address; + if (!this.address) { donor.address.reset(); } + else { donor.address = this.address; } Address.validate(donor.address); if (this.receiptNeeded == true && Address.isValidAddress(donor.address) == false) { throw new DonorReceiptAddressNeededError() diff --git a/src/models/actions/update/UpdateRunner.ts b/src/models/actions/update/UpdateRunner.ts index 1202ad0..2df10fe 100644 --- a/src/models/actions/update/UpdateRunner.ts +++ b/src/models/actions/update/UpdateRunner.ts @@ -36,7 +36,8 @@ export class UpdateRunner extends CreateParticipant { runner.phone = this.phone; runner.email = this.email; runner.group = await this.getGroup(); - runner.address = this.address; + if (!this.address) { runner.address.reset(); } + else { runner.address = this.address; } Address.validate(runner.address); return runner; diff --git a/src/models/actions/update/UpdateRunnerOrganisation.ts b/src/models/actions/update/UpdateRunnerOrganisation.ts index e53ade1..b34bc8f 100644 --- a/src/models/actions/update/UpdateRunnerOrganisation.ts +++ b/src/models/actions/update/UpdateRunnerOrganisation.ts @@ -29,7 +29,8 @@ export class UpdateRunnerOrganisation extends CreateRunnerGroup { organisation.name = this.name; organisation.contact = await this.getContact(); - organisation.address = this.address; + if (!this.address) { organisation.address.reset(); } + else { organisation.address = this.address; } Address.validate(organisation.address); return organisation; diff --git a/src/models/entities/Address.ts b/src/models/entities/Address.ts index ea35f7c..21ec92a 100644 --- a/src/models/entities/Address.ts +++ b/src/models/entities/Address.ts @@ -58,6 +58,14 @@ export class Address { @IsNotEmpty() country: string; + public reset() { + this.address1 = null; + this.address2 = null; + this.city = null; + this.country = null; + this.postalcode = null; + } + /** * Checks if this is a valid address */ From 4d40225a4491e8eb3f41ef0fd558a599f63729be Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 20:26:58 +0100 Subject: [PATCH 16/21] Added first address update tests ref #105 --- src/tests/runnerOrgs/org_update.spec.ts | 101 ++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/src/tests/runnerOrgs/org_update.spec.ts b/src/tests/runnerOrgs/org_update.spec.ts index 3db1254..9fa8f8d 100644 --- a/src/tests/runnerOrgs/org_update.spec.ts +++ b/src/tests/runnerOrgs/org_update.spec.ts @@ -76,4 +76,105 @@ describe('adding + try updating id (should return 406)', () => { expect(res2.status).toEqual(406); expect(res2.headers['content-type']).toContain("application/json") }); +}); +// --------------- +describe('adding + updateing address valid)', () => { + let added_org_id + let added_org + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('adding address to org should return 200', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json"); + expect(res2.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s first line should return 200', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json"); + expect(res2.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s second line should return 200', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json"); + expect(res2.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + }, + "teams": [] + }); + }); }); \ No newline at end of file From 230cdb0e37e2b7a21e7feb156f2b91a69ad200fd Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 20:37:48 +0100 Subject: [PATCH 17/21] Added address update valid tests ref #105 --- src/tests/runnerOrgs/org_update.spec.ts | 87 +++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/src/tests/runnerOrgs/org_update.spec.ts b/src/tests/runnerOrgs/org_update.spec.ts index 9fa8f8d..8c66a24 100644 --- a/src/tests/runnerOrgs/org_update.spec.ts +++ b/src/tests/runnerOrgs/org_update.spec.ts @@ -177,4 +177,91 @@ describe('adding + updateing address valid)', () => { "teams": [] }); }); + it('updateing address\'s city should return 200', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json"); + expect(res2.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Burkina Faso", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s country should return 200', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Germany", + "postalcode": "90174" + } + }, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json"); + expect(res2.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Germany", + "postalcode": "90174" + }, + "teams": [] + }); + }); + it('updateing address\'s postal code should return 200', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Germany", + "postalcode": "91065" + } + }, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json"); + expect(res2.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test2", + "address2": "Test3", + "city": "Kaya", + "country": "Germany", + "postalcode": "91065" + }, + "teams": [] + }); + }); }); \ No newline at end of file From 427dfaafabd243e94aba27c2dec2705fd8ed5d64 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Sat, 16 Jan 2021 21:26:45 +0100 Subject: [PATCH 18/21] Added address update ivalid tests ref #105 --- src/tests/runnerOrgs/org_update.spec.ts | 116 ++++++++++++++++++++++++ 1 file changed, 116 insertions(+) diff --git a/src/tests/runnerOrgs/org_update.spec.ts b/src/tests/runnerOrgs/org_update.spec.ts index 8c66a24..b9ffb84 100644 --- a/src/tests/runnerOrgs/org_update.spec.ts +++ b/src/tests/runnerOrgs/org_update.spec.ts @@ -264,4 +264,120 @@ describe('adding + updateing address valid)', () => { "teams": [] }); }); + it('removing org\'s should return 200', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null + }, axios_config); + expect(res2.status).toEqual(200); + expect(res2.headers['content-type']).toContain("application/json"); + expect(res2.data).toEqual({ + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": null, + "country": null, + "postalcode": null + }, + "teams": [] + }); + }); +}); +// --------------- +describe('adding + updateing address invalid)', () => { + let added_org_id + let added_org + it('creating a new org with just a name should return 200', async () => { + const res1 = await axios.post(base + '/api/organisations', { + "name": "test123" + }, axios_config); + added_org = res1.data + added_org_id = added_org.id; + expect(res1.status).toEqual(200); + expect(res1.headers['content-type']).toContain("application/json") + }); + it('adding address to org w/o address1 should return 400', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": null, + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res2.status).toEqual(400); + expect(res2.headers['content-type']).toContain("application/json"); + }); + it('adding address to org w/o city should return 400', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": null, + "country": "Burkina Faso", + "postalcode": "90174" + } + }, axios_config); + expect(res2.status).toEqual(400); + expect(res2.headers['content-type']).toContain("application/json"); + }); + it('adding address to org w/o country should return 400', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "TestCity", + "country": null, + "postalcode": "90174" + } + }, axios_config); + expect(res2.status).toEqual(400); + expect(res2.headers['content-type']).toContain("application/json"); + }); + it('adding address to org w/o postal code should return 400', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": null + } + }, axios_config); + expect(res2.status).toEqual(400); + expect(res2.headers['content-type']).toContain("application/json"); + }); + it('adding address to org w/ invalid postal code should return 400', async () => { + const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + "id": added_org_id, + "name": "testlelele", + "contact": null, + "address": { + "address1": "Test1", + "address2": null, + "city": "TestCity", + "country": "Burkina Faso", + "postalcode": "-1" + } + }, axios_config); + expect(res2.status).toEqual(400); + expect(res2.headers['content-type']).toContain("application/json"); + }); }); \ No newline at end of file From a3c93f0d394833f1a6f78d862b094ca751c85561 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 19 Jan 2021 15:48:06 +0100 Subject: [PATCH 19/21] Cleaned up var names ref #105 --- src/tests/runnerOrgs/org_update.spec.ts | 136 ++++++++++++------------ 1 file changed, 68 insertions(+), 68 deletions(-) diff --git a/src/tests/runnerOrgs/org_update.spec.ts b/src/tests/runnerOrgs/org_update.spec.ts index b9ffb84..389dc84 100644 --- a/src/tests/runnerOrgs/org_update.spec.ts +++ b/src/tests/runnerOrgs/org_update.spec.ts @@ -19,24 +19,24 @@ describe('adding + updating name', () => { let added_org_id let added_org it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { + const res = await axios.post(base + '/api/organisations', { "name": "test123" }, axios_config); - added_org = res1.data + added_org = res.data added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") }); it('update org', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, "address": null, }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json") - let added_org2 = res2.data + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") + let added_org2 = res.data added_org_id = added_org2.id; delete added_org2.id expect(added_org2).toEqual({ @@ -58,23 +58,23 @@ describe('adding + try updating id (should return 406)', () => { let added_org_id let added_org it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { + const res = await axios.post(base + '/api/organisations', { "name": "test123" }, axios_config); - added_org = res1.data + added_org = res.data added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") }); it('update org', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id + 1, "name": "testlelele", "contact": null, "address": null, }, axios_config); - expect(res2.status).toEqual(406); - expect(res2.headers['content-type']).toContain("application/json") + expect(res.status).toEqual(406); + expect(res.headers['content-type']).toContain("application/json") }); }); // --------------- @@ -82,37 +82,37 @@ describe('adding + updateing address valid)', () => { let added_org_id let added_org it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { + const res = await axios.post(base + '/api/organisations', { "name": "test123" }, axios_config); - added_org = res1.data + added_org = res.data added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") }); it('adding address to org should return 200', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, "address": { "address1": "Test1", "address2": null, - "city": "TestCity", + "city": "Herzogenaurach", "country": "Burkina Faso", "postalcode": "90174" } }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json"); - expect(res2.data).toEqual({ + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", "contact": null, "address": { "address1": "Test1", "address2": null, - "city": "TestCity", + "city": "Herzogenaurach", "country": "Burkina Faso", "postalcode": "90174" }, @@ -120,7 +120,7 @@ describe('adding + updateing address valid)', () => { }); }); it('updateing address\'s first line should return 200', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -132,9 +132,9 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" } }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json"); - expect(res2.data).toEqual({ + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", "contact": null, @@ -149,7 +149,7 @@ describe('adding + updateing address valid)', () => { }); }); it('updateing address\'s second line should return 200', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -161,9 +161,9 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" } }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json"); - expect(res2.data).toEqual({ + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", "contact": null, @@ -178,7 +178,7 @@ describe('adding + updateing address valid)', () => { }); }); it('updateing address\'s city should return 200', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -190,9 +190,9 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" } }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json"); - expect(res2.data).toEqual({ + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", "contact": null, @@ -207,7 +207,7 @@ describe('adding + updateing address valid)', () => { }); }); it('updateing address\'s country should return 200', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -219,9 +219,9 @@ describe('adding + updateing address valid)', () => { "postalcode": "90174" } }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json"); - expect(res2.data).toEqual({ + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", "contact": null, @@ -236,7 +236,7 @@ describe('adding + updateing address valid)', () => { }); }); it('updateing address\'s postal code should return 200', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -248,9 +248,9 @@ describe('adding + updateing address valid)', () => { "postalcode": "91065" } }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json"); - expect(res2.data).toEqual({ + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", "contact": null, @@ -265,14 +265,14 @@ describe('adding + updateing address valid)', () => { }); }); it('removing org\'s should return 200', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null }, axios_config); - expect(res2.status).toEqual(200); - expect(res2.headers['content-type']).toContain("application/json"); - expect(res2.data).toEqual({ + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json"); + expect(res.data).toEqual({ "id": added_org_id, "name": "testlelele", "contact": null, @@ -292,16 +292,16 @@ describe('adding + updateing address invalid)', () => { let added_org_id let added_org it('creating a new org with just a name should return 200', async () => { - const res1 = await axios.post(base + '/api/organisations', { + const res = await axios.post(base + '/api/organisations', { "name": "test123" }, axios_config); - added_org = res1.data + added_org = res.data added_org_id = added_org.id; - expect(res1.status).toEqual(200); - expect(res1.headers['content-type']).toContain("application/json") + expect(res.status).toEqual(200); + expect(res.headers['content-type']).toContain("application/json") }); it('adding address to org w/o address1 should return 400', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -313,11 +313,11 @@ describe('adding + updateing address invalid)', () => { "postalcode": "90174" } }, axios_config); - expect(res2.status).toEqual(400); - expect(res2.headers['content-type']).toContain("application/json"); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); }); it('adding address to org w/o city should return 400', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -329,11 +329,11 @@ describe('adding + updateing address invalid)', () => { "postalcode": "90174" } }, axios_config); - expect(res2.status).toEqual(400); - expect(res2.headers['content-type']).toContain("application/json"); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); }); it('adding address to org w/o country should return 400', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -345,11 +345,11 @@ describe('adding + updateing address invalid)', () => { "postalcode": "90174" } }, axios_config); - expect(res2.status).toEqual(400); - expect(res2.headers['content-type']).toContain("application/json"); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); }); it('adding address to org w/o postal code should return 400', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -361,11 +361,11 @@ describe('adding + updateing address invalid)', () => { "postalcode": null } }, axios_config); - expect(res2.status).toEqual(400); - expect(res2.headers['content-type']).toContain("application/json"); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); }); it('adding address to org w/ invalid postal code should return 400', async () => { - const res2 = await axios.put(base + '/api/organisations/' + added_org_id, { + const res = await axios.put(base + '/api/organisations/' + added_org_id, { "id": added_org_id, "name": "testlelele", "contact": null, @@ -377,7 +377,7 @@ describe('adding + updateing address invalid)', () => { "postalcode": "-1" } }, axios_config); - expect(res2.status).toEqual(400); - expect(res2.headers['content-type']).toContain("application/json"); + expect(res.status).toEqual(400); + expect(res.headers['content-type']).toContain("application/json"); }); }); \ No newline at end of file From 30b585c0c12b3b9818778110d33d5b3ab84d4192 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 19 Jan 2021 15:49:35 +0100 Subject: [PATCH 20/21] Set country code for the ci env to DE ref #105 --- .env.ci | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.env.ci b/.env.ci index 00bfa4a..389c0fa 100644 --- a/.env.ci +++ b/.env.ci @@ -6,4 +6,4 @@ DB_USER=unused DB_PASSWORD=bla DB_NAME=./test.sqlite NODE_ENV=dev -POSTALCODE_COUNTRYCODE=null \ No newline at end of file +POSTALCODE_COUNTRYCODE=DE \ No newline at end of file From 32e054eb84c869210fd483583ae5a6d0e2249cf9 Mon Sep 17 00:00:00 2001 From: Nicolai Ort Date: Tue, 19 Jan 2021 15:37:52 +0000 Subject: [PATCH 21/21] =?UTF-8?q?=F0=9F=A7=BENew=20changelog=20file=20vers?= =?UTF-8?q?ion=20[CI=20SKIP]=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 88fc77b..2bddfa7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,8 +2,35 @@ All notable changes to this project will be documented in this file. Dates are displayed in UTC. +#### [v0.1.1](https://git.odit.services/lfk/backend/compare/v0.1.1...v0.1.1) + +- Merge pull request 'Fully implemented addresses feature/105-addresses' (#107) from feature/105-addresses into dev [`5e36855`](https://git.odit.services/lfk/backend/commit/5e368552ea810ea1d3963b1207ba98f7b46c4abc) +- Cleaned up var names [`a3c93f0`](https://git.odit.services/lfk/backend/commit/a3c93f0d394833f1a6f78d862b094ca751c85561) +- Added address update ivalid tests [`427dfaa`](https://git.odit.services/lfk/backend/commit/427dfaafabd243e94aba27c2dec2705fd8ed5d64) +- Added first address update tests [`4d40225`](https://git.odit.services/lfk/backend/commit/4d40225a4491e8eb3f41ef0fd558a599f63729be) +- Added address update valid tests [`230cdb0`](https://git.odit.services/lfk/backend/commit/230cdb0e37e2b7a21e7feb156f2b91a69ad200fd) +- Implemented deep address validation [`9dc9ce3`](https://git.odit.services/lfk/backend/commit/9dc9ce37d8fbfc92842e4e05bbde68398324a186) +- Removed old create address class [`2a465f8`](https://git.odit.services/lfk/backend/commit/2a465f88c58c0b4be3ecd99d96a04c177a40b312) +- Switched the create classes over to the new address implementation [`2cd15d2`](https://git.odit.services/lfk/backend/commit/2cd15d25e934a5439bfea4de901f136e360e17f6) +- Test's now accept the new address format [`8dbee32`](https://git.odit.services/lfk/backend/commit/8dbee32eeec8ee3d013e4446e8f53544ee4cb577) +- Removed the IAddressUser Interface entity [`e265172`](https://git.odit.services/lfk/backend/commit/e2651728c5abf2273bf51a7652c51d55d8fa0a2f) +- Switched Address to embedded entity [`7fbe649`](https://git.odit.services/lfk/backend/commit/7fbe649dc90f4bb9f240c5a80fed447048e5e105) +- Removed the address errors [`58ae9b5`](https://git.odit.services/lfk/backend/commit/58ae9b589aef3580f4b8558c3d5ddbd7171e7915) +- Switched the update classes over to the new address implementation [`d0df5dd`](https://git.odit.services/lfk/backend/commit/d0df5dd641ac17f1fd8ad6bd8b46afa9dd2745c3) +- Implemented adress deletion (through reset) [`57b9c2b`](https://git.odit.services/lfk/backend/commit/57b9c2babcd68d69d1cbb240a86c2897717ba758) +- Fixed donor address check [`4824547`](https://git.odit.services/lfk/backend/commit/4824547dde4d7f90e9e2377a26df34cabf082fdb) +- Updated the responseclasses to use the new address implementation [`dafac06`](https://git.odit.services/lfk/backend/commit/dafac06bc84d1b237096a561b3adcd3ca5cb1dd8) +- Removed (now useless) relations [`673dea2`](https://git.odit.services/lfk/backend/commit/673dea2e5754e99ff77f7556d4fc03d4cca28a94) +- Added address validity check [`ae7c5ff`](https://git.odit.services/lfk/backend/commit/ae7c5ff0c387e9337d01a9dd819a4dddc208f6dd) +- 🧾New changelog file version [CI SKIP] [skip ci] [`f53894b`](https://git.odit.services/lfk/backend/commit/f53894b16ac1c06ecbeeb0b63a56ac438b2fbe1b) +- Updated comments [`8bc01d3`](https://git.odit.services/lfk/backend/commit/8bc01d3f2406ce8e58c2ab2963c858495c510dcf) +- Set country code for the ci env to DE [`30b585c`](https://git.odit.services/lfk/backend/commit/30b585c0c12b3b9818778110d33d5b3ab84d4192) +- Implemented postal code validation for the validaton function [`f245840`](https://git.odit.services/lfk/backend/commit/f245840cde5726611197b00730aca72ea133c427) + #### [v0.1.1](https://git.odit.services/lfk/backend/compare/v0.1.0...v0.1.1) +> 16 January 2021 + - Merge pull request 'Alpha Release 0.1.1 - Hotfix release' (#106) from dev into main [`7533c34`](https://git.odit.services/lfk/backend/commit/7533c349ef98ed328151259fca68621b3eb5fd98) - 🚀Bumped version to v0.1.1 [`9445c6f`](https://git.odit.services/lfk/backend/commit/9445c6f21e376329b9200664a44a94ba1f1dd463) - 🧾New changelog file version [CI SKIP] [skip ci] [`1b9d296`](https://git.odit.services/lfk/backend/commit/1b9d2969ebdca4dca84898b1e8307be7b781b90b)