Skip to content

Commit 7bfe323

Browse files
authored
PLU-289: Tiles v2 (#1051)
## Tiles v2 ### Staging - [x] Ensure new aurora db is created with Pulumi - [x] Add env vars into paramater store - [x] Add launch darkly whitelist group - [x] Run migration ### Prod - [x] Ensure new aurora db is created with Pulumi - [x] Add env vars into paramater store - [x] Add launch darkly whitelist group - [x] Run migration
1 parent ba6619c commit 7bfe323

File tree

100 files changed

+4724
-2057
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

100 files changed

+4724
-2057
lines changed

ecs/env.json

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
"name": "POSTGRES_ENABLE_SSL",
2121
"value": "true"
2222
},
23+
{
24+
"name": "TILES_POSTGRES_ENABLE_SSL",
25+
"value": "true"
26+
},
2327
{
2428
"name": "REDIS_TLS",
2529
"value": "true"
@@ -221,6 +225,26 @@
221225
{
222226
"name": "RDS_PROXY_HOST",
223227
"valueFrom": "plumber-<ENVIRONMENT>-rds-proxy-host"
228+
},
229+
{
230+
"name": "TILES_POSTGRES_HOST",
231+
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-host"
232+
},
233+
{
234+
"name": "TILES_POSTGRES_DATABASE",
235+
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-database"
236+
},
237+
{
238+
"name": "TILES_POSTGRES_USERNAME",
239+
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-username"
240+
},
241+
{
242+
"name": "TILES_POSTGRES_PASSWORD",
243+
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-password"
244+
},
245+
{
246+
"name": "TILES_POSTGRES_PORT",
247+
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-port"
224248
}
225249
]
226250
}

package-lock.json

Lines changed: 29 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/backend/.env-example

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,14 @@ MAX_JOB_ATTEMPTS=3
3434
POSTMAN_SMS_QPS_LIMIT_PER_CAMPAIGN=3
3535
ONBOARDING_EMAIL_WEBHOOK_URL=test-webhook-url
3636

37+
# TILE POSTGRES
38+
TILES_POSTGRES_DATABASE=plumber_tiles_dev
39+
TILES_POSTGRES_PORT=5431
40+
TILES_POSTGRES_HOST=localhost
41+
TILES_POSTGRES_USERNAME=postgres
42+
TILES_POSTGRES_PASSWORD=postgres
43+
TILES_POSTGRES_ENABLE_SSL=false
44+
3745
# LOCAL DEV
3846
SERVE_WEB_APP_SEPARATELY=true
3947
CLOUDFLARE_TOKEN=...

packages/backend/docker-compose.dev.yml

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,21 @@ services:
1414
interval: 5s
1515
timeout: 5s
1616
retries: 5
17+
tiles-postgres:
18+
image: postgres:16.6-bookworm
19+
environment:
20+
- POSTGRES_USER=postgres
21+
- POSTGRES_PASSWORD=postgres
22+
- POSTGRES_DB=plumber_tiles_dev
23+
ports:
24+
- 5431:5432
25+
volumes:
26+
- plumber-tiles-postgres:/var/lib/postgresql/data
27+
healthcheck:
28+
test: ['CMD-SHELL', 'pg_isready -U postgres']
29+
interval: 5s
30+
timeout: 5s
31+
retries: 5
1732
redis:
1833
image: redis:6.2.0-alpine
1934
ports:
@@ -76,3 +91,4 @@ volumes:
7691
plumber-redis:
7792
plumber-minio:
7893
plumber-dynamodb:
94+
plumber-tiles-postgres:

packages/backend/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,10 +74,12 @@
7474
"objection": "^3.0.0",
7575
"p-limit": "3.1.0",
7676
"pg": "^8.7.1",
77+
"pg-query-stream": "4.9.6",
7778
"rate-limiter-flexible": "2.4.1",
7879
"remark-breaks": "3.0.3",
7980
"remark-gfm": "3.0.1",
8081
"typescript": "^4.6.3",
82+
"ulid": "3.0.0",
8183
"urlcat": "3.1.0",
8284
"winston": "^3.7.1",
8385
"zod": "3.22.4",

packages/backend/src/apps/tiles/__tests__/actions/create-row.itest.ts

Lines changed: 74 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -10,87 +10,93 @@ import {
1010
generateMockTableRowData,
1111
} from '@/graphql/__tests__/mutations/tiles/table.mock'
1212
import TableMetadata from '@/models/table-metadata'
13+
import { DatabaseType } from '@/models/tiles/types'
1314
import User from '@/models/user'
1415
import Context from '@/types/express/context'
1516

1617
import tiles from '../..'
1718
import createRowAction from '../../actions/create-row'
1819

