bugfix/68-address_circular_dependencies #70

Merged
niggl merged 5 commits from bugfix/68-address_circular_dependencies into feature/65-donor_controllers 2021-01-02 20:55:04 +00:00
10 changed files with 52 additions and 39 deletions

View File

@ -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) {

View File

@ -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[];
}

View File

@ -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;
/**

View 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
}

View File

@ -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;
/**

View File

@ -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.

View File

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

View File

@ -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": []
})
});

View File

@ -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 () => {

View File

@ -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")