@edgedev/create-edge-app 1.0.48 → 1.0.50

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 (37) hide show
  1. package/.nvmrc +1 -0
  2. package/components/ui/sidebar/Sidebar.vue +85 -0
  3. package/components/ui/sidebar/SidebarContent.vue +17 -0
  4. package/components/ui/sidebar/SidebarFooter.vue +17 -0
  5. package/components/ui/sidebar/SidebarGroup.vue +17 -0
  6. package/components/ui/sidebar/SidebarGroupAction.vue +27 -0
  7. package/components/ui/sidebar/SidebarGroupContent.vue +17 -0
  8. package/components/ui/sidebar/SidebarGroupLabel.vue +24 -0
  9. package/components/ui/sidebar/SidebarHeader.vue +17 -0
  10. package/components/ui/sidebar/SidebarInput.vue +21 -0
  11. package/components/ui/sidebar/SidebarInset.vue +20 -0
  12. package/components/ui/sidebar/SidebarMenu.vue +17 -0
  13. package/components/ui/sidebar/SidebarMenuAction.vue +34 -0
  14. package/components/ui/sidebar/SidebarMenuBadge.vue +25 -0
  15. package/components/ui/sidebar/SidebarMenuButton.vue +49 -0
  16. package/components/ui/sidebar/SidebarMenuButtonChild.vue +33 -0
  17. package/components/ui/sidebar/SidebarMenuItem.vue +17 -0
  18. package/components/ui/sidebar/SidebarMenuSkeleton.vue +33 -0
  19. package/components/ui/sidebar/SidebarMenuSub.vue +21 -0
  20. package/components/ui/sidebar/SidebarMenuSubButton.vue +35 -0
  21. package/components/ui/sidebar/SidebarMenuSubItem.vue +9 -0
  22. package/components/ui/sidebar/SidebarProvider.vue +80 -0
  23. package/components/ui/sidebar/SidebarRail.vue +32 -0
  24. package/components/ui/sidebar/SidebarSeparator.vue +18 -0
  25. package/components/ui/sidebar/SidebarTrigger.vue +26 -0
  26. package/components/ui/sidebar/index.ts +59 -0
  27. package/components/ui/sidebar/utils.ts +19 -0
  28. package/firebase.json +1 -0
  29. package/package.json +1 -1
  30. package/firestore.rules +0 -342
  31. package/firestore.rules.backup +0 -323
  32. package/functions/.env.dev +0 -7
  33. package/functions/.env.prod +0 -7
  34. package/functions/index.js +0 -7
  35. package/functions/package.json +0 -37
  36. package/functions/stripe.js +0 -103
  37. package/storage.rules +0 -61
