From 1bfb7ad1111735fb264e42e8bd0fcb41b51ca3ee Mon Sep 17 00:00:00 2001 From: Sergey Yarkov Date: Fri, 13 Aug 2021 23:54:09 +0300 Subject: [PATCH] feat: get likes count from course --- app/Controllers/Http/Api/v1/CoursesController.ts | 14 ++++++++++++++ app/Repositories/CourseRepository.ts | 15 +++++++++++++++ app/Services/CourseService.ts | 12 +++++++++++- database/factories/index.ts | 3 +-- routes/apis/v1/courses.ts | 4 ++++ 5 files changed, 45 insertions(+), 3 deletions(-) diff --git a/app/Controllers/Http/Api/v1/CoursesController.ts b/app/Controllers/Http/Api/v1/CoursesController.ts index 206f817..27b9162 100644 --- a/app/Controllers/Http/Api/v1/CoursesController.ts +++ b/app/Controllers/Http/Api/v1/CoursesController.ts @@ -198,6 +198,20 @@ export default class CoursesController extends BaseController { return this.sendResponse(ctx, result.data, result.message, result.status); } + /** + * Get likes count of course + * GET /courses/:id/likes + */ + public async showLikes(ctx: HttpContextContract) { + const result = await this.courseService.fetchCourseLikesCount(ctx.params.id); + + if (!result.success && result.error) { + throw new Exception(result.message, result.status, result.error.code); + } + + return this.sendResponse(ctx, result.data, result.message, result.status); + } + /** * Set like on course by authorized user * PUT /courses/:id/likes diff --git a/app/Repositories/CourseRepository.ts b/app/Repositories/CourseRepository.ts index c64f6ef..dfb57b8 100644 --- a/app/Repositories/CourseRepository.ts +++ b/app/Repositories/CourseRepository.ts @@ -1,6 +1,7 @@ /** * Datatypes */ +import Database from '@ioc:Adonis/Lucid/Database'; import CourseStatusEnum from 'App/Datatypes/Enums/CourseStatusEnum'; /** @@ -18,9 +19,12 @@ import CreateCourseValidator from 'App/Validators/Course/CreateCourseValidator'; import UpdateCourseValidator from 'App/Validators/Course/UpdateCourseValidator'; export default class CourseRepository { + private Database: typeof Database; + private Course: typeof Course; constructor() { + this.Database = Database; this.Course = Course; } @@ -68,6 +72,17 @@ export default class CourseRepository { return course; } + /** + * Get likes count of course by id + * + * @param id Course id + * @returns Likes count + */ + public async getLikesCount(id: string | number): Promise { + const likes = await this.Database.query().from('courses_likes').where('course_id', id).count('* as count'); + return likes[0].count; + } + /** * Get teacher of course * diff --git a/app/Services/CourseService.ts b/app/Services/CourseService.ts index 3928647..150fc97 100644 --- a/app/Services/CourseService.ts +++ b/app/Services/CourseService.ts @@ -559,7 +559,6 @@ export default class CourseService { public async setCourseStatus(id: string | number, status: CourseStatusEnum): Promise { const data = await this.courseRepository.setStatus(id, status); - console.log(data); if (!data) { return { @@ -580,6 +579,17 @@ export default class CourseService { data: {}, }; } + + public async fetchCourseLikesCount(id: string | number): Promise { + const count = await this.courseRepository.getLikesCount(id); + + return { + success: true, + status: StatusCodeEnum.OK, + message: 'Fetched course likes count.', + data: { count }, + }; + } } new Ioc().make(CourseService); diff --git a/database/factories/index.ts b/database/factories/index.ts index 63faac0..5f4422a 100644 --- a/database/factories/index.ts +++ b/database/factories/index.ts @@ -49,9 +49,8 @@ export const LessonFactory = Factory.define(Lesson, ({ faker }) => { .build(); export const CategoryFactory = Factory.define(Category, ({ faker }) => { - const title = faker.lorem.word(6); return { - title: `${title[0].toUpperCase()}${title.slice(1)}`, + title: `Category #${faker.datatype.number(200)}`, description: faker.lorem.sentence(5), }; }).build(); diff --git a/routes/apis/v1/courses.ts b/routes/apis/v1/courses.ts index e85e6d6..314d06b 100644 --- a/routes/apis/v1/courses.ts +++ b/routes/apis/v1/courses.ts @@ -34,6 +34,10 @@ Route.group(() => { .middleware('role:admin,teacher') .as('courses.detach-student'); + Route.get('/:id/likes', 'Api/v1/CoursesController.showLikes') + .middleware('role:admin,teacher,student') + .as('courses.show-likes'); + Route.put('/:id/likes', 'Api/v1/CoursesController.setLike') .middleware('role:admin,teacher,student') .as('courses.set-like');