Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
e07ec68
[TILES-V2-1]: add another postgres db to docker compose, new env vars…
pregnantboy Jun 5, 2025
c4d311e
[TILES-V2-2]: add new column to table_metadata (#973)
pregnantboy Jun 5, 2025
d2f803a
[TILES-V2-3]: implement postgres functions for row, column and table …
pregnantboy Jun 5, 2025
da020ab
[TILES-V2-4]: reorganise files and update import paths (#975)
pregnantboy Jun 5, 2025
5fed88e
[TILES-V2-5]: abstract functions into factory pattern (#976)
pregnantboy Jun 5, 2025
f1c1cbf
[TILES-V2-6]: use factory class for queries and mutations, minimise g…
pregnantboy Jun 6, 2025
353c3b9
[TILES-V2-7]: update tiles actions to use factory class (#985)
pregnantboy Jun 6, 2025
cf7ed6a
[TILES-V2-8]: add env vars (#986)
pregnantboy Jun 10, 2025
e42adc5
[TILES-V2-9]: store database type in TableContext on frontend (#987)
pregnantboy Jun 10, 2025
5228e69
[TILES-V2-10]: add load testing scripts for tiles database (#1011)
pregnantboy Jun 10, 2025
e84ea42
[TILES-V2-11]: add unit and integration tests for tiles v2 (#1033)
pregnantboy Jun 10, 2025
e20f341
fix: rebase conflict
pregnantboy Jun 12, 2025
f234086
fix: incremental loading for ddb tiles
pregnantboy Jul 5, 2025
b977f26
fix: add missing fixed env var
pregnantboy Jul 23, 2025
fcb9775
chore: fix rebase issues and refactor consts
pregnantboy Jul 24, 2025
214dbf0
chore: fix tests to support tiles v1 and v2
pregnantboy Jul 24, 2025
45b4a55
[TILES-V2-12] : small improvements (#1118)
pregnantboy Jul 25, 2025
359dbf4
[TILES-V2-13] fix: support tiles v2 nullable cells (#1120)
pregnantboy Jul 25, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions ecs/env.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,10 @@
"name": "POSTGRES_ENABLE_SSL",
"value": "true"
},
{
"name": "TILES_POSTGRES_ENABLE_SSL",
"value": "true"
},
{
"name": "REDIS_TLS",
"value": "true"
Expand Down Expand Up @@ -221,6 +225,26 @@
{
"name": "RDS_PROXY_HOST",
"valueFrom": "plumber-<ENVIRONMENT>-rds-proxy-host"
},
{
"name": "TILES_POSTGRES_HOST",
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-host"
},
{
"name": "TILES_POSTGRES_DATABASE",
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-database"
},
{
"name": "TILES_POSTGRES_USERNAME",
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-username"
},
{
"name": "TILES_POSTGRES_PASSWORD",
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-password"
},
{
"name": "TILES_POSTGRES_PORT",
"valueFrom": "plumber-<ENVIRONMENT>-tiles-rds-port"
}
]
}
29 changes: 29 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions packages/backend/.env-example
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,14 @@ MAX_JOB_ATTEMPTS=3
POSTMAN_SMS_QPS_LIMIT_PER_CAMPAIGN=3
ONBOARDING_EMAIL_WEBHOOK_URL=test-webhook-url

# TILE POSTGRES
TILES_POSTGRES_DATABASE=plumber_tiles_dev
TILES_POSTGRES_PORT=5431
TILES_POSTGRES_HOST=localhost
TILES_POSTGRES_USERNAME=postgres
TILES_POSTGRES_PASSWORD=postgres
TILES_POSTGRES_ENABLE_SSL=false

# LOCAL DEV
SERVE_WEB_APP_SEPARATELY=true
CLOUDFLARE_TOKEN=...
Expand Down
16 changes: 16 additions & 0 deletions packages/backend/docker-compose.dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,21 @@ services:
interval: 5s
timeout: 5s
retries: 5
tiles-postgres:
image: postgres:16.6-bookworm
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
- POSTGRES_DB=plumber_tiles_dev
ports:
- 5431:5432
volumes:
- plumber-tiles-postgres:/var/lib/postgresql/data
healthcheck:
test: ['CMD-SHELL', 'pg_isready -U postgres']
interval: 5s
timeout: 5s
retries: 5
redis:
image: redis:6.2.0-alpine
ports:
Expand Down Expand Up @@ -76,3 +91,4 @@ volumes:
plumber-redis:
plumber-minio:
plumber-dynamodb:
plumber-tiles-postgres:
2 changes: 2 additions & 0 deletions packages/backend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,12 @@
"objection": "^3.0.0",
"p-limit": "3.1.0",
"pg": "^8.7.1",
"pg-query-stream": "4.9.6",
"rate-limiter-flexible": "2.4.1",
"remark-breaks": "3.0.3",
"remark-gfm": "3.0.1",
"typescript": "^4.6.3",
"ulid": "3.0.0",
"urlcat": "3.1.0",
"winston": "^3.7.1",
"zod": "3.22.4",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,87 +10,93 @@ import {
generateMockTableRowData,
} from '@/graphql/__tests__/mutations/tiles/table.mock'
import TableMetadata from '@/models/table-metadata'
import { DatabaseType } from '@/models/tiles/types'
import User from '@/models/user'
import Context from '@/types/express/context'

import tiles from '../..'
import createRowAction from '../../actions/create-row'

describe('tiles create row action', () => {
let context: Context
let dummyTable: TableMetadata
let dummyColumnIds: string[]
let editor: User
let viewer: User
let $: IGlobalVariable
describe.each([['ddb'], ['pg']])(
'tiles create row action: %s',
(databaseType: DatabaseType) => {
let context: Context
let dummyTable: TableMetadata
let dummyColumnIds: string[]
let editor: User
let viewer: User
let $: IGlobalVariable

beforeEach(async () => {
context = await generateMockContext()
beforeEach(async () => {
context = await generateMockContext()

const mockTable = await generateMockTable({
userId: context.currentUser.id,
})
dummyTable = mockTable.table
editor = mockTable.editor
viewer = mockTable.viewer
const mockTable = await generateMockTable({
userId: context.currentUser.id,
databaseType,
})
dummyTable = mockTable.table
editor = mockTable.editor
viewer = mockTable.viewer

dummyColumnIds = await generateMockTableColumns({
tableId: dummyTable.id,
numColumns: 5,
})
dummyColumnIds = await generateMockTableColumns({
tableId: dummyTable.id,
numColumns: 5,
databaseType,
})

const validData = generateMockTableRowData({ columnIds: dummyColumnIds })
const rowData = Object.keys(validData).map((columnId) => ({
columnId,
cellValue: validData[columnId],
}))
const validData = generateMockTableRowData({ columnIds: dummyColumnIds })
const rowData = Object.keys(validData).map((columnId) => ({
columnId,
cellValue: validData[columnId],
}))

$ = {
user: context.currentUser,
flow: {
id: '123',
userId: context.currentUser.id,
},
step: {
id: '456',
appKey: tiles.name,
key: createRowAction.key,
position: 2,
parameters: {
tableId: dummyTable.id,
rowData,
$ = {
user: context.currentUser,
flow: {
id: '123',
userId: context.currentUser.id,
},
step: {
id: '456',
appKey: tiles.name,
key: createRowAction.key,
position: 2,
parameters: {
tableId: dummyTable.id,
rowData,
},
},
},
app: {
name: tiles.name,
},
setActionItem: vi.fn(),
} as unknown as IGlobalVariable
})
app: {
name: tiles.name,
},
setActionItem: vi.fn(),
} as unknown as IGlobalVariable
})

it('should allow owners to create row', async () => {
await expect(createRowAction.run($)).resolves.toBeUndefined()
expect($.setActionItem).toBeCalled()
})
it('should allow owners to create row', async () => {
await expect(createRowAction.run($)).resolves.toBeUndefined()
expect($.setActionItem).toBeCalled()
})

it('should allow editors to create row', async () => {
$.user = editor
await expect(createRowAction.run($)).resolves.toBeUndefined()
expect($.setActionItem).toBeCalled()
})
it('should allow editors to create row', async () => {
$.user = editor
await expect(createRowAction.run($)).resolves.toBeUndefined()
expect($.setActionItem).toBeCalled()
})

it('should not allow viewers to create row', async () => {
$.user = viewer
await expect(createRowAction.run($)).rejects.toThrow(StepError)
})
it('should not allow viewers to create row', async () => {
$.user = viewer
await expect(createRowAction.run($)).rejects.toThrow(StepError)
})

it('should throw correct error if Tile deleted', async () => {
$.user = editor
await TableMetadata.query()
.patch({
deletedAt: new Date().toISOString(),
})
.where({ id: $.step.parameters.tableId })
await expect(createRowAction.run($)).rejects.toThrow(StepError)
})
})
it('should throw correct error if Tile deleted', async () => {
$.user = editor
await TableMetadata.query()
.patch({
deletedAt: new Date().toISOString(),
})
.where({ id: $.step.parameters.tableId })
await expect(createRowAction.run($)).rejects.toThrow(StepError)
})
},
)
Loading