Skip to content
This repository was archived by the owner on Jan 9, 2026. It is now read-only.

Commit 374adf3

Browse files
authored
Merge pull request #14 from workos/feature/sup-938-typescript-example-app-add-dsync-and
DSync Example App Update and Audit
2 parents 05808ba + ceb8314 commit 374adf3

File tree

14 files changed

+644
-686
lines changed

14 files changed

+644
-686
lines changed

typescript-directory-sync-example/README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,12 +46,19 @@ WORKOS_CLIENT_ID = your_project_id_here
4646
PORT = 8000
4747
```
4848

49-
## Run the server
49+
## Run the development server
5050

5151
```sh
5252
npm run dev
5353
```
5454

55+
## Compile TypeScript code and run the server
56+
57+
```sh
58+
npm run build
59+
npm start
60+
```
61+
5562
Head to `http://localhost:8000/` to navigate your directories!
5663

5764
## Testing Webhooks
Lines changed: 94 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,125 +1,151 @@
1-
import express, { Express } from 'express'
2-
import 'dotenv/config'
3-
import { WorkOS, Directory, Group, User } from '@workos-inc/node'
1+
import express, { Application, Request, Response } from 'express'
2+
import { WorkOS, Directory, Group, User, Webhook } from '@workos-inc/node'
3+
import { List } from '@workos-inc/node/lib/common/interfaces/list.interface'
44
import { Server, Socket } from 'socket.io'
55
import morgan from 'morgan'
6-
process.on('unhandledRejection', (reason, p) => { throw reason });
6+
import 'dotenv/config'
77

8-
const app: Express = express();
9-
const port = process.env.PORT || '8000'
10-
const workos = new WorkOS(process.env.WORKOS_API_KEY)
8+
const app: Application = express()
9+
const port: string = process.env.PORT || '8000'
10+
const workos: WorkOS = new WorkOS(process.env.WORKOS_API_KEY)
1111

1212
app.use('/public', express.static('public'))
1313
app.use(express.urlencoded({ extended: true }))
14-
app.set('view engine', 'ejs');
14+
app.set('view engine', 'ejs')
1515
app.use(express.json())
1616
app.use(morgan('dev'))
1717

18-
const server = app.listen(port, () => {
19-
console.log(`⚡️[server]: Server is running at https://localhost:${port}`);
20-
});
18+
process.on('unhandledRejection', (reason, p) => { throw reason })
19+
20+
const server = app.listen(port, (): void => {
21+
console.log(`⚡️[server]: Server is running at https://localhost:${port}`)
22+
})
2123

22-
const io = new Server(server)
24+
const io: Server = new Server(server)
2325

2426
io.on('connection', (socket: Socket) => {
25-
console.log('connected');
27+
console.log('connected')
2628

2729
socket.on('disconnect', () => {
28-
console.log('disconnected');
29-
});
30-
});
31-
32-
app.get("/", async (req, res) => {
33-
const directories = await workos.directorySync.listDirectories();
34-
res.render("index", {
35-
title: "Home",
36-
directories: directories.data
37-
});
38-
});
39-
40-
app.get('/directory/:id', async (req, res) => {
41-
const directories = await workos.directorySync.listDirectories();
42-
const directory = await directories.data.filter((directory: Directory) => {
43-
return directory.id == req.params.id
44-
})[0]
45-
res.render('directory.ejs', {
46-
directory: directory,
47-
title: "Directory"
30+
console.log('disconnected')
4831
})
4932
})
5033

