Compare commits

..

1 Commits

Author SHA1 Message Date
ff5371d867 Removed hard dependency on discord ID for auth system 2025-12-19 22:46:53 -05:00
2 changed files with 28 additions and 32 deletions

View File

@@ -46,32 +46,35 @@ passport.use(new OpenIDConnectStrategy({
//lookup existing user //lookup existing user
const existing = await con.query(`SELECT id FROM members WHERE authentik_issuer = ? AND authentik_sub = ? LIMIT 1;`, [issuer, sub]); const existing = await con.query(`SELECT id FROM members WHERE authentik_issuer = ? AND authentik_sub = ? LIMIT 1;`, [issuer, sub]);
let memberId: number; let memberId: number | null = null;
//if member exists //if member exists
if (existing.length > 0) { if (existing.length > 0) {
memberId = existing[0].id; memberId = existing[0].id;
} else { } else {
//otherwise: create account //otherwise: create account mode
const jwt = parseJwt(jwtClaims); const jwt = parseJwt(jwtClaims);
const discordID = jwt.discord.id as number; const discordID = jwt.discord?.id as number;
//check if account is available to claim //check if account is available to claim
if (discordID)
memberId = await mapDiscordtoID(discordID); memberId = await mapDiscordtoID(discordID);
if (memberId === null) { if (discordID && memberId) {
// create new account // claim account
console.log("Claiming account");
const result = await con.query(
`UPDATE members SET authentik_sub = ?, authentik_issuer = ? WHERE id = ?;`,
[sub, issuer, memberId]
)
} else {
console.log("New Account");
// new account
const username = sub.username; const username = sub.username;
const result = await con.query( const result = await con.query(
`INSERT INTO members (name, authentik_sub, authentik_issuer) VALUES (?, ?, ?)`, `INSERT INTO members (name, authentik_sub, authentik_issuer) VALUES (?, ?, ?)`,
[username, sub, issuer] [username, sub, issuer]
) )
memberId = Number(result.insertId); memberId = Number(result.insertId);
} else {
// claim existing account
const result = await con.query(
`UPDATE members SET authentik_sub = ?, authentik_issuer = ? WHERE id = ?;`,
[sub, issuer, memberId]
)
} }
} }

View File

@@ -84,7 +84,7 @@ function loaStatus(loa: LOARequest): "Upcoming" | "Active" | "Overdue" | "Closed
if (now < start) return "Upcoming"; if (now < start) return "Upcoming";
if (now >= start && now <= end) return "Active"; if (now >= start && now <= end) return "Active";
if (now > loa.extended_till || end) return "Overdue"; if (now > end) return "Overdue";
return "Overdue"; // fallback return "Overdue"; // fallback
} }
@@ -197,7 +197,7 @@ function setPage(pagenum: number) {
<TableCell @click.stop="" class="text-right"> <TableCell @click.stop="" class="text-right">
<DropdownMenu> <DropdownMenu>
<DropdownMenuTrigger class="cursor-pointer"> <DropdownMenuTrigger class="cursor-pointer">
<Button variant="ghost" size="icon"> <Button variant="ghost">
<Ellipsis class="size-6"></Ellipsis> <Ellipsis class="size-6"></Ellipsis>
</Button> </Button>
</DropdownMenuTrigger> </DropdownMenuTrigger>
@@ -220,11 +220,10 @@ function setPage(pagenum: number) {
</DropdownMenu> </DropdownMenu>
</TableCell> </TableCell>
<TableCell> <TableCell>
<Button v-if="expanded === post.id" @click.stop="expanded = null" size="icon" <Button v-if="expanded === post.id" @click.stop="expanded = null" variant="ghost">
variant="ghost">
<ChevronUp class="size-6" /> <ChevronUp class="size-6" />
</Button> </Button>
<Button v-else @click.stop="expanded = post.id" size="icon" variant="ghost"> <Button v-else @click.stop="expanded = post.id" variant="ghost">
<ChevronDown class="size-6" /> <ChevronDown class="size-6" />
</Button> </Button>
</TableCell> </TableCell>
@@ -234,24 +233,18 @@ function setPage(pagenum: number) {
<TableCell :colspan="8" class="p-0"> <TableCell :colspan="8" class="p-0">
<div class="w-full p-3 mb-6 space-y-3"> <div class="w-full p-3 mb-6 space-y-3">
<div class="flex justify-between items-start gap-4"> <div class="flex justify-between items-start gap-4">
<div class="space-y-3 w-full"> <div class="flex-1">
<!-- Title -->
<!-- Header --> <p class="text-md font-semibold text-foreground">
<div class="flex items-center gap-2">
<h4 class="text-sm font-semibold text-foreground">
Reason Reason
</h4> </p>
<Separator class="flex-1" />
</div>
<!-- Content --> <!-- Content -->
<div <p
class="rounded-lg border bg-muted/40 px-4 py-3 text-sm leading-relaxed whitespace-pre-wrap text-muted-foreground w-full"> class="mt-1 text-md whitespace-pre-wrap leading-relaxed text-muted-foreground">
{{ post.reason || 'No reason provided.' }} {{ post.reason }}
</p>
</div> </div>
</div>
</div> </div>
</div> </div>
</TableCell> </TableCell>