@esri/hub-common 15.37.1 → 15.38.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (200) hide show
  1. package/dist/esm/discussions/api/channels/channels.js +188 -0
  2. package/dist/esm/discussions/api/channels/channels.js.map +1 -1
  3. package/dist/esm/discussions/api/index.js +8 -2
  4. package/dist/esm/discussions/api/index.js.map +1 -1
  5. package/dist/esm/discussions/api/posts/index.js +2 -0
  6. package/dist/esm/discussions/api/posts/index.js.map +1 -0
  7. package/dist/esm/discussions/api/posts/posts.js +225 -0
  8. package/dist/esm/discussions/api/posts/posts.js.map +1 -0
  9. package/dist/esm/discussions/api/reactions/index.js +2 -0
  10. package/dist/esm/discussions/api/reactions/index.js.map +1 -0
  11. package/dist/esm/discussions/api/reactions/reactions.js +53 -0
  12. package/dist/esm/discussions/api/reactions/reactions.js.map +1 -0
  13. package/dist/esm/discussions/api/utils/channel-permission.js +359 -0
  14. package/dist/esm/discussions/api/utils/channel-permission.js.map +1 -0
  15. package/dist/esm/discussions/api/utils/channels/can-create-channel-v2.js +13 -0
  16. package/dist/esm/discussions/api/utils/channels/can-create-channel-v2.js.map +1 -0
  17. package/dist/esm/discussions/api/utils/channels/can-create-channel.js +54 -0
  18. package/dist/esm/discussions/api/utils/channels/can-create-channel.js.map +1 -0
  19. package/dist/esm/discussions/api/utils/channels/can-delete-channel-v2.js +17 -0
  20. package/dist/esm/discussions/api/utils/channels/can-delete-channel-v2.js.map +1 -0
  21. package/dist/esm/discussions/api/utils/channels/can-delete-channel.js +17 -0
  22. package/dist/esm/discussions/api/utils/channels/can-delete-channel.js.map +1 -0
  23. package/dist/esm/discussions/api/utils/channels/can-edit-channel-v2.js +19 -0
  24. package/dist/esm/discussions/api/utils/channels/can-edit-channel-v2.js.map +1 -0
  25. package/dist/esm/discussions/api/utils/channels/can-edit-channel.js +17 -0
  26. package/dist/esm/discussions/api/utils/channels/can-edit-channel.js.map +1 -0
  27. package/dist/esm/discussions/api/utils/channels/can-modify-channel.js +18 -0
  28. package/dist/esm/discussions/api/utils/channels/can-modify-channel.js.map +1 -0
  29. package/dist/esm/discussions/api/utils/channels/can-post-to-channel.js +57 -0
  30. package/dist/esm/discussions/api/utils/channels/can-post-to-channel.js.map +1 -0
  31. package/dist/esm/discussions/api/utils/channels/can-read-channel-v2.js +18 -0
  32. package/dist/esm/discussions/api/utils/channels/can-read-channel-v2.js.map +1 -0
  33. package/dist/esm/discussions/api/utils/channels/can-read-channel.js +52 -0
  34. package/dist/esm/discussions/api/utils/channels/can-read-channel.js.map +1 -0
  35. package/dist/esm/discussions/api/utils/channels/channel-to-dto-map.js +11 -0
  36. package/dist/esm/discussions/api/utils/channels/channel-to-dto-map.js.map +1 -0
  37. package/dist/esm/discussions/api/utils/channels/index.js +13 -0
  38. package/dist/esm/discussions/api/utils/channels/index.js.map +1 -0
  39. package/dist/esm/discussions/api/utils/channels/is-authorized-to-modify-channel-by-legacy-permissions.js +44 -0
  40. package/dist/esm/discussions/api/utils/channels/is-authorized-to-modify-channel-by-legacy-permissions.js.map +1 -0
  41. package/dist/esm/discussions/api/utils/platform.js +44 -0
  42. package/dist/esm/discussions/api/utils/platform.js.map +1 -0
  43. package/dist/esm/discussions/api/utils/portal-privilege.js +35 -0
  44. package/dist/esm/discussions/api/utils/portal-privilege.js.map +1 -0
  45. package/dist/esm/discussions/api/utils/posts/can-create-post-v2.js +20 -0
  46. package/dist/esm/discussions/api/utils/posts/can-create-post-v2.js.map +1 -0
  47. package/dist/esm/discussions/api/utils/posts/can-create-post.js +52 -0
  48. package/dist/esm/discussions/api/utils/posts/can-create-post.js.map +1 -0
  49. package/dist/esm/discussions/api/utils/posts/can-create-reply-v2.js +19 -0
  50. package/dist/esm/discussions/api/utils/posts/can-create-reply-v2.js.map +1 -0
  51. package/dist/esm/discussions/api/utils/posts/can-create-reply.js +52 -0
  52. package/dist/esm/discussions/api/utils/posts/can-create-reply.js.map +1 -0
  53. package/dist/esm/discussions/api/utils/posts/can-delete-post-v2.js +24 -0
  54. package/dist/esm/discussions/api/utils/posts/can-delete-post-v2.js.map +1 -0
  55. package/dist/esm/discussions/api/utils/posts/can-delete-post.js +28 -0
  56. package/dist/esm/discussions/api/utils/posts/can-delete-post.js.map +1 -0
  57. package/dist/esm/discussions/api/utils/posts/can-edit-post-status-v2.js +16 -0
  58. package/dist/esm/discussions/api/utils/posts/can-edit-post-status-v2.js.map +1 -0
  59. package/dist/esm/discussions/api/utils/posts/can-edit-post-status.js +61 -0
  60. package/dist/esm/discussions/api/utils/posts/can-edit-post-status.js.map +1 -0
  61. package/dist/esm/discussions/api/utils/posts/can-edit-post-v2.js +19 -0
  62. package/dist/esm/discussions/api/utils/posts/can-edit-post-v2.js.map +1 -0
  63. package/dist/esm/discussions/api/utils/posts/can-edit-post.js +62 -0
  64. package/dist/esm/discussions/api/utils/posts/can-edit-post.js.map +1 -0
  65. package/dist/esm/discussions/api/utils/posts/index.js +15 -0
  66. package/dist/esm/discussions/api/utils/posts/index.js.map +1 -0
  67. package/dist/esm/discussions/api/utils/posts/parse-discussion-uri.js +38 -0
  68. package/dist/esm/discussions/api/utils/posts/parse-discussion-uri.js.map +1 -0
  69. package/dist/esm/discussions/api/utils/posts/parse-mentioned-users.js +19 -0
  70. package/dist/esm/discussions/api/utils/posts/parse-mentioned-users.js.map +1 -0
  71. package/dist/esm/discussions/api/utils/reactions/can-create-reaction-v2.js +27 -0
  72. package/dist/esm/discussions/api/utils/reactions/can-create-reaction-v2.js.map +1 -0
  73. package/dist/esm/discussions/api/utils/reactions/can-create-reaction.js +28 -0
  74. package/dist/esm/discussions/api/utils/reactions/can-create-reaction.js.map +1 -0
  75. package/dist/esm/discussions/api/utils/reactions/index.js +3 -0
  76. package/dist/esm/discussions/api/utils/reactions/index.js.map +1 -0
  77. package/dist/esm/discussions/constants.js +1 -0
  78. package/dist/esm/discussions/constants.js.map +1 -1
  79. package/dist/esm/search/Catalog.js +4 -1
  80. package/dist/esm/search/Catalog.js.map +1 -1
  81. package/dist/node/discussions/api/channels/channels.js +205 -1
  82. package/dist/node/discussions/api/channels/channels.js.map +1 -1
  83. package/dist/node/discussions/api/index.js +8 -2
  84. package/dist/node/discussions/api/index.js.map +1 -1
  85. package/dist/node/discussions/api/posts/index.js +5 -0
  86. package/dist/node/discussions/api/posts/index.js.map +1 -0
  87. package/dist/node/discussions/api/posts/posts.js +244 -0
  88. package/dist/node/discussions/api/posts/posts.js.map +1 -0
  89. package/dist/node/discussions/api/reactions/index.js +5 -0
  90. package/dist/node/discussions/api/reactions/index.js.map +1 -0
  91. package/dist/node/discussions/api/reactions/reactions.js +60 -0
  92. package/dist/node/discussions/api/reactions/reactions.js.map +1 -0
  93. package/dist/node/discussions/api/utils/channel-permission.js +363 -0
  94. package/dist/node/discussions/api/utils/channel-permission.js.map +1 -0
  95. package/dist/node/discussions/api/utils/channels/can-create-channel-v2.js +17 -0
  96. package/dist/node/discussions/api/utils/channels/can-create-channel-v2.js.map +1 -0
  97. package/dist/node/discussions/api/utils/channels/can-create-channel.js +58 -0
  98. package/dist/node/discussions/api/utils/channels/can-create-channel.js.map +1 -0
  99. package/dist/node/discussions/api/utils/channels/can-delete-channel-v2.js +21 -0
  100. package/dist/node/discussions/api/utils/channels/can-delete-channel-v2.js.map +1 -0
  101. package/dist/node/discussions/api/utils/channels/can-delete-channel.js +21 -0
  102. package/dist/node/discussions/api/utils/channels/can-delete-channel.js.map +1 -0
  103. package/dist/node/discussions/api/utils/channels/can-edit-channel-v2.js +23 -0
  104. package/dist/node/discussions/api/utils/channels/can-edit-channel-v2.js.map +1 -0
  105. package/dist/node/discussions/api/utils/channels/can-edit-channel.js +21 -0
  106. package/dist/node/discussions/api/utils/channels/can-edit-channel.js.map +1 -0
  107. package/dist/node/discussions/api/utils/channels/can-modify-channel.js +22 -0
  108. package/dist/node/discussions/api/utils/channels/can-modify-channel.js.map +1 -0
  109. package/dist/node/discussions/api/utils/channels/can-post-to-channel.js +61 -0
  110. package/dist/node/discussions/api/utils/channels/can-post-to-channel.js.map +1 -0
  111. package/dist/node/discussions/api/utils/channels/can-read-channel-v2.js +22 -0
  112. package/dist/node/discussions/api/utils/channels/can-read-channel-v2.js.map +1 -0
  113. package/dist/node/discussions/api/utils/channels/can-read-channel.js +57 -0
  114. package/dist/node/discussions/api/utils/channels/can-read-channel.js.map +1 -0
  115. package/dist/node/discussions/api/utils/channels/channel-to-dto-map.js +15 -0
  116. package/dist/node/discussions/api/utils/channels/channel-to-dto-map.js.map +1 -0
  117. package/dist/node/discussions/api/utils/channels/index.js +26 -0
  118. package/dist/node/discussions/api/utils/channels/index.js.map +1 -0
  119. package/dist/node/discussions/api/utils/channels/is-authorized-to-modify-channel-by-legacy-permissions.js +48 -0
  120. package/dist/node/discussions/api/utils/channels/is-authorized-to-modify-channel-by-legacy-permissions.js.map +1 -0
  121. package/dist/node/discussions/api/utils/platform.js +53 -0
  122. package/dist/node/discussions/api/utils/platform.js.map +1 -0
  123. package/dist/node/discussions/api/utils/portal-privilege.js +41 -0
  124. package/dist/node/discussions/api/utils/portal-privilege.js.map +1 -0
  125. package/dist/node/discussions/api/utils/posts/can-create-post-v2.js +24 -0
  126. package/dist/node/discussions/api/utils/posts/can-create-post-v2.js.map +1 -0
  127. package/dist/node/discussions/api/utils/posts/can-create-post.js +56 -0
  128. package/dist/node/discussions/api/utils/posts/can-create-post.js.map +1 -0
  129. package/dist/node/discussions/api/utils/posts/can-create-reply-v2.js +23 -0
  130. package/dist/node/discussions/api/utils/posts/can-create-reply-v2.js.map +1 -0
  131. package/dist/node/discussions/api/utils/posts/can-create-reply.js +56 -0
  132. package/dist/node/discussions/api/utils/posts/can-create-reply.js.map +1 -0
  133. package/dist/node/discussions/api/utils/posts/can-delete-post-v2.js +28 -0
  134. package/dist/node/discussions/api/utils/posts/can-delete-post-v2.js.map +1 -0
  135. package/dist/node/discussions/api/utils/posts/can-delete-post.js +32 -0
  136. package/dist/node/discussions/api/utils/posts/can-delete-post.js.map +1 -0
  137. package/dist/node/discussions/api/utils/posts/can-edit-post-status-v2.js +20 -0
  138. package/dist/node/discussions/api/utils/posts/can-edit-post-status-v2.js.map +1 -0
  139. package/dist/node/discussions/api/utils/posts/can-edit-post-status.js +66 -0
  140. package/dist/node/discussions/api/utils/posts/can-edit-post-status.js.map +1 -0
  141. package/dist/node/discussions/api/utils/posts/can-edit-post-v2.js +23 -0
  142. package/dist/node/discussions/api/utils/posts/can-edit-post-v2.js.map +1 -0
  143. package/dist/node/discussions/api/utils/posts/can-edit-post.js +67 -0
  144. package/dist/node/discussions/api/utils/posts/can-edit-post.js.map +1 -0
  145. package/dist/node/discussions/api/utils/posts/index.js +31 -0
  146. package/dist/node/discussions/api/utils/posts/index.js.map +1 -0
  147. package/dist/node/discussions/api/utils/posts/parse-discussion-uri.js +42 -0
  148. package/dist/node/discussions/api/utils/posts/parse-discussion-uri.js.map +1 -0
  149. package/dist/node/discussions/api/utils/posts/parse-mentioned-users.js +23 -0
  150. package/dist/node/discussions/api/utils/posts/parse-mentioned-users.js.map +1 -0
  151. package/dist/node/discussions/api/utils/reactions/can-create-reaction-v2.js +31 -0
  152. package/dist/node/discussions/api/utils/reactions/can-create-reaction-v2.js.map +1 -0
  153. package/dist/node/discussions/api/utils/reactions/can-create-reaction.js +32 -0
  154. package/dist/node/discussions/api/utils/reactions/can-create-reaction.js.map +1 -0
  155. package/dist/node/discussions/api/utils/reactions/index.js +7 -0
  156. package/dist/node/discussions/api/utils/reactions/index.js.map +1 -0
  157. package/dist/node/discussions/constants.js +2 -1
  158. package/dist/node/discussions/constants.js.map +1 -1
  159. package/dist/node/search/Catalog.js +4 -1
  160. package/dist/node/search/Catalog.js.map +1 -1
  161. package/dist/types/discussions/api/channels/channels.d.ts +140 -1
  162. package/dist/types/discussions/api/index.d.ts +8 -2
  163. package/dist/types/discussions/api/posts/index.d.ts +1 -0
  164. package/dist/types/discussions/api/posts/posts.d.ts +146 -0
  165. package/dist/types/discussions/api/reactions/index.d.ts +1 -0
  166. package/dist/types/discussions/api/reactions/reactions.d.ts +38 -0
  167. package/dist/types/discussions/api/utils/channel-permission.d.ts +39 -0
  168. package/dist/types/discussions/api/utils/channels/can-create-channel-v2.d.ts +10 -0
  169. package/dist/types/discussions/api/utils/channels/can-create-channel.d.ts +11 -0
  170. package/dist/types/discussions/api/utils/channels/can-delete-channel-v2.d.ts +10 -0
  171. package/dist/types/discussions/api/utils/channels/can-delete-channel.d.ts +11 -0
  172. package/dist/types/discussions/api/utils/channels/can-edit-channel-v2.d.ts +11 -0
  173. package/dist/types/discussions/api/utils/channels/can-edit-channel.d.ts +11 -0
  174. package/dist/types/discussions/api/utils/channels/can-modify-channel.d.ts +11 -0
  175. package/dist/types/discussions/api/utils/channels/can-post-to-channel.d.ts +11 -0
  176. package/dist/types/discussions/api/utils/channels/can-read-channel-v2.d.ts +11 -0
  177. package/dist/types/discussions/api/utils/channels/can-read-channel.d.ts +22 -0
  178. package/dist/types/discussions/api/utils/channels/channel-to-dto-map.d.ts +6 -0
  179. package/dist/types/discussions/api/utils/channels/index.d.ts +10 -0
  180. package/dist/types/discussions/api/utils/channels/is-authorized-to-modify-channel-by-legacy-permissions.d.ts +11 -0
  181. package/dist/types/discussions/api/utils/platform.d.ts +26 -0
  182. package/dist/types/discussions/api/utils/portal-privilege.d.ts +17 -0
  183. package/dist/types/discussions/api/utils/posts/can-create-post-v2.d.ts +10 -0
  184. package/dist/types/discussions/api/utils/posts/can-create-post.d.ts +12 -0
  185. package/dist/types/discussions/api/utils/posts/can-create-reply-v2.d.ts +9 -0
  186. package/dist/types/discussions/api/utils/posts/can-create-reply.d.ts +12 -0
  187. package/dist/types/discussions/api/utils/posts/can-delete-post-v2.d.ts +11 -0
  188. package/dist/types/discussions/api/utils/posts/can-delete-post.d.ts +12 -0
  189. package/dist/types/discussions/api/utils/posts/can-edit-post-status-v2.d.ts +9 -0
  190. package/dist/types/discussions/api/utils/posts/can-edit-post-status.d.ts +20 -0
  191. package/dist/types/discussions/api/utils/posts/can-edit-post-v2.d.ts +10 -0
  192. package/dist/types/discussions/api/utils/posts/can-edit-post.d.ts +22 -0
  193. package/dist/types/discussions/api/utils/posts/index.d.ts +12 -0
  194. package/dist/types/discussions/api/utils/posts/parse-discussion-uri.d.ts +9 -0
  195. package/dist/types/discussions/api/utils/posts/parse-mentioned-users.d.ts +6 -0
  196. package/dist/types/discussions/api/utils/reactions/can-create-reaction-v2.d.ts +12 -0
  197. package/dist/types/discussions/api/utils/reactions/can-create-reaction.d.ts +13 -0
  198. package/dist/types/discussions/api/utils/reactions/index.d.ts +2 -0
  199. package/dist/types/discussions/constants.d.ts +1 -0
  200. package/package.json +1 -1
