test: cover atomic source invites
This commit is contained in:
@@ -0,0 +1,14 @@
|
||||
import { createHash } from "node:crypto";
|
||||
import { db } from "@/lib/db";
|
||||
|
||||
export function acceptSourceInvite(userId: number, token: string) {
|
||||
const hash = createHash("sha256").update(token).digest("hex");
|
||||
return db.transaction(() => {
|
||||
const invite = db.prepare("SELECT id,source_id,role FROM source_invites WHERE token_hash=? AND used_at IS NULL AND expires_at>CURRENT_TIMESTAMP").get(hash) as { id: number; source_id: number; role: string } | undefined;
|
||||
if (!invite) throw new Error("邀請不存在、已使用或已過期");
|
||||
const consumed = db.prepare("UPDATE source_invites SET used_at=CURRENT_TIMESTAMP WHERE id=? AND used_at IS NULL").run(invite.id);
|
||||
if (!consumed.changes) throw new Error("邀請不存在、已使用或已過期");
|
||||
db.prepare("INSERT INTO source_members(source_id,user_id,role) VALUES(?,?,?) ON CONFLICT(source_id,user_id) DO UPDATE SET role=excluded.role").run(invite.source_id, userId, invite.role);
|
||||
return invite;
|
||||
})();
|
||||
}
|
||||
Reference in New Issue
Block a user