diff --git a/eid/aut.ts b/eid/aut.ts new file mode 100644 index 0000000..569e73f --- /dev/null +++ b/eid/aut.ts @@ -0,0 +1,32 @@ +import type { Aut, Usr } from "./typ.ts" +import { DocR, DocU, coll } from "./db.ts" +import { is_aut, is_in } from "./is.ts" + +export async function aut( +): DocR> { + return await coll.aut.findOne({ _id: 1 }, { projection: { _id: 0 } }) ?? null +} + +export async function aut_f( + usr: Usr["_id"], +): Promise<(keyof Omit)[]> { + const a = await aut() + if (!a) return [] + const l: (keyof Omit)[] = [] + if (is_in(a.sup, usr)) l.push("sup") + if (is_in(a.aut, usr)) l.push("aut") + if (is_in(a.wsl, usr)) l.push("wsl") + if (is_in(a.lit, usr)) l.push("lit") + return l +} + +export async function aut_u( + a: Omit, +): DocU { + if (!is_aut({ _id: 1, ...a })) return null + try { + const { matchedCount, modifiedCount } = await coll.aut.updateOne({ _id: 1 }, { $set: a }) + if (matchedCount > 0) return modifiedCount > 0 ? 1 : 0 + else return null + } catch { return null } +} diff --git a/eid/is.ts b/eid/is.ts index 7047a71..6b596c9 100644 --- a/eid/is.ts +++ b/eid/is.ts @@ -36,6 +36,12 @@ export function is_idl( ) { return idl.length <= len && idl.every(is_id) } +export function is_in( + idl: Id["_id"][], + id: Id["_id"], +) { + return idl.includes(id) +} export function is_utc( utc: number, ) { diff --git a/tst/eid.test.ts b/tst/eid.test.ts index a462863..97e3fdb 100644 --- a/tst/eid.test.ts +++ b/tst/eid.test.ts @@ -3,7 +3,8 @@ import { usr_c, usr_d, usr_r, usr_u } from "../eid/usr.ts" import { soc_c, soc_d, soc_r, soc_u } from "../eid/soc.ts" import { agd_c, agd_d, agd_r, agd_u } from "../eid/agd.ts" import { assertEquals } from "./mod.test.ts" -import { msg_c, msg_f, msg_r, msg_u } from "../eid/msg.ts"; +import { msg_c, msg_f, msg_r, msg_u } from "../eid/msg.ts" +import { aut, aut_f, aut_u } from "../eid/aut.ts" await db("tst", true) @@ -58,3 +59,9 @@ Deno.test("msg", async () => { assertEquals("msg2", m2?.msg) assertEquals([m1?._id, m2?._id], (await msg_f(coll.wsl)).map(m => m._id)) }) + +Deno.test("aut", async () => { + assertEquals({ sup: [1, 2], aut: [2], wsl: [], lit: [] }, await aut()) + assertEquals(1, await aut_u({ sup: [1, 2], aut: [2, 3], wsl: [3, 4], lit: [3, 4] })) + assertEquals(["aut", "wsl", "lit"], await aut_f(3)) +})