@@ -0,0 +1,18 @@
1
+ import { ChannelPermission } from "../channel-permission";
2
+ import { hasOrgAdminViewRights } from "../portal-privilege";
3
+ /**
4
+ * Utility to determine if User can view channel posts and channel attributes
5
+ *
6
+ * @export
7
+ * @param {IChannel} channel
8
+ * @param {IUser} user
9
+ * @return {*} {boolean}
10
+ */
11
+ export function canReadChannelV2(channel, user = {}) {
12
+ if (hasOrgAdminViewRights(user, channel.orgId)) {
13
+ return true;
14
+ }
15
+ const channelPermission = new ChannelPermission(channel);
16
+ return channelPermission.canReadChannel(user);
17
+ }
18
+ //# sourceMappingURL=can-read-channel-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-read-channel-v2.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/channels/can-read-channel-v2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAiB,EACjB,OAAiC,EAAE;IAEnC,IAAI,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAC9C,OAAO,IAAI,CAAC;KACb;IAED,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,iBAAiB,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { reduceByGroupMembership } from "../platform";
2
+ import { hasOrgAdminViewRights } from "../portal-privilege";
3
+ /**
4
+ * Utility to determine if User can view channel posts and channel attributes
5
+ *
6
+ * @deprecated replace with canReadChannelV2 for v2 discussions
7
+ * @export
8
+ * @param {IChannel} channel
9
+ * @param {IUser} user
10
+ * @return {*} {boolean}
11
+ */
12
+ export function canReadChannel(channel, user = {}) {
13
+ if (hasOrgAdminViewRights(user, channel.orgId)) {
14
+ return true;
15
+ }
16
+ if (channel.access === "private") {
17
+ // ensure user is member of at least one group
18
+ return intersectGroups(["member", "owner", "admin"])(user, channel);
19
+ }
20
+ if (channel.access === "org") {
21
+ return (intersectGroups(["member", "owner", "admin"])(user, channel) ||
22
+ isLegacyChannelOrgMember(channel, user));
23
+ }
24
+ // public channel
25
+ return true;
26
+ }
27
+ /**
28
+ * Utility (deprecated) to determine whether User can view posts belonging to Channel
29
+ *
30
+ * @export
31
+ * @deprecated replace with canReadChannelV2 for v2 discussions
32
+ * @param {IChannel} channel
33
+ * @param {IUser} user
34
+ * @return {*} {boolean}
35
+ */
36
+ export function canReadFromChannel(channel, user = {}) {
37
+ return canReadChannel(channel, user);
38
+ }
39
+ function intersectGroups(membershipTypes) {
40
+ return (user, channel) => {
41
+ const { groups: sharedGroups = [] } = channel;
42
+ const { groups: userGroups = [] } = user;
43
+ const eligibleUserGroups = userGroups.reduce(reduceByGroupMembership(membershipTypes), []);
44
+ const method = "some";
45
+ return sharedGroups[method]((group) => eligibleUserGroups.indexOf(group) > -1);
46
+ };
47
+ }
48
+ function isLegacyChannelOrgMember(channel, user) {
49
+ // orgs.length = 1 until collaboration/discussion between many orgs is ideated
50
+ return channel.orgs.length === 1 && channel.orgs.indexOf(user.orgId) > -1;
51
+ }
52
+ //# sourceMappingURL=can-read-channel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-read-channel.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/channels/can-read-channel.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAE5D;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAiB,EACjB,OAAiC,EAAE;IAEnC,IAAI,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAC9C,OAAO,IAAI,CAAC;KACb;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,SAAS,EAAE;QAChC,8CAA8C;QAC9C,OAAO,eAAe,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;KACrE;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE;QAC5B,OAAO,CACL,eAAe,CAAC,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,CAAC;YAC5D,wBAAwB,CAAC,OAAO,EAAE,IAAI,CAAC,CACxC,CAAC;KACH;IAED,iBAAiB;IACjB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,OAAiB,EACjB,OAAiC,EAAE;IAEnC,OAAO,cAAc,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACvC,CAAC;AAED,SAAS,eAAe,CACtB,eAAkC;IAElC,OAAO,CAAC,IAA8B,EAAE,OAAiB,EAAW,EAAE;QACpE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC;QAC9C,MAAM,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;QACzC,MAAM,kBAAkB,GAAG,UAAU,CAAC,MAAM,CAC1C,uBAAuB,CAAC,eAAe,CAAC,EACxC,EAAE,CACH,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,CAAC;QACtB,OAAO,YAAY,CAAC,MAAM,CAAC,CACzB,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAClD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,wBAAwB,CAC/B,OAAiB,EACjB,IAA8B;IAE9B,8EAA8E;IAC9E,OAAO,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,11 @@
1
+ // TODO: V2 use IUpdateChannel as param type when hoisted to hub.js from service
2
+ import { __rest } from "tslib";
3
+ /**
4
+ * @hidden
5
+ * @internal
6
+ */
7
+ export function dtoToChannel(dto) {
8
+ const { channelAclDefinition } = dto, rest = __rest(dto, ["channelAclDefinition"]);
9
+ return Object.assign(Object.assign({}, rest), { channelAcl: channelAclDefinition });
10
+ }
11
+ //# sourceMappingURL=channel-to-dto-map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channel-to-dto-map.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/channels/channel-to-dto-map.ts"],"names":[],"mappings":"AAAA,gFAAgF;;AAIhF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,GAAQ;IACnC,MAAM,EAAE,oBAAoB,KAAc,GAAG,EAAZ,IAAI,UAAK,GAAG,EAAvC,wBAAiC,CAAM,CAAC;IAE9C,uCACK,IAAI,KACP,UAAU,EAAE,oBAAoB,IAChC;AACJ,CAAC"}
@@ -0,0 +1,13 @@
1
+ // V1
2
+ export { canCreateChannel } from "./can-create-channel";
3
+ export { canDeleteChannel } from "./can-delete-channel";
4
+ export { canEditChannel } from "./can-edit-channel";
5
+ export { canModifyChannel } from "./can-modify-channel";
6
+ export { canPostToChannel } from "./can-post-to-channel";
7
+ export { canReadChannel, canReadFromChannel } from "./can-read-channel";
8
+ // V2
9
+ export { canCreateChannelV2 } from "./can-create-channel-v2";
10
+ export { canDeleteChannelV2 } from "./can-delete-channel-v2";
11
+ export { canEditChannelV2 } from "./can-edit-channel-v2";
12
+ export { canReadChannelV2 } from "./can-read-channel-v2";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/channels/index.ts"],"names":[],"mappings":"AAAA,KAAK;AACL,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExE,KAAK;AACL,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -0,0 +1,44 @@
1
+ import { isOrgAdmin } from "../platform";
2
+ import { SharingAccess } from "../../types";
3
+ const AGO_ADMIN_GROUP_ROLES = Object.freeze(["owner", "admin"]);
4
+ /**
5
+ * Utility to determine if User has privileges to modify a channel by legacy channel permissions
6
+ * @param channel
7
+ * @param user
8
+ * @returns {boolean}
9
+ * @internal
10
+ * @hidden
11
+ */
12
+ export function isAuthorizedToModifyChannelByLegacyPermissions(user = {}, channel) {
13
+ const { username, groups: userGroups = [] } = user;
14
+ const { access, groups: channelGroups = [], orgs: channelOrgs = [], creator: channelCreator, } = channel;
15
+ // ensure authenticated
16
+ if (!username) {
17
+ return false;
18
+ }
19
+ if (username === channelCreator) {
20
+ return true;
21
+ }
22
+ if (access === SharingAccess.PRIVATE) {
23
+ return isAuthorizedToModifyChannelByLegacyGroup(channelGroups, userGroups);
24
+ }
25
+ // public or org access
26
+ return (isAuthorizedToModifyChannelByLegacyGroup(channelGroups, userGroups) ||
27
+ isLegacyChannelOrgAdmin(channelOrgs, user));
28
+ }
29
+ /**
30
+ * Ensure the user is an owner/admin of one of the channel groups
31
+ */
32
+ function isAuthorizedToModifyChannelByLegacyGroup(channelGroups, userGroups) {
33
+ return channelGroups.some((channelGroupId) => {
34
+ return userGroups.some((group) => {
35
+ const { id: userGroupId, userMembership: { memberType: userMemberType }, } = group;
36
+ return (channelGroupId === userGroupId &&
37
+ AGO_ADMIN_GROUP_ROLES.includes(userMemberType));
38
+ });
39
+ });
40
+ }
41
+ function isLegacyChannelOrgAdmin(channelOrgs, user) {
42
+ return isOrgAdmin(user) && channelOrgs.includes(user.orgId);
43
+ }
44
+ //# sourceMappingURL=is-authorized-to-modify-channel-by-legacy-permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"is-authorized-to-modify-channel-by-legacy-permissions.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/channels/is-authorized-to-modify-channel-by-legacy-permissions.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAA8B,aAAa,EAAE,MAAM,aAAa,CAAC;AAExE,MAAM,qBAAqB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAEhE;;;;;;;GAOG;AACH,MAAM,UAAU,8CAA8C,CAC5D,OAAiC,EAAE,EACnC,OAAiB;IAEjB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IACnD,MAAM,EACJ,MAAM,EACN,MAAM,EAAE,aAAa,GAAG,EAAE,EAC1B,IAAI,EAAE,WAAW,GAAG,EAAE,EACtB,OAAO,EAAE,cAAc,GACxB,GAAG,OAAO,CAAC;IAEZ,uBAAuB;IACvB,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,KAAK,CAAC;KACd;IAED,IAAI,QAAQ,KAAK,cAAc,EAAE;QAC/B,OAAO,IAAI,CAAC;KACb;IAED,IAAI,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE;QACpC,OAAO,wCAAwC,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;KAC5E;IAED,uBAAuB;IACvB,OAAO,CACL,wCAAwC,CAAC,aAAa,EAAE,UAAU,CAAC;QACnE,uBAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,wCAAwC,CAC/C,aAAuB,EACvB,UAAoB;IAEpB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,cAAsB,EAAE,EAAE;QACnD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,EACJ,EAAE,EAAE,WAAW,EACf,cAAc,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,GAC/C,GAAG,KAAK,CAAC;YAEV,OAAO,CACL,cAAc,KAAK,WAAW;gBAC9B,qBAAqB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAC/C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAC9B,WAAqB,EACrB,IAA8B;IAE9B,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Utility that returns reducer function that filters a user's groups
3
+ * by membership type and produces an array of group id's
4
+ *
5
+ *
6
+ * @export
7
+ * @param {GroupMembership[]} membershipTypes
8
+ * @return {*} {((memo: string[], group: IGroup) => string[])}
9
+ */
10
+ export function reduceByGroupMembership(membershipTypes) {
11
+ return function (memo, group) {
12
+ if (membershipTypes.indexOf(group.userMembership.memberType) > -1) {
13
+ memo.push(group.id);
14
+ }
15
+ return memo;
16
+ };
17
+ }
18
+ /**
19
+ * Utility that checks if a user is a portal org admin, or an org_admin by a platform role
20
+ *
21
+ * @export
22
+ * @param {IUser} user
23
+ * @return {*} {boolean}
24
+ */
25
+ // NOTE: this is not the same as @esri/arcgis-rest-portal isOrgAdmin,
26
+ // which first resolves `user` from `IUserRequestOptions` to make this determination
27
+ // https://github.com/Esri/arcgis-rest-js/blob/7ab072184f89dcb35367518101ee4abeb5a9d112/packages/arcgis-rest-portal/src/sharing/helpers.ts#L45
28
+ export function isOrgAdmin(user) {
29
+ return user.role === "org_admin";
30
+ }
31
+ export function isUserInOrg(user = {}, orgId) {
32
+ return user.orgId === orgId;
33
+ }
34
+ export function isOrgAdminInOrg(user, orgId) {
35
+ return isOrgAdmin(user) && isUserInOrg(user, orgId);
36
+ }
37
+ export function userHasPrivilege(user = {}, privilege) {
38
+ var _a;
39
+ return !!((_a = user.privileges) === null || _a === void 0 ? void 0 : _a.includes(privilege));
40
+ }
41
+ export function userHasPrivileges(user = {}, privileges) {
42
+ return privileges.every((privilege) => userHasPrivilege(user, privilege));
43
+ }
44
+ //# sourceMappingURL=platform.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../../../src/discussions/api/utils/platform.ts"],"names":[],"mappings":"AAeA;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,eAAkC;IAElC,OAAO,UAAU,IAAI,EAAE,KAAK;QAC1B,IAAI,eAAe,CAAC,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE;YACjE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;SACrB;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,qEAAqE;AACrE,oFAAoF;AACpF,8IAA8I;AAC9I,MAAM,UAAU,UAAU,CAAC,IAAW;IACpC,OAAO,IAAI,CAAC,IAAI,KAAK,WAAW,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,OAAiC,EAAE,EACnC,KAAa;IAEb,OAAO,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAW,EAAE,KAAa;IACxD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,OAAiC,EAAE,EACnC,SAAoB;;IAEpB,OAAO,CAAC,QAAC,IAAI,CAAC,UAAU,0CAAE,QAAQ,CAAC,SAAS,EAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,OAAiC,EAAE,EACnC,UAAuB;IAEvB,OAAO,UAAU,CAAC,KAAK,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,35 @@
1
+ import { isOrgAdminInOrg, isUserInOrg, userHasPrivileges } from "./platform";
2
+ /**
3
+ * @internal
4
+ * @hidden
5
+ */
6
+ export function hasOrgAdminViewRights(user = {}, orgId) {
7
+ return (isOrgAdminInOrg(user, orgId) ||
8
+ (isUserInOrg(user, orgId) &&
9
+ userHasPrivileges(user, ["portal:admin:viewItems"])));
10
+ }
11
+ /**
12
+ * @internal
13
+ * @hidden
14
+ */
15
+ export function hasOrgAdminUpdateRights(user = {}, orgId) {
16
+ return (isOrgAdminInOrg(user, orgId) ||
17
+ (isUserInOrg(user, orgId) &&
18
+ userHasPrivileges(user, [
19
+ "portal:admin:viewItems",
20
+ "portal:admin:updateItems",
21
+ ])));
22
+ }
23
+ /**
24
+ * @internal
25
+ * @hidden
26
+ */
27
+ export function hasOrgAdminDeleteRights(user = {}, orgId) {
28
+ return (isOrgAdminInOrg(user, orgId) ||
29
+ (isUserInOrg(user, orgId) &&
30
+ userHasPrivileges(user, [
31
+ "portal:admin:viewItems",
32
+ "portal:admin:deleteItems",
33
+ ])));
34
+ }
35
+ //# sourceMappingURL=portal-privilege.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"portal-privilege.js","sourceRoot":"","sources":["../../../../../src/discussions/api/utils/portal-privilege.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAG7E;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAiC,EAAE,EACnC,KAAa;IAEb,OAAO,CACL,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5B,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;YACvB,iBAAiB,CAAC,IAAI,EAAE,CAAC,wBAAwB,CAAC,CAAC,CAAC,CACvD,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAiC,EAAE,EACnC,KAAa;IAEb,OAAO,CACL,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5B,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;YACvB,iBAAiB,CAAC,IAAI,EAAE;gBACtB,wBAAwB;gBACxB,0BAA0B;aAC3B,CAAC,CAAC,CACN,CAAC;AACJ,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,OAAiC,EAAE,EACnC,KAAa;IAEb,OAAO,CACL,eAAe,CAAC,IAAI,EAAE,KAAK,CAAC;QAC5B,CAAC,WAAW,CAAC,IAAI,EAAE,KAAK,CAAC;YACvB,iBAAiB,CAAC,IAAI,EAAE;gBACtB,wBAAwB;gBACxB,0BAA0B;aAC3B,CAAC,CAAC,CACN,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import { ChannelPermission } from "../channel-permission";
2
+ import { hasOrgAdminUpdateRights } from "../portal-privilege";
3
+ /**
4
+ * Utility to determine if User has privileges to create a post in a channel
5
+ * @export
6
+ * @param channel
7
+ * @param user
8
+ * @returns {boolean}
9
+ */
10
+ export function canCreatePostV2(channel, user = {}) {
11
+ if (hasOrgAdminUpdateRights(user, channel.orgId)) {
12
+ return true;
13
+ }
14
+ if (!channel.allowPost) {
15
+ return false;
16
+ }
17
+ const channelPermission = new ChannelPermission(channel);
18
+ return channelPermission.canPostToChannel(user);
19
+ }
20
+ //# sourceMappingURL=can-create-post-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-create-post-v2.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-create-post-v2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,OAAiB,EACjB,OAAiC,EAAE;IAEnC,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,OAAO,IAAI,CAAC;KACb;IAED,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE;QACtB,OAAO,KAAK,CAAC;KACd;IAED,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,iBAAiB,CAAC,gBAAgB,CAAC,IAAwB,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { SharingAccess } from "../../types";
2
+ import { hasOrgAdminUpdateRights } from "../portal-privilege";
3
+ import { CANNOT_DISCUSS } from "../../../constants";
4
+ const ALLOWED_GROUP_ROLES = Object.freeze(["owner", "admin", "member"]);
5
+ /**
6
+ * Utility to determine if User has privileges to create a post in a channel
7
+ *
8
+ * @deprecated replace with canCreatePostV2 for v2 discussions
9
+ * @export
10
+ * @param channel
11
+ * @param user
12
+ * @returns {boolean}
13
+ */
14
+ export function canCreatePost(channel, user = {}) {
15
+ const { access, groups, orgs } = channel;
16
+ if (hasOrgAdminUpdateRights(user, channel.orgId)) {
17
+ return true;
18
+ }
19
+ return isAuthorizedToPostByLegacyPermissions(user, {
20
+ access,
21
+ groups,
22
+ orgs,
23
+ });
24
+ }
25
+ function isAuthorizedToPostByLegacyPermissions(user, channelParams) {
26
+ const { username, groups: userGroups, orgId: userOrgId } = user;
27
+ const { access, groups, orgs } = channelParams;
28
+ if (!username) {
29
+ return false;
30
+ }
31
+ if (access === SharingAccess.PUBLIC) {
32
+ return true;
33
+ }
34
+ if (access === SharingAccess.PRIVATE) {
35
+ return isAuthorizedToPostByLegacyGroup(groups, userGroups);
36
+ }
37
+ if (access === SharingAccess.ORG) {
38
+ return orgs.includes(userOrgId);
39
+ }
40
+ return false;
41
+ }
42
+ function isAuthorizedToPostByLegacyGroup(channelGroups = [], userGroups = []) {
43
+ return channelGroups.some((channelGroupId) => {
44
+ return userGroups.some((group) => {
45
+ const { id: userGroupId, userMembership: { memberType: userMemberType }, typeKeywords, } = group;
46
+ return (channelGroupId === userGroupId &&
47
+ ALLOWED_GROUP_ROLES.includes(userMemberType) &&
48
+ !typeKeywords.includes(CANNOT_DISCUSS));
49
+ });
50
+ });
51
+ }
52
+ //# sourceMappingURL=can-create-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-create-post.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-create-post.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,aAAa,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAIxE;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,OAAiB,EACjB,OAAiC,EAAE;IAEnC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzC,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,OAAO,IAAI,CAAC;KACb;IAED,OAAO,qCAAqC,CAAC,IAAI,EAAE;QACjD,MAAM;QACN,MAAM;QACN,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qCAAqC,CAC5C,IAA8B,EAC9B,aAAwC;IAExC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAChE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;IAE/C,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,KAAK,CAAC;KACd;IAED,IAAI,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE;QACnC,OAAO,IAAI,CAAC;KACb;IAED,IAAI,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE;QACpC,OAAO,+BAA+B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAC5D;IAED,IAAI,MAAM,KAAK,aAAa,CAAC,GAAG,EAAE;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;KACjC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,+BAA+B,CACtC,gBAA0B,EAAE,EAC5B,aAAuB,EAAE;IAEzB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,cAAsB,EAAE,EAAE;QACnD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,EACJ,EAAE,EAAE,WAAW,EACf,cAAc,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,EAC9C,YAAY,GACb,GAAG,KAAK,CAAC;YAEV,OAAO,CACL,cAAc,KAAK,WAAW;gBAC9B,mBAAmB,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAC5C,CAAC,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CACvC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { ChannelPermission } from "../channel-permission";
2
+ import { hasOrgAdminUpdateRights } from "../portal-privilege";
3
+ /**
4
+ * Utility to determine if User has privileges to create a reply in a channel
5
+ * @param channel
6
+ * @param user
7
+ * @returns {boolean}
8
+ */
9
+ export function canCreateReplyV2(channel, user = {}) {
10
+ if (hasOrgAdminUpdateRights(user, channel.orgId)) {
11
+ return true;
12
+ }
13
+ if (!channel.allowReply) {
14
+ return false;
15
+ }
16
+ const channelPermission = new ChannelPermission(channel);
17
+ return channelPermission.canPostToChannel(user);
18
+ }
19
+ //# sourceMappingURL=can-create-reply-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-create-reply-v2.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-create-reply-v2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,OAAiB,EACjB,OAAiC,EAAE;IAEnC,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,OAAO,IAAI,CAAC;KACb;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;QACvB,OAAO,KAAK,CAAC;KACd;IAED,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,iBAAiB,CAAC,gBAAgB,CAAC,IAAwB,CAAC,CAAC;AACtE,CAAC"}
@@ -0,0 +1,52 @@
1
+ import { SharingAccess } from "../../types";
2
+ import { hasOrgAdminUpdateRights } from "../portal-privilege";
3
+ import { CANNOT_DISCUSS } from "../../../constants";
4
+ const ALLOWED_GROUP_ROLES = Object.freeze(["owner", "admin", "member"]);
5
+ /**
6
+ * Utility to determine if User has privileges to create a reply in a channel
7
+ *
8
+ * @export
9
+ * @deprecated replace with canCreateReplyV2 for v2 discussions
10
+ * @param channel
11
+ * @param user
12
+ * @returns {boolean}
13
+ */
14
+ export function canCreateReply(channel, user = {}) {
15
+ const { access, groups, orgs } = channel;
16
+ if (hasOrgAdminUpdateRights(user, channel.orgId)) {
17
+ return true;
18
+ }
19
+ return isAuthorizedToPostByLegacyPermissions(user, {
20
+ access,
21
+ groups,
22
+ orgs,
23
+ });
24
+ }
25
+ function isAuthorizedToPostByLegacyPermissions(user, channelParams) {
26
+ const { username, groups: userGroups, orgId: userOrgId } = user;
27
+ const { access, groups, orgs } = channelParams;
28
+ if (!username) {
29
+ return false;
30
+ }
31
+ if (access === SharingAccess.PUBLIC) {
32
+ return true;
33
+ }
34
+ if (access === SharingAccess.PRIVATE) {
35
+ return isAuthorizedToPostByLegacyGroup(groups, userGroups);
36
+ }
37
+ if (access === SharingAccess.ORG) {
38
+ return orgs.includes(userOrgId);
39
+ }
40
+ return false;
41
+ }
42
+ function isAuthorizedToPostByLegacyGroup(channelGroups = [], userGroups = []) {
43
+ return channelGroups.some((channelGroupId) => {
44
+ return userGroups.some((group) => {
45
+ const { id: userGroupId, userMembership: { memberType: userMemberType }, typeKeywords, } = group;
46
+ return (channelGroupId === userGroupId &&
47
+ ALLOWED_GROUP_ROLES.includes(userMemberType) &&
48
+ !typeKeywords.includes(CANNOT_DISCUSS));
49
+ });
50
+ });
51
+ }
52
+ //# sourceMappingURL=can-create-reply.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-create-reply.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-create-reply.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,aAAa,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;AAIxE;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAC5B,OAAiB,EACjB,OAAiC,EAAE;IAEnC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,OAAO,CAAC;IAEzC,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,OAAO,IAAI,CAAC;KACb;IAED,OAAO,qCAAqC,CAAC,IAAI,EAAE;QACjD,MAAM;QACN,MAAM;QACN,IAAI;KACL,CAAC,CAAC;AACL,CAAC;AAED,SAAS,qCAAqC,CAC5C,IAA8B,EAC9B,aAAwC;IAExC,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC;IAChE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;IAE/C,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,KAAK,CAAC;KACd;IAED,IAAI,MAAM,KAAK,aAAa,CAAC,MAAM,EAAE;QACnC,OAAO,IAAI,CAAC;KACb;IAED,IAAI,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE;QACpC,OAAO,+BAA+B,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAC5D;IAED,IAAI,MAAM,KAAK,aAAa,CAAC,GAAG,EAAE;QAChC,OAAO,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;KACjC;IAED,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,+BAA+B,CACtC,gBAA0B,EAAE,EAC5B,aAAuB,EAAE;IAEzB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,cAAsB,EAAE,EAAE;QACnD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,EACJ,EAAE,EAAE,WAAW,EACf,cAAc,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,EAC9C,YAAY,GACb,GAAG,KAAK,CAAC;YAEV,OAAO,CACL,cAAc,KAAK,WAAW;gBAC9B,mBAAmB,CAAC,QAAQ,CAAC,cAAc,CAAC;gBAC5C,CAAC,YAAY,CAAC,QAAQ,CAAC,cAAc,CAAC,CACvC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ChannelPermission } from "../channel-permission";
2
+ import { hasOrgAdminUpdateRights } from "../portal-privilege";
3
+ /**
4
+ * Utility to determine if User has privileges to delete a post
5
+ * @export
6
+ * @param post
7
+ * @param user
8
+ * @param channel
9
+ * @returns {boolean}
10
+ */
11
+ export function canDeletePostV2(post, channel, user = {}) {
12
+ return isPostCreator(post, user) || isChannelModerator(channel, user);
13
+ }
14
+ function isPostCreator(post, user) {
15
+ return !!user.username && post.creator === user.username;
16
+ }
17
+ function isChannelModerator(channel, user) {
18
+ if (hasOrgAdminUpdateRights(user, channel.orgId)) {
19
+ return true;
20
+ }
21
+ const channelPermission = new ChannelPermission(channel);
22
+ return channelPermission.canModerateChannel(user);
23
+ }
24
+ //# sourceMappingURL=can-delete-post-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-delete-post-v2.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-delete-post-v2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAW,EACX,OAAiB,EACjB,OAAiC,EAAE;IAEnC,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,aAAa,CAAC,IAAW,EAAE,IAA8B;IAChE,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAiB,EACjB,IAA8B;IAE9B,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,OAAO,IAAI,CAAC;KACb;IAED,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { ChannelPermission } from "../channel-permission";
2
+ import { hasOrgAdminUpdateRights } from "../portal-privilege";
3
+ /**
4
+ * Utility to determine if User has privileges to delete a post
5
+ * @deprecated replace with canDeletePostV2 for v2 discussions
6
+ * @export
7
+ * @param post
8
+ * @param user
9
+ * @param channel
10
+ * @returns {boolean}
11
+ */
12
+ export function canDeletePost(post, channel, user = {}) {
13
+ return isPostCreator(post, user) || isChannelModerator(channel, user);
14
+ }
15
+ function isPostCreator(post, user) {
16
+ return !!user.username && post.creator === user.username;
17
+ }
18
+ function isChannelModerator(channel, user) {
19
+ if (hasOrgAdminUpdateRights(user, channel.orgId)) {
20
+ return true;
21
+ }
22
+ if (!channel.channelAcl) {
23
+ return false;
24
+ }
25
+ const channelPermission = new ChannelPermission(channel);
26
+ return channelPermission.canModerateChannel(user);
27
+ }
28
+ //# sourceMappingURL=can-delete-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-delete-post.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-delete-post.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAW,EACX,OAAiB,EACjB,OAAiC,EAAE;IAEnC,OAAO,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AACxE,CAAC;AAED,SAAS,aAAa,CAAC,IAAW,EAAE,IAA8B;IAChE,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC;AAC3D,CAAC;AAED,SAAS,kBAAkB,CACzB,OAAiB,EACjB,IAA8B;IAE9B,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,OAAO,IAAI,CAAC;KACb;IAED,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;QACvB,OAAO,KAAK,CAAC;KACd;IAED,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,iBAAiB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { ChannelPermission } from "../channel-permission";
2
+ import { hasOrgAdminUpdateRights } from "../portal-privilege";
3
+ /**
4
+ * Utility to determine if User has privileges to modify the status of a post
5
+ * @param channel
6
+ * @param user
7
+ * @returns {boolean}
8
+ */
9
+ export function canEditPostStatusV2(channel, user = {}) {
10
+ if (hasOrgAdminUpdateRights(user, channel.orgId)) {
11
+ return true;
12
+ }
13
+ const channelPermission = new ChannelPermission(channel);
14
+ return channelPermission.canModerateChannel(user);
15
+ }
16
+ //# sourceMappingURL=can-edit-post-status-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-edit-post-status-v2.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-edit-post-status-v2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC1D,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D;;;;;GAKG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAiB,EACjB,OAAiC,EAAE;IAEnC,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,OAAO,IAAI,CAAC;KACb;IAED,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IACzD,OAAO,iBAAiB,CAAC,kBAAkB,CAAC,IAAwB,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,61 @@
1
+ import { SharingAccess } from "../../types";
2
+ import { isOrgAdmin } from "../platform";
3
+ import { hasOrgAdminUpdateRights } from "../portal-privilege";
4
+ const ADMIN_GROUP_ROLES = Object.freeze(["owner", "admin"]);
5
+ /**
6
+ * Utility to determine if User has privileges to modify the status of a post
7
+ * @export
8
+ * @deprecated replace with canEditPostStatusV2 for v2 discussions
9
+ * @param channel
10
+ * @param user
11
+ * @returns {boolean}
12
+ */
13
+ export function canModifyPostStatus(channel, user = {}) {
14
+ return canEditPostStatus(channel, user);
15
+ }
16
+ /**
17
+ * Utility to determine if User has privileges to modify the status of a post
18
+ * @export
19
+ * @deprecated replace with canEditPostStatusV2 for v2 discussions
20
+ * @param channel
21
+ * @param user
22
+ * @returns {boolean}
23
+ */
24
+ export function canEditPostStatus(channel, user = {}) {
25
+ if (hasOrgAdminUpdateRights(user, channel.orgId)) {
26
+ return true;
27
+ }
28
+ return isAuthorizedToModifyStatusByLegacyPermissions(user, channel);
29
+ }
30
+ function isAuthorizedToModifyStatusByLegacyPermissions(user, channel) {
31
+ const { username, groups: userGroups = [] } = user;
32
+ const { access, groups: channelGroups = [], orgs: channelOrgs = [], creator: channelCreator, } = channel;
33
+ if (!username) {
34
+ return false;
35
+ }
36
+ if (channelCreator === username) {
37
+ return true;
38
+ }
39
+ if (access === SharingAccess.PRIVATE) {
40
+ return isAuthorizedToModifyStatusByLegacyGroup(channelGroups, userGroups);
41
+ }
42
+ // public or org access
43
+ return (isAuthorizedToModifyStatusByLegacyGroup(channelGroups, userGroups) ||
44
+ isLegacyChannelOrgAdmin(channelOrgs, user));
45
+ }
46
+ /**
47
+ * Ensure the user is an owner/admin of one of the channel groups
48
+ */
49
+ function isAuthorizedToModifyStatusByLegacyGroup(channelGroups, userGroups) {
50
+ return channelGroups.some((channelGroupId) => {
51
+ return userGroups.some((group) => {
52
+ const { id: userGroupId, userMembership: { memberType: userMemberType }, } = group;
53
+ return (channelGroupId === userGroupId &&
54
+ ADMIN_GROUP_ROLES.includes(userMemberType));
55
+ });
56
+ });
57
+ }
58
+ function isLegacyChannelOrgAdmin(channelOrgs, user) {
59
+ return isOrgAdmin(user) && channelOrgs.includes(user.orgId);
60
+ }
61
+ //# sourceMappingURL=can-edit-post-status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-edit-post-status.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-edit-post-status.ts"],"names":[],"mappings":"AACA,OAAO,EAA8B,aAAa,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC;AAE5D;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAiB,EACjB,OAAiC,EAAE;IAEnC,OAAO,iBAAiB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;AAC1C,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,OAAiB,EACjB,OAAiC,EAAE;IAEnC,IAAI,uBAAuB,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE;QAChD,OAAO,IAAI,CAAC;KACb;IAED,OAAO,6CAA6C,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACtE,CAAC;AAED,SAAS,6CAA6C,CACpD,IAA8B,EAC9B,OAAiB;IAEjB,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,EAAE,EAAE,GAAG,IAAI,CAAC;IACnD,MAAM,EACJ,MAAM,EACN,MAAM,EAAE,aAAa,GAAG,EAAE,EAC1B,IAAI,EAAE,WAAW,GAAG,EAAE,EACtB,OAAO,EAAE,cAAc,GACxB,GAAG,OAAO,CAAC;IAEZ,IAAI,CAAC,QAAQ,EAAE;QACb,OAAO,KAAK,CAAC;KACd;IAED,IAAI,cAAc,KAAK,QAAQ,EAAE;QAC/B,OAAO,IAAI,CAAC;KACb;IAED,IAAI,MAAM,KAAK,aAAa,CAAC,OAAO,EAAE;QACpC,OAAO,uCAAuC,CAAC,aAAa,EAAE,UAAU,CAAC,CAAC;KAC3E;IAED,uBAAuB;IACvB,OAAO,CACL,uCAAuC,CAAC,aAAa,EAAE,UAAU,CAAC;QAClE,uBAAuB,CAAC,WAAW,EAAE,IAAI,CAAC,CAC3C,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uCAAuC,CAC9C,aAAuB,EACvB,UAAoB;IAEpB,OAAO,aAAa,CAAC,IAAI,CAAC,CAAC,cAAsB,EAAE,EAAE;QACnD,OAAO,UAAU,CAAC,IAAI,CAAC,CAAC,KAAa,EAAE,EAAE;YACvC,MAAM,EACJ,EAAE,EAAE,WAAW,EACf,cAAc,EAAE,EAAE,UAAU,EAAE,cAAc,EAAE,GAC/C,GAAG,KAAK,CAAC;YAEV,OAAO,CACL,cAAc,KAAK,WAAW;gBAC9B,iBAAiB,CAAC,QAAQ,CAAC,cAAc,CAAC,CAC3C,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,uBAAuB,CAC9B,WAAqB,EACrB,IAA8B;IAE9B,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AAC9D,CAAC"}
@@ -0,0 +1,19 @@
1
+ import { ChannelPermission } from "../channel-permission";
2
+ /**
3
+ * Utility to determine if User has privileges to modify a post
4
+ * @param post
5
+ * @param user
6
+ * @param channel
7
+ * @returns {boolean}
8
+ */
9
+ export function canEditPostV2(post, user = {}, channel) {
10
+ const canReplyOrPost = post.parentId ? channel.allowReply : channel.allowPost;
11
+ const channelPermission = new ChannelPermission(channel);
12
+ return (isPostCreator(post, user) &&
13
+ canReplyOrPost &&
14
+ channelPermission.canPostToChannel(user));
15
+ }
16
+ function isPostCreator(post, user) {
17
+ return !!user.username && post.creator === user.username;
18
+ }
19
+ //# sourceMappingURL=can-edit-post-v2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"can-edit-post-v2.js","sourceRoot":"","sources":["../../../../../../src/discussions/api/utils/posts/can-edit-post-v2.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,IAAW,EACX,OAAiC,EAAE,EACnC,OAAiB;IAEjB,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IAC9E,MAAM,iBAAiB,GAAG,IAAI,iBAAiB,CAAC,OAAO,CAAC,CAAC;IAEzD,OAAO,CACL,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC;QACzB,cAAc;QACd,iBAAiB,CAAC,gBAAgB,CAAC,IAAI,CAAC,CACzC,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,IAAW,EAAE,IAA8B;IAChE,OAAO,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,QAAQ,CAAC;AAC3D,CAAC"}