{"version":3,"sources":["../../src/query-presets/access.ts"],"sourcesContent":["import type { Access, Config } from '../config/types.js'\nimport type { Operation } from '../types/index.js'\n\nimport { defaultAccess } from '../auth/defaultAccess.js'\n\nconst operations: Operation[] = ['delete', 'read', 'update', 'create'] as const\n\nconst defaultCollectionAccess = {\n create: defaultAccess,\n delete: defaultAccess,\n read: defaultAccess,\n unlock: defaultAccess,\n update: defaultAccess,\n}\n\nexport const getAccess = (config: Config): Record =>\n operations.reduce(\n (acc, operation) => {\n acc[operation] = async (args) => {\n const { req } = args\n\n const collectionAccess = config?.queryPresets?.access?.[operation]\n ? await config.queryPresets.access[operation](args)\n : defaultCollectionAccess?.[operation]\n ? defaultCollectionAccess[operation](args)\n : true\n\n // If collection-level access control is `false`, no need to continue to document-level access\n if (collectionAccess === false) {\n return false\n }\n\n // The `create` operation does not affect the document-level access control\n if (operation === 'create') {\n return collectionAccess\n }\n\n return {\n and: [\n {\n or: [\n // Default access control ensures a user exists, but custom access control may not\n ...(req?.user\n ? [\n {\n and: [\n {\n [`access.${operation}.users`]: {\n in: [req.user.id],\n },\n },\n {\n [`access.${operation}.constraint`]: {\n in: ['onlyMe', 'specificUsers'],\n },\n },\n ],\n },\n ]\n : []),\n {\n [`access.${operation}.constraint`]: {\n equals: 'everyone',\n },\n },\n ...(await Promise.all(\n (config?.queryPresets?.constraints?.[operation] || []).map(async (constraint) => {\n const constraintAccess = constraint.access\n ? await constraint.access(args)\n : undefined\n\n return {\n and: [\n ...(typeof constraintAccess === 'object'\n ? [constraintAccess]\n : constraintAccess === false\n ? [\n {\n id: {\n equals: null,\n },\n },\n ]\n : []),\n {\n [`access.${operation}.constraint`]: {\n equals: constraint.value,\n },\n },\n ],\n }\n }),\n )),\n ],\n },\n ...(typeof collectionAccess === 'object' ? [collectionAccess] : []),\n ],\n }\n }\n\n return acc\n },\n {} as Record,\n )\n"],"names":["defaultAccess","operations","defaultCollectionAccess","create","delete","read","unlock","update","getAccess","config","reduce","acc","operation","args","req","collectionAccess","queryPresets","access","and","or","user","in","id","equals","Promise","all","constraints","map","constraint","constraintAccess","undefined","value"],"mappings":"AAGA,SAASA,aAAa,QAAQ,2BAA0B;AAExD,MAAMC,aAA0B;IAAC;IAAU;IAAQ;IAAU;CAAS;AAEtE,MAAMC,0BAA0B;IAC9BC,QAAQH;IACRI,QAAQJ;IACRK,MAAML;IACNM,QAAQN;IACRO,QAAQP;AACV;AAEA,OAAO,MAAMQ,YAAY,CAACC,SACxBR,WAAWS,MAAM,CACf,CAACC,KAAKC;QACJD,GAAG,CAACC,UAAU,GAAG,OAAOC;YACtB,MAAM,EAAEC,GAAG,EAAE,GAAGD;YAEhB,MAAME,mBAAmBN,QAAQO,cAAcC,QAAQ,CAACL,UAAU,GAC9D,MAAMH,OAAOO,YAAY,CAACC,MAAM,CAACL,UAAU,CAACC,QAC5CX,yBAAyB,CAACU,UAAU,GAClCV,uBAAuB,CAACU,UAAU,CAACC,QACnC;YAEN,8FAA8F;YAC9F,IAAIE,qBAAqB,OAAO;gBAC9B,OAAO;YACT;YAEA,2EAA2E;YAC3E,IAAIH,cAAc,UAAU;gBAC1B,OAAOG;YACT;YAEA,OAAO;gBACLG,KAAK;oBACH;wBACEC,IAAI;4BACF,kFAAkF;+BAC9EL,KAAKM,OACL;gCACE;oCACEF,KAAK;wCACH;4CACE,CAAC,CAAC,OAAO,EAAEN,UAAU,MAAM,CAAC,CAAC,EAAE;gDAC7BS,IAAI;oDAACP,IAAIM,IAAI,CAACE,EAAE;iDAAC;4CACnB;wCACF;wCACA;4CACE,CAAC,CAAC,OAAO,EAAEV,UAAU,WAAW,CAAC,CAAC,EAAE;gDAClCS,IAAI;oDAAC;oDAAU;iDAAgB;4CACjC;wCACF;qCACD;gCACH;6BACD,GACD,EAAE;4BACN;gCACE,CAAC,CAAC,OAAO,EAAET,UAAU,WAAW,CAAC,CAAC,EAAE;oCAClCW,QAAQ;gCACV;4BACF;+BACI,MAAMC,QAAQC,GAAG,CACnB,AAAChB,CAAAA,QAAQO,cAAcU,aAAa,CAACd,UAAU,IAAI,EAAE,AAAD,EAAGe,GAAG,CAAC,OAAOC;gCAChE,MAAMC,mBAAmBD,WAAWX,MAAM,GACtC,MAAMW,WAAWX,MAAM,CAACJ,QACxBiB;gCAEJ,OAAO;oCACLZ,KAAK;2CACC,OAAOW,qBAAqB,WAC5B;4CAACA;yCAAiB,GAClBA,qBAAqB,QACnB;4CACE;gDACEP,IAAI;oDACFC,QAAQ;gDACV;4CACF;yCACD,GACD,EAAE;wCACR;4CACE,CAAC,CAAC,OAAO,EAAEX,UAAU,WAAW,CAAC,CAAC,EAAE;gDAClCW,QAAQK,WAAWG,KAAK;4CAC1B;wCACF;qCACD;gCACH;4BACF;yBAEH;oBACH;uBACI,OAAOhB,qBAAqB,WAAW;wBAACA;qBAAiB,GAAG,EAAE;iBACnE;YACH;QACF;QAEA,OAAOJ;IACT,GACA,CAAC,GACF"}