@@ -0,0 +1,18 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { Separator } from '@/components/ui/separator'
4
+ import { cn } from '@/lib/utils'
5
+
6
+ const props = defineProps<{
7
+ class?: HTMLAttributes['class']
8
+ }>()
9
+ </script>
10
+
11
+ <template>
12
+ <Separator
13
+ data-sidebar="separator"
14
+ :class="cn('mx-2 w-auto bg-sidebar-border', props.class)"
15
+ >
16
+ <slot />
17
+ </Separator>
18
+ </template>
@@ -0,0 +1,26 @@
1
+ <script setup lang="ts">
2
+ import type { HTMLAttributes } from 'vue'
3
+ import { Button } from '@/components/ui/button'
4
+ import { cn } from '@/lib/utils'
5
+ import { PanelLeft } from 'lucide-vue-next'
6
+ import { useSidebar } from './utils'
7
+
8
+ const props = defineProps<{
9
+ class?: HTMLAttributes['class']
10
+ }>()
11
+
12
+ const { toggleSidebar } = useSidebar()
13
+ </script>
14
+
15
+ <template>
16
+ <Button
17
+ data-sidebar="trigger"
18
+ variant="ghost"
19
+ size="icon"
20
+ :class="cn('h-7 w-7', props.class)"
21
+ @click="toggleSidebar"
22
+ >
23
+ <PanelLeft />
24
+ <span class="sr-only">Toggle Sidebar</span>
25
+ </Button>
26
+ </template>
@@ -0,0 +1,59 @@
1
+ import type { HTMLAttributes } from 'vue'
2
+ import { cva, type VariantProps } from 'class-variance-authority'
3
+
4
+ export interface SidebarProps {
5
+ side?: 'left' | 'right'
6
+ variant?: 'sidebar' | 'floating' | 'inset'
7
+ collapsible?: 'offcanvas' | 'icon' | 'none'
8
+ class?: HTMLAttributes['class']
9
+ }
10
+
11
+ export { default as Sidebar } from './Sidebar.vue'
12
+ export { default as SidebarContent } from './SidebarContent.vue'
13
+ export { default as SidebarFooter } from './SidebarFooter.vue'
14
+ export { default as SidebarGroup } from './SidebarGroup.vue'
15
+ export { default as SidebarGroupAction } from './SidebarGroupAction.vue'
16
+ export { default as SidebarGroupContent } from './SidebarGroupContent.vue'
17
+ export { default as SidebarGroupLabel } from './SidebarGroupLabel.vue'
18
+ export { default as SidebarHeader } from './SidebarHeader.vue'
19
+ export { default as SidebarInput } from './SidebarInput.vue'
20
+ export { default as SidebarInset } from './SidebarInset.vue'
21
+ export { default as SidebarMenu } from './SidebarMenu.vue'
22
+ export { default as SidebarMenuAction } from './SidebarMenuAction.vue'
23
+ export { default as SidebarMenuBadge } from './SidebarMenuBadge.vue'
24
+ export { default as SidebarMenuButton } from './SidebarMenuButton.vue'
25
+ export { default as SidebarMenuItem } from './SidebarMenuItem.vue'
26
+ export { default as SidebarMenuSkeleton } from './SidebarMenuSkeleton.vue'
27
+ export { default as SidebarMenuSub } from './SidebarMenuSub.vue'
28
+ export { default as SidebarMenuSubButton } from './SidebarMenuSubButton.vue'
29
+ export { default as SidebarMenuSubItem } from './SidebarMenuSubItem.vue'
30
+ export { default as SidebarProvider } from './SidebarProvider.vue'
31
+ export { default as SidebarRail } from './SidebarRail.vue'
32
+ export { default as SidebarSeparator } from './SidebarSeparator.vue'
33
+ export { default as SidebarTrigger } from './SidebarTrigger.vue'
34
+
35
+ export { useSidebar } from './utils'
36
+
37
+ export const sidebarMenuButtonVariants = cva(
38
+ 'peer/menu-button flex w-full items-center gap-2 overflow-hidden rounded-md p-2 text-left text-sm outline-none ring-sidebar-ring transition-[width,height,padding] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground focus-visible:ring-2 active:bg-sidebar-accent active:text-sidebar-accent-foreground disabled:pointer-events-none disabled:opacity-50 group-has-[[data-sidebar=menu-action]]/menu-item:pr-8 aria-disabled:pointer-events-none aria-disabled:opacity-50 data-[active=true]:bg-sidebar-accent data-[active=true]:font-medium data-[active=true]:text-sidebar-accent-foreground data-[state=open]:hover:bg-sidebar-accent data-[state=open]:hover:text-sidebar-accent-foreground group-data-[collapsible=icon]:!size-8 group-data-[collapsible=icon]:!p-2 [&>span:last-child]:truncate [&>svg]:size-4 [&>svg]:shrink-0',
39
+ {
40
+ variants: {
41
+ variant: {
42
+ default: 'hover:bg-sidebar-accent hover:text-sidebar-accent-foreground',
43
+ outline:
44
+ 'bg-background shadow-[0_0_0_1px_hsl(var(--sidebar-border))] hover:bg-sidebar-accent hover:text-sidebar-accent-foreground hover:shadow-[0_0_0_1px_hsl(var(--sidebar-accent))]',
45
+ },
46
+ size: {
47
+ default: 'h-8 text-sm',
48
+ sm: 'h-7 text-xs',
49
+ lg: 'h-12 text-sm group-data-[collapsible=icon]:!p-0',
50
+ },
51
+ },
52
+ defaultVariants: {
53
+ variant: 'default',
54
+ size: 'default',
55
+ },
56
+ },
57
+ )
58
+
59
+ export type SidebarMenuButtonVariants = VariantProps<typeof sidebarMenuButtonVariants>
@@ -0,0 +1,19 @@
1
+ import type { ComputedRef, Ref } from 'vue'
2
+ import { createContext } from 'radix-vue'
3
+
4
+ export const SIDEBAR_COOKIE_NAME = 'sidebar:state'
5
+ export const SIDEBAR_COOKIE_MAX_AGE = 60 * 60 * 24 * 7
6
+ export const SIDEBAR_WIDTH = '16rem'
7
+ export const SIDEBAR_WIDTH_MOBILE = '18rem'
8
+ export const SIDEBAR_WIDTH_ICON = '3rem'
9
+ export const SIDEBAR_KEYBOARD_SHORTCUT = 'b'
10
+
11
+ export const [useSidebar, provideSidebarContext] = createContext<{
12
+ state: ComputedRef<'expanded' | 'collapsed'>
13
+ open: Ref<boolean>
14
+ setOpen: (value: boolean) => void
15
+ isMobile: Ref<boolean>
16
+ openMobile: Ref<boolean>
17
+ setOpenMobile: (value: boolean) => void
18
+ toggleSidebar: () => void
19
+ }>('Sidebar')
package/firebase.json CHANGED
@@ -5,6 +5,7 @@
5
5
  },
