The frontend/UI server, written in JS using the MarkoJS library
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

207 lines
5.1 KiB

6 years ago
  1. const {query} = require("../client")
  2. class Character {
  3. /**
  4. * @param {string} id
  5. * @param {string[]} nicks
  6. * @param {string} author
  7. * @param {string} name
  8. * @param {string} shortName
  9. * @param {string} description
  10. */
  11. constructor(id, nicks, author, name, shortName, description) {
  12. this.id = id
  13. this.nicks = nicks
  14. this.nick = this.nicks[0] || null
  15. this.author = author
  16. this.name = name
  17. this.shortName = shortName
  18. this.description = description
  19. }
  20. /**
  21. * Create a character object from data.
  22. */
  23. static fromData(data) {
  24. return new Character(data.id, data.nicks, data.author, data.name, data.shortName, data.description)
  25. }
  26. }
  27. class CharacterHeader {
  28. /**
  29. * @param {string} id
  30. * @param {string} author
  31. * @param {string} name
  32. */
  33. constructor(id, author, name) {
  34. this.id = id
  35. this.author = author
  36. this.name = name
  37. }
  38. /**
  39. * Create a character object from data.
  40. */
  41. static fromData(data) {
  42. return new CharacterHeader(data.id, data.author, data.name)
  43. }
  44. }
  45. class ChracterAPI {
  46. /**
  47. * Call `characters(filter)` query
  48. *
  49. * @param {{ids:string[], nicks:string[], names:string[], author:string, search:string, logged:boolean}} filter
  50. * @returns {Promise<Character[]>}
  51. */
  52. list(filter = {}) {
  53. return query(`
  54. query ListCharacters($filter: CharactersFilter) {
  55. characters(filter: $filter) {
  56. id
  57. nicks
  58. author
  59. name
  60. shortName
  61. description
  62. }
  63. }
  64. `, {filter}).then(({characters}) => {
  65. return characters.map(d => Character.fromData(d))
  66. })
  67. }
  68. /**
  69. * Call `characters(filter)` query
  70. *
  71. * @param {{ids:string[], nicks:string[], names:string[], author:string, search:string, logged:boolean}} filter
  72. * @returns {Promise<CharacterHeader[]>}
  73. */
  74. listHeaders(filter = {}) {
  75. return query(`
  76. query ListCharacters($filter: CharactersFilter) {
  77. characters(filter: $filter) {
  78. id
  79. name
  80. author
  81. }
  82. }
  83. `, {filter}).then(({characters}) => {
  84. return characters.map(d => CharacterHeader.fromData(d))
  85. })
  86. }
  87. /**
  88. * Call `addCharacter(input)` mutation, returns addable fields.
  89. *
  90. * @param {{id:string, name:string, shortName:string, author:string, description:string}} input
  91. * @returns {Promise<Character>}
  92. */
  93. add(input) {
  94. return query(`
  95. mutation AddCharacter($input: CharacterAddInput!) {
  96. addCharacter(input: $input) {
  97. id
  98. nicks
  99. author
  100. name
  101. shortName
  102. description
  103. }
  104. }
  105. `, {input}, {permissions: ["member", "character.add"]}).then(({addCharacter}) => {
  106. return Character.fromData(addCharacter)
  107. })
  108. }
  109. /**
  110. * Call `editCharacter(input)` mutation, returns editable fields.
  111. *
  112. * @param {{id:string, name:string, shortName:string, description:string}} input
  113. * @returns {Promise<{id:string, name:string, shortName:string, description:string}>}
  114. */
  115. edit(input) {
  116. return query(`
  117. mutation EditCharacters($input: CharacterEditInput!) {
  118. editCharacter(input: $input) {
  119. id
  120. name
  121. shortName
  122. description
  123. }
  124. }
  125. `, {input}, {permissions: ["member", "character.edit"]}).then(({editCharacter}) => {
  126. return editCharacter
  127. })
  128. }
  129. /**
  130. * Call `addCharacterNick(input)` mutation, returns new nick list.
  131. *
  132. * @param {{id:string, nick:string}} input
  133. * @returns {Promise<{id:string, nicks:string[]}>}
  134. */
  135. addNick(input) {
  136. return query(`
  137. mutation AddCharacterNick($input: CharacterNickInput!) {
  138. addCharacterNick(input: $input) {
  139. id
  140. nicks
  141. }
  142. }
  143. `, {input}, {permissions: ["member", "character.edit"]}).then(({addCharacterNick}) => {
  144. return addCharacterNick
  145. })
  146. }
  147. /**
  148. * Call `removeCharacterNick(input)` mutation, returns new nick list.
  149. *
  150. * @param {{id:string, nick:string}} input
  151. * @returns {Promise<{id:string, nicks:string[]}>}
  152. */
  153. removeNick(input) {
  154. return query(`
  155. mutation RemoveCharacterNick($input: CharacterNickInput!) {
  156. removeCharacterNick(input: $input) {
  157. id
  158. nicks
  159. }
  160. }
  161. `, {input}, {permissions: ["member", "character.edit"]}).then(({removeCharacterNick}) => {
  162. return removeCharacterNick
  163. })
  164. }
  165. /**
  166. * Call `removeCharacter(input)` mutation
  167. *
  168. * @param {{id:string}} input
  169. * @returns {Promise<{id:string}>}
  170. */
  171. remove(input) {
  172. return query(`
  173. mutation RemoveCharacters($input: CharacterRemoveInput!) {
  174. removeCharacter(input: $input) {
  175. id
  176. }
  177. }
  178. `, {input}, {permissions: ["member", "character.remove"]}).then(({removeCharacter}) => {
  179. return removeCharacter
  180. })
  181. }
  182. unknownNicks(limit = 100) {
  183. return query(`
  184. query UnknownNicks($limit: Int!) {
  185. unknownNicks(filter: {limit: $limit}) {
  186. nick
  187. score
  188. }
  189. }
  190. `, {limit}).then(({unknownNicks}) => {
  191. return unknownNicks
  192. })
  193. }
  194. }
  195. module.exports = { Character, charactersApi: new ChracterAPI }