80 lines
1.7 KiB
TypeScript
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;
|
|
};
|