From b2efcdd95143c81bf9fd78f4d45fe2d03f6552bd Mon Sep 17 00:00:00 2001 From: Kristaps Fabians Geikins Date: Wed, 16 Oct 2024 12:10:13 +0300 Subject: [PATCH] chore(server): core IoC #67 - remaining users repo --- .../modules/core/domain/users/operations.ts | 11 +++++- .../modules/core/graph/resolvers/users.js | 5 +-- .../server/modules/core/repositories/users.ts | 34 +++++++++++-------- .../server/modules/cross-server-sync/index.ts | 4 +-- .../services/onboardingProject.ts | 4 +-- 5 files changed, 37 insertions(+), 21 deletions(-) diff --git a/packages/server/modules/core/domain/users/operations.ts b/packages/server/modules/core/domain/users/operations.ts index a2d182477..1ea3e71ab 100644 --- a/packages/server/modules/core/domain/users/operations.ts +++ b/packages/server/modules/core/domain/users/operations.ts @@ -5,7 +5,12 @@ import { } from '@/modules/core/domain/users/types' import { UserUpdateInput } from '@/modules/core/graph/generated/graphql' import { ServerAclRecord, UserWithRole } from '@/modules/core/helpers/types' -import { Nullable, NullableKeysToOptional, ServerRoles } from '@speckle/shared' +import { + Nullable, + NullableKeysToOptional, + Optional, + ServerRoles +} from '@speckle/shared' export type GetUserParams = Partial<{ /** @@ -80,6 +85,10 @@ export type UpdateUserServerRole = (params: { export type MarkUserAsVerified = (email: string) => Promise +export type MarkOnboardingComplete = (userId: string) => Promise + +export type GetFirstAdmin = () => Promise> + export type LegacyGetUserByEmail = (params: { email: string }) => Promise>> diff --git a/packages/server/modules/core/graph/resolvers/users.js b/packages/server/modules/core/graph/resolvers/users.js index 80faff081..4b6a499a2 100644 --- a/packages/server/modules/core/graph/resolvers/users.js +++ b/packages/server/modules/core/graph/resolvers/users.js @@ -7,7 +7,6 @@ const { } = require('@/modules/core/services/users/adminUsersListService') const { Roles, Scopes } = require('@speckle/shared') const { - markOnboardingComplete, legacyGetUserFactory, legacyGetUserByEmailFactory, getUserFactory, @@ -16,7 +15,8 @@ const { deleteUserRecordFactory, getUserRoleFactory, updateUserServerRoleFactory, - searchUsersFactory + searchUsersFactory, + markOnboardingCompleteFactory } = require('@/modules/core/repositories/users') const { UsersMeta } = require('@/modules/core/dbSchema') const { getServerInfo } = require('@/modules/core/services/generic') @@ -69,6 +69,7 @@ const changeUserRole = changeUserRoleFactory({ updateUserServerRole: updateUserServerRoleFactory({ db }) }) const searchUsers = searchUsersFactory({ db }) +const markOnboardingComplete = markOnboardingCompleteFactory({ db }) /** @type {import('@/modules/core/graph/generated/graphql').Resolvers} */ module.exports = { diff --git a/packages/server/modules/core/repositories/users.ts b/packages/server/modules/core/repositories/users.ts index cc5fbc62a..6a49a51e3 100644 --- a/packages/server/modules/core/repositories/users.ts +++ b/packages/server/modules/core/repositories/users.ts @@ -7,13 +7,13 @@ import { UserValidationError } from '@/modules/core/errors/user' import { Knex } from 'knex' import { Roles, ServerRoles } from '@speckle/shared' import { updateUserEmailFactory } from '@/modules/core/repositories/userEmails' -import { db } from '@/db/knex' import { markUserEmailAsVerifiedFactory } from '@/modules/core/services/users/emailVerification' import { UserWithOptionalRole } from '@/modules/core/domain/users/types' import { CountAdminUsers, CountUsers, DeleteUserRecord, + GetFirstAdmin, GetUser, GetUserByEmail, GetUserParams, @@ -25,6 +25,7 @@ import { LegacyGetUser, LegacyGetUserByEmail, ListPaginatedUsersPage, + MarkOnboardingComplete, MarkUserAsVerified, SearchLimitedUsers, StoreUser, @@ -214,14 +215,16 @@ export const markUserAsVerifiedFactory = return !!(usersUpdate || userEmailsUpdate) } -export async function markOnboardingComplete(userId: string) { - if (!userId) return false +export const markOnboardingCompleteFactory = + (deps: { db: Knex }): MarkOnboardingComplete => + async (userId: string) => { + if (!userId) return false - const meta = metaHelpers(Users, db) - const newMeta = await meta.set(userId, 'isOnboardingFinished', true) + const meta = metaHelpers(Users, deps.db) + const newMeta = await meta.set(userId, 'isOnboardingFinished', true) - return !!newMeta.value -} + return !!newMeta.value + } const cleanInputRecord = ( update: Partial @@ -272,14 +275,17 @@ export const updateUserFactory = return newUser as Nullable } -export async function getFirstAdmin() { - const q = Users.knex() - .select(Users.cols) - .innerJoin(ServerAcl.name, ServerAcl.col.userId, Users.col.id) - .where(ServerAcl.col.role, Roles.Server.Admin) +export const getFirstAdminFactory = + (deps: { db: Knex }): GetFirstAdmin => + async () => { + const q = tables + .users(deps.db) + .select(Users.cols) + .innerJoin(ServerAcl.name, ServerAcl.col.userId, Users.col.id) + .where(ServerAcl.col.role, Roles.Server.Admin) - return await q.first() -} + return await q.first() + } /** * @deprecated Use getUser instead diff --git a/packages/server/modules/cross-server-sync/index.ts b/packages/server/modules/cross-server-sync/index.ts index c9746a593..072e47d7a 100644 --- a/packages/server/modules/cross-server-sync/index.ts +++ b/packages/server/modules/cross-server-sync/index.ts @@ -52,7 +52,7 @@ import { markOnboardingBaseStreamFactory } from '@/modules/core/repositories/streams' import { - getFirstAdmin, + getFirstAdminFactory, getUserFactory, getUsersFactory } from '@/modules/core/repositories/users' @@ -172,7 +172,7 @@ const crossServerSyncModule: SpeckleModule = { }) const ensureOnboardingProject = ensureOnboardingProjectFactory({ getOnboardingBaseStream: getOnboardingBaseStreamFactory({ db }), - getFirstAdmin, + getFirstAdmin: getFirstAdminFactory({ db }), downloadProject: downloadProjectFactory({ downloadCommit: downloadCommitFactory({ getStream, diff --git a/packages/server/modules/cross-server-sync/services/onboardingProject.ts b/packages/server/modules/cross-server-sync/services/onboardingProject.ts index da536388b..352569d67 100644 --- a/packages/server/modules/cross-server-sync/services/onboardingProject.ts +++ b/packages/server/modules/cross-server-sync/services/onboardingProject.ts @@ -3,7 +3,7 @@ import { GetOnboardingBaseStream, MarkOnboardingBaseStream } from '@/modules/core/domain/streams/operations' -import { getFirstAdmin } from '@/modules/core/repositories/users' +import { GetFirstAdmin } from '@/modules/core/domain/users/operations' import { DownloadProject, EnsureOnboardingProject, @@ -39,7 +39,7 @@ export const getOnboardingBaseProjectFactory = export const ensureOnboardingProjectFactory = (deps: { getOnboardingBaseStream: GetOnboardingBaseStream - getFirstAdmin: typeof getFirstAdmin + getFirstAdmin: GetFirstAdmin downloadProject: DownloadProject markOnboardingBaseStream: MarkOnboardingBaseStream }): EnsureOnboardingProject =>