@curvenote/cli
Version:
CLI Client library for Curvenote
88 lines (87 loc) • 4.08 kB
JavaScript
import { checkVenueExists, ensureVenue } from '../sites/utils.js';
import { getFromJournals } from '../utils/api.js';
import { exitOnInvalidKeyOption, getMyWorksFromDoi, workKeyFromConfig } from '../works/utils.js';
import { getAllSubmissionsThatICanSeeUsingKey, getSubmissionToUpdate } from './submit.utils.js';
import { patchUpdateSubmissionStatus } from './utils.js';
import { keyFromTransferFile } from './utils.transfer.js';
export function hyphenatedFromDate(date) {
const year = date.getFullYear().toString();
const month = (date.getMonth() + 1).toString().padStart(2, '0');
const day = date.getDate().toString().padStart(2, '0');
return `${year}-${month}-${day}`;
}
async function updateStatus(action, session, venue, opts = {}) {
if (session.isAnon) {
throw new Error('⛔️ You must be authenticated for this command. Use `curvenote token set [token]`');
}
venue = await ensureVenue(session, venue, { action });
await checkVenueExists(session, venue);
// TODO check user scope on this venue! await checkVenueAccess(session, venue);
const doiTrimmed = typeof opts.doi === 'string' && opts.doi.trim().length > 0 ? opts.doi.trim() : undefined;
let existing;
if (doiTrimmed) {
session.log.info(`📍 Updating submission status using DOI: ${doiTrimmed}`);
const works = await getMyWorksFromDoi(session, doiTrimmed);
if (!works.length) {
session.log.error(`⛔️ No work found for DOI "${doiTrimmed}"`);
process.exit(1);
}
const work = works[0];
const mine = (await getFromJournals(session, `/my/submissions/?work_id=${encodeURIComponent(work.id)}&site=${encodeURIComponent(venue)}`));
const found = mine.items.find((s) => s.site_name === venue && s.active_version.work_id === work.id);
if (!found) {
session.log.error(`⛔️ No existing submission found to ${action} for DOI "${doiTrimmed}" at venue "${venue}"`);
process.exit(1);
}
existing = await getSubmissionToUpdate(session, [found]);
if (!existing) {
session.log.error(`⛔️ Could not select submission to ${action} for DOI "${doiTrimmed}"`);
process.exit(1);
}
session.log.debug(`Found existing submission for DOI ${doiTrimmed}: ${existing.id}`);
}
else {
let key = workKeyFromConfig(session);
// Deprecation step to handle old transfer.yml files
key = (await keyFromTransferFile(session, venue, key)) ?? key;
if (!key) {
session.log.error(`⛔️ No id in project config`);
process.exit(1);
}
exitOnInvalidKeyOption(session, key);
session.log.info(`📍 Updating submission status using a key: ${key}`);
const allExisting = await getAllSubmissionsThatICanSeeUsingKey(session, venue, key);
existing = allExisting ? await getSubmissionToUpdate(session, allExisting) : undefined;
if (!existing) {
session.log.error(`⛔️ No existing submission found to ${action} with key: ${key}`);
process.exit(1);
}
session.log.debug(`Found existing submission with key/id: ${key}/${existing.id}`);
}
let date;
if (action === 'publish' && opts.date) {
if (typeof opts.date === 'string') {
date = opts.date;
}
else if (existing.date) {
date = hyphenatedFromDate(new Date(existing.date));
}
else {
session.log.warn('No alternative publish date provided; using today');
}
}
try {
await patchUpdateSubmissionStatus(session, venue, existing.links.self, action, date);
}
catch (e) {
if (!opts.force)
throw e;
session.log.warn(`⚠️ ${e.message}`);
}
}
export async function publish(session, venue, opts = {}) {
await updateStatus('publish', session, venue, opts);
}
export async function unpublish(session, venue, opts = {}) {
await updateStatus('unpublish', session, venue, opts);
}