aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-04-18 10:01:45 +0100
committerMohamedBassem <me@mbassem.com>2024-04-18 10:01:45 +0100
commitdeba31ee010f785a9739fd4df8a64a3056c9593d (patch)
tree647499476af517b045a784591e0f8538551f69a4 /packages/shared
parent81fc4c45269fcd2b9cb9b6a001f8208f6b2b04a3 (diff)
downloadkarakeep-deba31ee010f785a9739fd4df8a64a3056c9593d.tar.zst
refactor: Move the shared types to the shared package
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/types/bookmarks.ts118
-rw-r--r--packages/shared/types/lists.ts19
-rw-r--r--packages/shared/types/tags.ts18
-rw-r--r--packages/shared/types/uploads.ts14
-rw-r--r--packages/shared/types/users.ts26
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"],
+ });