Files
kan/packages/db/src/repository/user.repo.ts
2025-06-01 23:07:21 +01:00

80 lines
1.7 KiB
TypeScript

import { desc, eq } from "drizzle-orm";
import { v4 as uuidv4 } from "uuid";
import type { dbClient } from "@kan/db/client";
import { apikey, users } from "@kan/db/schema";
export const getById = async (db: dbClient, userId: string) => {
return await db.query.users.findFirst({
columns: {
id: true,
name: true,
email: true,
image: true,
stripeCustomerId: true,
},
with: {
apiKeys: {
columns: {
id: true,
prefix: true,
key: true,
},
orderBy: desc(apikey.createdAt),
limit: 1,
},
},
where: eq(users.id, userId),
});
};
export const getByEmail = (db: dbClient, email: string) => {
return db.query.users.findFirst({
columns: {
id: true,
name: true,
email: true,
},
where: eq(users.email, email),
});
};
export const create = async (
db: dbClient,
user: { id?: string; email: string; stripeCustomerId?: string },
) => {
const [result] = await db
.insert(users)
.values({
id: user.id ?? uuidv4(),
email: user.email,
stripeCustomerId: user.stripeCustomerId,
emailVerified: false,
})
.returning();
return result;
};
export const update = async (
db: dbClient,
userId: string,
updates: { image?: string; name?: string; stripeCustomerId?: string },
) => {
const [result] = await db
.update(users)
.set({
name: updates.name,
image: updates.image,
stripeCustomerId: updates.stripeCustomerId,
})
.where(eq(users.id, userId))
.returning({
name: users.name,
image: users.image,
stripeCustomerId: users.stripeCustomerId,
});
return result;
};