From 3b4162dd49e3610fa1f962c8807d4e89984cfa61 Mon Sep 17 00:00:00 2001 From: Pedro Sanders Date: Thu, 21 Dec 2023 21:10:27 -0500 Subject: [PATCH] chore: auto-populate avatar field with getGravatar function --- mods/apiserver/src/users/getGravatar.ts | 26 +++++++++++++++++++ mods/apiserver/src/users/updateUser.ts | 5 ++-- mods/apiserver/src/users/upsertDefaultUser.ts | 2 ++ .../src/workspaces/addWorkspaceMember.ts | 8 ++++-- 4 files changed, 36 insertions(+), 5 deletions(-) create mode 100644 mods/apiserver/src/users/getGravatar.ts diff --git a/mods/apiserver/src/users/getGravatar.ts b/mods/apiserver/src/users/getGravatar.ts new file mode 100644 index 0000000..483cfb3 --- /dev/null +++ b/mods/apiserver/src/users/getGravatar.ts @@ -0,0 +1,26 @@ +/* + * Copyright (C) 2023 by Fonoster Inc (https://fonoster.com) + * http://github.com/fonoster/goodtok + * + * This file is part of Goodtok + * + * Licensed under the MIT License (the "License"); + * you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * https://opensource.org/licenses/MIT + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import crypt from "crypto"; + +export function getGravatarURL(email: string, size = 200) { + email = email.trim().toLowerCase(); + const hash = crypt.createHash("md5").update(email).digest("hex"); + const url = `https://www.gravatar.com/avatar/${hash}?s=${size}`; + return url; +} diff --git a/mods/apiserver/src/users/updateUser.ts b/mods/apiserver/src/users/updateUser.ts index 1bf38db..aa62d6b 100644 --- a/mods/apiserver/src/users/updateUser.ts +++ b/mods/apiserver/src/users/updateUser.ts @@ -27,8 +27,7 @@ export async function updateUser( ctx: Context, request: UpdateUserRequest ): Promise { - // eslint-disable-next-line @typescript-eslint/no-unused-vars - const { password, ...rest } = request; + const { password } = request; logger.verbose("updating user", { id: ctx.userId }); @@ -46,7 +45,7 @@ export async function updateUser( }, data: { ...request, - password: password ? password : userFromDB.password, + password: password || userFromDB.password, updatedAt: new Date() } }); diff --git a/mods/apiserver/src/users/upsertDefaultUser.ts b/mods/apiserver/src/users/upsertDefaultUser.ts index 51d440b..d0fcd41 100644 --- a/mods/apiserver/src/users/upsertDefaultUser.ts +++ b/mods/apiserver/src/users/upsertDefaultUser.ts @@ -18,6 +18,7 @@ */ import { getLogger } from "@fonoster/logger"; import { prisma } from "../db"; +import { getGravatarURL } from "./getGravatar"; const logger = getLogger({ service: "apiserver", filePath: __filename }); @@ -59,6 +60,7 @@ async function upsertDefaultUser(request: { email: string; password: string }) { create: { name: "Admin", email, + avatar: getGravatarURL(email), password, createdAt: today, updatedAt: today diff --git a/mods/apiserver/src/workspaces/addWorkspaceMember.ts b/mods/apiserver/src/workspaces/addWorkspaceMember.ts index 950a261..61d4c6c 100644 --- a/mods/apiserver/src/workspaces/addWorkspaceMember.ts +++ b/mods/apiserver/src/workspaces/addWorkspaceMember.ts @@ -24,10 +24,13 @@ import { } from "./types"; import { Context } from "../context"; import { getLogger } from "@fonoster/logger"; -import { WorkspaceMemberStatus as PrismaWorkspaceMemberStatus } from "@prisma/client"; -import { WorkspaceMemberRole as PrismaWorkspaceMemberRole } from "@prisma/client"; +import { + WorkspaceMemberStatus as PrismaWorkspaceMemberStatus, + WorkspaceMemberRole as PrismaWorkspaceMemberRole +} from "@prisma/client"; import { customAlphabet } from "nanoid"; import { sendInvite } from "../notifications/sendInvite"; +import { getGravatarURL } from "../users/getGravatar"; const logger = getLogger({ service: "apiserver", filePath: __filename }); @@ -78,6 +81,7 @@ export async function addWorkspaceMember( data: { email, name, + avatar: getGravatarURL(email), password: oneTimePassword } });