characterHandlers.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  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. async function readCharacter(id, callback) {
  9. await characterHandler({
  10. callback,
  11. id,
  12. query: ({ id }) => prisma.character.findUnique({ where: { id } })
  13. })
  14. }
  15. async function listCharacters(callback) {
  16. await characterHandler({
  17. callback,
  18. query: () =>
  19. prisma.character.findMany({ orderBy: [{ createdAt: "asc" }] })
  20. })
  21. }
  22. async function deleteCharacter(id, callback) {
  23. await characterHandler({
  24. callback,
  25. permissions: ["delete"],
  26. id,
  27. mutator: (rawResult) => _pick(rawResult, ["id"]),
  28. query: ({ id }) => prisma.character.delete({ where: { id } })
  29. })
  30. socket.broadcast.emit("character:delete", id)
  31. }
  32. async function createCharacter(payload, callback) {
  33. const character = await characterHandler({
  34. callback,
  35. permissions: ["create"],
  36. data: addPlainTextFields(payload),
  37. validator: createCharacterSchema.parse,
  38. query: ({ data }) => prisma.character.create({ data })
  39. })
  40. socket.broadcast.emit("character:create", character)
  41. }
  42. async function updateCharacter(id, payload, callback) {
  43. const character = await characterHandler({
  44. callback,
  45. permissions: ["update"],
  46. id,
  47. data: addPlainTextFields(payload),
  48. validator: updateCharacterSchema.parse,
  49. query: ({ id, data }) => prisma.character.update({ where: { id }, data })
  50. })
  51. socket.broadcast.emit("character:update", character)
  52. }
  53. async function fetchCharacterOptions(callback) {
  54. const columns = _keys(categoryFields)
  55. const fetchColumnOptions = async (column) => {
  56. return prisma.character.groupBy({
  57. by: column,
  58. where: { [column]: { not: "" } },
  59. orderBy: { [column]: "asc" }
  60. })
  61. }
  62. await characterHandler({
  63. callback,
  64. query: () =>
  65. Promise.all(_map(columns, (column) => fetchColumnOptions(column))),
  66. mutator: (rawResult) =>
  67. _zipObject(
  68. columns,
  69. _map(rawResult, (group) => _flatMap(group, _values))
  70. )
  71. })
  72. }
  73. async function characterHandler(options) {
  74. const defaultOptions = {
  75. user: socket.data?.user,
  76. resource: "character",
  77. idValidator: characterSchema.shape.id.parse
  78. }
  79. function typenameMutator(rawResult) {
  80. if (_isPlainObject(rawResult) && _has(rawResult, "id")) {
  81. _set(rawResult, "__typename", "character")
  82. } else if (_isArray(rawResult)) {
  83. _forEach(rawResult, (entry) =>
  84. _set(entry, "__typename", "character")
  85. )
  86. }
  87. return rawResult
  88. }
  89. let mutator
  90. if (_has(options, "mutator")) {
  91. mutator = _flow([options.mutator, typenameMutator])
  92. _unset(options, "mutator")
  93. } else {
  94. mutator = typenameMutator
  95. }
  96. return await executeQuery({ ...defaultOptions, ...options, mutator })
  97. }
  98. }