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.
 
 
 
 

208 lines
5.1 KiB

const {query} = require("../client")
class Character {
/**
* @param {string} id
* @param {string[]} nicks
* @param {string} author
* @param {string} name
* @param {string} shortName
* @param {string} description
*/
constructor(id, nicks, author, name, shortName, description) {
this.id = id
this.nicks = nicks
this.nick = this.nicks[0] || null
this.author = author
this.name = name
this.shortName = shortName
this.description = description
}
/**
* Create a character object from data.
*/
static fromData(data) {
return new Character(data.id, data.nicks, data.author, data.name, data.shortName, data.description)
}
}
class CharacterHeader {
/**
* @param {string} id
* @param {string} author
* @param {string} name
*/
constructor(id, author, name) {
this.id = id
this.author = author
this.name = name
}
/**
* Create a character object from data.
*/
static fromData(data) {
return new CharacterHeader(data.id, data.author, data.name)
}
}
class ChracterAPI {
/**
* Call `characters(filter)` query
*
* @param {{ids:string[], nicks:string[], names:string[], author:string, search:string, logged:boolean}} filter
* @returns {Promise<Character[]>}
*/
list(filter = {}) {
return query(`
query ListCharacters($filter: CharactersFilter) {
characters(filter: $filter) {
id
nicks
author
name
shortName
description
}
}
`, {filter}).then(({characters}) => {
return characters.map(d => Character.fromData(d))
})
}
/**
* Call `characters(filter)` query
*
* @param {{ids:string[], nicks:string[], names:string[], author:string, search:string, logged:boolean}} filter
* @returns {Promise<CharacterHeader[]>}
*/
listHeaders(filter = {}) {
return query(`
query ListCharacters($filter: CharactersFilter) {
characters(filter: $filter) {
id
name
author
}
}
`, {filter}).then(({characters}) => {
return characters.map(d => CharacterHeader.fromData(d))
})
}
/**
* Call `addCharacter(input)` mutation, returns addable fields.
*
* @param {{id:string, name:string, shortName:string, author:string, description:string}} input
* @returns {Promise<Character>}
*/
add(input) {
return query(`
mutation AddCharacter($input: CharacterAddInput!) {
addCharacter(input: $input) {
id
nicks
author
name
shortName
description
}
}
`, {input}, {permissions: ["member", "character.add"]}).then(({addCharacter}) => {
return Character.fromData(addCharacter)
})
}
/**
* Call `editCharacter(input)` mutation, returns editable fields.
*
* @param {{id:string, name:string, shortName:string, description:string}} input
* @returns {Promise<{id:string, name:string, shortName:string, description:string}>}
*/
edit(input) {
return query(`
mutation EditCharacters($input: CharacterEditInput!) {
editCharacter(input: $input) {
id
name
shortName
description
}
}
`, {input}, {permissions: ["member", "character.edit"]}).then(({editCharacter}) => {
return editCharacter
})
}
/**
* Call `addCharacterNick(input)` mutation, returns new nick list.
*
* @param {{id:string, nick:string}} input
* @returns {Promise<{id:string, nicks:string[]}>}
*/
addNick(input) {
return query(`
mutation AddCharacterNick($input: CharacterNickInput!) {
addCharacterNick(input: $input) {
id
nicks
}
}
`, {input}, {permissions: ["member", "character.edit"]}).then(({addCharacterNick}) => {
return addCharacterNick
})
}
/**
* Call `removeCharacterNick(input)` mutation, returns new nick list.
*
* @param {{id:string, nick:string}} input
* @returns {Promise<{id:string, nicks:string[]}>}
*/
removeNick(input) {
return query(`
mutation RemoveCharacterNick($input: CharacterNickInput!) {
removeCharacterNick(input: $input) {
id
nicks
}
}
`, {input}, {permissions: ["member", "character.edit"]}).then(({removeCharacterNick}) => {
return removeCharacterNick
})
}
/**
* Call `removeCharacter(input)` mutation
*
* @param {{id:string}} input
* @returns {Promise<{id:string}>}
*/
remove(input) {
return query(`
mutation RemoveCharacters($input: CharacterRemoveInput!) {
removeCharacter(input: $input) {
id
}
}
`, {input}, {permissions: ["member", "character.remove"]}).then(({removeCharacter}) => {
return removeCharacter
})
}
unknownNicks(limit = 100) {
return query(`
query UnknownNicks($limit: Int!) {
unknownNicks(filter: {limit: $limit}) {
nick
score
}
}
`, {limit}).then(({unknownNicks}) => {
return unknownNicks
})
}
}
module.exports = { Character, charactersApi: new ChracterAPI }