Skip to content

Commit b8ecc98

Browse files
committed
feat(list): add support for creating new lists
1 parent 76d0fa8 commit b8ecc98

6 files changed

Lines changed: 38 additions & 5 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import { asString, z } from '../z.ts';
2+
3+
export const listPrivacyEnumSchema = asString(z.enum([
4+
'private',
5+
'public',
6+
'friends',
7+
'link',
8+
]));

projects/api/src/contracts/_internal/response/listResponseSchema.ts

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,13 @@
11
import { sortEnumSchema } from '../../users/_internal/request/sortParamsSchema.ts';
22
import { asString, z } from '../z.ts';
3+
import { listPrivacyEnumSchema } from './listPrivacyEnumSchema.ts';
34
import { profileResponseSchema } from './profileResponseSchema.ts';
45
import { sortDirectionSchema } from './sortDirectionSchema.ts';
56

67
export const listResponseSchema = z.object({
78
name: z.string(),
89
description: z.string().nullish(),
9-
privacy: asString(z.enum([
10-
'public',
11-
'private',
12-
])),
10+
privacy: listPrivacyEnumSchema,
1311
share_link: z.string(),
1412
type: asString(z.enum([
1513
'all',
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { listPrivacyEnumSchema } from '../../../_internal/response/listPrivacyEnumSchema.ts';
2+
import { sortDirectionSchema } from '../../../_internal/response/sortDirectionSchema.ts';
3+
import { z } from '../../../_internal/z.ts';
4+
import { sortEnumSchema } from './sortParamsSchema.ts';
5+
6+
export const createListRequestSchema = z.object({
7+
name: z.string(),
8+
description: z.string().optional(),
9+
privacy: listPrivacyEnumSchema.optional(),
10+
display_numbers: z.boolean().optional(),
11+
allow_comments: z.boolean().optional(),
12+
sort_by: sortEnumSchema.optional(),
13+
sort_how: sortDirectionSchema.optional(),
14+
});
Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
import { listPrivacyEnumSchema } from '../../../_internal/response/listPrivacyEnumSchema.ts';
12
import { z } from '../../../_internal/z.ts';
23

34
export const listUpdateRequestSchema = z.object({
45
name: z.string().nullish(),
56
description: z.string().nullish(),
6-
privacy: z.enum(['private', 'link', 'friends', 'public']).nullish(),
7+
privacy: listPrivacyEnumSchema.nullish(),
78
display_numbers: z.boolean().nullish(),
89
allow_comments: z.boolean().nullish(),
910
});

projects/api/src/contracts/users/_internal/request/sortParamsSchema.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { asString, z } from '../../../_internal/z.ts';
22

3+
// FIXME: add vip-only sort options
34
export const sortEnumSchema = asString(z.enum([
45
'rank',
56
'added',

projects/api/src/contracts/users/subroutes/userLists.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import { listedShowResponseSchema } from '../../_internal/response/listedShowRes
1414
import { listRemoveResponseSchema } from '../../_internal/response/listRemoveResponseSchema.ts';
1515
import { listResponseSchema } from '../../_internal/response/listResponseSchema.ts';
1616
import { z } from '../../_internal/z.ts';
17+
import { createListRequestSchema } from '../_internal/request/createListRequestSchema.ts';
1718
import { listCommentsSortParamsSchema } from '../_internal/request/listCommentsSortParamsSchema.ts';
1819
import { listParamsSchema } from '../_internal/request/listParamsSchema.ts';
1920
import { listUpdateRequestSchema } from '../_internal/request/listUpdateRequestSchema.ts';
@@ -172,6 +173,14 @@ export const userLists = builder.router({
172173
200: reorderListsResponseSchema,
173174
},
174175
},
176+
create: {
177+
path: '',
178+
method: 'POST',
179+
body: createListRequestSchema,
180+
responses: {
181+
201: listResponseSchema,
182+
},
183+
},
175184
list,
176185
}, {
177186
pathPrefix: '/:id/lists',
@@ -188,3 +197,5 @@ export type ListCommentsSortParams = z.infer<
188197
>;
189198
export type ListRequest = z.infer<typeof listRequestSchema>;
190199
export type ListUpdateRequest = z.infer<typeof listUpdateRequestSchema>;
200+
201+
export type CreateListRequest = z.infer<typeof createListRequestSchema>;

0 commit comments

Comments
 (0)