diff --git a/dbal/development/src/core/entities/operations/core/user-operations.ts b/dbal/development/src/core/entities/operations/core/user-operations.ts index d5e29f59c..5d1da503e 100644 --- a/dbal/development/src/core/entities/operations/core/user-operations.ts +++ b/dbal/development/src/core/entities/operations/core/user-operations.ts @@ -1,2 +1,11 @@ export { createUserOperations } from './user' export type { UserOperations } from './user' + +export { createUser } from './user/create' +export { deleteUser } from './user/delete' +export { updateUser } from './user/update' +export { + assertValidUserCreate, + assertValidUserId, + assertValidUserUpdate, +} from './user/validation' diff --git a/dbal/development/src/core/entities/operations/core/user/create.ts b/dbal/development/src/core/entities/operations/core/user/create.ts new file mode 100644 index 000000000..4543fe4e2 --- /dev/null +++ b/dbal/development/src/core/entities/operations/core/user/create.ts @@ -0,0 +1,20 @@ +import type { DBALAdapter } from '../../../../adapters/adapter' +import { DBALError } from '../../../../foundation/errors' +import type { User } from '../../../../foundation/types' +import { assertValidUserCreate } from './validation' + +export const createUser = async ( + adapter: DBALAdapter, + data: Omit, +): Promise => { + assertValidUserCreate(data) + + try { + return adapter.create('User', data) as Promise + } catch (error) { + if (error instanceof DBALError && error.code === 409) { + throw DBALError.conflict('User with username or email already exists') + } + throw error + } +} diff --git a/dbal/development/src/core/entities/operations/core/user/delete.ts b/dbal/development/src/core/entities/operations/core/user/delete.ts new file mode 100644 index 000000000..07484d1a6 --- /dev/null +++ b/dbal/development/src/core/entities/operations/core/user/delete.ts @@ -0,0 +1,13 @@ +import type { DBALAdapter } from '../../../../adapters/adapter' +import { DBALError } from '../../../../foundation/errors' +import { assertValidUserId } from './validation' + +export const deleteUser = async (adapter: DBALAdapter, id: string): Promise => { + assertValidUserId(id) + + const result = await adapter.delete('User', id) + if (!result) { + throw DBALError.notFound(`User not found: ${id}`) + } + return result +} diff --git a/dbal/development/src/core/entities/operations/core/user/index.ts b/dbal/development/src/core/entities/operations/core/user/index.ts index 200efa017..a5f410c72 100644 --- a/dbal/development/src/core/entities/operations/core/user/index.ts +++ b/dbal/development/src/core/entities/operations/core/user/index.ts @@ -1,6 +1,8 @@ import type { DBALAdapter } from '../../../../adapters/adapter' import type { User, ListOptions, ListResult } from '../../../../foundation/types' -import { createUser, deleteUser, updateUser } from './mutations' +import { createUser } from './create' +import { deleteUser } from './delete' +import { updateUser } from './update' import { createManyUsers, deleteManyUsers, updateManyUsers } from './batch' import { listUsers, readUser } from './reads' diff --git a/dbal/development/src/core/entities/operations/core/user/mutations.ts b/dbal/development/src/core/entities/operations/core/user/mutations.ts deleted file mode 100644 index 8e80c7be8..000000000 --- a/dbal/development/src/core/entities/operations/core/user/mutations.ts +++ /dev/null @@ -1,57 +0,0 @@ -import type { DBALAdapter } from '../../../../adapters/adapter' -import type { User } from '../../../../foundation/types' -import { DBALError } from '../../../../foundation/errors' -import { validateUserCreate, validateUserUpdate, validateId } from '../../../../foundation/validation' - -export const createUser = async ( - adapter: DBALAdapter, - data: Omit, -): Promise => { - const validationErrors = validateUserCreate(data) - if (validationErrors.length > 0) { - throw DBALError.validationError('Invalid user data', validationErrors.map(error => ({ field: 'user', error }))) - } - - try { - return adapter.create('User', data) as Promise - } catch (error) { - if (error instanceof DBALError && error.code === 409) { - throw DBALError.conflict('User with username or email already exists') - } - throw error - } -} - -export const updateUser = async (adapter: DBALAdapter, id: string, data: Partial): Promise => { - const idErrors = validateId(id) - if (idErrors.length > 0) { - throw DBALError.validationError('Invalid user ID', idErrors.map(error => ({ field: 'id', error }))) - } - - const validationErrors = validateUserUpdate(data) - if (validationErrors.length > 0) { - throw DBALError.validationError('Invalid user update data', validationErrors.map(error => ({ field: 'user', error }))) - } - - try { - return adapter.update('User', id, data) as Promise - } catch (error) { - if (error instanceof DBALError && error.code === 409) { - throw DBALError.conflict('Username or email already exists') - } - throw error - } -} - -export const deleteUser = async (adapter: DBALAdapter, id: string): Promise => { - const validationErrors = validateId(id) - if (validationErrors.length > 0) { - throw DBALError.validationError('Invalid user ID', validationErrors.map(error => ({ field: 'id', error }))) - } - - const result = await adapter.delete('User', id) - if (!result) { - throw DBALError.notFound(`User not found: ${id}`) - } - return result -} diff --git a/dbal/development/src/core/entities/operations/core/user/update.ts b/dbal/development/src/core/entities/operations/core/user/update.ts new file mode 100644 index 000000000..ca0ae185d --- /dev/null +++ b/dbal/development/src/core/entities/operations/core/user/update.ts @@ -0,0 +1,22 @@ +import type { DBALAdapter } from '../../../../adapters/adapter' +import { DBALError } from '../../../../foundation/errors' +import type { User } from '../../../../foundation/types' +import { assertValidUserId, assertValidUserUpdate } from './validation' + +export const updateUser = async ( + adapter: DBALAdapter, + id: string, + data: Partial, +): Promise => { + assertValidUserId(id) + assertValidUserUpdate(data) + + try { + return adapter.update('User', id, data) as Promise + } catch (error) { + if (error instanceof DBALError && error.code === 409) { + throw DBALError.conflict('Username or email already exists') + } + throw error + } +} diff --git a/dbal/development/src/core/entities/operations/core/user/validation.ts b/dbal/development/src/core/entities/operations/core/user/validation.ts new file mode 100644 index 000000000..0b57322d5 --- /dev/null +++ b/dbal/development/src/core/entities/operations/core/user/validation.ts @@ -0,0 +1,24 @@ +import { DBALError } from '../../../../foundation/errors' +import type { User } from '../../../../foundation/types' +import { validateId, validateUserCreate, validateUserUpdate } from '../../../../foundation/validation' + +export const assertValidUserId = (id: string): void => { + const validationErrors = validateId(id) + if (validationErrors.length > 0) { + throw DBALError.validationError('Invalid user ID', validationErrors.map(error => ({ field: 'id', error }))) + } +} + +export const assertValidUserCreate = (data: Omit): void => { + const validationErrors = validateUserCreate(data) + if (validationErrors.length > 0) { + throw DBALError.validationError('Invalid user data', validationErrors.map(error => ({ field: 'user', error }))) + } +} + +export const assertValidUserUpdate = (data: Partial): void => { + const validationErrors = validateUserUpdate(data) + if (validationErrors.length > 0) { + throw DBALError.validationError('Invalid user update data', validationErrors.map(error => ({ field: 'user', error }))) + } +}