@curvenote/cli
Version:
CLI Client library for Curvenote
135 lines (134 loc) • 4.56 kB
JavaScript
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;
}