6
6
  "functions": [
7
7
  {
8
+ "region": "us-west2",
8
9
  "source": "functions",
9
10
  "codebase": "default",
10
11
  "ignore": [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edgedev/create-edge-app",
3
- "version": "1.0.48",
3
+ "version": "1.0.50",
4
4
  "description": "Create Edge Starter App",
5
5
  "bin": {
6
6
  "create-edge-app": "./bin/cli.js"
package/firestore.rules DELETED
@@ -1,342 +0,0 @@
1
- rules_version = '2';
2
- // #EDGE FIREBASE RULES START
3
- service cloud.firestore {
4
-
5
- match /databases/{database}/documents/phone-auth/{phone} {
6
- allow read: if false;
7
- allow create: if false;
8
- allow update: if false;
9
- allow delete: if false;
10
- }
11
-
12
- match /databases/{database}/documents/topic-queue/{topic} {
13
- allow read: if false;
14
- allow create: if false;
15
- allow update: if false;
16
- allow delete: if false;
17
- }
18
-
19
-
20
- match /databases/{database}/documents/public-users/{user} {
21
- allow read: if request.auth != null;
22
- allow list: if request.auth != null;
23
- allow create: if false;
24
- allow update: if false;
25
- allow delete: if false;
26
- }
27
-
28
- match /databases/{database}/documents/events/{event} {
29
- allow read: if false;
30
- allow create: if false;
31
- allow update: if false;
32
- allow delete: if false;
33
- }
34
-
35
-
36
- match /databases/{database}/documents/system/{event} {
37
- allow read: if false;
38
- allow create: if false;
39
- allow update: if false;
40
- allow delete: if false;
41
- }
42
-
43
- match /databases/{database}/documents/rule-helpers/{helper} {
44
- allow read: if false;
45
- allow create: if request.auth.uid == request.resource.data.uid;
46
- allow update: if request.auth.uid == request.resource.data.uid;
47
- allow delete: if false;
48
- }
49
-
50
- match /databases/{database}/documents/users/{user} {
51
- function readSelf() {
52
- return resource == null ||
53
- (
54
- "userId" in resource.data &&
55
- resource.data.userId == request.auth.uid
56
- );
57
- }
58
-
59
- allow read: if readSelf();
60
- allow create: if false;
61
- allow update: if false;
62
- allow delete: if false;
63
- }
64
-
65
- match /databases/{database}/documents/collection-data/{collectionPath} {
66
- // TODO: these rules need tested.
67
- function getRolePermission(role, permissionCheck) {
68
- let permissions = {
69
- 'admin': {'assign': true, 'delete': true, 'read': true, 'write': true},
70
- 'editor': {'assign': false, 'delete': true, 'read': true, 'write': true},
71
- 'user': {'assign': false, 'delete': false, 'read': true, 'write': false},
72
- 'writer': {'assign': false, 'delete': false, 'read': true, 'write': true}
73
- };
74
- return permissions[role][permissionCheck];
75
- }
76
- function canAssign() {
77
- let user = get(/databases/$(database)/documents/users/$(request.auth.uid)).data;
78
- let ruleHelper = get(/databases/$(database)/documents/rule-helpers/$(request.auth.uid)).data['edge-assignment-helper'];
79
- return collectionPath.matches("^" + ruleHelper[collectionPath].permissionCheckPath + ".*$") &&
80
- (
81
- "specialPermissions" in user &&
82
- ruleHelper[collectionPath].permissionCheckPath in user.specialPermissions &&
83
- "assign" in user.specialPermissions[ruleHelper[collectionPath].permissionCheckPath] &&
84
- user.specialPermissions[ruleHelper[collectionPath].permissionCheckPath]["assign"]
85
- ) ||
86
- (
87
- "roles" in user &&
88
- ruleHelper[collectionPath].permissionCheckPath in user.roles &&
89
- "role" in user.roles[ruleHelper[collectionPath].permissionCheckPath] &&
90
- getRolePermission(user.roles[ruleHelper[collectionPath].permissionCheckPath].role, "assign")
91
- );
92
- }
93
- allow read: if request.auth != null; // All signed in users can read collection-data
94
- allow create: if canAssign();
95
- allow update: if canAssign();
96
- allow delete: if canAssign();
97
- }
98
-
99
- match /databases/{database}/documents/staged-users/{user} {
100
-
101
- function canUpdate() {
102
- let user = get(/databases/$(database)/documents/users/$(request.auth.uid)).data;
103
- let ruleHelper = get(/databases/$(database)/documents/rule-helpers/$(request.auth.uid)).data;
104
-
105
- return (
106
- request.auth.uid == request.resource.data.uid &&
107
- (
108
- (
109
- (
110
- request.resource.data.userId == resource.data.userId ||
111
- resource.data.userId == ""
112
- ) &&
113
- (
114
- request.resource.data.userId == request.auth.uid ||
115
- request.resource.data.templateUserId == request.auth.uid
116
- )
117
- ) ||
118
- (
119
- request.resource.data.userId == resource.data.userId &&
120
- "edge-assignment-helper" in ruleHelper &&
121
- permissionUpdatesCheck(user, ruleHelper, "roles") &&
122
- permissionUpdatesCheck(user, ruleHelper, "specialPermssions")
123
- )
124
- )
125
- );
126
-
127
- }
128
-
129
-
130
- function permissionUpdatesCheck(user, ruleHelper, permissionType) {
131
- return !(permissionType in request.resource.data) ||
132
- (
133
- resource.data.userId == request.auth.uid &&
134
- request.resource.data[permissionType].keys().hasOnly(resource.data[permissionType].keys())
135
- ) ||
136
- (
137
- resource.data.userId != request.auth.uid &&
138
- permissionCheck(permissionType, user, ruleHelper)
139
- );
140
- }
141
- function permissionCheck(permissionType, user, ruleHelper) {
142
- let lastPathUpdated = ruleHelper["edge-assignment-helper"].fullPath;
143
- let permissionCheckPath = ruleHelper["edge-assignment-helper"].permissionCheckPath;
144
- return request.resource.data[permissionType].diff(resource.data[permissionType]).affectedKeys().size() == 0 ||
145
- (
146
- request.resource.data[permissionType].diff(resource.data[permissionType]).affectedKeys().size() == 1 &&
147
- request.resource.data[permissionType].diff(resource.data[permissionType]).affectedKeys() == [lastPathUpdated].toSet() &&
148
- (
149
- permissionCheckPath == "-" ||
150
- lastPathUpdated.matches("^" + permissionCheckPath + ".*$")
151
- ) &&
152
- (
153
- (
154
- "roles" in user &&
155
- getRolePermission(user.roles[permissionCheckPath].role, "assign")
156
- ) ||
157
- (
158
- "specialPermissions" in user &&
159
- permissionCheckPath in user.specialPermissions &&
160
- "assign" in user.specialPermissions[permissionCheckPath] &&
161
- user.specialPermissions[permissionCheckPath]["assign"]
162
- )
163
- )
164
- );
165
- }
166
-
167
- function canAssign(user, ruleHelper) {
168
- return request.auth != null &&
169
- "edge-assignment-helper" in ruleHelper &&
170
- (
171
- (
172
- "roles" in user &&
173
- ruleHelper["edge-assignment-helper"].permissionCheckPath in user.roles &&
174
- getRolePermission(user.roles[ruleHelper["edge-assignment-helper"].permissionCheckPath].role, 'assign')
175
- ) ||
176
- (
177
- "specialPermissions" in user &&
178
- ruleHelper["edge-assignment-helper"].permissionCheckPath in user.specialPermissions &&
179
- "assign" in user.specialPermissions[ruleHelper["edge-assignment-helper"].permissionCheckPath] &&
180
- user.specialPermissions[ruleHelper["edge-assignment-helper"].permissionCheckPath]["assign"]
181
- )
182
- )
183
- }
184
-
185
- function canAssignSubCreatePath(user, ruleHelper) {
186
- let permissionCheckPath = ruleHelper["edge-assignment-helper"].permissionCheckPath;
187
- return (
188
- !("subCreate" in request.resource.data) ||
189
- (
190
- "subCreate" in request.resource.data &&
191
- request.resource.data.subCreate.keys().size() == 0
192
- )
193
- )||
194
- (
195
- permissionCheckPath == "-" ||
196
- request.resource.data.subCreate.rootPath.matches("^" + permissionCheckPath + ".*$")
197
- ) &&
198
- (
199
- (
200
- "roles" in user &&
201
- permissionCheckPath in user.roles &&
202
- getRolePermission(user.roles[permissionCheckPath].role, "assign")
203
- ) ||
204
- (
205
- "specialPermissions" in user &&
206
- permissionCheckPath in user.specialPermissions &&
207
- "assign" in user.specialPermissions[permissionCheckPath] &&
208
- user.specialPermissions[permissionCheckPath]["assign"]
209
- )
210
- )
211
-
212
- }
213
-
214
- function canList() {
215
- let user = get(/databases/$(database)/documents/users/$(request.auth.uid)).data;
216
- let ruleHelper = get(/databases/$(database)/documents/rule-helpers/$(request.auth.uid)).data;
217
- return canAssign(user, ruleHelper);
218
- }
219
-
220
- function canCreate() {
221
- let user = get(/databases/$(database)/documents/users/$(request.auth.uid)).data;
222
- let ruleHelper = get(/databases/$(database)/documents/rule-helpers/$(request.auth.uid)).data;
223
- return noPermissionData() && canAssign(user, ruleHelper) && canAssignSubCreatePath(user, ruleHelper);
224
- }
225
-
226
- function noPermissionData() {
227
- return request.resource.data.roles.size() == 0 && request.resource.data.specialPermissions.size() == 0;
228
- }
229
-
230
- function getRolePermission(role, permissionCheck) {
231
- let permissions = {
232
- 'admin': {'assign': true, 'delete': true, 'read': true, 'write': true},
233
- 'editor': {'assign': false, 'delete': true, 'read': true, 'write': true},
234
- 'user': {'assign': false, 'delete': false, 'read': true, 'write': false},
235
- 'writer': {'assign': false, 'delete': false, 'read': true, 'write': true}
236
- };
237
- return permissions[role][permissionCheck];
238
- }
239
-
240
- function canGet () {
241
- return resource == null ||
242
- ("userId" in resource.data && resource.data.userId == "") ||
243
- ("userId" in resource.data && resource.data.userId == request.auth.uid) ||
244
- canAssign(get(/databases/$(database)/documents/users/$(request.auth.uid)).data, get(/databases/$(database)/documents/rule-helpers/$(request.auth.uid)).data);
245
- }
246
- allow get: if canGet();
247
- allow list: if canList();
248
- allow create: if canCreate();
249
- allow update: if canUpdate();
250
- allow delete: if false // TODO if isTemplate is true... can delete... otherwise users never deleted just removed from collection paths
251
- }
252
-
253
- match /databases/{database}/documents/{seg1} {
254
- function getRolePermission(role, permissionCheck) {
255
- let permissions = {
256
- 'admin': {'assign': true, 'delete': true, 'read': true, 'write': true},
257
- 'editor': {'assign': false, 'delete': true, 'read': true, 'write': true},
258
- 'user': {'assign': false, 'delete': false, 'read': true, 'write': false},
259
- 'writer': {'assign': false, 'delete': false, 'read': true, 'write': true}
260
- };
261
- return permissions[role][permissionCheck];
262
- }
263
- function checkPermission(collectionPath, permissionCheck) {
264
- let user = get(/databases/$(database)/documents/users/$(request.auth.uid)).data;
265
- let skipPaths = ["collection-data", "users", "staged-users", "events", "rule-helpers", "phone-auth", "public-users", "topic-queue"];
266
- let ruleHelper = get(/databases/$(database)/documents/rule-helpers/$(request.auth.uid)).data;
267
- return !(collectionPath in skipPaths) &&
268
- !(permissionCheck == "write" &&
269
- (
270
- ("stripeCustomerId" in request.resource.data && (!("stripeCustomerId" in resource.data) || resource.data.stripeCustomerId != request.resource.data.stripeCustomerId)) ||
271
- ("stripeSubscription" in request.resource.data && (!("stripeSubscription" in resource.data) || resource.data.stripeSubscription != request.resource.data.stripeSubscription)) ||
272
- ("stripeProductId" in request.resource.data && (!("stripeProductId" in resource.data) || resource.data.stripeProductId != request.resource.data.stripeProductId)) ||
273
- ("stripePriceId" in request.resource.data && (!("stripePriceId" in resource.data) || resource.data.stripePriceId != request.resource.data.stripePriceId))
274
- )
275
- ) &&
276
- request.auth != null &&
277
- collectionPath in ruleHelper &&
278
- "permissionCheckPath" in ruleHelper[collectionPath] &&
279
- (
280
- ruleHelper[collectionPath].permissionCheckPath == "-" ||
281
- collectionPath.matches("^" + ruleHelper[collectionPath].permissionCheckPath + ".*$")
282
- ) &&
283
- (
284
- (
285
- "roles" in user &&
286
- ruleHelper[collectionPath].permissionCheckPath in user.roles &&
287
- getRolePermission(user.roles[ruleHelper[collectionPath].permissionCheckPath].role, permissionCheck)
288
- ) ||
289
- (
290
- "specialPermissions" in user &&
291
- ruleHelper[collectionPath].permissionCheckPath in user.specialPermissions &&
292
- permissionCheck in user.specialPermissions[ruleHelper[collectionPath].permissionCheckPath] &&
293
- user.specialPermissions[ruleHelper[collectionPath].permissionCheckPath][permissionCheck]
294
- )
295
- );
296
- }
297
- match /{seg2} {
298
- allow get: if checkPermission(seg1 + "-" + seg2, "read");
299
- allow list: if checkPermission(seg1, "read");
300
- allow create: if request.auth.uid == request.resource.data.uid && checkPermission(seg1, "write");
301
- allow update: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2, "write");
302
- allow delete: if checkPermission(seg1, "delete");
303
- match /{seg3} {
304
- allow get: if checkPermission(seg1 + "-" + seg2 + "-" + seg3, "read");
305
- allow list: if checkPermission(seg1 + "-" + seg2, "read");
306
- allow create: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2, "write");
307
- allow update: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3, "write");
308
- allow delete: if checkPermission(seg1 + "-" + seg2, "delete");
309
- match /{seg4} {
310
- allow get: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4, "read");
311
- allow list: if checkPermission(seg1 + "-" + seg2 + "-" + seg3, "read");
312
- allow create: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3, "write");
313
- allow update: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4, "write");
314
- allow delete: if checkPermission(seg1 + "-" + seg2 + "-" + seg3, "delete");
315
-
316
- match /{seg5} {
317
- allow get: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5, "read");
318
- allow list: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4, "read");
319
- allow create: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4, "write");
320
- allow update: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5, "write");
321
- allow delete: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4, "delete");
322
- match /{seg6} {
323
- allow get: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5 + "-" + seg6, "read");
324
- allow list: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5, "read");
325
- allow create: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5, "write");
326
- allow update: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5 + "-" + seg6, "write");
327
- allow delete: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5, "delete");
328
- match /{seg7} {
329
- allow get: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5 + "-" + seg6 + "-" + seg7, "read");
330
- allow list: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5 + "-" + seg6, "read");
331
- allow create: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5 + "-" + seg6, "write");
332
- allow update: if request.auth.uid == request.resource.data.uid && checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5 + "-" + seg6 + "-" + seg7, "write");
333
- allow delete: if checkPermission(seg1 + "-" + seg2 + "-" + seg3 + "-" + seg4 + "-" + seg5 + "-" + seg6, "delete");
334
- }
335
- }
336
- }
337
- }
338
- }
339
- }
340
- }
341
- }
342
- // #EDGE FIREBASE RULES END