// @ts-check
/** @param {D1Database} database @param {string} owner */
export async function inviteData(database, owner) {
if (owner === "wimble") {
const result = await database.prepare(`
SELECT system_invite_codes.code, system_invite_codes.accepted_username,
CASE WHEN users.status = 'active' AND computers.status = 'active'
THEN users.username ELSE NULL END AS connected_username
FROM system_invite_codes
LEFT JOIN users ON users.username = system_invite_codes.accepted_username
LEFT JOIN computers ON computers.owner_account_id = users.id AND computers.status = 'active'
ORDER BY system_invite_codes.created_at, system_invite_codes.code
`).all();
return fromRows("Wimble", /** @type {InviteRow[]} */ (result.results ?? []));
}
const result = await database.prepare(`
SELECT invite_codes.code, invited.username AS accepted_username,
CASE WHEN invited.status = 'active' AND computers.status = 'active'
THEN invited.username ELSE NULL END AS connected_username
FROM users owner
JOIN invite_codes ON invite_codes.inviter_id = owner.id
LEFT JOIN users invited ON invited.id = invite_codes.accepted_user_id
LEFT JOIN computers ON computers.owner_account_id = invited.id AND computers.status = 'active'
WHERE owner.username = ?
ORDER BY invite_codes.created_at, invite_codes.code
`).bind(owner).all();
return fromRows(displayName(owner), /** @type {InviteRow[]} */ (result.results ?? []));
}
/** @typedef {{ code: string, accepted_username: string | null, connected_username: string | null }} InviteRow */
/** @param {string} ownerLabel @param {InviteRow[]} rows */
function fromRows(ownerLabel, rows) {
return {
ownerLabel,
invited: rows.flatMap((row) => row.connected_username ? [row.connected_username] : []),
available: rows.filter((row) => !row.accepted_username).map((row) => row.code),
};
}
/** @param {string} username */
function displayName(username) {
return `${username.charAt(0).toUpperCase()}${username.slice(1)}`;
}