@multitenantkit/domain 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.d.ts +3 -2
- package/dist/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.d.ts.map +1 -1
- package/dist/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.js +49 -18
- package/dist/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.js.map +1 -1
- package/dist/organizations/use-cases/create-organization/CreateOrganization.d.ts +7 -2
- package/dist/organizations/use-cases/create-organization/CreateOrganization.d.ts.map +1 -1
- package/dist/organizations/use-cases/create-organization/CreateOrganization.js +69 -23
- package/dist/organizations/use-cases/create-organization/CreateOrganization.js.map +1 -1
- package/package.json +1 -1
package/dist/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.d.ts
CHANGED
|
@@ -11,9 +11,10 @@ import { BaseUseCase } from '../../../shared/use-case';
|
|
|
11
11
|
* Generic support for custom fields:
|
|
12
12
|
* @template TOrganizationCustomFields - Custom fields for OrganizationRepository (for consistency)
|
|
13
13
|
*/
|
|
14
|
-
export declare class AddOrganizationMember<TOrganizationCustomFields = {}, TUserCustomFields = {}, TOrganizationMembershipCustomFields = {}> extends BaseUseCase<AddOrganizationMemberInput, AddOrganizationMemberOutput, DomainError, TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields> implements IAddOrganizationMember {
|
|
14
|
+
export declare class AddOrganizationMember<TOrganizationCustomFields = {}, TUserCustomFields = {}, TOrganizationMembershipCustomFields = {}> extends BaseUseCase<AddOrganizationMemberInput & TOrganizationMembershipCustomFields, AddOrganizationMemberOutput, DomainError, TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields> implements IAddOrganizationMember {
|
|
15
|
+
private readonly membershipCustomSchema?;
|
|
15
16
|
constructor(adapters: Adapters<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>, toolkitOptions?: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>);
|
|
16
17
|
protected authorize(input: AddOrganizationMemberInput, _context: OperationContext): Promise<Result<void, DomainError>>;
|
|
17
|
-
protected executeBusinessLogic(input: AddOrganizationMemberInput, context: OperationContext): Promise<Result<AddOrganizationMemberOutput, DomainError>>;
|
|
18
|
+
protected executeBusinessLogic(input: AddOrganizationMemberInput & TOrganizationMembershipCustomFields, context: OperationContext): Promise<Result<AddOrganizationMemberOutput, DomainError>>;
|
|
18
19
|
}
|
|
19
20
|
//# sourceMappingURL=AddOrganizationMember.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddOrganizationMember.d.ts","sourceRoot":"","sources":["../../../../src/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EACR,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACzB,MAAM,2DAA2D,CAAC;
|
|
1
|
+
{"version":3,"file":"AddOrganizationMember.d.ts","sourceRoot":"","sources":["../../../../src/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AACjE,OAAO,KAAK,EACR,0BAA0B,EAC1B,2BAA2B,EAC3B,sBAAsB,EACzB,MAAM,2DAA2D,CAAC;AAOnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EAEH,KAAK,WAAW,EAInB,MAAM,sDAAsD,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;GAMG;AACH,qBAAa,qBAAqB,CAE1B,yBAAyB,GAAG,EAAE,EAE9B,iBAAiB,GAAG,EAAE,EAEtB,mCAAmC,GAAG,EAAE,CAE5C,SAAQ,WAAW,CACf,0BAA0B,GAAG,mCAAmC,EAChE,2BAA2B,EAC3B,WAAW,EACX,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CAEvC,YAAW,sBAAsB;IAEjC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAmB;gBAGvD,QAAQ,EAAE,QAAQ,CACd,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,EACD,cAAc,CAAC,EAAE,cAAc,CAC3B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC;cAyBW,SAAS,CACrB,KAAK,EAAE,0BAA0B,EACjC,QAAQ,EAAE,gBAAgB,GAC3B,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;cAqDrB,oBAAoB,CAChC,KAAK,EAAE,0BAA0B,GAAG,mCAAmC,EACvE,OAAO,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,2BAA2B,EAAE,WAAW,CAAC,CAAC;CAwI/D"}
|
package/dist/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { AddOrganizationMemberInputSchema, AddOrganizationMemberOutputSchema } from '@multitenantkit/domain-contracts/organization-memberships';
|
|
1
|
+
import { AddOrganizationMemberInputSchema, AddOrganizationMemberOutputSchema, OrganizationMembershipSchema } from '@multitenantkit/domain-contracts/organization-memberships';
|
|
2
2
|
import { ConflictError, NotFoundError, UnauthorizedError, ValidationError } from '@multitenantkit/domain-contracts/shared/errors/index';
|
|
3
3
|
import { Result } from '../../../shared/result/Result';
|
|
4
4
|
import { BaseUseCase } from '../../../shared/use-case';
|
|
@@ -10,8 +10,17 @@ import { BaseUseCase } from '../../../shared/use-case';
|
|
|
10
10
|
* @template TOrganizationCustomFields - Custom fields for OrganizationRepository (for consistency)
|
|
11
11
|
*/
|
|
12
12
|
export class AddOrganizationMember extends BaseUseCase {
|
|
13
|
+
membershipCustomSchema;
|
|
13
14
|
constructor(adapters, toolkitOptions) {
|
|
14
|
-
|
|
15
|
+
// Extract organization membership custom schema from toolkit options
|
|
16
|
+
const membershipCustomSchema = toolkitOptions?.organizationMemberships?.customFields
|
|
17
|
+
?.customSchema;
|
|
18
|
+
// Build input schema with membership custom fields if provided
|
|
19
|
+
const inputSchema = (membershipCustomSchema
|
|
20
|
+
? AddOrganizationMemberInputSchema.and(membershipCustomSchema.partial())
|
|
21
|
+
: AddOrganizationMemberInputSchema);
|
|
22
|
+
super('organizationMembership-addOrganizationMember', adapters, toolkitOptions, inputSchema, AddOrganizationMemberOutputSchema, 'Failed to add organization member');
|
|
23
|
+
this.membershipCustomSchema = membershipCustomSchema;
|
|
15
24
|
}
|
|
16
25
|
async authorize(input, _context) {
|
|
17
26
|
// Ensure organization exists for permission checks
|
|
@@ -44,17 +53,20 @@ export class AddOrganizationMember extends BaseUseCase {
|
|
|
44
53
|
return Result.ok(undefined);
|
|
45
54
|
}
|
|
46
55
|
async executeBusinessLogic(input, context) {
|
|
47
|
-
// 1.
|
|
48
|
-
const
|
|
56
|
+
// 1. Extract custom fields from input
|
|
57
|
+
const { principalExternalId, organizationId, username, roleCode, ...customFields } = input;
|
|
58
|
+
const baseInput = { principalExternalId, organizationId, username, roleCode };
|
|
59
|
+
// 2. Validate target user exists
|
|
60
|
+
const targetUser = await this.adapters.persistence.userRepository.findByUsername(baseInput.username);
|
|
49
61
|
const now = this.adapters.system.clock.now();
|
|
50
62
|
let existingMembership = null;
|
|
51
63
|
// If user doesn't exist, just create the membership without user id
|
|
52
64
|
if (targetUser) {
|
|
53
|
-
//
|
|
54
|
-
const existingMembershipDB = await this.adapters.persistence.organizationMembershipRepository.findByUserIdAndOrganizationId(targetUser.id,
|
|
65
|
+
// 3. Check if user already has a membership
|
|
66
|
+
const existingMembershipDB = await this.adapters.persistence.organizationMembershipRepository.findByUserIdAndOrganizationId(targetUser.id, baseInput.organizationId);
|
|
55
67
|
existingMembership = existingMembershipDB;
|
|
56
68
|
if (existingMembership && !existingMembership.leftAt && !existingMembership.deletedAt) {
|
|
57
|
-
return Result.fail(new ConflictError('OrganizationMembership', `${targetUser.id}:${
|
|
69
|
+
return Result.fail(new ConflictError('OrganizationMembership', `${targetUser.id}:${baseInput.organizationId}`, {
|
|
58
70
|
reason: 'User is already a member of this organization'
|
|
59
71
|
}));
|
|
60
72
|
}
|
|
@@ -62,7 +74,7 @@ export class AddOrganizationMember extends BaseUseCase {
|
|
|
62
74
|
let membership;
|
|
63
75
|
if (existingMembership && !!existingMembership.leftAt && !existingMembership.deletedAt) {
|
|
64
76
|
// 4a. Reactivate existing membership that was left
|
|
65
|
-
const
|
|
77
|
+
const reactivatedMembershipBase = {
|
|
66
78
|
...existingMembership,
|
|
67
79
|
invitedAt: now,
|
|
68
80
|
joinedAt: undefined,
|
|
@@ -70,21 +82,26 @@ export class AddOrganizationMember extends BaseUseCase {
|
|
|
70
82
|
deletedAt: undefined,
|
|
71
83
|
updatedAt: now
|
|
72
84
|
};
|
|
85
|
+
// Merge base with custom fields
|
|
86
|
+
const reactivatedMembership = {
|
|
87
|
+
...reactivatedMembershipBase,
|
|
88
|
+
...customFields
|
|
89
|
+
};
|
|
73
90
|
// Then update the role if it's different from current role
|
|
74
91
|
membership =
|
|
75
|
-
reactivatedMembership.roleCode !==
|
|
76
|
-
? { ...reactivatedMembership, roleCode:
|
|
92
|
+
reactivatedMembership.roleCode !== baseInput.roleCode
|
|
93
|
+
? { ...reactivatedMembership, roleCode: baseInput.roleCode, updatedAt: now }
|
|
77
94
|
: reactivatedMembership;
|
|
78
95
|
}
|
|
79
96
|
else {
|
|
80
|
-
// 4b. Create new membership
|
|
97
|
+
// 4b. Create new membership with custom fields
|
|
81
98
|
const membershipId = this.adapters.system.uuid.generate();
|
|
82
|
-
|
|
99
|
+
const membershipBase = {
|
|
83
100
|
id: membershipId,
|
|
84
101
|
userId: targetUser?.id,
|
|
85
|
-
username:
|
|
86
|
-
organizationId:
|
|
87
|
-
roleCode:
|
|
102
|
+
username: baseInput.username,
|
|
103
|
+
organizationId: baseInput.organizationId,
|
|
104
|
+
roleCode: baseInput.roleCode,
|
|
88
105
|
invitedAt: now,
|
|
89
106
|
joinedAt: undefined,
|
|
90
107
|
leftAt: undefined,
|
|
@@ -92,11 +109,25 @@ export class AddOrganizationMember extends BaseUseCase {
|
|
|
92
109
|
createdAt: now,
|
|
93
110
|
updatedAt: now
|
|
94
111
|
};
|
|
112
|
+
// Merge base membership with custom fields
|
|
113
|
+
membership = {
|
|
114
|
+
...membershipBase,
|
|
115
|
+
...customFields
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
// 5. Validate the membership data (base + custom) if custom schema exists
|
|
119
|
+
if (this.membershipCustomSchema) {
|
|
120
|
+
const membershipSchema = OrganizationMembershipSchema.and(this.membershipCustomSchema);
|
|
121
|
+
const membershipValidation = membershipSchema.safeParse(membership);
|
|
122
|
+
if (!membershipValidation.success) {
|
|
123
|
+
const firstError = membershipValidation.error.errors[0];
|
|
124
|
+
return Result.fail(new ValidationError(`Membership validation failed: ${firstError.message}`, firstError.path.join('.')));
|
|
125
|
+
}
|
|
95
126
|
}
|
|
96
|
-
//
|
|
127
|
+
// 6. Persist the entity (save or update) using Unit of Work (transaction) with audit context
|
|
97
128
|
const auditContext = {
|
|
98
129
|
...context,
|
|
99
|
-
organizationId:
|
|
130
|
+
organizationId: baseInput.organizationId,
|
|
100
131
|
auditAction: 'ADD_ORGANIZATION_MEMBER'
|
|
101
132
|
};
|
|
102
133
|
try {
|
|
@@ -116,7 +147,7 @@ export class AddOrganizationMember extends BaseUseCase {
|
|
|
116
147
|
originalError: error
|
|
117
148
|
}));
|
|
118
149
|
}
|
|
119
|
-
//
|
|
150
|
+
// 7. KEY PATTERN: Spread + Parse to guarantee contract
|
|
120
151
|
const output = AddOrganizationMemberOutputSchema.parse({
|
|
121
152
|
...membership
|
|
122
153
|
});
|
package/dist/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AddOrganizationMember.js","sourceRoot":"","sources":["../../../../src/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.ts"],"names":[],"mappings":"AAMA,OAAO,EACH,gCAAgC,EAChC,iCAAiC,
|
|
1
|
+
{"version":3,"file":"AddOrganizationMember.js","sourceRoot":"","sources":["../../../../src/organization-memberships/use-cases/add-organization-member/AddOrganizationMember.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,9 +11,14 @@ import { BaseUseCase } from '../../../shared/use-case';
|
|
|
11
11
|
* Generic support for custom fields:
|
|
12
12
|
* @template TOrganizationCustomFields - Custom fields added to Organization
|
|
13
13
|
*/
|
|
14
|
-
export declare class CreateOrganization<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}> extends BaseUseCase<CreateOrganizationInput & TOrganizationCustomFields
|
|
14
|
+
export declare class CreateOrganization<TUserCustomFields = {}, TOrganizationCustomFields = {}, TOrganizationMembershipCustomFields = {}> extends BaseUseCase<CreateOrganizationInput & TOrganizationCustomFields & {
|
|
15
|
+
ownerMembershipCustomFields?: TOrganizationMembershipCustomFields;
|
|
16
|
+
}, CreateOrganizationOutput, DomainError, TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields> implements ICreateOrganization {
|
|
15
17
|
private readonly customSchema?;
|
|
18
|
+
private readonly membershipCustomSchema?;
|
|
16
19
|
constructor(adapters: Adapters<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>, toolkitOptions?: ToolkitOptions<TUserCustomFields, TOrganizationCustomFields, TOrganizationMembershipCustomFields>);
|
|
17
|
-
protected executeBusinessLogic(input: CreateOrganizationInput & TOrganizationCustomFields
|
|
20
|
+
protected executeBusinessLogic(input: CreateOrganizationInput & TOrganizationCustomFields & {
|
|
21
|
+
ownerMembershipCustomFields?: TOrganizationMembershipCustomFields;
|
|
22
|
+
}, context: OperationContext): Promise<Result<CreateOrganizationOutput, DomainError>>;
|
|
18
23
|
}
|
|
19
24
|
//# sourceMappingURL=CreateOrganization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateOrganization.d.ts","sourceRoot":"","sources":["../../../../src/organizations/use-cases/create-organization/CreateOrganization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,KAAK,EACR,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EAEtB,MAAM,gDAAgD,CAAC;AAKxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EACH,KAAK,WAAW,EAEnB,MAAM,sDAAsD,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;GAMG;AACH,qBAAa,kBAAkB,CAEvB,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,CAE5C,SAAQ,WAAW,CACf,uBAAuB,
|
|
1
|
+
{"version":3,"file":"CreateOrganization.d.ts","sourceRoot":"","sources":["../../../../src/organizations/use-cases/create-organization/CreateOrganization.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kCAAkC,CAAC;AAEjE,OAAO,KAAK,EACR,uBAAuB,EACvB,wBAAwB,EACxB,mBAAmB,EAEtB,MAAM,gDAAgD,CAAC;AAKxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AAChG,OAAO,EACH,KAAK,WAAW,EAEnB,MAAM,sDAAsD,CAAC;AAE9D,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;GAMG;AACH,qBAAa,kBAAkB,CAEvB,iBAAiB,GAAG,EAAE,EAEtB,yBAAyB,GAAG,EAAE,EAE9B,mCAAmC,GAAG,EAAE,CAE5C,SAAQ,WAAW,CACf,uBAAuB,GACnB,yBAAyB,GAAG;IACxB,2BAA2B,CAAC,EAAE,mCAAmC,CAAC;CACrE,EACL,wBAAwB,EACxB,WAAW,EACX,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CAEvC,YAAW,mBAAmB;IAE9B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAmB;IACjD,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAmB;gBAGvD,QAAQ,EAAE,QAAQ,CACd,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC,EACD,cAAc,CAAC,EAAE,cAAc,CAC3B,iBAAiB,EACjB,yBAAyB,EACzB,mCAAmC,CACtC;cAmDW,oBAAoB,CAChC,KAAK,EAAE,uBAAuB,GAC1B,yBAAyB,GAAG;QACxB,2BAA2B,CAAC,EAAE,mCAAmC,CAAC;KACrE,EACL,OAAO,EAAE,gBAAgB,GAC1B,OAAO,CAAC,MAAM,CAAC,wBAAwB,EAAE,WAAW,CAAC,CAAC;CA4H5D"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { CreateOrganizationInputSchema, CreateOrganizationOutputSchema } from '@multitenantkit/domain-contracts/organizations';
|
|
2
2
|
import { ValidationError } from '@multitenantkit/domain-contracts/shared/errors/index';
|
|
3
|
+
import { z } from 'zod';
|
|
3
4
|
import { Result } from '../../../shared/result/Result';
|
|
4
5
|
import { BaseUseCase } from '../../../shared/use-case';
|
|
5
6
|
/**
|
|
@@ -11,19 +12,31 @@ import { BaseUseCase } from '../../../shared/use-case';
|
|
|
11
12
|
*/
|
|
12
13
|
export class CreateOrganization extends BaseUseCase {
|
|
13
14
|
customSchema;
|
|
15
|
+
membershipCustomSchema;
|
|
14
16
|
constructor(adapters, toolkitOptions) {
|
|
15
17
|
// Extract organization custom schema from toolkit options
|
|
16
18
|
const customSchema = toolkitOptions?.organizations?.customFields?.customSchema;
|
|
17
|
-
//
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
|
|
19
|
+
// Extract organization membership custom schema from toolkit options
|
|
20
|
+
const membershipCustomSchema = toolkitOptions?.organizationMemberships?.customFields
|
|
21
|
+
?.customSchema;
|
|
22
|
+
// Build input schema with organization custom fields and optional membership custom fields
|
|
23
|
+
let inputSchema = CreateOrganizationInputSchema;
|
|
24
|
+
if (customSchema) {
|
|
25
|
+
inputSchema = inputSchema.and(customSchema.partial());
|
|
26
|
+
}
|
|
27
|
+
if (membershipCustomSchema) {
|
|
28
|
+
inputSchema = inputSchema.and(z.object({
|
|
29
|
+
ownerMembershipCustomFields: membershipCustomSchema.partial().optional()
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
const finalInputSchema = inputSchema;
|
|
21
33
|
// Build output schema with custom fields if provided
|
|
22
34
|
const outputSchema = (customSchema
|
|
23
35
|
? CreateOrganizationOutputSchema.merge(customSchema)
|
|
24
36
|
: CreateOrganizationOutputSchema);
|
|
25
|
-
super('organization-createOrganization', adapters, toolkitOptions,
|
|
37
|
+
super('organization-createOrganization', adapters, toolkitOptions, finalInputSchema, outputSchema, 'Failed to create organization');
|
|
26
38
|
this.customSchema = customSchema;
|
|
39
|
+
this.membershipCustomSchema = membershipCustomSchema;
|
|
27
40
|
}
|
|
28
41
|
async executeBusinessLogic(input, context) {
|
|
29
42
|
// 1. Business validation - e.g., ensure no conflicting organization constraints
|
|
@@ -36,15 +49,17 @@ export class CreateOrganization extends BaseUseCase {
|
|
|
36
49
|
// 2. Generate ID and timestamp
|
|
37
50
|
const organizationId = this.adapters.system.uuid.generate();
|
|
38
51
|
const now = this.adapters.system.clock.now();
|
|
39
|
-
// 3.
|
|
52
|
+
// 3. Extract membership custom fields from input (if provided)
|
|
53
|
+
const { ownerMembershipCustomFields, ...organizationInput } = input;
|
|
54
|
+
// 4. Create Organization entity
|
|
40
55
|
const organization = {
|
|
41
56
|
id: organizationId,
|
|
42
|
-
...
|
|
57
|
+
...organizationInput,
|
|
43
58
|
ownerUserId: existingUser.id,
|
|
44
59
|
createdAt: now,
|
|
45
60
|
updatedAt: now
|
|
46
61
|
};
|
|
47
|
-
//
|
|
62
|
+
// 5. Validate the organization data (base + custom)
|
|
48
63
|
const organizationSchema = this.customSchema
|
|
49
64
|
? CreateOrganizationOutputSchema.strip().and(this.customSchema.strip())
|
|
50
65
|
: CreateOrganizationOutputSchema.strip();
|
|
@@ -54,7 +69,51 @@ export class CreateOrganization extends BaseUseCase {
|
|
|
54
69
|
return Result.fail(new ValidationError(firstError.message, firstError.path.join('.')));
|
|
55
70
|
}
|
|
56
71
|
const validatedOrganization = validation.data;
|
|
57
|
-
//
|
|
72
|
+
// 6. Create owner membership with custom fields
|
|
73
|
+
const ownerMembershipBase = {
|
|
74
|
+
id: this.adapters.system.uuid.generate(),
|
|
75
|
+
organizationId: validatedOrganization.id,
|
|
76
|
+
userId: validatedOrganization.ownerUserId,
|
|
77
|
+
username: existingUser.username,
|
|
78
|
+
roleCode: 'owner',
|
|
79
|
+
invitedAt: undefined,
|
|
80
|
+
joinedAt: now,
|
|
81
|
+
leftAt: undefined,
|
|
82
|
+
deletedAt: undefined,
|
|
83
|
+
createdAt: now,
|
|
84
|
+
updatedAt: now
|
|
85
|
+
};
|
|
86
|
+
// Merge membership base fields with custom fields
|
|
87
|
+
const ownerMembership = {
|
|
88
|
+
...ownerMembershipBase,
|
|
89
|
+
...ownerMembershipCustomFields
|
|
90
|
+
};
|
|
91
|
+
// 7. Validate the membership data (base + custom) if custom schema exists
|
|
92
|
+
if (this.membershipCustomSchema) {
|
|
93
|
+
const membershipSchema = this.membershipCustomSchema
|
|
94
|
+
? z
|
|
95
|
+
.object({
|
|
96
|
+
id: z.string(),
|
|
97
|
+
organizationId: z.string(),
|
|
98
|
+
userId: z.string(),
|
|
99
|
+
username: z.string(),
|
|
100
|
+
roleCode: z.enum(['owner', 'admin', 'member']),
|
|
101
|
+
invitedAt: z.date().optional(),
|
|
102
|
+
joinedAt: z.date().optional(),
|
|
103
|
+
leftAt: z.date().optional(),
|
|
104
|
+
deletedAt: z.date().optional(),
|
|
105
|
+
createdAt: z.date(),
|
|
106
|
+
updatedAt: z.date()
|
|
107
|
+
})
|
|
108
|
+
.and(this.membershipCustomSchema)
|
|
109
|
+
: z.any();
|
|
110
|
+
const membershipValidation = membershipSchema.safeParse(ownerMembership);
|
|
111
|
+
if (!membershipValidation.success) {
|
|
112
|
+
const firstError = membershipValidation.error.errors[0];
|
|
113
|
+
return Result.fail(new ValidationError(`Owner membership validation failed: ${firstError.message}`, `ownerMembershipCustomFields.${firstError.path.join('.')}`));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
// 8. Persist organization and owner membership using Unit of Work
|
|
58
117
|
const auditContext = {
|
|
59
118
|
...context,
|
|
60
119
|
organizationId: validatedOrganization.id,
|
|
@@ -68,19 +127,6 @@ export class CreateOrganization extends BaseUseCase {
|
|
|
68
127
|
try {
|
|
69
128
|
await this.adapters.persistence.uow.transaction(async (repos) => {
|
|
70
129
|
await repos.organizations.insert(validatedOrganization, auditContext);
|
|
71
|
-
const ownerMembership = {
|
|
72
|
-
id: this.adapters.system.uuid.generate(),
|
|
73
|
-
organizationId: validatedOrganization.id,
|
|
74
|
-
userId: validatedOrganization.ownerUserId,
|
|
75
|
-
username: existingUser.username,
|
|
76
|
-
roleCode: 'owner',
|
|
77
|
-
invitedAt: undefined,
|
|
78
|
-
joinedAt: now,
|
|
79
|
-
leftAt: undefined,
|
|
80
|
-
deletedAt: undefined,
|
|
81
|
-
createdAt: now,
|
|
82
|
-
updatedAt: now
|
|
83
|
-
};
|
|
84
130
|
await repos.organizationMemberships.insert(ownerMembership, membershipAuditContext);
|
|
85
131
|
});
|
|
86
132
|
}
|
|
@@ -89,7 +135,7 @@ export class CreateOrganization extends BaseUseCase {
|
|
|
89
135
|
originalError: error
|
|
90
136
|
}));
|
|
91
137
|
}
|
|
92
|
-
//
|
|
138
|
+
// 9. Return success; BaseUseCase will parse with output schema
|
|
93
139
|
return Result.ok({ ...validatedOrganization });
|
|
94
140
|
}
|
|
95
141
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CreateOrganization.js","sourceRoot":"","sources":["../../../../src/organizations/use-cases/create-organization/CreateOrganization.ts"],"names":[],"mappings":"AAQA,OAAO,EACH,6BAA6B,EAC7B,8BAA8B,EACjC,MAAM,gDAAgD,CAAC;AAExD,OAAO,EAEH,eAAe,EAClB,MAAM,sDAAsD,CAAC;
|
|
1
|
+
{"version":3,"file":"CreateOrganization.js","sourceRoot":"","sources":["../../../../src/organizations/use-cases/create-organization/CreateOrganization.ts"],"names":[],"mappings":"AAQA,OAAO,EACH,6BAA6B,EAC7B,8BAA8B,EACjC,MAAM,gDAAgD,CAAC;AAExD,OAAO,EAEH,eAAe,EAClB,MAAM,sDAAsD,CAAC;AAC9D,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAEvD;;;;;;GAMG;AACH,MAAM,OAAO,kBAQT,SAAQ,WAUP;IAGgB,YAAY,CAAoB;IAChC,sBAAsB,CAAoB;IAE3D,YACI,QAIC,EACD,cAIC;QAED,0DAA0D;QAC1D,MAAM,YAAY,GAAG,cAAc,EAAE,aAAa,EAAE,YAAY,EAAE,YAEnD,CAAC;QAEhB,qEAAqE;QACrE,MAAM,sBAAsB,GAAG,cAAc,EAAE,uBAAuB,EAAE,YAAY;YAChF,EAAE,YAA4C,CAAC;QAEnD,2FAA2F;QAC3F,IAAI,WAAW,GAAG,6BAA+C,CAAC;QAElE,IAAI,YAAY,EAAE,CAAC;YACf,WAAW,GAAG,WAAW,CAAC,GAAG,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC,CAAC;QAC1D,CAAC;QAED,IAAI,sBAAsB,EAAE,CAAC;YACzB,WAAW,GAAG,WAAW,CAAC,GAAG,CACzB,CAAC,CAAC,MAAM,CAAC;gBACL,2BAA2B,EAAE,sBAAsB,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;aAC3E,CAAC,CACL,CAAC;QACN,CAAC;QAED,MAAM,gBAAgB,GAAG,WAKxB,CAAC;QAEF,qDAAqD;QACrD,MAAM,YAAY,GAAG,CAAC,YAAY;YAC9B,CAAC,CAAC,8BAA8B,CAAC,KAAK,CAAC,YAAY,CAAC;YACpD,CAAC,CAAC,8BAA8B,CAAmD,CAAC;QAExF,KAAK,CACD,iCAAiC,EACjC,QAAQ,EACR,cAAc,EACd,gBAAgB,EAChB,YAAY,EACZ,+BAA+B,CAClC,CAAC;QAEF,IAAI,CAAC,YAAY,GAAG,YAAY,CAAC;QACjC,IAAI,CAAC,sBAAsB,GAAG,sBAAsB,CAAC;IACzD,CAAC;IAES,KAAK,CAAC,oBAAoB,CAChC,KAGK,EACL,OAAyB;QAEzB,gFAAgF;QAChF,0EAA0E;QAE1E,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAElF,IAAI,aAAa,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,YAAY,GAAG,aAAa,CAAC,QAAQ,EAAE,CAAC;QAE9C,+BAA+B;QAC/B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5D,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAE7C,+DAA+D;QAC/D,MAAM,EAAE,2BAA2B,EAAE,GAAG,iBAAiB,EAAE,GAAG,KAAY,CAAC;QAE3E,gCAAgC;QAChC,MAAM,YAAY,GAA6C;YAC3D,EAAE,EAAE,cAAc;YAClB,GAAG,iBAAiB;YACpB,WAAW,EAAE,YAAY,CAAC,EAAE;YAC5B,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACV,CAAC;QAET,oDAAoD;QACpD,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY;YACxC,CAAC,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;YACvE,CAAC,CAAC,8BAA8B,CAAC,KAAK,EAAE,CAAC;QAC7C,MAAM,UAAU,GAAG,kBAAkB,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;QAC9D,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;YACtB,MAAM,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;YAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,eAAe,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3F,CAAC;QACD,MAAM,qBAAqB,GAAG,UAAU,CAAC,IAAgD,CAAC;QAE1F,gDAAgD;QAChD,MAAM,mBAAmB,GAA2B;YAChD,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE;YACxC,cAAc,EAAE,qBAAqB,CAAC,EAAE;YACxC,MAAM,EAAE,qBAAqB,CAAC,WAAW;YACzC,QAAQ,EAAE,YAAY,CAAC,QAAQ;YAC/B,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,SAAS;YACpB,QAAQ,EAAE,GAAG;YACb,MAAM,EAAE,SAAS;YACjB,SAAS,EAAE,SAAS;YACpB,SAAS,EAAE,GAAG;YACd,SAAS,EAAE,GAAG;SACjB,CAAC;QAEF,kDAAkD;QAClD,MAAM,eAAe,GAAiE;YAClF,GAAG,mBAAmB;YACtB,GAAI,2BAAmC;SACnC,CAAC;QAET,0EAA0E;QAC1E,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAC9B,MAAM,gBAAgB,GAAG,IAAI,CAAC,sBAAsB;gBAChD,CAAC,CAAC,CAAC;qBACI,MAAM,CAAC;oBACJ,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE;oBACd,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE;oBAC1B,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;oBAClB,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE;oBACpB,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;oBAC9C,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;oBAC9B,QAAQ,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;oBAC7B,MAAM,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;oBAC3B,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE;oBAC9B,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;oBACnB,SAAS,EAAE,CAAC,CAAC,IAAI,EAAE;iBACtB,CAAC;qBACD,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC;gBACvC,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC;YAEd,MAAM,oBAAoB,GAAG,gBAAgB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;YACzE,IAAI,CAAC,oBAAoB,CAAC,OAAO,EAAE,CAAC;gBAChC,MAAM,UAAU,GAAG,oBAAoB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACxD,OAAO,MAAM,CAAC,IAAI,CACd,IAAI,eAAe,CACf,uCAAuC,UAAU,CAAC,OAAO,EAAE,EAC3D,+BAA+B,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAC7D,CACJ,CAAC;YACN,CAAC;QACL,CAAC;QAED,kEAAkE;QAClE,MAAM,YAAY,GAAqB;YACnC,GAAG,OAAO;YACV,cAAc,EAAE,qBAAqB,CAAC,EAAE;YACxC,WAAW,EAAE,qBAAqB;SACrC,CAAC;QACF,MAAM,sBAAsB,GAAqB;YAC7C,GAAG,OAAO;YACV,cAAc,EAAE,qBAAqB,CAAC,EAAE;YACxC,WAAW,EAAE,yBAAyB;SACzC,CAAC;QAEF,IAAI,CAAC;YACD,MAAM,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC5D,MAAM,KAAK,CAAC,aAAa,CAAC,MAAM,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;gBAEtE,MAAM,KAAK,CAAC,uBAAuB,CAAC,MAAM,CACtC,eAAsB,EACtB,sBAAsB,CACzB,CAAC;YACN,CAAC,CAAC,CAAC;QACP,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,OAAO,MAAM,CAAC,IAAI,CACd,IAAI,eAAe,CAAC,6BAA6B,EAAE,SAAS,EAAE;gBAC1D,aAAa,EAAE,KAAK;aACvB,CAAC,CACL,CAAC;QACN,CAAC;QAED,+DAA+D;QAC/D,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,GAAI,qBAA6B,EAA8B,CAAC,CAAC;IACxF,CAAC;CACJ"}
|