xtablo-source/api/src/user.ts
2025-07-05 15:16:42 +02:00

74 lines
1.7 KiB
TypeScript

import { Hono } from "hono";
import { authMiddleware, streamChatMiddleware } from "./middleware.js";
import type { SupabaseClient, User } from "@supabase/supabase-js";
import { StreamChat } from "stream-chat";
import type { Transporter } from "nodemailer";
import type { Tables } from "./database.types.js";
export const userRouter = new Hono<{
Variables: {
user: User;
supabase: SupabaseClient;
transporter: Transporter;
streamServerClient: StreamChat;
};
}>();
userRouter.use(authMiddleware);
userRouter.use(streamChatMiddleware);
userRouter.post("/sign-up-to-stream", async (c) => {
const { id } = c.get("user");
const supabase = c.get("supabase");
const { data } = await supabase
.from("profiles")
.select("*")
.eq("id", id)
.single();
const user = data as Tables<"profiles">;
const streamServerClient = c.get("streamServerClient");
await streamServerClient.upsertUser({
id,
name: user.name ?? "",
language: "fr",
});
return c.json({
message: "User signed up to stream",
});
});
userRouter.get("/me", async (c) => {
const user = c.get("user");
const supabase = c.get("supabase");
const streamServerClient = c.get("streamServerClient");
const { data, error } = await supabase
.from("profiles")
.select("*")
.eq("id", user.id)
.single();
const userData = data as Tables<"profiles">;
if (!userData) {
return c.json({ error: "User not found" }, 404);
}
if (error) {
return c.json({ error: error.message }, 500);
}
const user_id = data.id;
const token = streamServerClient.createToken(user_id);
return c.json({
...userData,
streamToken: token,
});
});
userRouter.post("");