mirror of
https://gitlab.com/PronounsPage/PronounsPage.git
synced 2025-09-16 19:16:54 -04:00

the #shared alias used by Nuxt cannot be easily disabled and to prevent breackage with jiti, we make use of it
42 lines
1.3 KiB
TypeScript
42 lines
1.3 KiB
TypeScript
import SQL from 'sql-template-strings';
|
|
|
|
import type { Database } from './db.ts';
|
|
import type { UserRow } from './express/user.ts';
|
|
|
|
import { fallbackAvatar, gravatar, now } from '#shared/helpers.ts';
|
|
|
|
const fromPayload = (payloadJson: string): string => {
|
|
const payload = JSON.parse(payloadJson);
|
|
return payload.avatarCopy || payload.avatar;
|
|
};
|
|
|
|
export default async (
|
|
db: Database,
|
|
user: Pick<UserRow, 'id' | 'username' | 'email' | 'avatarSource'> & { payload?: string },
|
|
): Promise<string> => {
|
|
if (
|
|
user.avatarSource &&
|
|
process.env.NUXT_PUBLIC_CLOUDFRONT &&
|
|
user.avatarSource.startsWith(process.env.NUXT_PUBLIC_CLOUDFRONT!)
|
|
) {
|
|
return user.avatarSource;
|
|
} else if (user.avatarSource === 'gravatar') {
|
|
return await gravatar(user);
|
|
} else if (user.avatarSource) {
|
|
if (user.payload) {
|
|
return fromPayload(user.payload);
|
|
}
|
|
const auth = await db.get(SQL`
|
|
SELECT payload FROM authenticators
|
|
WHERE type = ${user.avatarSource}
|
|
AND userId = ${user.id}
|
|
AND (validUntil IS NULL OR validUntil > ${now()})
|
|
`) as { payload: string };
|
|
if (auth) {
|
|
return fromPayload(auth.payload);
|
|
}
|
|
}
|
|
|
|
return fallbackAvatar(user);
|
|
};
|