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

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}`)
}
}