userHandlers.js 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. export function userHandlers(_io, socket) {
  2. socket.on("user:read", readUser)
  3. socket.on("user:list", listUsers)
  4. socket.on("user:delete", deleteUser)
  5. socket.on("user:create", createUser)
  6. socket.on("user:update", updateUser)
  7. async function readUser(id, callback) {
  8. await userHandler({
  9. callback,
  10. id,
  11. query: ({ id }) =>
  12. prisma.user.findUnique({
  13. omit: { banned: true, banReason: true, banExpires: true },
  14. where: { id }
  15. })
  16. })
  17. }
  18. async function listUsers(callback) {
  19. await userHandler({
  20. callback,
  21. query: () =>
  22. prisma.user.findMany({
  23. omit: { banned: true, banReason: true, banExpires: true },
  24. orderBy: [{ createdAt: "asc" }]
  25. })
  26. })
  27. }
  28. async function deleteUser(id, callback) {
  29. await userHandler({
  30. callback,
  31. permissions: ["delete"],
  32. id,
  33. mutator: (rawResult) => _pick(rawResult, ["id"]),
  34. query: ({ id }) => prisma.user.delete({ where: { id } })
  35. })
  36. }
  37. async function createUser(data, callback) {
  38. await userHandler({
  39. callback,
  40. permissions: ["create"],
  41. data,
  42. validator: createUserSchema.parse,
  43. query: ({ data }) =>
  44. serverAuth().api.createUser({
  45. body: {
  46. ..._omit(data, "username"),
  47. data: { username: data.username }
  48. }
  49. })
  50. })
  51. }
  52. async function updateUser(id, data, callback) {
  53. await userHandler({
  54. callback,
  55. permissions: ["update"],
  56. id,
  57. data,
  58. validator: updateUserSchema.parse,
  59. query: ({ id, data }) => prisma.user.update({ where: { id }, data })
  60. })
  61. }
  62. async function userHandler(options) {
  63. const defaultOptions = {
  64. user: socket.data?.user,
  65. resource: "user",
  66. idValidator: userSchema.shape.id.parse
  67. }
  68. const typenameMutator = injectTypename("user")
  69. let mutator
  70. if (_has(options, "mutator")) {
  71. mutator = _flow([options.mutator, typenameMutator])
  72. _unset(options, "mutator")
  73. } else {
  74. mutator = typenameMutator
  75. }
  76. return await executeQuery({ ...defaultOptions, ...options, mutator })
  77. }
  78. }