aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared
diff options
context:
space:
mode:
authorMohamedBassem <me@mbassem.com>2024-05-26 00:06:32 +0000
committerMohamedBassem <me@mbassem.com>2024-05-26 10:11:53 +0000
commitdedc5fb24536832eae2c18d84efa2a92272c955c (patch)
tree4b9540b819db892fa6bc66a29cf8fc790d06ea67 /packages/shared
parent033e8a2d26bb0ecaa8301609960d35d3467a88f4 (diff)
downloadkarakeep-dedc5fb24536832eae2c18d84efa2a92272c955c.tar.zst
feature: Full page archival with monolith. Fixes #132
Diffstat (limited to 'packages/shared')
-rw-r--r--packages/shared/assetdb.ts35
-rw-r--r--packages/shared/config.ts2
-rw-r--r--packages/shared/types/bookmarks.ts1
3 files changed, 37 insertions, 1 deletions
diff --git a/packages/shared/assetdb.ts b/packages/shared/assetdb.ts
index c070ad54..4cea06b0 100644
--- a/packages/shared/assetdb.ts
+++ b/packages/shared/assetdb.ts
@@ -6,13 +6,20 @@ import serverConfig from "./config";
const ROOT_PATH = path.join(serverConfig.dataDir, "assets");
-export const SUPPORTED_ASSET_TYPES = new Set([
+// The assets that we allow the users to upload
+export const SUPPORTED_UPLOAD_ASSET_TYPES = new Set([
"image/jpeg",
"image/png",
"image/webp",
"application/pdf",
]);
+// The assets that we support saving in the asset db
+export const SUPPORTED_ASSET_TYPES = new Set([
+ ...SUPPORTED_UPLOAD_ASSET_TYPES,
+ "text/html",
+]);
+
function getAssetDir(userId: string, assetId: string) {
return path.join(ROOT_PATH, userId, assetId);
}
@@ -52,6 +59,32 @@ export async function saveAsset({
]);
}
+export async function saveAssetFromFile({
+ userId,
+ assetId,
+ assetPath,
+ metadata,
+}: {
+ userId: string;
+ assetId: string;
+ assetPath: string;
+ metadata: z.infer<typeof zAssetMetadataSchema>;
+}) {
+ if (!SUPPORTED_ASSET_TYPES.has(metadata.contentType)) {
+ throw new Error("Unsupported asset type");
+ }
+ const assetDir = getAssetDir(userId, assetId);
+ await fs.promises.mkdir(assetDir, { recursive: true });
+
+ await Promise.all([
+ fs.promises.rename(assetPath, path.join(assetDir, "asset.bin")),
+ fs.promises.writeFile(
+ path.join(assetDir, "metadata.json"),
+ JSON.stringify(metadata),
+ ),
+ ]);
+}
+
export async function readAsset({
userId,
assetId,
diff --git a/packages/shared/config.ts b/packages/shared/config.ts
index 8bb4e830..2c739a0c 100644
--- a/packages/shared/config.ts
+++ b/packages/shared/config.ts
@@ -29,6 +29,7 @@ const allEnv = z.object({
CRAWLER_DOWNLOAD_BANNER_IMAGE: stringBool("true"),
CRAWLER_STORE_SCREENSHOT: stringBool("true"),
CRAWLER_FULL_PAGE_SCREENSHOT: stringBool("false"),
+ CRAWLER_FULL_PAGE_ARCHIVE: stringBool("false"),
MEILI_ADDR: z.string().optional(),
MEILI_MASTER_KEY: z.string().default(""),
LOG_LEVEL: z.string().default("debug"),
@@ -74,6 +75,7 @@ const serverConfigSchema = allEnv.transform((val) => {
downloadBannerImage: val.CRAWLER_DOWNLOAD_BANNER_IMAGE,
storeScreenshot: val.CRAWLER_STORE_SCREENSHOT,
fullPageScreenshot: val.CRAWLER_FULL_PAGE_SCREENSHOT,
+ fullPageArchive: val.CRAWLER_FULL_PAGE_ARCHIVE,
},
meilisearch: val.MEILI_ADDR
? {
diff --git a/packages/shared/types/bookmarks.ts b/packages/shared/types/bookmarks.ts
index 10dba0c8..06cd632e 100644
--- a/packages/shared/types/bookmarks.ts
+++ b/packages/shared/types/bookmarks.ts
@@ -12,6 +12,7 @@ export const zBookmarkedLinkSchema = z.object({
imageUrl: z.string().url().nullish(),
imageAssetId: z.string().nullish(),
screenshotAssetId: z.string().nullish(),
+ fullPageArchiveAssetId: z.string().nullish(),
favicon: z.string().url().nullish(),
htmlContent: z.string().nullish(),
crawledAt: z.date().nullish(),