Skip to content

Commit 484014b

Browse files
committed
address comments
1 parent 65c7742 commit 484014b

29 files changed

Lines changed: 253 additions & 176 deletions

convex/_test/factories.helper.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -219,15 +219,14 @@ async function insertSidebarItem(
219219
const n = nextId()
220220
const name = overrides?.name ?? `${label} ${n}`
221221

222-
const { inheritShares, imageStorageId, storageId, ...sidebarOverrides } = overrides ?? {}
222+
const { inheritShares, imageStorageId, storageId, slug, ...sidebarOverrides } = overrides ?? {}
223+
const validatedSlug = slug ? assertSidebarItemSlug(slug) : assertSidebarItemSlug(slugify(name))
223224

224225
const sharedData = {
225226
...sidebarItemBase(campaignId, creatorProfileId, name),
226227
type,
227228
...sidebarOverrides,
228-
slug: overrides?.slug
229-
? assertSidebarItemSlug(overrides.slug)
230-
: assertSidebarItemSlug(slugify(name)),
229+
slug: validatedSlug,
231230
}
232231

233232
const extensionFields: Record<string, unknown> = {}

convex/canvases/mutations.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@ import {
44
createItemParentArgsValidator,
55
requireCreateParentTarget,
66
} from '../sidebarItems/validation/parent'
7-
import {
8-
requireSidebarItemColor,
9-
requireOptionalSidebarItemColor,
10-
} from '../sidebarItems/validation/color'
11-
import {
12-
requireOptionalSidebarItemIconName,
13-
requireSidebarItemIconName,
14-
} from '../sidebarItems/validation/icon'
7+
import { requireOptionalSidebarItemColor } from '../sidebarItems/validation/color'
8+
import { requireOptionalSidebarItemIconName } from '../sidebarItems/validation/icon'
159
import {
1610
sidebarItemColorValidator,
1711
sidebarItemIconNameValidator,
1812
sidebarItemNameValidator,
1913
sidebarItemSlugValidator,
2014
} from '../sidebarItems/schema/validators'
21-
import { requireSidebarItemName } from '../sidebarItems/validation/name'
15+
import {
16+
requireOptionalSidebarItemName,
17+
requireSidebarItemName,
18+
} from '../sidebarItems/validation/name'
2219
import { createCanvas as createCanvasFn } from './functions/createCanvas'
2320
import { updateCanvas as updateCanvasFn } from './functions/updateCanvas'
2421

@@ -36,9 +33,8 @@ export const createCanvas = campaignMutation({
3633
handler: async (ctx, args) => {
3734
const name = requireSidebarItemName(args.name)
3835
const parentTarget = requireCreateParentTarget(args.parentTarget)
39-
const iconName =
40-
args.iconName === undefined ? undefined : requireSidebarItemIconName(args.iconName)
41-
const color = args.color === undefined ? undefined : requireSidebarItemColor(args.color)
36+
const iconName = requireOptionalSidebarItemIconName(args.iconName) ?? undefined
37+
const color = requireOptionalSidebarItemColor(args.color) ?? undefined
4238
return await createCanvasFn(ctx, {
4339
name,
4440
parentTarget,
@@ -60,7 +56,7 @@ export const updateCanvas = campaignMutation({
6056
slug: sidebarItemSlugValidator,
6157
}),
6258
handler: async (ctx, args) => {
63-
const name = args.name ? requireSidebarItemName(args.name) : undefined
59+
const name = requireOptionalSidebarItemName(args.name)
6460
const iconName = requireOptionalSidebarItemIconName(args.iconName)
6561
const color = requireOptionalSidebarItemColor(args.color)
6662
return await updateCanvasFn(ctx, {

convex/common/async.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
export type MaybePromise<T> = T | Promise<T>
22

33
export function isPromiseLike<T>(value: MaybePromise<T>): value is Promise<T> {
4-
return typeof value === 'object' && value !== null && 'then' in value
4+
return (
5+
typeof value === 'object' &&
6+
value !== null &&
7+
typeof (value as { then?: unknown }).then === 'function'
8+
)
59
}

convex/files/mutations.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@ import {
44
createItemParentArgsValidator,
55
requireCreateParentTarget,
66
} from '../sidebarItems/validation/parent'
7-
import {
8-
requireSidebarItemColor,
9-
requireOptionalSidebarItemColor,
10-
} from '../sidebarItems/validation/color'
11-
import {
12-
requireOptionalSidebarItemIconName,
13-
requireSidebarItemIconName,
14-
} from '../sidebarItems/validation/icon'
7+
import { requireOptionalSidebarItemColor } from '../sidebarItems/validation/color'
8+
import { requireOptionalSidebarItemIconName } from '../sidebarItems/validation/icon'
159
import {
1610
sidebarItemColorValidator,
1711
sidebarItemIconNameValidator,
1812
sidebarItemNameValidator,
1913
sidebarItemSlugValidator,
2014
} from '../sidebarItems/schema/validators'
21-
import { requireSidebarItemName } from '../sidebarItems/validation/name'
15+
import {
16+
requireOptionalSidebarItemName,
17+
requireSidebarItemName,
18+
} from '../sidebarItems/validation/name'
2219
import { createFile as createFileFn } from './functions/createFile'
2320
import { updateFile as updateFileFn } from './functions/updateFile'
2421
import type { Id } from '../_generated/dataModel'
@@ -38,9 +35,8 @@ export const createFile = campaignMutation({
3835
handler: async (ctx, args): Promise<{ fileId: Id<'sidebarItems'>; slug: string }> => {
3936
const name = requireSidebarItemName(args.name)
4037
const parentTarget = requireCreateParentTarget(args.parentTarget)
41-
const iconName =
42-
args.iconName === undefined ? undefined : requireSidebarItemIconName(args.iconName)
43-
const color = args.color === undefined ? undefined : requireSidebarItemColor(args.color)
38+
const iconName = requireOptionalSidebarItemIconName(args.iconName) ?? undefined
39+
const color = requireOptionalSidebarItemColor(args.color) ?? undefined
4440
return await createFileFn(ctx, {
4541
name,
4642
storageId: args.storageId,
@@ -64,7 +60,7 @@ export const updateFile = campaignMutation({
6460
slug: sidebarItemSlugValidator,
6561
}),
6662
handler: async (ctx, args): Promise<{ fileId: Id<'sidebarItems'>; slug: string }> => {
67-
const name = args.name ? requireSidebarItemName(args.name) : undefined
63+
const name = requireOptionalSidebarItemName(args.name)
6864
const iconName = requireOptionalSidebarItemIconName(args.iconName)
6965
const color = requireOptionalSidebarItemColor(args.color)
7066
return await updateFileFn(ctx, {

convex/files/queries.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { v } from 'convex/values'
22
import { campaignQuery } from '../functions'
33
import { fileWithContentValidator } from './schema'
44
import { getSidebarItemWithContent } from '../sidebarItems/functions/getSidebarItemWithContent'
5-
import type { FileWithContent } from './types'
5+
import { SIDEBAR_ITEM_TYPES } from '../sidebarItems/types/baseTypes'
66

77
export const getFile = campaignQuery({
88
args: {
99
fileId: v.id('sidebarItems'),
1010
},
1111
returns: v.nullable(fileWithContentValidator),
1212
handler: async (ctx, args) => {
13-
return (await getSidebarItemWithContent(ctx, args.fileId)) as FileWithContent | null
13+
return await getSidebarItemWithContent(ctx, args.fileId, SIDEBAR_ITEM_TYPES.files)
1414
},
1515
})

convex/folders/mutations.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@ import {
44
createItemParentArgsValidator,
55
requireCreateParentTarget,
66
} from '../sidebarItems/validation/parent'
7-
import {
8-
requireSidebarItemColor,
9-
requireOptionalSidebarItemColor,
10-
} from '../sidebarItems/validation/color'
11-
import {
12-
requireOptionalSidebarItemIconName,
13-
requireSidebarItemIconName,
14-
} from '../sidebarItems/validation/icon'
7+
import { requireOptionalSidebarItemColor } from '../sidebarItems/validation/color'
8+
import { requireOptionalSidebarItemIconName } from '../sidebarItems/validation/icon'
159
import {
1610
sidebarItemColorValidator,
1711
sidebarItemIconNameValidator,
1812
sidebarItemNameValidator,
1913
sidebarItemSlugValidator,
2014
} from '../sidebarItems/schema/validators'
21-
import { requireSidebarItemName } from '../sidebarItems/validation/name'
15+
import {
16+
requireOptionalSidebarItemName,
17+
requireSidebarItemName,
18+
} from '../sidebarItems/validation/name'
2219
import { createFolder as createFolderFn } from './functions/createFolder'
2320
import { updateFolder as updateFolderFn } from './functions/updateFolder'
2421
import type { Id } from '../_generated/dataModel'
@@ -35,7 +32,7 @@ export const updateFolder = campaignMutation({
3532
slug: sidebarItemSlugValidator,
3633
}),
3734
handler: async (ctx, args): Promise<{ folderId: Id<'sidebarItems'>; slug: string }> => {
38-
const name = args.name ? requireSidebarItemName(args.name) : undefined
35+
const name = requireOptionalSidebarItemName(args.name)
3936
const iconName = requireOptionalSidebarItemIconName(args.iconName)
4037
const color = requireOptionalSidebarItemColor(args.color)
4138
return await updateFolderFn(ctx, {
@@ -61,9 +58,8 @@ export const createFolder = campaignMutation({
6158
handler: async (ctx, args): Promise<{ folderId: Id<'sidebarItems'>; slug: string }> => {
6259
const name = requireSidebarItemName(args.name)
6360
const parentTarget = requireCreateParentTarget(args.parentTarget)
64-
const iconName =
65-
args.iconName === undefined ? undefined : requireSidebarItemIconName(args.iconName)
66-
const color = args.color === undefined ? undefined : requireSidebarItemColor(args.color)
61+
const iconName = requireOptionalSidebarItemIconName(args.iconName) ?? undefined
62+
const color = requireOptionalSidebarItemColor(args.color) ?? undefined
6763
return await createFolderFn(ctx, {
6864
name,
6965
parentTarget,

convex/gameMaps/mutations.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4,21 +4,18 @@ import {
44
createItemParentArgsValidator,
55
requireCreateParentTarget,
66
} from '../sidebarItems/validation/parent'
7-
import {
8-
requireSidebarItemColor,
9-
requireOptionalSidebarItemColor,
10-
} from '../sidebarItems/validation/color'
11-
import {
12-
requireOptionalSidebarItemIconName,
13-
requireSidebarItemIconName,
14-
} from '../sidebarItems/validation/icon'
7+
import { requireOptionalSidebarItemColor } from '../sidebarItems/validation/color'
8+
import { requireOptionalSidebarItemIconName } from '../sidebarItems/validation/icon'
159
import {
1610
sidebarItemColorValidator,
1711
sidebarItemIconNameValidator,
1812
sidebarItemNameValidator,
1913
sidebarItemSlugValidator,
2014
} from '../sidebarItems/schema/validators'
21-
import { requireSidebarItemName } from '../sidebarItems/validation/name'
15+
import {
16+
requireOptionalSidebarItemName,
17+
requireSidebarItemName,
18+
} from '../sidebarItems/validation/name'
2219
import { createMap as createMapFn } from './functions/createMap'
2320
import { updateMap as updateMapFn } from './functions/updateMap'
2421
import { createItemPin as createItemPinFn } from './functions/createItemPin'
@@ -42,9 +39,8 @@ export const createMap = campaignMutation({
4239
handler: async (ctx, args): Promise<{ mapId: Id<'sidebarItems'>; slug: string }> => {
4340
const name = requireSidebarItemName(args.name)
4441
const parentTarget = requireCreateParentTarget(args.parentTarget)
45-
const iconName =
46-
args.iconName === undefined ? undefined : requireSidebarItemIconName(args.iconName)
47-
const color = args.color === undefined ? undefined : requireSidebarItemColor(args.color)
42+
const iconName = requireOptionalSidebarItemIconName(args.iconName) ?? undefined
43+
const color = requireOptionalSidebarItemColor(args.color) ?? undefined
4844
return await createMapFn(ctx, {
4945
name,
5046
imageStorageId: args.imageStorageId,
@@ -68,7 +64,7 @@ export const updateMap = campaignMutation({
6864
slug: sidebarItemSlugValidator,
6965
}),
7066
handler: async (ctx, args): Promise<{ mapId: Id<'sidebarItems'>; slug: string }> => {
71-
const name = args.name ? requireSidebarItemName(args.name) : undefined
67+
const name = requireOptionalSidebarItemName(args.name)
7268
const iconName = requireOptionalSidebarItemIconName(args.iconName)
7369
const color = requireOptionalSidebarItemColor(args.color)
7470
return await updateMapFn(ctx, {

convex/gameMaps/queries.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@ import { v } from 'convex/values'
22
import { campaignQuery } from '../functions'
33
import { mapWithContentValidator } from './schema'
44
import { getSidebarItemWithContent } from '../sidebarItems/functions/getSidebarItemWithContent'
5-
import type { GameMapWithContent } from './types'
5+
import { SIDEBAR_ITEM_TYPES } from '../sidebarItems/types/baseTypes'
66

77
export const getMap = campaignQuery({
88
args: {
99
mapId: v.id('sidebarItems'),
1010
},
1111
returns: v.nullable(mapWithContentValidator),
1212
handler: async (ctx, args) => {
13-
return (await getSidebarItemWithContent(ctx, args.mapId)) as GameMapWithContent | null
13+
return await getSidebarItemWithContent(ctx, args.mapId, SIDEBAR_ITEM_TYPES.gameMaps)
1414
},
1515
})

convex/notes/__tests__/createNote.test.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -304,6 +304,32 @@ describe('createNote', () => {
304304
)
305305
})
306306

307+
it('rejects names with leading whitespace only', async () => {
308+
const ctx = await setupCampaignContext(t)
309+
const dmAuth = asDm(ctx)
310+
311+
await expectValidationFailed(
312+
dmAuth.mutation(api.notes.mutations.createNote, {
313+
campaignId: ctx.campaignId,
314+
name: ' Leading',
315+
parentTarget: { kind: 'direct', parentId: null },
316+
}),
317+
)
318+
})
319+
320+
it('rejects names with trailing whitespace only', async () => {
321+
const ctx = await setupCampaignContext(t)
322+
const dmAuth = asDm(ctx)
323+
324+
await expectValidationFailed(
325+
dmAuth.mutation(api.notes.mutations.createNote, {
326+
campaignId: ctx.campaignId,
327+
name: 'Trailing ',
328+
parentTarget: { kind: 'direct', parentId: null },
329+
}),
330+
)
331+
})
332+
307333
it('requires authentication', async () => {
308334
const ctx = await setupCampaignContext(t)
309335

convex/notes/mutations.ts

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,21 +7,18 @@ import {
77
createItemParentArgsValidator,
88
requireCreateParentTarget,
99
} from '../sidebarItems/validation/parent'
10-
import {
11-
requireSidebarItemColor,
12-
requireOptionalSidebarItemColor,
13-
} from '../sidebarItems/validation/color'
14-
import {
15-
requireOptionalSidebarItemIconName,
16-
requireSidebarItemIconName,
17-
} from '../sidebarItems/validation/icon'
10+
import { requireOptionalSidebarItemColor } from '../sidebarItems/validation/color'
11+
import { requireOptionalSidebarItemIconName } from '../sidebarItems/validation/icon'
1812
import {
1913
sidebarItemColorValidator,
2014
sidebarItemIconNameValidator,
2115
sidebarItemNameValidator,
2216
sidebarItemSlugValidator,
2317
} from '../sidebarItems/schema/validators'
24-
import { requireSidebarItemName } from '../sidebarItems/validation/name'
18+
import {
19+
requireOptionalSidebarItemName,
20+
requireSidebarItemName,
21+
} from '../sidebarItems/validation/name'
2522
import { createNote as createNoteFn } from './functions/createNote'
2623
import { updateNote as updateNoteFn } from './functions/updateNote'
2724
import type { Id } from '../_generated/dataModel'
@@ -38,7 +35,7 @@ export const updateNote = campaignMutation({
3835
slug: sidebarItemSlugValidator,
3936
}),
4037
handler: async (ctx, args): Promise<{ noteId: Id<'sidebarItems'>; slug: string }> => {
41-
const name = args.name ? requireSidebarItemName(args.name) : undefined
38+
const name = requireOptionalSidebarItemName(args.name)
4239
const iconName = requireOptionalSidebarItemIconName(args.iconName)
4340
const color = requireOptionalSidebarItemColor(args.color)
4441
return await updateNoteFn(ctx, {
@@ -65,9 +62,8 @@ export const createNote = campaignMutation({
6562
handler: async (ctx, args): Promise<{ noteId: Id<'sidebarItems'>; slug: string }> => {
6663
const name = requireSidebarItemName(args.name)
6764
const parentTarget = requireCreateParentTarget(args.parentTarget)
68-
const iconName =
69-
args.iconName === undefined ? undefined : requireSidebarItemIconName(args.iconName)
70-
const color = args.color === undefined ? undefined : requireSidebarItemColor(args.color)
65+
const iconName = requireOptionalSidebarItemIconName(args.iconName) ?? undefined
66+
const color = requireOptionalSidebarItemColor(args.color) ?? undefined
7167
return await createNoteFn(ctx, {
7268
name,
7369
parentTarget,

0 commit comments

Comments
 (0)