From f28a4f375fe40a9272c1a62d170a1e3f4d1f7daf Mon Sep 17 00:00:00 2001 From: abdulhakim2902 Date: Mon, 11 Oct 2021 20:22:44 +0800 Subject: [PATCH] MYR-927: Fixed error status code 400 --- src/controllers/vote.controller.ts | 48 +++++++++++++++++++++++++++++ src/interfaces/metric.interface.ts | 4 +++ src/models/post.model.ts | 3 ++ src/models/vote.model.ts | 3 -- src/repositories/post.repository.ts | 12 ++++++++ src/services/metric.service.ts | 6 ++++ 6 files changed, 73 insertions(+), 3 deletions(-) diff --git a/src/controllers/vote.controller.ts b/src/controllers/vote.controller.ts index 80e143934..151a4d3e7 100644 --- a/src/controllers/vote.controller.ts +++ b/src/controllers/vote.controller.ts @@ -61,4 +61,52 @@ export class VoteController { async deleteById(@param.path.string('id') id: string): Promise { return this.voteRepository.deleteById(id); } + + @post('/likes', { + responses: { + '200': { + description: 'Vote model instance', + content: {'application/json': {schema: getModelSchemaRef(Vote)}}, + }, + }, + }) + async createLike( + @requestBody({ + content: { + 'application/json': { + schema: getModelSchemaRef(Vote, { + title: 'NewVote', + }), + }, + }, + }) + vote: Omit, + ): Promise { + /* eslint-disable @typescript-eslint/no-explicit-any */ + const collection = ( + this.voteRepository.dataSource.connector as any + ).collection(Vote.modelName); + const query = { + userId: vote.userId, + type: vote.type, + referenceId: vote.referenceId, + }; + const update = { + $set: vote, + }; + const options = {upsert: true, returnOriginal: false}; + + return collection.findOneAndUpdate(query, update, options); + } + + @del('/likes/{id}', { + responses: { + '200': { + description: 'Vote DELETE success', + }, + }, + }) + async deleteLikesById(@param.path.string('id') id: string): Promise { + return this.voteRepository.deleteById(id); + } } diff --git a/src/interfaces/metric.interface.ts b/src/interfaces/metric.interface.ts index e593f1857..d7381321d 100644 --- a/src/interfaces/metric.interface.ts +++ b/src/interfaces/metric.interface.ts @@ -1,4 +1,8 @@ +// TODO: removed likes, comments and dislikes export interface Metric { + likes?: number; + dislikes?: number; + comments?: number; upvotes: number; downvotes: number; discussions?: number; diff --git a/src/models/post.model.ts b/src/models/post.model.ts index 435172f79..452e86c59 100644 --- a/src/models/post.model.ts +++ b/src/models/post.model.ts @@ -192,6 +192,9 @@ export class Post extends Entity { @hasMany(() => Comment, {keyTo: 'referenceId'}) comments: Comment[]; + @hasMany(() => Vote, {keyTo: 'referenceId'}) + likes: Vote[]; + @hasMany(() => Vote, {keyTo: 'referenceId'}) votes: Vote[]; diff --git a/src/models/vote.model.ts b/src/models/vote.model.ts index ca599845f..262aa3676 100644 --- a/src/models/vote.model.ts +++ b/src/models/vote.model.ts @@ -8,9 +8,6 @@ import {User} from './user.model'; mongodb: { collection: 'votes', }, - jsonSchema: { - require: ['userId'], - }, }, }) export class Vote extends Entity { diff --git a/src/repositories/post.repository.ts b/src/repositories/post.repository.ts index 29d9dbd0e..356447add 100644 --- a/src/repositories/post.repository.ts +++ b/src/repositories/post.repository.ts @@ -40,6 +40,12 @@ export class PostRepository extends DefaultCrudRepository< typeof Vote.prototype.id >; + // TODO: Delete after revamp is finished + public readonly likes: HasManyRepositoryFactory< + Vote, + typeof Vote.prototype.id + >; + public readonly transactions: HasManyRepositoryFactory< Transaction, typeof Post.prototype.id @@ -84,5 +90,11 @@ export class PostRepository extends DefaultCrudRepository< voteRepositoryGetter, ); this.registerInclusionResolver('votes', this.votes.inclusionResolver); + // TODO: Delete after revamp + this.likes = this.createHasManyRepositoryFactoryFor( + 'likes', + voteRepositoryGetter, + ); + this.registerInclusionResolver('likes', this.likes.inclusionResolver); } } diff --git a/src/services/metric.service.ts b/src/services/metric.service.ts index 387999025..583b771c5 100644 --- a/src/services/metric.service.ts +++ b/src/services/metric.service.ts @@ -69,7 +69,10 @@ export class MetricService { state: false, }); + // TODO: removed likes and dislikes const metric: Metric = { + likes: upvote.count, + dislikes: downvote.count, upvotes: upvote.count, downvotes: downvote.count, }; @@ -95,6 +98,9 @@ export class MetricService { ).count; } + // TODO: removed comments + metric.comments = (metric.discussions ?? 0) + (metric.debates ?? 0); + return metric; }