@appsemble/node-utils
Version:
NodeJS utilities used by Appsemble internally.
60 lines • 2.92 kB
JavaScript
import { assertKoaCondition, getResourceDefinition, getSingleGroupId, processResourceBody, setResourceEtagHeader, validateResourceReferences, } from '@appsemble/node-utils';
export function createUpdateAppResourceController(options) {
return async (ctx) => {
const { pathParams: { appId, resourceId, resourceType }, queryParams: { selectedGroupId }, user: authSubject, } = ctx;
const groupId = getSingleGroupId(selectedGroupId);
const { checkAppPermissions, getApp, getAppAssets, getAppResource, getAppResources, updateAppResource, } = options;
const app = await getApp({
context: ctx,
query: { attributes: ['id', 'demoMode', 'definition', 'template'], where: { id: appId } },
});
const findOptions = {
where: {
id: resourceId,
type: resourceType,
GroupId: groupId,
expires: { or: [{ gt: new Date() }, null] },
...(app.demoMode ? { seed: false, ephemeral: true } : {}),
},
};
const oldResource = await getAppResource({
app,
id: resourceId,
type: resourceType,
context: ctx,
findOptions,
});
assertKoaCondition(oldResource != null, ctx, 404, 'Resource not found');
await checkAppPermissions({
context: ctx,
permissions: [
oldResource.$author?.id === authSubject?.id
? `$resource:${resourceType}:own:update`
: `$resource:${resourceType}:update`,
],
app,
// The operation acts on a single group; authorize against that group only.
groupId,
});
const appAssets = await getAppAssets({ context: ctx, app });
const resourceDefinition = getResourceDefinition(app.definition, resourceType, ctx);
const [processedBody, preparedAssets, deletedAssetIds] = await processResourceBody(ctx, resourceDefinition, appAssets.filter((asset) => asset.resourceId === resourceId).map((asset) => asset.id), oldResource.expires, appAssets.map((asset) => ({ id: asset.id, name: asset.name })));
await validateResourceReferences(ctx, app, resourceDefinition, processedBody, getAppResources);
const resources = Array.isArray(processedBody) ? processedBody : [processedBody];
ctx.body = await updateAppResource({
app,
context: ctx,
id: resourceId,
type: resourceType,
resource: resources[0],
preparedAssets,
deletedAssetIds,
resourceDefinition,
options,
lockWhere: findOptions.where,
ifMatch: ctx.get('If-Match') || undefined,
});
setResourceEtagHeader(ctx, ctx.body);
};
}
//# sourceMappingURL=createUpdateAppResourceController.js.map