Merge pull request 'bugfix/68-address_circular_dependencies' (#70) from bugfix/68-address_circular_dependencies into feature/65-donor_controllers
	
		
			
	
		
	
	
		
	
		
			All checks were successful
		
		
	
	
		
			
				
	
				continuous-integration/drone/pr Build is passing
				
			
		
		
	
	
				
					
				
			
		
			All checks were successful
		
		
	
	continuous-integration/drone/pr Build is passing
				
			Reviewed-on: #70 closes #68
This commit is contained in:
		| @@ -29,7 +29,7 @@ export class RunnerOrganisationController { | ||||
| 	@OpenAPI({ description: 'Lists all organisations. <br> This includes their address, contact and teams (if existing/associated).' }) | ||||
| 	async getAll() { | ||||
| 		let responseTeams: ResponseRunnerOrganisation[] = new Array<ResponseRunnerOrganisation>(); | ||||
| 		const runners = await this.runnerOrganisationRepository.find({ relations: [/*'address',*/ 'contact', 'teams'] }); | ||||
| 		const runners = await this.runnerOrganisationRepository.find({ relations: ['address', '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: ['address', '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: ['address', 'contact', 'teams'] })); | ||||
| 	} | ||||
|  | ||||
| 	@Put('/:id') | ||||
| @@ -84,7 +84,7 @@ export class RunnerOrganisationController { | ||||
|  | ||||
| 		await this.runnerOrganisationRepository.save(await updateOrganisation.updateRunnerOrganisation(oldRunnerOrganisation)); | ||||
|  | ||||
| 		return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(id, { relations: [/*'address',*/ 'contact', 'teams'] })); | ||||
| 		return new ResponseRunnerOrganisation(await this.runnerOrganisationRepository.findOne(id, { relations: ['address', '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: ['address', 'contact', 'runners', 'teams'] }); | ||||
|  | ||||
| 		if (!force) { | ||||
| 			if (runnerOrganisation.teams.length != 0) { | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import { | ||||
| } from "class-validator"; | ||||
| import { Column, Entity, OneToMany, PrimaryGeneratedColumn } from "typeorm"; | ||||
| import { config } from '../../config'; | ||||
| import { Participant } from "./Participant"; | ||||
| import { IAddressUser } from './IAddressUser'; | ||||
|  | ||||
| /** | ||||
|  * Defines the Address entity. | ||||
| @@ -78,13 +78,6 @@ export class Address { | ||||
|   /** | ||||
|    * Used to link the address to participants. | ||||
|    */ | ||||
|   @OneToMany(() => Participant, participant => participant.address, { nullable: true }) | ||||
|   participants: Participant[]; | ||||
|  | ||||
|   //TODO: #68 | ||||
|   // /** | ||||
|   //  * Used to link the address to runner groups. | ||||
|   //  */ | ||||
|   // @OneToMany(() => RunnerOrganisation, group => group.address, { nullable: true }) | ||||
|   // groups: RunnerOrganisation[]; | ||||
|   @OneToMany(() => IAddressUser, addressUser => addressUser.address, { nullable: true }) | ||||
|   addressUsers: IAddressUser[]; | ||||
| } | ||||
|   | ||||
| @@ -10,6 +10,7 @@ import { | ||||
| import { Column, Entity, ManyToOne, OneToMany, PrimaryGeneratedColumn } from "typeorm"; | ||||
| import { config } from '../../config'; | ||||
| import { Address } from "./Address"; | ||||
| import { IAddressUser } from './IAddressUser'; | ||||
| import { RunnerGroup } from "./RunnerGroup"; | ||||
|  | ||||
| /** | ||||
| @@ -17,7 +18,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 { | ||||
| export class GroupContact implements IAddressUser { | ||||
|   /** | ||||
|    * Autogenerated unique id (primary key). | ||||
|    */ | ||||
| @@ -54,7 +55,7 @@ export class GroupContact { | ||||
|    * This is a address object to prevent any formatting differences. | ||||
|    */ | ||||
|   @IsOptional() | ||||
|   @ManyToOne(() => Address, address => address.participants, { nullable: true }) | ||||
|   @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) | ||||
|   address?: Address; | ||||
|  | ||||
|   /** | ||||
|   | ||||
							
								
								
									
										15
									
								
								src/models/entities/IAddressUser.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/models/entities/IAddressUser.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| 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 | ||||
| } | ||||
| @@ -10,6 +10,7 @@ import { | ||||
| import { Column, Entity, ManyToOne, PrimaryGeneratedColumn, TableInheritance } from "typeorm"; | ||||
| import { config } from '../../config'; | ||||
| import { Address } from "./Address"; | ||||
| import { IAddressUser } from './IAddressUser'; | ||||
|  | ||||
| /** | ||||
|  * Defines the Participant entity. | ||||
| @@ -17,7 +18,7 @@ import { Address } from "./Address"; | ||||
| */ | ||||
| @Entity() | ||||
| @TableInheritance({ column: { name: "type", type: "varchar" } }) | ||||
| export abstract class Participant { | ||||
| export abstract class Participant implements IAddressUser { | ||||
|   /** | ||||
|    * Autogenerated unique id (primary key). | ||||
|    */ | ||||
| @@ -53,7 +54,7 @@ export abstract class Participant { | ||||
|    * The participant's address. | ||||
|    * This is a address object to prevent any formatting differences. | ||||
|    */ | ||||
|   @ManyToOne(() => Address, address => address.participants, { nullable: true }) | ||||
|   @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) | ||||
|   address?: Address; | ||||
|  | ||||
|   /** | ||||
|   | ||||
| @@ -1,5 +1,7 @@ | ||||
| import { IsInt } from "class-validator"; | ||||
| import { ChildEntity, OneToMany } from "typeorm"; | ||||
| import { IsInt, IsOptional } from "class-validator"; | ||||
| import { ChildEntity, ManyToOne, OneToMany } from "typeorm"; | ||||
| import { Address } from './Address'; | ||||
| import { IAddressUser } from './IAddressUser'; | ||||
| import { Runner } from './Runner'; | ||||
| import { RunnerGroup } from "./RunnerGroup"; | ||||
| import { RunnerTeam } from "./RunnerTeam"; | ||||
| @@ -9,14 +11,14 @@ import { RunnerTeam } from "./RunnerTeam"; | ||||
|  * This usually is a school, club or company. | ||||
| */ | ||||
| @ChildEntity() | ||||
| export class RunnerOrganisation extends RunnerGroup { | ||||
| export class RunnerOrganisation extends RunnerGroup implements IAddressUser { | ||||
|  | ||||
|   // /** | ||||
|   //  * The organisations's address. | ||||
|   //  */ | ||||
|   // @IsOptional() | ||||
|   // @ManyToOne(() => Address, address => address.groups, { nullable: true }) | ||||
|   // address?: Address; | ||||
|   /** | ||||
|    * The organisations's address. | ||||
|    */ | ||||
|   @IsOptional() | ||||
|   @ManyToOne(() => Address, address => address.addressUsers, { nullable: true }) | ||||
|   address?: Address; | ||||
|  | ||||
|   /** | ||||
|    * The organisation's teams. | ||||
|   | ||||
| @@ -1,7 +1,8 @@ | ||||
| import { | ||||
|     IsArray, | ||||
|     IsNotEmpty, | ||||
|     IsObject | ||||
|  | ||||
|     IsObject, | ||||
|     IsOptional | ||||
| } from "class-validator"; | ||||
| import { Address } from '../entities/Address'; | ||||
| import { RunnerOrganisation } from '../entities/RunnerOrganisation'; | ||||
| @@ -17,7 +18,7 @@ export class ResponseRunnerOrganisation extends ResponseRunnerGroup { | ||||
|      * The runnerOrganisation's address. | ||||
|      */ | ||||
|     @IsObject() | ||||
|     @IsNotEmpty() | ||||
|     @IsOptional() | ||||
|     address?: Address; | ||||
|  | ||||
|     /** | ||||
| @@ -32,7 +33,7 @@ export class ResponseRunnerOrganisation extends ResponseRunnerGroup { | ||||
|      */ | ||||
|     public constructor(org: RunnerOrganisation) { | ||||
|         super(org); | ||||
|         // this.address = org.address; | ||||
|         this.address = org.address; | ||||
|         this.teams = org.teams; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -56,7 +56,7 @@ describe('adding + getting from all orgs', () => { | ||||
|         expect(added_org).toEqual({ | ||||
|             "name": "test123", | ||||
|             "contact": null, | ||||
|             // "address": null, | ||||
|             "address": null, | ||||
|             "teams": [] | ||||
|         }) | ||||
|     }); | ||||
| @@ -83,7 +83,7 @@ describe('adding + getting explicitly', () => { | ||||
|         expect(added_org2).toEqual({ | ||||
|             "name": "test123", | ||||
|             "contact": null, | ||||
|             // "address": null, | ||||
|             "address": null, | ||||
|             "teams": [] | ||||
|         }) | ||||
|     }); | ||||
|   | ||||
| @@ -44,7 +44,7 @@ describe('adding + deletion (successfull)', () => { | ||||
|         expect(added_org2).toEqual({ | ||||
|             "name": "test123", | ||||
|             "contact": null, | ||||
|             // "address": null, | ||||
|             "address": null, | ||||
|             "teams": [] | ||||
|         }); | ||||
|     }); | ||||
| @@ -121,7 +121,7 @@ describe('adding + deletion with teams still existing (with force)', () => { | ||||
|         expect(added_org2).toEqual({ | ||||
|             "name": "test123", | ||||
|             "contact": null, | ||||
|             // "address": null | ||||
|             "address": null | ||||
|         }); | ||||
|     }); | ||||
|     it('check if org really was deleted', async () => { | ||||
|   | ||||
| @@ -32,7 +32,7 @@ describe('adding + updating name', () => { | ||||
|             "id": added_org_id, | ||||
|             "name": "testlelele", | ||||
|             "contact": null, | ||||
|             // "address": null, | ||||
|             "address": null, | ||||
|         }, axios_config); | ||||
|         expect(res2.status).toEqual(200); | ||||
|         expect(res2.headers['content-type']).toContain("application/json") | ||||
| @@ -42,7 +42,7 @@ describe('adding + updating name', () => { | ||||
|         expect(added_org2).toEqual({ | ||||
|             "name": "testlelele", | ||||
|             "contact": null, | ||||
|             // "address": null, | ||||
|             "address": null, | ||||
|             "teams": [] | ||||
|         }) | ||||
|     }); | ||||
| @@ -65,7 +65,7 @@ describe('adding + try updating id (should return 406)', () => { | ||||
|             "id": added_org_id + 1, | ||||
|             "name": "testlelele", | ||||
|             "contact": null, | ||||
|             // "address": null, | ||||
|             "address": null, | ||||
|         }, axios_config); | ||||
|         expect(res2.status).toEqual(406); | ||||
|         expect(res2.headers['content-type']).toContain("application/json") | ||||
|   | ||||
		Reference in New Issue
	
	Block a user