Skip to content

Commit c216c2a

Browse files
committed
Add basic frontend
1 parent 67b67a8 commit c216c2a

20 files changed

+5415
-1
lines changed

docker-compose.yml

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,27 @@ services:
181181
- ZED_TOKEN=eoapi-secret-token
182182
volumes:
183183
- type: bind
184-
source: runtime/spicedb
184+
source: ./runtime/spicedb/init
185185
target: /home/spicedb
186186
depends_on:
187187
- spicedb
188188

189+
spicedb-ui:
190+
build:
191+
context: ./runtime/spicedb/spicedb-ui
192+
193+
# Set environment variables directly in the docker-compose file
194+
environment:
195+
ENV_VARIABLE: ${ENV_VARIABLE}
196+
NEXT_PUBLIC_ENV_VARIABLE: ${NEXT_PUBLIC_ENV_VARIABLE}
197+
198+
volumes:
199+
- ./runtime/spicedb/spicedb-ui/src:/app/src
200+
- ./runtime/spicedb/spicedb-ui/public:/app/public
201+
restart: always
202+
ports:
203+
- 3000:3000
204+
189205
networks:
190206
default:
191207
name: eoapi-network
File renamed without changes.

runtime/spicedb/init/zed.yaml

Lines changed: 138 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
schema: |-
2+
definition user {}
3+
4+
definition anonymous_user {}
5+
6+
definition team {
7+
// Recursive team structure to support groups of groups
8+
relation owner: user | team#owner_or_member
9+
relation member: user
10+
permission owner_or_member = member + owner
11+
}
12+
13+
definition collection {
14+
// Recursive collection structure to support collections of collections
15+
relation collection: collection
16+
relation owner: user | team#owner_or_member
17+
relation editor: user | team#owner_or_member
18+
relation reader: user | team#owner_or_member | user:*
19+
20+
// Collection-level permissions
21+
permission read = reader + update
22+
permission update = editor + editor->owner_or_member + delete
23+
permission delete = owner + owner->owner_or_member
24+
permission make_public = delete
25+
permission transfer_ownership = owner + owner->owner_or_member
26+
27+
// Item-level permissions
28+
permission add_item = update
29+
}
30+
31+
definition item {
32+
relation collection: collection
33+
relation reader: user | team#owner_or_member | anonymous_user:*
34+
// Permissions are mostly inherited from collection, except support for one-off read permissions
35+
permission read = reader + collection->read
36+
permission update = collection->update
37+
permission delete = collection->update
38+
}
39+
relationships: |-
40+
team:super_admins#owner@user:alice
41+
team:admins#owner@team:super_admins#owner_or_member
42+
team:editors#owner@team:admins#owner_or_member
43+
team:editors#member@user:bob
44+
collection:public#owner@team:editors#owner_or_member
45+
collection:public#editor@team:editors#owner_or_member
46+
collection:public#reader@user:*
47+
collection:private#owner@team:admins#owner_or_member
48+
item:public/001#collection@collection:public
49+
item:public/002#collection@collection:public
50+
item:public/003#collection@collection:public
51+
item:public/004#collection@collection:public
52+
item:public/005#collection@collection:public
53+
item:public/006#collection@collection:public
54+
item:public/007#collection@collection:public
55+
item:public/008#collection@collection:public
56+
item:public/009#collection@collection:public
57+
item:public/010#collection@collection:public
58+
item:private/001#collection@collection:private
59+
item:private/002#collection@collection:private
60+
item:private/003#collection@collection:private
61+
item:private/004#collection@collection:private
62+
item:private/005#collection@collection:private
63+
item:private/006#collection@collection:private
64+
item:private/007#collection@collection:private
65+
item:private/008#collection@collection:private
66+
item:private/009#collection@collection:private
67+
item:private/010#collection@collection:priva
68+
assertions:
69+
assertTrue:
70+
- collection:public#read@user:alice
71+
- collection:public#read@user:0
72+
- item:public/001#read@user:0
73+
- collection:public#read@user:alice
74+
- collection:public#add_item@user:alice
75+
- collection:public#update@user:alice
76+
- collection:public#delete@user:alice
77+
- collection:public#add_item@user:bob
78+
- collection:public#delete@user:bob
79+
- collection:private#read@user:alice
80+
- collection:private#add_item@user:alice
81+
- item:private/001#read@user:alice
82+
- item:private/001#delete@user:alice
83+
- item:public/001#read@user:some-new-user
84+
assertFalse:
85+
- collection:private#add_item@user:bob
86+
- collection:public#add_item@user:0
87+
- collection:private#add_item@user:0
88+
- item:private/001#delete@user:0
89+
- item:private/002#read@user:0
90+
validation:
91+
collection:private#add_item:
92+
- "[team:admins#owner_or_member] is <collection:private#owner>"
93+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
94+
- "[user:alice] is <team:super_admins#owner>"
95+
collection:private#read:
96+
- "[team:admins#owner_or_member] is <collection:private#owner>"
97+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
98+
- "[user:alice] is <team:super_admins#owner>"
99+
collection:private#transfer_ownership:
100+
- "[team:admins#owner_or_member] is <collection:private#owner>"
101+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
102+
- "[user:alice] is <team:super_admins#owner>"
103+
collection:public#add_item:
104+
- "[team:admins#owner_or_member] is <team:editors#owner>"
105+
- "[team:editors#owner_or_member] is <collection:public#editor>/<collection:public#owner>"
106+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
107+
- "[user:alice] is <team:super_admins#owner>"
108+
- "[user:bob] is <team:editors#member>"
109+
collection:public#delete:
110+
- "[team:admins#owner_or_member] is <team:editors#owner>"
111+
- "[team:editors#owner_or_member] is <collection:public#owner>"
112+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
113+
- "[user:alice] is <team:super_admins#owner>"
114+
- "[user:bob] is <team:editors#member>"
115+
collection:public#read:
116+
- "[team:admins#owner_or_member] is <team:editors#owner>"
117+
- "[team:editors#owner_or_member] is <collection:public#editor>/<collection:public#owner>"
118+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
119+
- "[user:*] is <collection:public#reader>"
120+
- "[user:alice] is <team:super_admins#owner>"
121+
- "[user:bob] is <team:editors#member>"
122+
collection:public#transfer_ownership:
123+
- "[team:admins#owner_or_member] is <team:editors#owner>"
124+
- "[team:editors#owner_or_member] is <collection:public#owner>"
125+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
126+
- "[user:alice] is <team:super_admins#owner>"
127+
- "[user:bob] is <team:editors#member>"
128+
item:private/002#read:
129+
- "[team:admins#owner_or_member] is <collection:private#owner>"
130+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
131+
- "[user:alice] is <team:super_admins#owner>"
132+
item:public/001#read:
133+
- "[team:admins#owner_or_member] is <team:editors#owner>"
134+
- "[team:editors#owner_or_member] is <collection:public#editor>/<collection:public#owner>"
135+
- "[team:super_admins#owner_or_member] is <team:admins#owner>"
136+
- "[user:*] is <collection:public#reader>"
137+
- "[user:alice] is <team:super_admins#owner>"
138+
- "[user:bob] is <team:editors#member>"
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
node_modules
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"extends": "next/core-web-vitals"
3+
}

