Skip to content

Commit

Permalink
second amendment of discountcoffe project
Browse files Browse the repository at this point in the history
  • Loading branch information
bahram1249 committed Mar 9, 2024
1 parent 18b5f30 commit 9ff0d23
Show file tree
Hide file tree
Showing 33 changed files with 648 additions and 11 deletions.
1 change: 1 addition & 0 deletions apps/core-dashboard/src/login/login.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { PermissionMenu } from '@rahino/database/models/core/permission-menu.ent
Role,
RolePermission,
PermissionMenu,
Menu,
]),
],
controllers: [LoginController],
Expand Down
83 changes: 82 additions & 1 deletion apps/core-dashboard/src/login/login.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,24 @@ import { User } from '@rahino/database/models/core/user.entity';
import { loginDto } from './dto';
import { Request, Response } from 'express';
import { AuthService } from '@rahino/core/auth/auth.service';
import { Role } from '@rahino/database/models/core/role.entity';
import { PermissionGroup } from '@rahino/database/models/core/permissionGroup.entity';
import { RolePermission } from '@rahino/database/models/core/rolePermission.entity';
import { PermissionMenu } from '@rahino/database/models/core/permission-menu.entity';
import { Menu } from '@rahino/database/models/core/menu.entity';
import { Op, Sequelize } from 'sequelize';

