aboutsummaryrefslogtreecommitdiffhomepage
path: root/pkgs/server/src/repositories/user.ts
diff options
context:
space:
mode:
Diffstat (limited to 'pkgs/server/src/repositories/user.ts')
-rw-r--r--pkgs/server/src/repositories/user.ts55
1 files changed, 55 insertions, 0 deletions
diff --git a/pkgs/server/src/repositories/user.ts b/pkgs/server/src/repositories/user.ts
new file mode 100644
index 0000000..7917632
--- /dev/null
+++ b/pkgs/server/src/repositories/user.ts
@@ -0,0 +1,55 @@
+import { eq } from "drizzle-orm";
+import { db, users } from "../db";
+import type { UserPublic, UserRepository } from "./types";
+
+export const userRepository: UserRepository = {
+ async findByUsername(username) {
+ const [user] = await db
+ .select({
+ id: users.id,
+ username: users.username,
+ passwordHash: users.passwordHash,
+ })
+ .from(users)
+ .where(eq(users.username, username))
+ .limit(1);
+ return user;
+ },
+
+ async existsByUsername(username) {
+ const [user] = await db
+ .select({ id: users.id })
+ .from(users)
+ .where(eq(users.username, username))
+ .limit(1);
+ return user !== undefined;
+ },
+
+ async create(data): Promise<UserPublic> {
+ const [newUser] = await db
+ .insert(users)
+ .values({
+ username: data.username,
+ passwordHash: data.passwordHash,
+ })
+ .returning({
+ id: users.id,
+ username: users.username,
+ createdAt: users.createdAt,
+ });
+ // Insert with returning should always return the created row
+ return newUser!;
+ },
+
+ async findById(id) {
+ const [user] = await db
+ .select({
+ id: users.id,
+ username: users.username,
+ })
+ .from(users)
+ .where(eq(users.id, id))
+ .limit(1);
+ return user;
+ },
+};