import { Ctx, Field, ID, ObjectType } from 'type-graphql'; import { BaseEntity, CreateDateColumn, DeleteDateColumn, Entity, JoinTable, ManyToMany, ManyToOne, PrimaryGeneratedColumn, UpdateDateColumn, } from 'typeorm'; import { ContextType } from '../types'; import { Page, User } from '.'; @Entity({ name: 'product_lists' }) @ObjectType({ description: 'A list of pages saved by a user, related to specific products.', }) export default class ProductList extends BaseEntity { @Field(() => ID) @PrimaryGeneratedColumn('uuid') id!: string; @Field(() => [Page], { nullable: false, }) @ManyToMany(() => Page, { lazy: true }) @JoinTable() pages!: Promise; @Field(() => User, { nullable: false }) @ManyToOne(() => User, { nullable: false, eager: true }) createdBy!: User; @Field(() => [User], { nullable: false, }) @ManyToMany(() => User, { lazy: true }) @JoinTable() collaborators!: Promise; @Field(() => Date) @CreateDateColumn({ type: 'timestamp with time zone', }) createdAt!: Date; @Field(() => Date, { nullable: true, }) @UpdateDateColumn({ type: 'timestamp with time zone', nullable: true, default: null, }) updatedAt!: Date; @Field(() => Date, { nullable: true, }) @DeleteDateColumn({ type: 'timestamp with time zone', nullable: true, default: null, }) deletedAt!: Date; @Field(() => Boolean) async viewerCanEdit(@Ctx() { user }: ContextType): Promise { if (!user) return false; return Boolean( this.createdBy.id === user.id || (await this.collaborators).find((c) => c.id === user.id) ); } }