From f1226624a8a881b866120bad0fceea415ca57a85 Mon Sep 17 00:00:00 2001 From: Arios67 Date: Wed, 30 Mar 2022 12:26:10 +0900 Subject: [PATCH] =?UTF-8?q?[#81]feat:=20=EA=B2=BD=EB=A7=A4=20=EC=B0=B8?= =?UTF-8?q?=EC=97=AC=20=EC=A4=91=EC=9D=B8=20=EC=9E=91=ED=92=88=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ars/src/apis/art/entities/art.entity.ts | 8 +--- ars/src/apis/engage/entities/engage.entity.ts | 17 +++++++++ ars/src/apis/likeArt/likeArt.service.ts | 7 +++- ars/src/apis/payment/payment.module.ts | 2 + ars/src/apis/payment/payment.resolver.ts | 20 +++++++++- ars/src/apis/payment/payment.service.ts | 37 ++++++++++++++++++- .../apis/user/entities/phoneToken.entity.ts | 21 ----------- ars/src/apis/user/entities/user.entity.ts | 9 +---- ars/src/apis/user/user.module.ts | 2 - ars/src/apis/user/user.resolver.ts | 2 +- ars/src/common/graphql/schema.gql | 8 +++- 11 files changed, 91 insertions(+), 42 deletions(-) create mode 100644 ars/src/apis/engage/entities/engage.entity.ts delete mode 100644 ars/src/apis/user/entities/phoneToken.entity.ts diff --git a/ars/src/apis/art/entities/art.entity.ts b/ars/src/apis/art/entities/art.entity.ts index e85eae4..e86b2c9 100644 --- a/ars/src/apis/art/entities/art.entity.ts +++ b/ars/src/apis/art/entities/art.entity.ts @@ -44,11 +44,11 @@ export class Art { @CreateDateColumn() @Field(() => Date) - createdAt: string; + createdAt: Date; @DeleteDateColumn() @Field(() => Date) - deletedAt: string; + deletedAt: Date; @Column() @Field(() => Date) @@ -58,10 +58,6 @@ export class Art { @Field(() => Boolean) is_soldout: boolean; - @DeleteDateColumn() - @Field(() => Date) - deletedAt: Date; - @ManyToOne(() => User, { eager: true }) @Field(() => User) user: User; diff --git a/ars/src/apis/engage/entities/engage.entity.ts b/ars/src/apis/engage/entities/engage.entity.ts new file mode 100644 index 0000000..87ba5ff --- /dev/null +++ b/ars/src/apis/engage/entities/engage.entity.ts @@ -0,0 +1,17 @@ +import { Field, ObjectType } from '@nestjs/graphql'; +import { Art } from 'src/apis/art/entities/art.entity'; +import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; + +@Entity() +@ObjectType() +export class Engage { + @PrimaryGeneratedColumn() + id: string; + + @Column() + userId: string; + + @ManyToOne(() => Art, { eager: true }) + @Field(() => Art) + art: Art; +} diff --git a/ars/src/apis/likeArt/likeArt.service.ts b/ars/src/apis/likeArt/likeArt.service.ts index b834353..eaff18e 100644 --- a/ars/src/apis/likeArt/likeArt.service.ts +++ b/ars/src/apis/likeArt/likeArt.service.ts @@ -17,7 +17,12 @@ export class LikeArtService { async like(artId, userId) { try { - const prevLike = await this.likeArtRepository.findOne({ art: artId }); + const prevLike = await this.likeArtRepository.findOne({ + where: { + userId: userId, + art: artId, + }, + }); if (!prevLike) { await this.likeArtRepository.save({ userId: userId, diff --git a/ars/src/apis/payment/payment.module.ts b/ars/src/apis/payment/payment.module.ts index 2ca9eae..71f9c57 100644 --- a/ars/src/apis/payment/payment.module.ts +++ b/ars/src/apis/payment/payment.module.ts @@ -3,6 +3,7 @@ import { TypeOrmModule } from '@nestjs/typeorm'; import { ArtService } from '../art/art.service'; import { Art } from '../art/entities/art.entity'; import { ArtImage } from '../artImage/entities/artImage.entity'; +import { Engage } from '../engage/entities/engage.entity'; import { User } from '../user/entities/user.entity'; import { UserService } from '../user/user.service'; import { Payment } from './entities/payment.entity'; @@ -16,6 +17,7 @@ import { PaymentServie } from './payment.service'; ArtImage, User, Payment, + Engage, ]), ], providers: [ diff --git a/ars/src/apis/payment/payment.resolver.ts b/ars/src/apis/payment/payment.resolver.ts index 54e76a5..61f624b 100644 --- a/ars/src/apis/payment/payment.resolver.ts +++ b/ars/src/apis/payment/payment.resolver.ts @@ -3,6 +3,7 @@ import { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; import { Cache } from 'cache-manager'; import { GqlAuthAccessGuard } from 'src/common/auth/gql-auth.guard'; import { CurrentUser, ICurrentUser } from 'src/common/auth/gql-user.param'; +import { Engage } from '../engage/entities/engage.entity'; import { UserService } from '../user/user.service'; import { Payment } from './entities/payment.entity'; import { PaymentServie } from './payment.service'; @@ -23,11 +24,16 @@ export class PaymentResolver { return await this.paymentService.find(currentUser.id); } + @UseGuards(GqlAuthAccessGuard) + @Query(() => [Engage]) + async fetchEngaging(@CurrentUser() currentUser: ICurrentUser) { + return await this.paymentService.findEngage(currentUser.id); + } + @Mutation(() => String) async checkTimedoutAndProcess() { try { const arts = await this.paymentService.checkTimeout(); - console.log(arts, '작품들'); arts.map(async (e) => { const bidInfo = await this.cacheManager.get(e.id); const price = bidInfo[0]; @@ -63,6 +69,7 @@ export class PaymentResolver { return 'artId'; } + // 입찰 API(임시) @UseGuards(GqlAuthAccessGuard) @Mutation(() => [String]) async Bid( @@ -72,4 +79,15 @@ export class PaymentResolver { ) { return await this.paymentService.call(artId, bid_price, currentUser.email); } + + @UseGuards(GqlAuthAccessGuard) + @Mutation(() => String) + async saveBid( + @Args('artId') artId: string, + @CurrentUser() currentUser: ICurrentUser, + ) { + console.log(currentUser.id); + await this.paymentService.save(artId, currentUser.id); + return 'ok'; + } } diff --git a/ars/src/apis/payment/payment.service.ts b/ars/src/apis/payment/payment.service.ts index 0270b21..a2f2801 100644 --- a/ars/src/apis/payment/payment.service.ts +++ b/ars/src/apis/payment/payment.service.ts @@ -3,6 +3,7 @@ import { InjectRepository } from '@nestjs/typeorm'; import { Cache } from 'cache-manager'; import { Connection, LessThan, Repository } from 'typeorm'; import { Art } from '../art/entities/art.entity'; +import { Engage } from '../engage/entities/engage.entity'; import { History } from '../history/entities/history.entity'; import { User } from '../user/entities/user.entity'; import { Payment } from './entities/payment.entity'; @@ -16,6 +17,9 @@ export class PaymentServie { @InjectRepository(Payment) private readonly paymentRepository: Repository, + @InjectRepository(Engage) + private readonly engageRepository: Repository, + @Inject(CACHE_MANAGER) private readonly cacheManager: Cache, @@ -53,6 +57,7 @@ export class PaymentServie { is_soldout: true, }); await queryRunner.manager.softDelete(Art, { id: artId }); + await queryRunner.manager.delete(Engage, { art: artId }); // 낙찰 테이블 저장 const payment = await queryRunner.manager.save(Payment, { @@ -99,7 +104,6 @@ export class PaymentServie { async call(artId, bid_price, email) { const art = await this.artRepository.findOne(artId); const time = Number(art.deadline) - Number(new Date()); - console.log(time); if (time > 0) { await this.cacheManager.set(artId, [bid_price, email], { ttl: time + 60000, @@ -108,8 +112,39 @@ export class PaymentServie { return [bid_price, email]; } + async save(artId, userId) { + const queryRunner = this.connection.createQueryRunner(); + await queryRunner.connect(); + await queryRunner.startTransaction(); + try { + const prevEngage = await queryRunner.manager.findOne(Engage, { + where: { + userId: userId, + art: artId, + }, + }); + + if (!prevEngage) + await queryRunner.manager.save(Engage, { + userId: userId, + art: artId, + }); + await queryRunner.commitTransaction(); + } catch (error) { + await queryRunner.rollbackTransaction(); + throw error + 'saveBid'; + } finally { + await queryRunner.release(); + } + } + // 구매한 작품 목록 조회 async find(userId) { return await this.paymentRepository.find({ user: userId }); } + + // 경매 참여 중인 작품 조회 + async findEngage(userId) { + return await this.engageRepository.find({ userId: userId }); + } } diff --git a/ars/src/apis/user/entities/phoneToken.entity.ts b/ars/src/apis/user/entities/phoneToken.entity.ts deleted file mode 100644 index 402e22a..0000000 --- a/ars/src/apis/user/entities/phoneToken.entity.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Field, ObjectType } from '@nestjs/graphql'; -import { Column, Entity, PrimaryGeneratedColumn } from 'typeorm'; - -@Entity() -@ObjectType() -export class PhoneToken { - @PrimaryGeneratedColumn() - id: string; - - @Field(() => String) - @Column() - token: string; - - @Field(() => String) - @Column() - phone: string; - - @Field(() => String) - @Column() - isAuth: boolean; -} diff --git a/ars/src/apis/user/entities/user.entity.ts b/ars/src/apis/user/entities/user.entity.ts index dd8771f..2d62c35 100644 --- a/ars/src/apis/user/entities/user.entity.ts +++ b/ars/src/apis/user/entities/user.entity.ts @@ -1,13 +1,6 @@ -import { - Column, - Entity, - JoinColumn, - OneToOne, - PrimaryGeneratedColumn, -} from 'typeorm'; +import { Column, Entity, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; import { Field, Int, ObjectType } from '@nestjs/graphql'; import { Profile } from 'src/apis/profile/entities/profile.entity'; -import { History } from 'src/apis/history/entities/history.entity'; @Entity() @ObjectType() diff --git a/ars/src/apis/user/user.module.ts b/ars/src/apis/user/user.module.ts index 2e91f7b..32cbce3 100644 --- a/ars/src/apis/user/user.module.ts +++ b/ars/src/apis/user/user.module.ts @@ -1,7 +1,6 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; import { Profile } from '../profile/entities/profile.entity'; -import { PhoneToken } from './entities/phoneToken.entity'; import { User } from './entities/user.entity'; import { UserResolver } from './user.resolver'; import { UserService } from './user.service'; @@ -11,7 +10,6 @@ import { UserService } from './user.service'; TypeOrmModule.forFeature([ User, // Profile, - PhoneToken, ]), ], providers: [ diff --git a/ars/src/apis/user/user.resolver.ts b/ars/src/apis/user/user.resolver.ts index 3e8f69a..932a724 100644 --- a/ars/src/apis/user/user.resolver.ts +++ b/ars/src/apis/user/user.resolver.ts @@ -1,4 +1,4 @@ -import { Args, Context, Mutation, Query, Resolver } from '@nestjs/graphql'; +import { Args, Mutation, Query, Resolver } from '@nestjs/graphql'; import { CreateUserInput } from './dto/createUserInput'; import { User } from './entities/user.entity'; import { UserService } from './user.service'; diff --git a/ars/src/common/graphql/schema.gql b/ars/src/common/graphql/schema.gql index cf1a78d..f1df9e7 100644 --- a/ars/src/common/graphql/schema.gql +++ b/ars/src/common/graphql/schema.gql @@ -52,7 +52,6 @@ type Art { deletedAt: DateTime! deadline: DateTime! is_soldout: Boolean! - deletedAt: DateTime! user: User! payment: Payment! tag1: String! @@ -115,6 +114,10 @@ type Comment { user: User! } +type Engage { + art: Art! +} + type Query { fetchArts(tags: [String!]!, createdAt: String = "1970-2-10"): [Art!]! fetchArt(artId: String!): Art! @@ -132,7 +135,9 @@ type Query { fetchHistory(page: Float!): [History!]! fetchProfile: Profile! fetchUser: User! + findUserEmail(phoneNum: String!): String! fetchPurchaseList: Payment! + fetchEngaging: [Engage!]! fetchPointTransactions: [PointTransaction!]! } @@ -160,6 +165,7 @@ type Mutation { checkTimedoutAndProcess: String! instantBid(artId: String!, price: Float!, artistEmail: String!): String! Bid(artId: String!, bid_price: Float!): [String!]! + saveBid(artId: String!): String! createPointTransaction(impUid: String!, charge_amount: Float!): PointTransaction! cancelPointTransaction(impUid: String!): PointTransaction! }