diff --git a/apps/e-commerce/src/e-commerce.module.ts b/apps/e-commerce/src/e-commerce.module.ts index dcd91a8a..2fc2eaf0 100644 --- a/apps/e-commerce/src/e-commerce.module.ts +++ b/apps/e-commerce/src/e-commerce.module.ts @@ -78,6 +78,7 @@ import { AdminPageModule } from './admin/page/page.module'; import { PageModule } from './page/page.module'; import { DashboardModule } from './user/dashboard/dashboard.module'; import { CancellOrderModule } from './admin/cancell-order/cancell-order.module'; +import { UserCommentModule } from './user/comment/comment.module'; @Module({ imports: [ @@ -158,6 +159,7 @@ import { CancellOrderModule } from './admin/cancell-order/cancell-order.module'; PageModule, DashboardModule, CancellOrderModule, + UserCommentModule, ], providers: [ { diff --git a/apps/e-commerce/src/user/comment/comment.controller.ts b/apps/e-commerce/src/user/comment/comment.controller.ts new file mode 100644 index 00000000..d435794a --- /dev/null +++ b/apps/e-commerce/src/user/comment/comment.controller.ts @@ -0,0 +1,48 @@ +import { + Controller, + Get, + HttpCode, + HttpStatus, + Query, + UseGuards, + UseInterceptors, +} from '@nestjs/common'; +import { JsonResponseTransformInterceptor } from '@rahino/response/interceptor'; +import { + ApiBearerAuth, + ApiOperation, + ApiQuery, + ApiTags, +} from '@nestjs/swagger'; +import { JwtGuard } from '@rahino/auth/guard'; +import { CommentService } from './comment.service'; +import { GetUser } from '@rahino/auth/decorator'; +import { User } from '@rahino/database/models/core/user.entity'; +import { OptionalSessionGuard } from '../session/guard'; +import { ListFilter } from '@rahino/query-filter'; + +@ApiTags('Addresses') +@UseGuards(JwtGuard, OptionalSessionGuard) +@ApiBearerAuth() +@UseInterceptors(JsonResponseTransformInterceptor) +@Controller({ + path: '/api/ecommerce/user/comments', + version: ['1'], +}) +export class CommentController { + constructor(private service: CommentService) {} + + // public url + @ApiOperation({ description: 'show all comments' }) + @Get('/') + @ApiQuery({ + name: 'filter', + type: ListFilter, + style: 'deepObject', + explode: true, + }) + @HttpCode(HttpStatus.OK) + async findAll(@GetUser() user: User, @Query() filter: ListFilter) { + return await this.service.findAll(user, filter); + } +} diff --git a/apps/e-commerce/src/user/comment/comment.module.ts b/apps/e-commerce/src/user/comment/comment.module.ts new file mode 100644 index 00000000..8281c5ac --- /dev/null +++ b/apps/e-commerce/src/user/comment/comment.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { CommentController } from './comment.controller'; +import { CommentService } from './comment.service'; +import { SequelizeModule } from '@nestjs/sequelize'; +import { SessionModule } from '../session/session.module'; +import { ECProductComment } from '@rahino/database/models/ecommerce-eav/ec-product-comment.entity'; + +@Module({ + imports: [SessionModule, SequelizeModule.forFeature([ECProductComment])], + controllers: [CommentController], + providers: [CommentService], + exports: [CommentService], +}) +export class UserCommentModule {} diff --git a/apps/e-commerce/src/user/comment/comment.service.ts b/apps/e-commerce/src/user/comment/comment.service.ts new file mode 100644 index 00000000..7a6054a9 --- /dev/null +++ b/apps/e-commerce/src/user/comment/comment.service.ts @@ -0,0 +1,94 @@ +import { Injectable } from '@nestjs/common'; +import { InjectModel } from '@nestjs/sequelize'; +import { QueryOptionsBuilder } from '@rahino/query-filter/sequelize-query-builder'; +import { Op, Sequelize } from 'sequelize'; +import * as _ from 'lodash'; +import { User } from '@rahino/database/models/core/user.entity'; +import { ListFilter } from '@rahino/query-filter'; +import { ECProductComment } from '@rahino/database/models/ecommerce-eav/ec-product-comment.entity'; +import { ProductCommentStatusEnum } from '@rahino/ecommerce/util/enum'; +import { ECProductCommentStatus } from '@rahino/database/models/ecommerce-eav/ec-comment-status.entity'; +import { ECProduct } from '@rahino/database/models/ecommerce-eav/ec-product.entity'; +import { ECProductCommentFactor } from '@rahino/database/models/ecommerce-eav/ec-product-comment-factor.entity'; +import { ECEntityTypeFactor } from '@rahino/database/models/ecommerce-eav/ec-entitytype-factor.entity'; + +@Injectable() +export class CommentService { + constructor( + @InjectModel(ECProductComment) private repository: typeof ECProductComment, + ) {} + + async findAll(user: User, filter: ListFilter) { + let builder = new QueryOptionsBuilder() + .filter( + Sequelize.where( + Sequelize.fn( + 'isnull', + Sequelize.col('ECProductComment.isDeleted'), + 0, + ), + { + [Op.eq]: 0, + }, + ), + ) + .filter({ statusId: ProductCommentStatusEnum.confirm }) + .filter({ userId: user.id }); + + const count = await this.repository.count(builder.build()); + + builder = builder + .attributes([ + 'id', + 'description', + 'statusId', + 'userId', + 'replyId', + 'createdAt', + 'updatedAt', + ]) + .include([ + { + attributes: ['id', 'name'], + model: ECProductCommentStatus, + as: 'status', + required: false, + }, + { + attributes: ['id', 'title', 'sku', 'slug'], + model: ECProduct, + as: 'product', + required: false, + }, + { + attributes: ['id', 'firstname', 'lastname'], + model: User, + as: 'user', + required: false, + }, + { + attributes: ['id', 'commentId', 'entityId', 'factorId', 'score'], + model: ECProductCommentFactor, + as: 'commentFactors', + required: false, + include: [ + { + attributes: ['id', 'name'], + model: ECEntityTypeFactor, + as: 'factor', + required: false, + }, + ], + }, + ]) + .offset(filter.offset) + .limit(filter.limit) + .order({ orderBy: filter.orderBy, sortOrder: filter.sortOrder }); + + const result = await this.repository.findAll(builder.build()); + return { + result: result, + total: count, + }; + } +}