characterHandlers.js 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. export function characterHandlers(_io, socket) {
  2. socket.on("character:read", readCharacter)
  3. socket.on("character:list", listCharacters)
  4. socket.on("character:delete", deleteCharacter)
  5. socket.on("character:create", createCharacter)
  6. socket.on("character:update", updateCharacter)
  7. socket.on("character:options", fetchCharacterOptions)
  8. const characterHandlerOptions = {
  9. user: socket.data?.user,
  10. resource: "character",
  11. idValidator: characterSchema.shape.id.parse
  12. }
  13. async function readCharacter(id, callback) {
  14. await characterHandler({
  15. callback,
  16. id,
  17. query: ({ id }) => prisma.character.findUnique({ where: { id } })
  18. })
  19. }
  20. async function listCharacters(callback) {
  21. await characterHandler({
  22. callback,
  23. query: () =>
  24. prisma.character.findMany({ orderBy: [{ createdAt: "asc" }] })
  25. })
  26. }
  27. async function deleteCharacter(id, callback) {
  28. await characterHandler({
  29. callback,
  30. permissions: ["delete"],
  31. id,
  32. mutator: (rawResult) => _pick(rawResult, ["id"]),
  33. query: ({ id }) => prisma.character.delete({ where: { id } })
  34. })
  35. socket.broadcast.emit("character:delete", id)
  36. }
  37. async function createCharacter(payload, callback) {
  38. const character = await characterHandler({
  39. callback,
  40. permissions: ["create"],
  41. data: withPlainTextFields(payload),
  42. validator: createCharacterSchema.parse,
  43. query: ({ data }) => prisma.character.create({ data })
  44. })
  45. socket.broadcast.emit("character:create", character)
  46. }
  47. async function updateCharacter(id, payload, callback) {
  48. const character = await characterHandler({
  49. callback,
  50. permissions: ["update"],
  51. id,
  52. data: withPlainTextFields(payload),
  53. validator: updateCharacterSchema.parse,
  54. query: ({ id, data }) => prisma.character.update({ where: { id }, data })
  55. })
  56. socket.broadcast.emit("character:update", character)
  57. }
  58. async function fetchCharacterOptions(callback) {
  59. const columns = _keys(categoryFields)
  60. const fetchColumnOptions = async (column) => {
  61. return prisma.character.groupBy({
  62. by: column,
  63. where: { [column]: { not: "" } },
  64. orderBy: { [column]: "asc" }
  65. })
  66. }
  67. await characterHandler({
  68. callback,
  69. query: () => Promise.all(_map(columns, (column) => fetchColumnOptions(column))),
  70. mutator: (rawResult) =>
  71. _zipObject(
  72. columns,
  73. _map(rawResult, (group) => _flatMap(group, _values))
  74. )
  75. })
  76. }
  77. async function characterHandler(options) {
  78. return await executeQuery({ ...characterHandlerOptions, ...options })
  79. }
  80. }