mirror of
https://github.com/kmc7468/arkvault.git
synced 2026-02-04 16:16:55 +00:00
DB에 동시적으로 접근하더라도 데이터 무결성이 깨지지 않도록 DB 접근 코드 수정
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
import { SqliteError } from "better-sqlite3";
|
||||
import { and, or, eq } from "drizzle-orm";
|
||||
import db from "./drizzle";
|
||||
import { IntegrityError } from "./error";
|
||||
import { mek, clientMek } from "./schema";
|
||||
|
||||
export const registerInitialMek = async (
|
||||
@@ -8,22 +10,32 @@ export const registerInitialMek = async (
|
||||
encMek: string,
|
||||
encMekSig: string,
|
||||
) => {
|
||||
await db.transaction(async (tx) => {
|
||||
await tx.insert(mek).values({
|
||||
userId,
|
||||
version: 1,
|
||||
createdBy,
|
||||
createdAt: new Date(),
|
||||
state: "active",
|
||||
});
|
||||
await tx.insert(clientMek).values({
|
||||
userId,
|
||||
clientId: createdBy,
|
||||
mekVersion: 1,
|
||||
encMek,
|
||||
encMekSig,
|
||||
});
|
||||
});
|
||||
await db.transaction(
|
||||
async (tx) => {
|
||||
try {
|
||||
await tx.insert(mek).values({
|
||||
userId,
|
||||
version: 1,
|
||||
createdBy,
|
||||
createdAt: new Date(),
|
||||
state: "active",
|
||||
});
|
||||
await tx.insert(clientMek).values({
|
||||
userId,
|
||||
clientId: createdBy,
|
||||
mekVersion: 1,
|
||||
encMek,
|
||||
encMekSig,
|
||||
});
|
||||
} catch (e) {
|
||||
if (e instanceof SqliteError && e.code === "SQLITE_CONSTRAINT_PRIMARYKEY") {
|
||||
throw new IntegrityError("MEK already registered");
|
||||
}
|
||||
throw e;
|
||||
}
|
||||
},
|
||||
{ behavior: "exclusive" },
|
||||
);
|
||||
};
|
||||
|
||||
export const getInitialMek = async (userId: number) => {
|
||||
@@ -31,19 +43,10 @@ export const getInitialMek = async (userId: number) => {
|
||||
.select()
|
||||
.from(mek)
|
||||
.where(and(eq(mek.userId, userId), eq(mek.version, 1)))
|
||||
.execute();
|
||||
.limit(1);
|
||||
return meks[0] ?? null;
|
||||
};
|
||||
|
||||
export const getActiveMekVersion = async (userId: number) => {
|
||||
const meks = await db
|
||||
.select({ version: mek.version })
|
||||
.from(mek)
|
||||
.where(and(eq(mek.userId, userId), eq(mek.state, "active")))
|
||||
.execute();
|
||||
return meks[0]?.version ?? null;
|
||||
};
|
||||
|
||||
export const getAllValidClientMeks = async (userId: number, clientId: number) => {
|
||||
return await db
|
||||
.select()
|
||||
@@ -55,6 +58,5 @@ export const getAllValidClientMeks = async (userId: number, clientId: number) =>
|
||||
eq(clientMek.clientId, clientId),
|
||||
or(eq(mek.state, "active"), eq(mek.state, "retired")),
|
||||
),
|
||||
)
|
||||
.execute();
|
||||
);
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user