rls.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { is } from "../entity.js";
  2. import { pgPolicy } from "../pg-core/index.js";
  3. import { PgRole, pgRole } from "../pg-core/roles.js";
  4. import { sql } from "../sql/sql.js";
  5. const crudPolicy = (options) => {
  6. if (options.read === void 0) {
  7. throw new Error("crudPolicy requires a read policy");
  8. }
  9. if (options.modify === void 0) {
  10. throw new Error("crudPolicy requires a modify policy");
  11. }
  12. let read;
  13. if (options.read === true) {
  14. read = sql`true`;
  15. } else if (options.read === false) {
  16. read = sql`false`;
  17. } else if (options.read !== null) {
  18. read = options.read;
  19. }
  20. let modify;
  21. if (options.modify === true) {
  22. modify = sql`true`;
  23. } else if (options.modify === false) {
  24. modify = sql`false`;
  25. } else if (options.modify !== null) {
  26. modify = options.modify;
  27. }
  28. let rolesName = "";
  29. if (Array.isArray(options.role)) {
  30. rolesName = options.role.map((it) => {
  31. return is(it, PgRole) ? it.name : it;
  32. }).join("-");
  33. } else {
  34. rolesName = is(options.role, PgRole) ? options.role.name : options.role;
  35. }
  36. return [
  37. read && pgPolicy(`crud-${rolesName}-policy-select`, {
  38. for: "select",
  39. to: options.role,
  40. using: read
  41. }),
  42. modify && pgPolicy(`crud-${rolesName}-policy-insert`, {
  43. for: "insert",
  44. to: options.role,
  45. withCheck: modify
  46. }),
  47. modify && pgPolicy(`crud-${rolesName}-policy-update`, {
  48. for: "update",
  49. to: options.role,
  50. using: modify,
  51. withCheck: modify
  52. }),
  53. modify && pgPolicy(`crud-${rolesName}-policy-delete`, {
  54. for: "delete",
  55. to: options.role,
  56. using: modify
  57. })
  58. ].filter(Boolean);
  59. };
  60. const authenticatedRole = pgRole("authenticated").existing();
  61. const anonymousRole = pgRole("anonymous").existing();
  62. const authUid = (userIdColumn) => sql`(select auth.user_id() = ${userIdColumn})`;
  63. export {
  64. anonymousRole,
  65. authUid,
  66. authenticatedRole,
  67. crudPolicy
  68. };
  69. //# sourceMappingURL=rls.js.map