diff options
| author | MohamedBassem <me@mbassem.com> | 2024-04-18 10:01:45 +0100 |
|---|---|---|
| committer | MohamedBassem <me@mbassem.com> | 2024-04-18 10:01:45 +0100 |
| commit | deba31ee010f785a9739fd4df8a64a3056c9593d (patch) | |
| tree | 647499476af517b045a784591e0f8538551f69a4 /packages/shared | |
| parent | 81fc4c45269fcd2b9cb9b6a001f8208f6b2b04a3 (diff) | |
| download | karakeep-deba31ee010f785a9739fd4df8a64a3056c9593d.tar.zst | |
refactor: Move the shared types to the shared package
Diffstat (limited to 'packages/shared')
| -rw-r--r-- | packages/shared/types/bookmarks.ts | 118 | ||||
| -rw-r--r-- | packages/shared/types/lists.ts | 19 | ||||
| -rw-r--r-- | packages/shared/types/tags.ts | 18 | ||||
| -rw-r--r-- | packages/shared/types/uploads.ts | 14 | ||||
| -rw-r--r-- | packages/shared/types/users.ts | 26 |
5 files changed, 195 insertions, 0 deletions
diff --git a/packages/shared/types/bookmarks.ts b/packages/shared/types/bookmarks.ts new file mode 100644 index 00000000..2cf8152b --- /dev/null +++ b/packages/shared/types/bookmarks.ts @@ -0,0 +1,118 @@ +import { z } from "zod"; + +import { zBookmarkTagSchema } from "./tags"; + +const MAX_TITLE_LENGTH = 100; + +export const zBookmarkedLinkSchema = z.object({ + type: z.literal("link"), + url: z.string().url(), + title: z.string().nullish(), + description: z.string().nullish(), + imageUrl: z.string().url().nullish(), + favicon: z.string().url().nullish(), + htmlContent: z.string().nullish(), + crawledAt: z.date().nullish(), +}); +export type ZBookmarkedLink = z.infer<typeof zBookmarkedLinkSchema>; + +export const zBookmarkedTextSchema = z.object({ + type: z.literal("text"), + text: z.string(), +}); +export type ZBookmarkedText = z.infer<typeof zBookmarkedTextSchema>; + +export const zBookmarkedAssetSchema = z.object({ + type: z.literal("asset"), + assetType: z.enum(["image", "pdf"]), + assetId: z.string(), + fileName: z.string().nullish(), +}); +export type ZBookmarkedAsset = z.infer<typeof zBookmarkedAssetSchema>; + +export const zBookmarkContentSchema = z.discriminatedUnion("type", [ + zBookmarkedLinkSchema, + zBookmarkedTextSchema, + zBookmarkedAssetSchema, + z.object({ type: z.literal("unknown") }), +]); +export type ZBookmarkContent = z.infer<typeof zBookmarkContentSchema>; + +export const zBareBookmarkSchema = z.object({ + id: z.string(), + createdAt: z.date(), + title: z.string().max(MAX_TITLE_LENGTH).nullish(), + archived: z.boolean(), + favourited: z.boolean(), + taggingStatus: z.enum(["success", "failure", "pending"]).nullable(), + note: z.string().nullish(), +}); + +export const zBookmarkSchema = zBareBookmarkSchema.merge( + z.object({ + tags: z.array(zBookmarkTagSchema), + content: zBookmarkContentSchema, + }), +); +export type ZBookmark = z.infer<typeof zBookmarkSchema>; + +const zBookmarkTypeLinkSchema = zBareBookmarkSchema.merge( + z.object({ + tags: z.array(zBookmarkTagSchema), + content: zBookmarkedLinkSchema, + }), +); +export type ZBookmarkTypeLink = z.infer<typeof zBookmarkTypeLinkSchema>; + +const zBookmarkTypeTextSchema = zBareBookmarkSchema.merge( + z.object({ + tags: z.array(zBookmarkTagSchema), + content: zBookmarkedTextSchema, + }), +); +export type ZBookmarkTypeText = z.infer<typeof zBookmarkTypeTextSchema>; + +const zBookmarkTypeAssetSchema = zBareBookmarkSchema.merge( + z.object({ + tags: z.array(zBookmarkTagSchema), + content: zBookmarkedAssetSchema, + }), +); +export type ZBookmarkTypeAsset = z.infer<typeof zBookmarkTypeAssetSchema>; + +// POST /v1/bookmarks +export const zNewBookmarkRequestSchema = zBookmarkContentSchema; +export type ZNewBookmarkRequest = z.infer<typeof zNewBookmarkRequestSchema>; + +// GET /v1/bookmarks + +export const DEFAULT_NUM_BOOKMARKS_PER_PAGE = 20; + +export const zGetBookmarksRequestSchema = z.object({ + ids: z.array(z.string()).optional(), + archived: z.boolean().optional(), + favourited: z.boolean().optional(), + tagId: z.string().optional(), + listId: z.string().optional(), + limit: z.number().max(100).optional(), + cursor: z.date().nullish(), +}); +export type ZGetBookmarksRequest = z.infer<typeof zGetBookmarksRequestSchema>; + +export const zGetBookmarksResponseSchema = z.object({ + bookmarks: z.array(zBookmarkSchema), + nextCursor: z.date().nullable(), +}); +export type ZGetBookmarksResponse = z.infer<typeof zGetBookmarksResponseSchema>; + +// PATCH /v1/bookmarks/[bookmarkId] +export const zUpdateBookmarksRequestSchema = z.object({ + bookmarkId: z.string(), + archived: z.boolean().optional(), + favourited: z.boolean().optional(), + note: z.string().optional(), + title: z.string().max(MAX_TITLE_LENGTH).nullish(), +}); +export type ZUpdateBookmarksRequest = z.infer< + typeof zUpdateBookmarksRequestSchema +>; diff --git a/packages/shared/types/lists.ts b/packages/shared/types/lists.ts new file mode 100644 index 00000000..e9d7eca0 --- /dev/null +++ b/packages/shared/types/lists.ts @@ -0,0 +1,19 @@ +import { z } from "zod"; + +export const zBookmarkListSchema = z.object({ + id: z.string(), + name: z.string(), + icon: z.string(), + parentId: z.string().nullable(), +}); + +export const zBookmarkListWithBookmarksSchema = zBookmarkListSchema.merge( + z.object({ + bookmarks: z.array(z.string()), + }), +); + +export type ZBookmarkList = z.infer<typeof zBookmarkListSchema>; +export type ZBookmarkListWithBookmarks = z.infer< + typeof zBookmarkListWithBookmarksSchema +>; diff --git a/packages/shared/types/tags.ts b/packages/shared/types/tags.ts new file mode 100644 index 00000000..c9fe2a93 --- /dev/null +++ b/packages/shared/types/tags.ts @@ -0,0 +1,18 @@ +import { z } from "zod"; + +export const zAttachedByEnumSchema = z.enum(["ai", "human"]); +export type ZAttachedByEnum = z.infer<typeof zAttachedByEnumSchema>; +export const zBookmarkTagSchema = z.object({ + id: z.string(), + name: z.string(), + attachedBy: zAttachedByEnumSchema, +}); +export type ZBookmarkTags = z.infer<typeof zBookmarkTagSchema>; + +export const zGetTagResponseSchema = z.object({ + id: z.string(), + name: z.string(), + count: z.number(), + countAttachedBy: z.record(zAttachedByEnumSchema, z.number()), +}); +export type ZGetTagResponse = z.infer<typeof zGetTagResponseSchema>; diff --git a/packages/shared/types/uploads.ts b/packages/shared/types/uploads.ts new file mode 100644 index 00000000..b53b86d5 --- /dev/null +++ b/packages/shared/types/uploads.ts @@ -0,0 +1,14 @@ +import { z } from "zod"; + +export const zUploadErrorSchema = z.object({ + error: z.string(), +}); + +export const zUploadResponseSchema = z.object({ + assetId: z.string(), + contentType: z.string(), + size: z.number(), + fileName: z.string(), +}); + +export type ZUploadResponse = z.infer<typeof zUploadResponseSchema>; diff --git a/packages/shared/types/users.ts b/packages/shared/types/users.ts new file mode 100644 index 00000000..3026337a --- /dev/null +++ b/packages/shared/types/users.ts @@ -0,0 +1,26 @@ +import { z } from "zod"; + +const PASSWORD_MAX_LENGTH = 100; + +export const zSignUpSchema = z + .object({ + name: z.string().min(1, { message: "Name can't be empty" }), + email: z.string().email(), + password: z.string().min(8).max(PASSWORD_MAX_LENGTH), + confirmPassword: z.string(), + }) + .refine((data) => data.password === data.confirmPassword, { + message: "Passwords don't match", + path: ["confirmPassword"], + }); + +export const zChangePasswordSchema = z + .object({ + currentPassword: z.string(), + newPassword: z.string().min(8).max(PASSWORD_MAX_LENGTH), + newPasswordConfirm: z.string(), + }) + .refine((data) => data.newPassword === data.newPasswordConfirm, { + message: "Passwords don't match", + path: ["newPasswordConfirm"], + }); |
