chore(server): core IoC #67 - remaining users repo

This commit is contained in:
Kristaps Fabians Geikins
2024-10-16 12:10:13 +03:00
parent 554b2fa386
commit b2efcdd951
5 changed files with 37 additions and 21 deletions
@@ -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<boolean>
export type MarkOnboardingComplete = (userId: string) => Promise<boolean>
export type GetFirstAdmin = () => Promise<Optional<User>>
export type LegacyGetUserByEmail = (params: {
email: string
}) => Promise<Nullable<Omit<User, 'passwordDigest'>>>
@@ -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 = {
@@ -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<UserRecord & { password?: string }>
@@ -272,14 +275,17 @@ export const updateUserFactory =
return newUser as Nullable<UserRecord>
}
export async function getFirstAdmin() {
const q = Users.knex()
.select<UserRecord[]>(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<UserRecord[]>(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
@@ -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,
@@ -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 =>