runtime/spicedb/spicedb-ui/.gitignore

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
2+
3+
# dependencies
4+
/node_modules
5+
/.pnp
6+
.pnp.js
7+
.yarn/install-state.gz
8+
9+
# testing
10+
/coverage
11+
12+
# next.js
13+
/.next/
14+
/out/
15+
16+
# production
17+
/build
18+
19+
# misc
20+
.DS_Store
21+
*.pem
22+
23+
# debug
24+
npm-debug.log*
25+
yarn-debug.log*
26+
yarn-error.log*
27+
28+
# local env files
29+
.env*.local
30+
31+
# vercel
32+
.vercel
33+
34+
# typescript
35+
*.tsbuildinfo
36+
next-env.d.ts

runtime/spicedb/spicedb-ui/Dockerfile

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
FROM node:18-alpine
2+
3+
WORKDIR /app
4+
5+
# Install dependencies based on the preferred package manager
6+
COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./
7+
RUN \
8+
if [ -f yarn.lock ]; then yarn --frozen-lockfile; \
9+
elif [ -f package-lock.json ]; then npm ci; \
10+
elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i; \
11+
# Allow install without lockfile, so example works even without Node.js installed locally
12+
else echo "Warning: Lockfile not found. It is recommended to commit lockfiles to version control." && yarn install; \
13+
fi
14+
15+
COPY src ./src
16+
COPY public ./public
17+
COPY next.config.* .
18+
COPY postcss.config.js .
19+
COPY tailwind.config.ts .
20+
COPY tsconfig.json .
21+
22+
# Next.js collects completely anonymous telemetry data about general usage. Learn more here: https://nextjs.org/telemetry
23+
# Uncomment the following line to disable telemetry at run time
24+
# ENV NEXT_TELEMETRY_DISABLED 1
25+
26+
# Note: Don't expose ports here, Compose will handle that for us
27+
28+
# Start Next.js in development mode based on the preferred package manager
29+
CMD \
30+
if [ -f yarn.lock ]; then yarn dev; \
31+
elif [ -f package-lock.json ]; then npm run dev; \
32+
elif [ -f pnpm-lock.yaml ]; then pnpm dev; \
33+
else npm run dev; \
34+
fi

runtime/spicedb/spicedb-ui/README.md

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
2+
3+
## Getting Started
4+
5+
First, run the development server:
6+
7+
```bash
8+
npm run dev
9+
# or
10+
yarn dev
11+
# or
12+
pnpm dev
13+
# or
14+
bun dev
15+
```
16+
17+
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
18+
19+
You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file.
20+
21+
This project uses [`next/font`](https://nextjs.org/docs/basic-features/font-optimization) to automatically optimize and load Inter, a custom Google Font.
22+
23+
## Learn More
24+
25+
To learn more about Next.js, take a look at the following resources:
26+
27+
- [Next.js Documentation](https://nextjs.org/docs) - learn about Next.js features and API.
28+
- [Learn Next.js](https://nextjs.org/learn) - an interactive Next.js tutorial.
29+
30+
You can check out [the Next.js GitHub repository](https://github.com/vercel/next.js/) - your feedback and contributions are welcome!
31+
32+
## Deploy on Vercel
33+
34+
The easiest way to deploy your Next.js app is to use the [Vercel Platform](https://vercel.com/new?utm_medium=default-template&filter=next.js&utm_source=create-next-app&utm_campaign=create-next-app-readme) from the creators of Next.js.
35+
36+
Check out our [Next.js deployment documentation](https://nextjs.org/docs/deployment) for more details.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
/** @type {import('next').NextConfig} */
2+
const nextConfig = {};
3+
4+
export default nextConfig;

0 commit comments

Comments
 (0)