2026-04-11 14:47:05 +03:30
|
|
|
import { BusinessRole, ComplexRole, POSRole } from '@/generated/prisma/enums'
|
|
|
|
|
import { PrismaPromise } from '@/generated/prisma/internal/prismaNamespace'
|
2026-03-16 17:56:51 +03:30
|
|
|
import { PrismaService } from '@/prisma/prisma.service'
|
2026-04-11 14:47:05 +03:30
|
|
|
import { ForbiddenException, Injectable, NotFoundException } from '@nestjs/common'
|
2026-03-16 17:56:51 +03:30
|
|
|
import { ResponseMapper } from 'common/response/response-mapper'
|
2026-04-11 14:47:05 +03:30
|
|
|
import { UpdatePermissionDto } from './dto/permission.dto'
|
2026-03-16 17:56:51 +03:30
|
|
|
|
|
|
|
|
@Injectable()
|
|
|
|
|
export class AccountsService {
|
|
|
|
|
constructor(private readonly prisma: PrismaService) {}
|
|
|
|
|
|
2026-04-11 14:47:05 +03:30
|
|
|
async findAll(consumer_id: string, account_id: string) {
|
|
|
|
|
let data: any = []
|
|
|
|
|
|
|
|
|
|
const businesses = [] as any
|
|
|
|
|
const complexes = [] as any
|
|
|
|
|
let poses = [] as any
|
|
|
|
|
|
|
|
|
|
const consumerAccount = await this.prisma.consumerAccount.findUniqueOrThrow({
|
2026-03-16 17:56:51 +03:30
|
|
|
where: {
|
2026-04-11 14:47:05 +03:30
|
|
|
id: account_id,
|
|
|
|
|
consumer_id,
|
2026-03-16 17:56:51 +03:30
|
|
|
},
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
2026-04-11 14:47:05 +03:30
|
|
|
role: true,
|
2026-03-16 17:56:51 +03:30
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
2026-04-11 14:47:05 +03:30
|
|
|
const role = consumerAccount?.role
|
|
|
|
|
|
|
|
|
|
if (!role) {
|
|
|
|
|
return new NotFoundException('کاربر مورد نظر شما یافت نشد.')
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (role === 'MANAGER') {
|
|
|
|
|
return ResponseMapper.list(data)
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-16 17:56:51 +03:30
|
|
|
const permissions = await this.prisma.permissionConsumer.findMany({
|
|
|
|
|
where: {
|
2026-04-11 14:47:05 +03:30
|
|
|
consumer_account: {
|
|
|
|
|
id: account_id,
|
|
|
|
|
},
|
2026-03-16 17:56:51 +03:30
|
|
|
},
|
|
|
|
|
select: {
|
2026-04-11 14:47:05 +03:30
|
|
|
pos_permissions: {
|
2026-03-16 17:56:51 +03:30
|
|
|
select: {
|
|
|
|
|
pos_id: true,
|
|
|
|
|
role: true,
|
|
|
|
|
},
|
|
|
|
|
},
|
2026-04-11 14:47:05 +03:30
|
|
|
business_permissions: {
|
2026-03-16 17:56:51 +03:30
|
|
|
select: {
|
|
|
|
|
business_id: true,
|
|
|
|
|
role: true,
|
|
|
|
|
},
|
|
|
|
|
},
|
2026-04-11 14:47:05 +03:30
|
|
|
complex_permissions: {
|
2026-03-16 17:56:51 +03:30
|
|
|
select: {
|
|
|
|
|
complex_id: true,
|
|
|
|
|
role: true,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
2026-04-11 14:47:05 +03:30
|
|
|
const posList = await this.prisma.pos.findMany({
|
|
|
|
|
where: {
|
|
|
|
|
complex: {
|
|
|
|
|
business_activity: {
|
|
|
|
|
consumer: {
|
|
|
|
|
consumer_accounts: {
|
|
|
|
|
some: {
|
|
|
|
|
id: account_id,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
name: true,
|
|
|
|
|
complex: {
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
name: true,
|
|
|
|
|
business_activity: {
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
name: true,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (role === 'OPERATOR') {
|
|
|
|
|
poses = posList?.map(pos => ({
|
|
|
|
|
...pos,
|
|
|
|
|
hasAccess: permissions.some(permission =>
|
|
|
|
|
permission.pos_permissions.some(
|
|
|
|
|
posPermission => posPermission.pos_id === pos.id,
|
|
|
|
|
),
|
|
|
|
|
),
|
|
|
|
|
}))
|
|
|
|
|
|
|
|
|
|
return ResponseMapper.single({ poses })
|
|
|
|
|
} else {
|
|
|
|
|
const businessActivities = await this.prisma.businessActivity.findMany({
|
|
|
|
|
where: {
|
|
|
|
|
consumer: {
|
|
|
|
|
consumer_accounts: {
|
|
|
|
|
some: {
|
|
|
|
|
account_id,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
name: true,
|
|
|
|
|
complexes: {
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
name: true,
|
|
|
|
|
pos_list: {
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
name: true,
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
},
|
2026-03-16 17:56:51 +03:30
|
|
|
})
|
|
|
|
|
|
2026-04-11 14:47:05 +03:30
|
|
|
businessActivities.forEach(businessActivity => {
|
|
|
|
|
businesses.push({
|
|
|
|
|
id: businessActivity.id,
|
|
|
|
|
name: businessActivity.name,
|
2026-03-16 17:56:51 +03:30
|
|
|
hasAccess: false,
|
|
|
|
|
role: null,
|
|
|
|
|
})
|
|
|
|
|
|
2026-04-11 14:47:05 +03:30
|
|
|
businessActivity.complexes.forEach(complex => {
|
|
|
|
|
complexes.push({
|
|
|
|
|
id: complex.id,
|
|
|
|
|
name: complex.name,
|
2026-03-16 17:56:51 +03:30
|
|
|
hasAccess: false,
|
|
|
|
|
role: null,
|
|
|
|
|
})
|
|
|
|
|
|
2026-04-11 14:47:05 +03:30
|
|
|
complex.pos_list.forEach(pos => {
|
|
|
|
|
poses.push({
|
|
|
|
|
id: pos.id,
|
|
|
|
|
name: pos.name,
|
|
|
|
|
hasAccess: false,
|
|
|
|
|
role: null,
|
|
|
|
|
})
|
|
|
|
|
})
|
2026-03-16 17:56:51 +03:30
|
|
|
})
|
|
|
|
|
})
|
2026-04-11 14:47:05 +03:30
|
|
|
|
|
|
|
|
return ResponseMapper.single({ businessActivities, complexes })
|
|
|
|
|
}
|
2026-03-16 17:56:51 +03:30
|
|
|
}
|
|
|
|
|
|
2026-04-11 14:47:05 +03:30
|
|
|
async create(consumer_id: string, account_id: string, data: UpdatePermissionDto) {
|
|
|
|
|
const consumerAccount = await this.prisma.consumerAccount.findUniqueOrThrow({
|
|
|
|
|
where: {
|
|
|
|
|
id: account_id,
|
|
|
|
|
consumer_id,
|
|
|
|
|
},
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
role: true,
|
|
|
|
|
},
|
2026-03-16 17:56:51 +03:30
|
|
|
})
|
|
|
|
|
|
2026-04-11 14:47:05 +03:30
|
|
|
const role = consumerAccount?.role
|
|
|
|
|
|
|
|
|
|
if (!role) {
|
|
|
|
|
return new NotFoundException('کاربر مورد نظر شما یافت نشد.')
|
|
|
|
|
}
|
|
|
|
|
if (role === 'MANAGER') {
|
|
|
|
|
return new ForbiddenException(
|
|
|
|
|
'این امکان برای کاربران با سطح دسترسی مدیر اصلی وجود ندارد.',
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const existingPermissionConsumer = await this.prisma.permissionConsumer.findUnique({
|
|
|
|
|
where: {
|
|
|
|
|
consumer_account_id: account_id,
|
|
|
|
|
},
|
|
|
|
|
select: {
|
|
|
|
|
id: true,
|
|
|
|
|
},
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
if (!existingPermissionConsumer) {
|
|
|
|
|
throw new NotFoundException(``)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const permissionConsumerId = existingPermissionConsumer.id
|
|
|
|
|
await this.prisma.$transaction(async tx => {
|
|
|
|
|
await tx.permissionPos.deleteMany({
|
|
|
|
|
where: { permission_id: permissionConsumerId },
|
|
|
|
|
})
|
|
|
|
|
await tx.permissionComplex.deleteMany({
|
|
|
|
|
where: { permission_id: permissionConsumerId },
|
|
|
|
|
})
|
|
|
|
|
await tx.permissionBusiness.deleteMany({
|
|
|
|
|
where: { permission_id: permissionConsumerId },
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
const createOperations: PrismaPromise<any>[] = []
|
|
|
|
|
|
|
|
|
|
if (data.poses && data.poses.length > 0) {
|
|
|
|
|
data.poses.forEach(posId => {
|
|
|
|
|
createOperations.push(
|
|
|
|
|
tx.permissionPos.create({
|
|
|
|
|
data: {
|
|
|
|
|
role: POSRole.OPERATOR,
|
|
|
|
|
permission: { connect: { id: permissionConsumerId } },
|
|
|
|
|
pos: { connect: { id: posId } },
|
|
|
|
|
},
|
|
|
|
|
}),
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (data.complexes && data.complexes.length > 0) {
|
|
|
|
|
data.complexes.forEach(complexId => {
|
|
|
|
|
createOperations.push(
|
|
|
|
|
tx.permissionComplex.create({
|
|
|
|
|
data: {
|
|
|
|
|
role: ComplexRole.OPERATOR,
|
|
|
|
|
permission: { connect: { id: permissionConsumerId } },
|
|
|
|
|
complex: { connect: { id: complexId } },
|
|
|
|
|
},
|
|
|
|
|
}),
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (data.business_activities && data.business_activities.length > 0) {
|
|
|
|
|
data.business_activities.forEach(businessId => {
|
|
|
|
|
createOperations.push(
|
|
|
|
|
tx.permissionBusiness.create({
|
|
|
|
|
data: {
|
|
|
|
|
role: BusinessRole.OPERATOR,
|
|
|
|
|
permission: { connect: { id: permissionConsumerId } },
|
|
|
|
|
business: { connect: { id: businessId } },
|
|
|
|
|
},
|
|
|
|
|
}),
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (createOperations.length > 0) {
|
|
|
|
|
await Promise.all(createOperations)
|
|
|
|
|
}
|
|
|
|
|
})
|
2026-03-16 17:56:51 +03:30
|
|
|
return ResponseMapper.create({})
|
|
|
|
|
}
|
|
|
|
|
}
|