19-
describe('tiles create row action', () => {
20-
let context: Context
21-
let dummyTable: TableMetadata
22-
let dummyColumnIds: string[]
23-
let editor: User
24-
let viewer: User
25-
let $: IGlobalVariable
20+
describe.each([['ddb'], ['pg']])(
21+
'tiles create row action: %s',
22+
(databaseType: DatabaseType) => {
23+
let context: Context
24+
let dummyTable: TableMetadata
25+
let dummyColumnIds: string[]
26+
let editor: User
27+
let viewer: User
28+
let $: IGlobalVariable
2629

27-
beforeEach(async () => {
28-
context = await generateMockContext()
30+
beforeEach(async () => {
31+
context = await generateMockContext()
2932

30-
const mockTable = await generateMockTable({
31-
userId: context.currentUser.id,
32-
})
33-
dummyTable = mockTable.table
34-
editor = mockTable.editor
35-
viewer = mockTable.viewer
33+
const mockTable = await generateMockTable({
34+
userId: context.currentUser.id,
35+
databaseType,
36+
})
37+
dummyTable = mockTable.table
38+
editor = mockTable.editor
39+
viewer = mockTable.viewer
3640

37-
dummyColumnIds = await generateMockTableColumns({
38-
tableId: dummyTable.id,
39-
numColumns: 5,
40-
})
41+
dummyColumnIds = await generateMockTableColumns({
42+
tableId: dummyTable.id,
43+
numColumns: 5,
44+
databaseType,
45+
})
4146

42-
const validData = generateMockTableRowData({ columnIds: dummyColumnIds })
43-
const rowData = Object.keys(validData).map((columnId) => ({
44-
columnId,
45-
cellValue: validData[columnId],
46-
}))
47+
const validData = generateMockTableRowData({ columnIds: dummyColumnIds })
48+
const rowData = Object.keys(validData).map((columnId) => ({
49+
columnId,
50+
cellValue: validData[columnId],
51+
}))
4752

48-
$ = {
49-
user: context.currentUser,
50-
flow: {
51-
id: '123',
52-
userId: context.currentUser.id,
53-
},
54-
step: {
55-
id: '456',
56-
appKey: tiles.name,
57-
key: createRowAction.key,
58-
position: 2,
59-
parameters: {
60-
tableId: dummyTable.id,
61-
rowData,
53+
$ = {
54+
user: context.currentUser,
55+
flow: {
56+
id: '123',
57+
userId: context.currentUser.id,
58+
},
59+
step: {
60+
id: '456',
61+
appKey: tiles.name,
62+
key: createRowAction.key,
63+
position: 2,
64+
parameters: {
65+
tableId: dummyTable.id,
66+
rowData,
67+
},
6268
},
63-
},
64-
app: {
65-
name: tiles.name,
66-
},
67-
setActionItem: vi.fn(),
68-
} as unknown as IGlobalVariable
69-
})
69+
app: {
70+
name: tiles.name,
71+
},
72+
setActionItem: vi.fn(),
73+
} as unknown as IGlobalVariable
74+
})
7075

71-
it('should allow owners to create row', async () => {
72-
await expect(createRowAction.run($)).resolves.toBeUndefined()
73-
expect($.setActionItem).toBeCalled()
74-
})
76+
it('should allow owners to create row', async () => {
77+
await expect(createRowAction.run($)).resolves.toBeUndefined()
78+
expect($.setActionItem).toBeCalled()
79+
})
7580

76-
it('should allow editors to create row', async () => {
77-
$.user = editor
78-
await expect(createRowAction.run($)).resolves.toBeUndefined()
79-
expect($.setActionItem).toBeCalled()
80-
})
81+
it('should allow editors to create row', async () => {
82+
$.user = editor
83+
await expect(createRowAction.run($)).resolves.toBeUndefined()
84+
expect($.setActionItem).toBeCalled()
85+
})
8186

82-
it('should not allow viewers to create row', async () => {
83-
$.user = viewer
84-
await expect(createRowAction.run($)).rejects.toThrow(StepError)
85-
})
87+
it('should not allow viewers to create row', async () => {
88+
$.user = viewer
89+
await expect(createRowAction.run($)).rejects.toThrow(StepError)
90+
})
8691

87-
it('should throw correct error if Tile deleted', async () => {
88-
$.user = editor
89-
await TableMetadata.query()
90-
.patch({
91-
deletedAt: new Date().toISOString(),
92-
})
93-
.where({ id: $.step.parameters.tableId })
94-
await expect(createRowAction.run($)).rejects.toThrow(StepError)
95-
})
96-
})
92+
it('should throw correct error if Tile deleted', async () => {
93+
$.user = editor
94+
await TableMetadata.query()
95+
.patch({
96+
deletedAt: new Date().toISOString(),
97+
})
98+
.where({ id: $.step.parameters.tableId })
99+
await expect(createRowAction.run($)).rejects.toThrow(StepError)
100+
})
101+
},
102+
)

0 commit comments

Comments
 (0)