import {Entity, BaseEntity, Tree, getRepository, getTreeRepository, TreeRepository, PrimaryGeneratedColumn, Column, JoinTable, ManyToMany, TreeParent, TreeChildren, TreeLevelColumn} from 'typeorm'; import User from './user'; @Entity() @Tree('closure-table') export default class Group extends BaseEntity { @PrimaryGeneratedColumn() id: number; @Column() name: string; @Column() login: string; @TreeParent() parent?: Group; @TreeChildren() groups: Group[] @Column({ nullable: true }) icon: string | null; @ManyToMany(type => User, u => u.groups, {eager: true}) @JoinTable() users: User[] async mail(data, all = true): Promise { const users = this.users; users.forEach(user => { user.mail(data) }); if(all){ const children = await getTreeRepository(Group).findDescendants(this); children.forEach(group => { group.mail(data, true); }); } } /*isChild(node: User|Group): boolean { if(node instanceof User) { return this.users.some(user => user.id === node.id); }else{ return this.groups.some(group => group.id === node.id); } } isParent(node: Group): boolean { return this.parent.id === node.id }*/ /*async isDescendant(node: User|Group): Promise { const repos = await getTreeRepository(Group); try{ if(node instanceof User) { await repos .createDescendantsQueryBuilder('group', 'groupClosure', this) .leftJoinAndSelect('group.users', 'users') .andWhere('users.id = :id', { id: node.id }) .getOneOrFail(); }else{ await repos .createDescendantsQueryBuilder('group', 'groupClosure', this) .andWhere('group.id = :id', { id: node.id }) .getOneOrFail(); } return true; }catch{ return false; } } async isAncestor(node: Group): Promise { const repos = await getTreeRepository(Group); try{ await repos .createAncestorsQueryBuilder('group', 'groupClosure', this) .andWhere('group.id = :id', { id: node.id }) .getOneOrFail(); return true; }catch{ return false; } }*/ }