UNPKG

@curvenote/cli

Version:
135 lines (134 loc) 4.56 kB
import { projectFromDTO, blockFromDTO, versionFromDTO, userFromDTO, myUserFromDTO, teamFromDTO, siteConfigFromDTO, } from '@curvenote/blocks'; import { selectors } from './store/index.js'; import { users, teams, blocks, projects, siteconfigs, versions, templates, } from './store/api/index.js'; import { versionIdToURL } from './utils/index.js'; /** Base class for API models */ class BaseTransfer { modelKind = ''; session; id; $data; $fromDTO = () => { throw new Error('Must be set in base class'); }; $createUrl = () => { throw new Error('Must be set in base class'); }; $selector; $receive; constructor(session, id) { this.id = id; this.session = session; } get data() { if (this.$data) return this.$data; throw new Error(`${this.modelKind}: Must call "get" first`); } set data(data) { this.id = data.id; this.$data = this.$fromDTO(data.id, data); if (this.$receive) this.session.store.dispatch(this.$receive(data)); } async get(query) { const url = this.$createUrl(); const state = this.session.store.getState(); const fromSession = this.$selector?.(state, this.id); if (fromSession) { this.session.log.debug(`Loading ${this.modelKind} from cache: "${url}"`); this.data = fromSession; return this; } this.session.log.debug(`Fetching ${this.modelKind}: "${url}"`); const { ok, json } = await this.session.get(url, query); if (!ok) { if ('message' in json) { console.log('mode.get throw 1'); throw new Error(`${this.modelKind}: (${url}) ${json.message}`); } console.log('mode.get throw 2'); throw new Error(`${this.modelKind}: Not found (${url}) or you do not have access.`); } this.data = json; return this; } } export class MyUser extends BaseTransfer { constructor(session) { super(session, ''); } modelKind = 'User'; $fromDTO = myUserFromDTO; $createUrl = () => { let audience = this.session.activeTokens.session?.decoded?.aud; if (audience && !audience?.endsWith('/')) audience = audience.replace(/\/$/, ''); return `${audience}/my/user`; }; $receive = users.actions.receive; } export class User extends BaseTransfer { modelKind = 'User'; $fromDTO = userFromDTO; $createUrl = () => { return `${this.session.config.editorApiUrl}/users/${this.id}`; }; $receive = users.actions.receive; $selector = selectors.selectUser; } export class Team extends BaseTransfer { modelKind = 'Team'; $fromDTO = teamFromDTO; $createUrl = () => { return `${this.session.config.editorApiUrl}/teams/${this.id}`; }; $receive = teams.actions.receive; $selector = selectors.selectTeam; } export class Project extends BaseTransfer { modelKind = 'Project'; $fromDTO = projectFromDTO; $createUrl = () => { return `${this.session.config.editorApiUrl}/projects/${this.id}`; }; $receive = projects.actions.receive; $selector = selectors.selectProject; } export class RemoteSiteConfig extends BaseTransfer { modelKind = 'SiteConfig'; $fromDTO = siteConfigFromDTO; $createUrl = () => { return `${this.session.config.editorApiUrl}/sites/${this.id}`; }; $receive = siteconfigs.actions.receive; $selector = selectors.selectSiteConfig; } export class Block extends BaseTransfer { modelKind = 'Block'; $fromDTO = blockFromDTO; $createUrl = () => { return `${this.session.config.editorApiUrl}/blocks/${this.id.project}/${this.id.block}`; }; $receive = blocks.actions.receive; $selector = selectors.selectBlock; } export class Version extends BaseTransfer { modelKind = 'Version'; $fromDTO = versionFromDTO; $createUrl = () => { return `${this.session.config.editorApiUrl}${versionIdToURL(this.id)}`; }; $receive = versions.actions.receive; $selector = selectors.selectVersion; } export class Template extends BaseTransfer { modelKind = 'Template'; // TODO better unpacking and defaults on the dto contents $fromDTO = (id, json) => ({ id, ...json }); $createUrl = () => { return `${this.session.config.editorApiUrl}/templates/${this.id}`; }; $receive = templates.actions.receive; $selector = selectors.selectTemplate; }