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.
123 lines
2.9 KiB
123 lines
2.9 KiB
import {Session} from './service/Session.service.js'
|
|
|
|
export const ResourceActions = Object.freeze({
|
|
create: 'create',
|
|
read: 'read',
|
|
readOne: 'readOne',
|
|
update: 'update',
|
|
delete: 'delete',
|
|
})
|
|
|
|
export class UnsupportedActionError extends Error {
|
|
constructor(key, action) {
|
|
super(`Resource '${key}' does not support action '${action}'.`)
|
|
}
|
|
}
|
|
|
|
export class Resource {
|
|
static async get(key) {
|
|
if ( !this.instances ) {
|
|
this.instances = []
|
|
}
|
|
|
|
if ( !this.instances[name] ) {
|
|
this.instances[key] = new Resource(key)
|
|
await this.instances[key].configure()
|
|
}
|
|
|
|
return this.instances[key]
|
|
}
|
|
|
|
constructor(key) {
|
|
this.key = key
|
|
this.configuration = {
|
|
supportedActions: [],
|
|
}
|
|
}
|
|
|
|
singular() {
|
|
return this.configuration.display.singular
|
|
}
|
|
|
|
plural() {
|
|
return this.configuration.display.plural
|
|
}
|
|
|
|
async configure() {
|
|
this.configuration = await this.json('configure').then(x => x.data)
|
|
}
|
|
|
|
getSupportedActions() {
|
|
return this.configuration.supportedActions
|
|
}
|
|
|
|
supports(action) {
|
|
return this.getSupportedActions().includes(action)
|
|
}
|
|
|
|
checkSupports(action) {
|
|
if ( !this.supports(action) ) {
|
|
throw new UnsupportedActionError(this.key, action)
|
|
}
|
|
}
|
|
|
|
async create(record) {
|
|
return this.json('/', record, 'put').then(x => x.data)
|
|
}
|
|
|
|
async read() {
|
|
this.checkSupports(ResourceActions.read)
|
|
return this.json('/').then(x => x.data.records)
|
|
}
|
|
|
|
async readOne(id) {
|
|
this.checkSupports(ResourceActions.readOne)
|
|
return this.json(`/${id}`).then(x => x.data)
|
|
}
|
|
|
|
async update(id, row) {
|
|
await this.json(`${id}`, row, 'PATCH')
|
|
}
|
|
|
|
async delete(id) {
|
|
await this.json(`${id}`, {}, 'DELETE')
|
|
}
|
|
|
|
async json(endpoint, body = {}, method = 'get') {
|
|
const response = await fetch(
|
|
this.getEndpoint(endpoint),
|
|
{
|
|
method,
|
|
...(method !== 'get' ? {
|
|
headers: {
|
|
Accept: 'application/json',
|
|
'Content-Type': 'application/json',
|
|
},
|
|
body: JSON.stringify(body),
|
|
} : {})
|
|
}
|
|
)
|
|
|
|
if ( !response.ok ) {
|
|
console.error(response)
|
|
throw new Error('Request to endpoint failed: ' + endpoint)
|
|
}
|
|
|
|
const json = await response.json()
|
|
if ( !json.success ) {
|
|
console.error(json)
|
|
throw new Error('Unsuccessful response.')
|
|
}
|
|
|
|
return json
|
|
}
|
|
|
|
getEndpoint(url = '/') {
|
|
if ( !url.startsWith('/') ) {
|
|
url = `/${url}`
|
|
}
|
|
|
|
return Session.get().url(`dash/cobalt/resource/${this.key}${url}`)
|
|
}
|
|
}
|