【问题标题】:Next JS with Prisma - Update User Based RolesNext JS with Prisma - 更新基于用户的角色
【发布时间】:2021-11-02 00:10:45
【问题描述】:

我对 Next.js 和 Prisma 都很陌生。我正在开发一个管理市议会的应用程序,因此,该应用程序的管理员可以创建用户和角色并将角色分配给用户(即市议会员工)。

每个用户可以接收多个角色,并且这些角色可以更新,也就是说,管理员可以根据需要删除或分配更多角色给用户。

在我的数据库模式中,我有表 Customer(又名 user,因为 user 是 postgresql 中的保留名称)、表 Role 和表 Customer_role 表示用户和他的关系 n:m角色。

使用 prisma 更新用户角色的最佳方式是什么?我现在就是这样做的:

const updateUser = async (req: NextApiRequest, res: NextApiResponse) => {
  const {
    query: { id },
    body: { name, email, roles },
  } = req as { query: { [key: string]: string }; body: any };

  try {
    await prisma.customer.update({
      where: { id },
      data: { name, email },
    });
    await updateUserRoles(id, roles);
    const response = await prisma.customer.findUnique({
      where: { id: id },
      include: {
        customer_roles: {
          select: {
            role: {
              select: {
                id: true,
                name: true,
              },
            },
          },
        },
      },
    });
    res.status(200).json(response);
  } catch (error) {
    res.status(400).json((error as Error).message);
  }
};

const updateUserRoles = async (userID: string, roles: { id: string }[]) => {
  try {
    await prisma.customer_role.deleteMany({
      where: {
        customer_id: userID,
      },
    });
    roles.map(async (role: { id: string }) => {
      await prisma.customer_role.create({
        data: {
          customer_id: userID,
          role_id: role.id,
        },
      });
    });
  } catch (error) {
    throw new Error(error);
  }
};

最初,我收到了一组我想分配给用户的角色,但是当我想更新它们时,我删除了所有当前用户角色,然后重新分配它们。这会产生一个错误,因为应该返回现在更新的用户及其新角色的响应对象没有等待函数updateUserRoles,而是将用户角色作为空数组返回。只有当我刷新页面并再次获得用户时,这个错误才会得到修复。这是我的棱镜架构。

model role {
  id                  String          @id @default(uuid())
  @db.Uuid
  name                String          @db.VarChar(255)
  polls               permission
  news                permission
  events              permission
  work_orders         permission
  pharmacies          permission
  points_of_interest  permission
  subscription_events permission
  customer_roles      customer_role[]
  created_at          DateTime        @default(now()) @db.Timestamptz(6)
  updated_at          DateTime?       @default(now()) @db.Timestamptz(6)

  @@index([name], name: "idx_role_name")
}

model customer_role {
  id          String   @id @default(uuid()) @db.Uuid
  customer_id String   @db.Uuid
  role_id     String   @unique @db.Uuid
  customer    customer @relation(fields: [customer_id], references: [id], onDelete: Cascade)
  role        role     @relation(fields: [role_id], references: [id])
}

model customer {
  id              String           @id @default(uuid()) @db.Uuid
  name            String           @db.VarChar(255)
  email           String           @unique @db.VarChar(255)
  external_uuid   String?          @unique @db.Uuid
  password        String?          @db.VarChar(255)
  created_at      DateTime         @default(now()) @db.Timestamptz(6)
  updated_at      DateTime?        @default(now()) @db.Timestamptz(6)
  work_order_user work_order_user?
  customer_roles  customer_role[]

  @@index([name], name: "idx_customer_name")
  @@index([external_uuid], name: "idx_customer_external_uuid")
}

【问题讨论】:

    标签: reactjs rest next.js prisma


    【解决方案1】:

    您没有看到更新的角色的原因是因为您在 map 内的 updateUserRoles 函数下使用了 async。这将异步运行,您将无法获得所需的响应,因为这将在后台运行。

    更好的方法是使用upsert:

    const updateUserRoles = async (userID: string, roles: { id: string }[]) => {
      try {
        await prisma.$transaction(
        roles.map((role) =>
          prisma.customer_role.upsert({
            where: { id: role.id },
            create: { customer_id: userId, role_id: role.id },
            update: {},
          })
        )
      )
      } catch (error) {
        throw new Error(error);
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2022-01-04
      • 2014-02-13
      • 1970-01-01
      • 2023-01-15
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多