51-
app.post('/webhooks', async (req, res) => {
52-
const webhook = workos.webhooks.constructEvent({
53-
payload: req.body,
54-
sigHeader: typeof req.headers['workos-signature'] === 'string' ? req.headers['workos-signature'] : "",
55-
secret: process.env.WORKOS_WEBHOOK_SECRET !== undefined ? process.env.WORKOS_WEBHOOK_SECRET : "",
56-
tolerance: 90000,
34+
app.get('/', async (req: Request, res: Response) => {
35+
let before: string | undefined = req.query.before ? req.query.before.toString() : undefined
36+
let after: string | undefined = req.query.after ? req.query.after.toString() : undefined
37+
38+
const directories: List<Directory> = await workos.directorySync.listDirectories({
39+
limit: 5,
40+
before: before,
41+
after: after,
42+
order: undefined
5743
})
58-
io.emit('webhook event', { webhook })
5944

60-
res.sendStatus(200)
45+
before = directories.list_metadata.before
46+
after = directories.list_metadata.after
47+
48+
res.render('index', {
49+
title: 'Home',
50+
directories: directories.data,
51+
before: before,
52+
after: after
53+
})
6154
})
6255

63-
app.get('/webhooks', async (req, res) => {
64-
res.render('webhooks.ejs', {
65-
title: "Webhooks"
66-
});
67-
});
56+
app.get('/directory/:id', async (req: Request, res: Response) => {
57+
const directories: List<Directory> = await workos.directorySync.listDirectories()
58+
const directory: Directory = directories.data.filter((directory: Directory) => {
59+
return directory.id == req.params.id
60+
})[0]
6861

69-
app.get('/directory/:id/usersgroups', async (req, res) => {
70-
const directories = await workos.directorySync.listDirectories();
71-
const directory = await directories.data.filter((directory: Directory) => {
62+
res.render('directory.ejs', {
63+
directory: directory,
64+
title: 'Directory'
65+
})
66+
})
67+
68+
app.get('/directory/:id/usersgroups', async (req: Request, res: Response) => {
69+
const directories: List<Directory> = await workos.directorySync.listDirectories()
70+
const directory: Directory = directories.data.filter((directory: Directory) => {
7271
return directory.id == req.params.id
7372
})[0]
74-
const groups = await workos.directorySync.listGroups({
73+
74+
const groups: List<Group> = await workos.directorySync.listGroups({
7575
directory: req.params.id,
76-
});
77-
const users = await workos.directorySync.listUsers({
76+
})
77+
78+
const users: List<User> = await workos.directorySync.listUsers({
7879
directory: req.params.id,
79-
});
80+
})
8081

8182
res.render('groups.ejs', {
8283
groups: groups.data,
8384
directory: directory,
8485
users: users.data,
85-
title: "Group & Users"
86+
title: 'Group & Users'
8687
})
8788
})
8889

89-
app.get('/directory/:id/group/:groupId', async (req, res) => {
90-
const directories = await workos.directorySync.listDirectories();
91-
const directory = await directories.data.filter((directory: Directory) => {
90+
app.get('/directory/:id/group/:groupId', async (req: Request, res: Response) => {
91+
const directories: List<Directory> = await workos.directorySync.listDirectories()
92+
const directory: Directory = directories.data.filter((directory: Directory) => {
9293
return directory.id == req.params.id
9394
})[0]
94-
const groups = await workos.directorySync.listGroups({
95+
96+
const groups: List<Group> = await workos.directorySync.listGroups({
9597
directory: req.params.id,
96-
});
97-
const group = await groups.data.filter((group: Group) => {
98+
})
99+
100+
const group: Group = groups.data.filter((group: Group) => {
98101
return group.id == req.params.groupId
99102
})[0]
103+
100104
res.render('group.ejs', {
101105
directory: directory,
102-
title: "Directory",
106+
title: 'Directory',
103107
group: JSON.stringify(group, null, 2),
104108
rawGroup: group
105109
})
106110
})
107111

108-
app.get('/directory/:id/user/:userId', async (req, res) => {
109-
const directories = await workos.directorySync.listDirectories();
110-
const directory = await directories.data.filter((directory: Directory) => {
112+
app.get('/directory/:id/user/:userId', async (req: Request, res: Response) => {
113+
const directories: List<Directory> = await workos.directorySync.listDirectories()
114+
const directory: Directory = directories.data.filter((directory: Directory) => {
111115
return directory.id == req.params.id
112116
})[0]
113-
const users = await workos.directorySync.listUsers({
117+
118+
const users: List<User> = await workos.directorySync.listUsers({
114119
directory: req.params.id,
115-
});
116-
const user = await users.data.filter((user: User) => {
120+
})
121+
122+
const user: User = users.data.filter((user: User) => {
117123
return user.id == req.params.userId
118124
})[0]
125+
119126
res.render('user', {
120127
directory: directory,
121-
title: "Directory",
128+
title: 'Directory',
122129
user: JSON.stringify(user, null, 2),
123130
rawUser: user
124131
})
125132
})
133+
134+
app.post('/webhooks', async (req: Request, res: Response) => {
135+
const webhook: Webhook = workos.webhooks.constructEvent({
136+
payload: req.body,
137+
sigHeader: typeof req.headers['workos-signature'] === 'string' ? req.headers['workos-signature'] : '',
138+
secret: process.env.WORKOS_WEBHOOK_SECRET !== undefined ? process.env.WORKOS_WEBHOOK_SECRET : '',
139+
tolerance: 90000,
140+
})
141+
142+
io.emit('webhook event', { webhook })
143+
144+
res.sendStatus(200)
145+
})
146+
147+
app.get('/webhooks', async (req: Request, res: Response) => {
148+
res.render('webhooks.ejs', {
149+
title: 'Webhooks'
150+
})
151+
})

0 commit comments

Comments
 (0)