Skip to content

Commit

Permalink
add user comment module
Browse files Browse the repository at this point in the history
  • Loading branch information
bahram1249 committed Jul 9, 2024
1 parent fde38b4 commit ebece2f
Show file tree
Hide file tree
Showing 4 changed files with 158 additions and 0 deletions.
2 changes: 2 additions & 0 deletions apps/e-commerce/src/e-commerce.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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: [
Expand Down Expand Up @@ -158,6 +159,7 @@ import { CancellOrderModule } from './admin/cancell-order/cancell-order.module';
PageModule,
DashboardModule,
CancellOrderModule,
UserCommentModule,
],
providers: [
{
Expand Down
48 changes: 48 additions & 0 deletions apps/e-commerce/src/user/comment/comment.controller.ts
Original file line number Diff line number Diff line change
@@ -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);
}
}
14 changes: 14 additions & 0 deletions apps/e-commerce/src/user/comment/comment.module.ts
Original file line number Diff line number Diff line change
@@ -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 {}
94 changes: 94 additions & 0 deletions apps/e-commerce/src/user/comment/comment.service.ts
Original file line number Diff line number Diff line change
@@ -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,
};
}
}

0 comments on commit ebece2f

Please sign in to comment.