@Injectable()
export class LoginService {
constructor(
@InjectModel(User)
private readonly repository: typeof User,
@InjectModel(RolePermission)
private readonly rolePermissionRepository: typeof RolePermission,
@InjectModel(PermissionMenu)
private readonly permissionMenuRepository: typeof PermissionMenu,
@InjectModel(Menu)
private readonly menuRepository: typeof Menu,
private authService: AuthService,
private jwt: JwtService,
private config: ConfigService,
Expand All @@ -26,6 +38,12 @@ export class LoginService {
where: {
username: dto.username,
},
include: [
{
model: Role,
as: 'roles',
},
],
});
if (!user) {
return res.render('login/index', {
Expand All @@ -44,8 +62,71 @@ export class LoginService {
const access = await this.authService.signToken(user);
const oneMonth = 31 * 24 * 3600 * 1000;
const options: any = {};

let menus: Menu[] = [];
const roleIds: number[] = user.roles.map((role) => role.id);
const rolePermissions = await this.rolePermissionRepository.findAll({
where: {
roleId: {
[Op.in]: roleIds,
},
},
});
const permissionIds = rolePermissions.map(
(rolePermission) => rolePermission.permissionId,
);
const permissionMenus = await this.permissionMenuRepository.findAll({
where: {
permissionId: {
[Op.in]: permissionIds,
},
},
});
const menuIds = permissionMenus.map(
(permissionMenu) => permissionMenu.menuId,
);
menus = await this.menuRepository.findAll({
where: {
[Op.and]: [
{
id: {
[Op.in]: menuIds,
},
},
{
parentMenuId: {
[Op.is]: null,
},
},
Sequelize.where(
Sequelize.fn('isnull', Sequelize.col('subMenus.visibility'), 1),
{
[Op.eq]: 1,
},
),
],
},
include: [
{
model: Menu,
as: 'subMenus',
required: false,
where: {
id: {
[Op.in]: menuIds,
},
},
},
],
});

let url = '/core/admin/roles';
if (menus.length > 0 && menus[0].subMenus.length > 0) {
url = menus[0].subMenus[0].url;
}

if (req.body.isRemember) options.expires = new Date(Date.now() + oneMonth);
res.cookie('token', access.access_token, options);
return res.redirect(302, '/core/admin/roles');
return res.redirect(302, url);
}
}
1 change: 1 addition & 0 deletions apps/discount-coffe/src/api/admin/qrscan/dto/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './qrscan.dto';
14 changes: 14 additions & 0 deletions apps/discount-coffe/src/api/admin/qrscan/dto/qrscan.dto.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { IsNotEmpty, MaxLength, MinLength } from 'class-validator';

export class QrScanDto {
@MinLength(3, {
message: 'حداقل کد رزرو میبایست 3 کاراکتر باشد',
})
@MaxLength(256, {
message: 'حداکثر کد رزرو میبایست 256 کاراکتر باشد',
})
@IsNotEmpty({
message: 'کد رزرو نمیتواند خالی باشد',
})
reserveId: string;
}
40 changes: 40 additions & 0 deletions apps/discount-coffe/src/api/admin/qrscan/qrscan.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import {
Body,
Controller,
HttpCode,
HttpStatus,
Post,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { CheckPermission } from '@rahino/permission-checker/decorator';
import { PermissionGuard } from '@rahino/permission-checker/guard';
import { JsonResponseTransformInterceptor } from '@rahino/response/interceptor';
import { ApiBearerAuth, ApiOperation, ApiTags } from '@nestjs/swagger';
import { JwtGuard } from '@rahino/auth/guard';
import { GetUser } from '@rahino/auth/decorator';
import { User } from '@rahino/database/models/core/user.entity';
import { QrScanDto } from './dto';
import { QrScanService } from './qrscan.service';

@ApiTags('DiscountCoffe-QRScan')
@ApiBearerAuth()
@UseGuards(JwtGuard, PermissionGuard)
@UseInterceptors(JsonResponseTransformInterceptor)
@Controller({
path: '/api/discountcoffe/admin/qrscans',
version: ['1'],
})
export class QrScanController {
constructor(private service: QrScanService) {}

@ApiOperation({ description: 'confirm reserve' })
@CheckPermission({
permissionSymbol: 'discountcoffe.admin.qrscan.showmenu',
})
@Post('/')
@HttpCode(HttpStatus.CREATED)
async confirmReserve(@GetUser() user: User, @Body() dto: QrScanDto) {
return await this.service.confirmReserve(user, dto);
}
}
17 changes: 17 additions & 0 deletions apps/discount-coffe/src/api/admin/qrscan/qrscan.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
import { Module } from '@nestjs/common';
import { QrScanController } from './qrscan.controller';
import { QrScanService } from './qrscan.service';
import { SequelizeModule } from '@nestjs/sequelize';
import { User } from '@rahino/database/models/core/user.entity';
import { Permission } from '@rahino/database/models/core/permission.entity';
import { BuffetReserve } from '@rahino/database/models/discount-coffe/buffet-reserve.entity';
import { Buffet } from '@rahino/database/models/discount-coffe/buffet.entity';

@Module({
imports: [
SequelizeModule.forFeature([User, Permission, BuffetReserve, Buffet]),
],
controllers: [QrScanController],
providers: [QrScanService],
})
export class QrScanApiModule {}
52 changes: 52 additions & 0 deletions apps/discount-coffe/src/api/admin/qrscan/qrscan.service.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
import { BadRequestException, Injectable } from '@nestjs/common';
import { User } from '@rahino/database/models/core/user.entity';
import { QrScanDto } from './dto';
import { InjectModel } from '@nestjs/sequelize';
import { BuffetReserve } from '@rahino/database/models/discount-coffe/buffet-reserve.entity';
import { QueryOptionsBuilder } from '@rahino/query-filter/sequelize-query-builder';
import { Buffet } from '@rahino/database/models/discount-coffe/buffet.entity';
import { Sequelize } from 'sequelize';

@Injectable()
export class QrScanService {
constructor(
@InjectModel(BuffetReserve)
private readonly reserveRepository: typeof BuffetReserve,
@InjectModel(Buffet)
private readonly buffetRepository: typeof Buffet,
) {}

async confirmReserve(user: User, dto: QrScanDto) {
let reserve = await this.reserveRepository.findOne(
new QueryOptionsBuilder().filter({ uniqueCode: dto.reserveId }).build(),
);
if (!reserve) {
throw new BadRequestException('هیچ رزروی یافت نشد');
}
const reserveDate = reserve.reserveDate.setHours(0, 0, 0, 0);
const today = new Date().setHours(0, 0, 0, 0);
if (reserveDate != today) {
throw new BadRequestException('تاریخ رزرو برای امروز نیست');
}
const buffet = await this.buffetRepository.findOne(
new QueryOptionsBuilder()
.filter({ ownerId: user.id })
.filter({ id: reserve.buffetId })
.build(),
);
if (!buffet) {
throw new BadRequestException('رزرو کافه برای شما نیست');
}
reserve = await this.reserveRepository.update(
{
isQrScan: true,
qrScanDate: Sequelize.fn('getdate'),
qrScanBy: user.id,
},
{ where: { id: reserve.id } },
)[1][0];
return {
result: reserve,
};
}
}
1 change: 1 addition & 0 deletions apps/discount-coffe/src/api/admin/reserve/dto/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export * from './reserve-filter.dto';
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import { IntersectionType } from '@nestjs/swagger';
import { ReserveDto } from '@rahino/discountCoffe/controller/admin/reservers/dto';
import { ListFilter } from '@rahino/query-filter';

export class ReserveFilterDto extends IntersectionType(
ListFilter,
ReserveDto,
) {}
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ import {
ApiTags,
} from '@nestjs/swagger';
import { JwtGuard } from '@rahino/auth/guard';
import { ListFilter } from '@rahino/query-filter';
import { GetUser } from '@rahino/auth/decorator';
import { User } from '@rahino/database/models/core/user.entity';
import { ReserveService } from './reserve.service';
import { ReserveFilterDto } from './dto';

@ApiTags('DiscountCoffe-Reserves')
@ApiBearerAuth()
Expand All @@ -41,12 +41,12 @@ export class ReserveController {
@Get('/')
@ApiQuery({
name: 'filter',
type: ListFilter,
type: ReserveFilterDto,
style: 'deepObject',
explode: true,
})
@HttpCode(HttpStatus.OK)
async findAll(@GetUser() user: User, @Query() filter: ListFilter) {
async findAll(@GetUser() user: User, @Query() filter: ReserveFilterDto) {
return await this.service.findAll(user, filter);
}

Expand Down
7 changes: 5 additions & 2 deletions apps/discount-coffe/src/api/admin/reserve/reserve.service.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { Injectable, NotImplementedException } from '@nestjs/common';
import { InjectModel } from '@nestjs/sequelize';
import { Op, Sequelize } from 'sequelize';
import { ListFilter } from '@rahino/query-filter';
import { QueryOptionsBuilder } from '@rahino/query-filter/sequelize-query-builder';
import { User } from '@rahino/database/models/core/user.entity';
import * as _ from 'lodash';
Expand All @@ -12,6 +11,7 @@ import { Attachment } from '@rahino/database/models/core/attachment.entity';
import { PersianDate } from '@rahino/database/models/core/view/persiandate.entity';
import { BuffetReserveDetail } from '@rahino/database/models/discount-coffe/buffet-reserve-detail.entity';
import { BuffetMenu } from '@rahino/database/models/discount-coffe/buffet-menu.entity';
import { ReserveFilterDto } from './dto';

@Injectable()
export class ReserveService {
Expand All @@ -20,7 +20,7 @@ export class ReserveService {
private readonly repository: typeof BuffetReserve,
) {}

async findAll(user: User, filter: ListFilter) {
async findAll(user: User, filter: ReserveFilterDto) {
let builder = new QueryOptionsBuilder();
const reserveComplete = 2;
builder = builder
Expand Down Expand Up @@ -56,6 +56,9 @@ export class ReserveService {
},
})
.filter({ '$[buffet.ownerId]$': user.id });
if (filter.reserveId) {
builder = builder.filter({ id: filter.reserveId });
}
const count = await this.repository.count(builder.build());
const options = builder
.include([
Expand Down
8 changes: 8 additions & 0 deletions apps/discount-coffe/src/api/user/buffet/buffet.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,14 @@ export class BuffetService {
});
}

if (dto.latitude) {
queryBuilder = queryBuilder.filter(
Sequelize.literal(`
dbo.fnCalcDistanceKM(Buffet.latitude, ${dto.latitude},Buffet.longitude, ${dto.longitude}) < 50
`),
);
}

const count = await this.buffetRepository.count(queryBuilder.build());

queryBuilder = queryBuilder
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,10 @@ export class BuffetFilterDto {
)
@IsInt({ each: true })
coffeOptionIds?: number[] = [];

@IsOptional()
latitude?: string;

@IsOptional()
longitude?: string;
}
4 changes: 4 additions & 0 deletions apps/discount-coffe/src/controller/admin/admin.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import { TotalReserveController } from './total-reserve/total-reserve.controller
import { ReserveController } from './reservers/reserve.controller';
import { AdminReportController } from './adminreport/admin-report.controller';
import { CoffeReportController } from './coffereport/coffe-report.controller';
import { QrScanModule } from './qrscan/qrscan.module';
import { QrScanController } from './qrscan/qrscan.controller';

@Module({
imports: [
Expand All @@ -24,6 +26,7 @@ import { CoffeReportController } from './coffereport/coffe-report.controller';
ReserveModule,
AdminReportModule,
CoffeReportModule,
QrScanModule,
],
})
export class AdminModule implements NestModule {
Expand All @@ -38,6 +41,7 @@ export class AdminModule implements NestModule {
ReserveController,
AdminReportController,
CoffeReportController,
QrScanController,
);
}
}
Loading

0 comments on commit 9ff0d23

Please sign in to comment.