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 was merged in pull request #70.
	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