UNPKG

@appsemble/node-utils

Version:

NodeJS utilities used by Appsemble internally.

60 lines 2.92 kB
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