Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions lib/puter.worker.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
const HOSTING_CONFIG_KEY = "roomify_hosting_config";
const PROJECT_PREFIX = "roomify_project_";
const PUBLIC_PREFIX = "roomify_public_";
const USER_PREFIX = "roomify_user_";

const jsonError = (status, message, extra = {}) =>
new Response(JSON.stringify({ error: message, ...extra }), {
Expand Down Expand Up @@ -53,6 +54,12 @@ const findPublicKeyByProjectId = async (mePuter, projectId) => {
return match?.key || null;
};

const resolveUsername = async (mePuter, userId) => {
if (!userId) return null;
const userRecord = await mePuter.kv.get(`${USER_PREFIX}${userId}`);
return userRecord?.username || null;
};

router.get("/api/projects/list", async ({ user }) => {
try {
const mePuter = me.puter;
Expand All @@ -65,6 +72,16 @@ router.get("/api/projects/list", async ({ user }) => {
const publicItems = (await mePuter.kv.list(`${PUBLIC_PREFIX}*`, true))
.map(({ value }) => ({ ...value, isPublic: true}));

const ownerIds = [...new Set(publicItems.map((p) => p.ownerId).filter(Boolean))];
const usernames = Object.fromEntries(
await Promise.all(ownerIds.map(async (id) => [id, await resolveUsername(mePuter, id)])),
);
for (const item of publicItems) {
if (item.ownerId && usernames[item.ownerId]) {
item.sharedBy = usernames[item.ownerId];
}
}

const merged = [...userItems, ...publicItems];
merged.sort((a, b) => (b?.timestamp || 0) - (a?.timestamp || 0));

Expand Down Expand Up @@ -107,6 +124,11 @@ router.get("/api/projects/get", async ({ request, user }) => {
const project = await mePuter.kv.get(publicKey);
if (!project) return jsonError(404, "Project not found");

if (project.ownerId) {
const username = await resolveUsername(mePuter, project.ownerId);
if (username) project.sharedBy = username;
}

return { project };
}
} catch (error) {
Expand Down Expand Up @@ -154,6 +176,7 @@ router.post("/api/projects/save", async ({ request, user }) => {

const userInfo = await userPuter.auth.getUser();
let username = userInfo?.username || userInfo?.name || null;
if (username) await mePuter.kv.set(`${USER_PREFIX}${userId}`, { username });

const publicRecord = {
...payload,
Expand Down Expand Up @@ -188,10 +211,14 @@ router.post("/api/projects/clear", async ({ user }) => {
const publicDeleted = mePuter?.kv
? await deleteKvByPattern(mePuter.kv, `${PUBLIC_PREFIX}*`)
: 0;
const usernameDeleted = mePuter?.kv
? await deleteKvByPattern(mePuter.kv, `${USER_PREFIX}*`)
: 0;

return jsonOk({
cleared: userDeleted,
clearedPublic: publicDeleted,
clearedUsernames: usernameDeleted,
});
});

Expand Down