summaryrefslogtreecommitdiff
path: root/lib/users/repository.ts
blob: 78d1668b3e79da596180e203d6f6813940b4f45a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
// lib/users/repository.ts
import db from '@/db/db';
import { users, otps, type User, Role, roles, userRoles } from '@/db/schema/users';
import { Otp } from '@/types/user';
import { eq,and ,asc} from 'drizzle-orm';

// 모든 사용자 조회
export const getAllUsers = async (): Promise<User[]> => {
  const usersRes = await db.select().from(users).execute();
  return usersRes
};

export async function getRoleAssignedUsers(roleId: number) {
  const rows = await db
    .select()
    .from(userRoles)
    .where(eq(userRoles.roleId, roleId))
  return rows.map((r) => r.userId)  // [1, 2, 5, ...]
}

// ID로 사용자 조회
export const getUserById = async (id: number): Promise<User | null> => {
  const usersRes = await db.select().from(users).where(eq(users.id, id)).execute();
  if (usersRes.length === 0) return null;

  const user = usersRes[0];
  return user
};

// Email로 사용자 조회
export const getUserByEmail = async (email: string): Promise<User | null> => {
  const usersRes = await db.select().from(users).where(eq(users.email, email)).execute();
  if (usersRes.length === 0) return null;

  const user = usersRes[0];
  return user
};


// 새 사용자 생성
export const createUser = async (name: string, email: string): Promise<User> => {
  const usersRes = await db.insert(users).values({ name, email }).returning();
  const user = usersRes[0];
  return user
};

// 사용자 업데이트
export const updateUser = async (id: number, data: Partial<User>): Promise<User | null> => {
  const usersRes = await db.update(users).set(data).where(eq(users.id, id)).returning();
  if (usersRes.length === 0) return null;
  const user = usersRes[0];
  return user
};

// 사용자 삭제
export const deleteUser = async (id: number): Promise<boolean> => {
  const result = await db.delete(users).where(eq(users.id, id)).execute();
  return (result.rowCount ?? 0) > 0; // null일 경우 0으로 처리
};


// 새 otp 생성
export const createOtp = async ( email: string, code:string, createdAt:Date, otpToken:string, otpExpires:Date ): Promise<Otp> => {
  const otp = await db.insert(otps).values({ email, code, createdAt, otpToken,otpExpires  }).returning();
  return otp[0]
};


export const findOtpByEmail = async (email: string): Promise<Otp | null> => {
  const [otpRecord] = await db
    .select()
    .from(otps)
    .where(eq(otps.email, email))

  return otpRecord ?? null
}

export const updateOtp = async (
  email: string,
  code: string,
  createdAt: Date,
  otpToken: string,
  otpExpires: Date
): Promise<Otp> => {
  const rows = await db
    .update(otps)
    .set({
      code,
      createdAt,
      otpToken,
      otpExpires,
    })
    .where(eq(otps.email, email))
    .returning();

  return rows[0];
};

// Email 및 토큰으로 opt 조회
export const getOtpByEmailAndToken = async (email: string, token:string): Promise<Otp | null> => {
  const opts = await db.select().from(otps).where(eq(otps.email, email)).execute();
  if (opts.length === 0) return null;

  const otp = opts[0];
  return otp
};


export const getOtpByEmailAndCode = async (
  email: string,
  code: string
): Promise<Otp | null> => {

  console.log(email, code, "db")

  const [otp] = await db
    .select()
    .from(otps)
    .where(
      and(eq(otps.email, email), eq(otps.code, code))
    );

  return otp ?? null;
};

export async function findAllRoles(): Promise<Role[]> {
  return db.select().from(roles).where(eq(roles.domain ,'evcp')).orderBy(asc(roles.name));
}