import { uniqBy, sortBy } from 'lodash'; import { Ctx, Field, ObjectType, UseMiddleware } from 'type-graphql'; import { Column, Entity, ManyToMany, ManyToOne, OneToMany } from 'typeorm'; import { getFilterRetailersUsingWhitelistMiddleware, RETAILER_DOMAIN_WHITELIST_SET, } from '@/utils/retailer'; import { ContextType } from '@/types'; import { transformURL } from '@/repositories/PageRepository/utils'; import { AggregateProduct, AggregateProductVariantSavesList, RetailerProductVariant, } from '..'; import { AbstractProductData } from '../abstract/AbstractProductData'; @Entity({ name: 'aggregate_product_variants' }) @ObjectType({ implements: AbstractProductData.objectTypeImplements, }) export default class AggregateProductVariant extends AbstractProductData { @ManyToOne(() => AggregateProduct, (product) => product.variants, { nullable: false, }) product!: AggregateProduct; @Column() productId!: string; @Field(() => AggregateProduct, { nullable: false, name: 'product' }) async productResolver( @Ctx() { dbDataLoader }: ContextType ): Promise { return dbDataLoader.aggregateProductById.load(this.productId); } @Field(() => Number, { name: 'numberOfSaves', nullable: false, }) async numberOfSavesResolver( @Ctx() { dbDataLoader }: ContextType ): Promise { return (await dbDataLoader.savesListForvariants.load(this.id)).length; } @OneToMany(() => RetailerProductVariant, (retailer) => retailer.variant) retailers!: RetailerProductVariant[]; @Field(() => [RetailerProductVariant], { name: 'retailerProductVariants' }) @UseMiddleware( getFilterRetailersUsingWhitelistMiddleware(RETAILER_DOMAIN_WHITELIST_SET) ) async retailersResolver( @Ctx() { dbDataLoader }: ContextType ): Promise { return uniqBy( sortBy( // eslint-disable-next-line max-len await dbDataLoader.retailerProductVariantsByAggregateProductVariantId.load( this.id ), ['imageUrls', 'length'] ).reverse(), 'retailer' ); } @ManyToMany( () => AggregateProductVariantSavesList, (savesList) => savesList.variants ) savesLists!: AggregateProductVariantSavesList[]; }