update models and create consumer domain accounts permissions

This commit is contained in:
2026-04-11 14:47:05 +03:30
parent 89726c8904
commit 9cef733370
87 changed files with 2967 additions and 3352 deletions
@@ -1,25 +1,92 @@
import { BusinessRole, ComplexRole, POSRole } from '@/generated/prisma/enums'
import { PrismaPromise } from '@/generated/prisma/internal/prismaNamespace'
import { PrismaService } from '@/prisma/prisma.service'
import { Injectable } from '@nestjs/common'
import { ForbiddenException, Injectable, NotFoundException } from '@nestjs/common'
import { ResponseMapper } from 'common/response/response-mapper'
import { CreateAccountDto } from './dto/permission.dto'
import { UpdatePermissionDto } from './dto/permission.dto'
@Injectable()
export class AccountsService {
constructor(private readonly prisma: PrismaService) {}
async findAll(userId: string, account_id: string) {
const businessActivities = await this.prisma.businessActivity.findMany({
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({
where: {
user_id: userId,
id: account_id,
consumer_id,
},
select: {
id: true,
role: true,
},
})
const role = consumerAccount?.role
if (!role) {
return new NotFoundException('کاربر مورد نظر شما یافت نشد.')
}
if (role === 'MANAGER') {
return ResponseMapper.list(data)
}
const permissions = await this.prisma.permissionConsumer.findMany({
where: {
consumer_account: {
id: account_id,
},
},
select: {
pos_permissions: {
select: {
pos_id: true,
role: true,
},
},
business_permissions: {
select: {
business_id: true,
role: true,
},
},
complex_permissions: {
select: {
complex_id: true,
role: true,
},
},
},
})
const posList = await this.prisma.pos.findMany({
where: {
complex: {
business_activity: {
consumer: {
consumer_accounts: {
some: {
id: account_id,
},
},
},
},
},
},
select: {
id: true,
name: true,
complexes: {
complex: {
select: {
id: true,
name: true,
pos_list: {
business_activity: {
select: {
id: true,
name: true,
@@ -30,87 +97,173 @@ export class AccountsService {
},
})
const permissions = await this.prisma.permissionConsumer.findMany({
where: {
account_id,
},
select: {
posPermissions: {
select: {
pos_id: true,
role: true,
},
},
businessPermissions: {
select: {
business_id: true,
role: true,
},
},
complexPermissions: {
select: {
complex_id: true,
role: true,
},
},
},
})
if (role === 'OPERATOR') {
poses = posList?.map(pos => ({
...pos,
hasAccess: permissions.some(permission =>
permission.pos_permissions.some(
posPermission => posPermission.pos_id === pos.id,
),
),
}))
const businesses = [] as any
const complexes = [] as any
const poses = [] as any
businessActivities.forEach(businessActivity => {
businesses.push({
id: businessActivity.id,
name: businessActivity.name,
hasAccess: false,
role: null,
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,
},
},
},
},
},
})
businessActivity.complexes.forEach(complex => {
complexes.push({
id: complex.id,
name: complex.name,
businessActivities.forEach(businessActivity => {
businesses.push({
id: businessActivity.id,
name: businessActivity.name,
hasAccess: false,
role: null,
})
complex.pos_list.forEach(pos => {
poses.push({
id: pos.id,
name: pos.name,
businessActivity.complexes.forEach(complex => {
complexes.push({
id: complex.id,
name: complex.name,
hasAccess: false,
role: null,
})
complex.pos_list.forEach(pos => {
poses.push({
id: pos.id,
name: pos.name,
hasAccess: false,
role: null,
})
})
})
})
return ResponseMapper.single({ businessActivities, complexes })
}
}
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,
},
})
permissions.forEach(permission => {
permission.posPermissions.forEach(posPermission => {
poses.map(pos => {
if (pos.id === posPermission.pos_id) {
return {
...pos,
role: posPermission.role,
hasAccess: true,
}
}
return pos
})
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 },
})
})
}
async findOne(id: string) {
const account = await this.prisma.account.findUnique({
where: { id },
})
return ResponseMapper.single(account)
}
const createOperations: PrismaPromise<any>[] = []
async create(userId: string, data: CreateAccountDto) {
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)
}
})
return ResponseMapper.create({})
}
}