Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 6 additions & 10 deletions jslib/common/src/models/request/organizationImportRequest.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,16 +8,12 @@ export class OrganizationImportRequest {
overwriteExisting = false;
largeImport = false;

constructor(
model:
| {
groups: Required<OrganizationImportGroupRequest>[];
users: Required<OrganizationImportMemberRequest>[];
overwriteExisting: boolean;
largeImport: boolean;
}
| ImportDirectoryRequest,
) {
constructor(model: {
groups: Required<OrganizationImportGroupRequest>[];
users: Required<OrganizationImportMemberRequest>[];
overwriteExisting: boolean;
largeImport: boolean;
}) {
if (model instanceof ImportDirectoryRequest) {
this.groups = model.groups.map((g) => new OrganizationImportGroupRequest(g));
this.members = model.users.map((u) => new OrganizationImportMemberRequest(u));
Expand Down
6 changes: 4 additions & 2 deletions src/abstractions/request-builder.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,9 @@ export abstract class RequestBuilder {
buildRequest: (
groups: GroupEntry[],
users: UserEntry[],
removeDisabled: boolean,
overwriteExisting: boolean,
options: {
removeDisabled: boolean;
overwriteExisting: boolean;
},
) => OrganizationImportRequest[];
}
18 changes: 13 additions & 5 deletions src/services/batch-request-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,17 +16,25 @@ export class BatchRequestBuilder implements RequestBuilder {
buildRequest(
groups: GroupEntry[],
users: UserEntry[],
removeDisabled: boolean,
overwriteExisting: boolean,
options: {
removeDisabled: boolean;
overwriteExisting: boolean;
},
): OrganizationImportRequest[] {
if (options.overwriteExisting) {
throw new Error(
"You cannot use the 'Remove and re-add organization users during the next sync' option with large imports.",
);
}

const requests: OrganizationImportRequest[] = [];

if (users.length > 0) {
const usersRequest = users.map((u) => {
return {
email: u.email,
externalId: u.externalId,
deleted: u.deleted || (removeDisabled && u.disabled),
deleted: u.deleted || (options.removeDisabled && u.disabled),
};
});

Expand All @@ -37,7 +45,7 @@ export class BatchRequestBuilder implements RequestBuilder {
groups: [],
users: u,
largeImport: true,
overwriteExisting,
overwriteExisting: false,
});
requests.push(req);
}
Expand All @@ -59,7 +67,7 @@ export class BatchRequestBuilder implements RequestBuilder {
groups: g,
users: [],
largeImport: true,
overwriteExisting,
overwriteExisting: false,
});
requests.push(req);
}
Expand Down
20 changes: 17 additions & 3 deletions src/services/batch-requests-builder.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,26 +21,40 @@ describe("BatchRequestBuilder", () => {
singleRequestBuilder = new SingleRequestBuilder();
});

const defaultOptions = { overwriteExisting: false, removeDisabled: false };

it("BatchRequestBuilder batches requests for > 2000 users", () => {
const mockGroups = groupSimulator(11000);
const mockUsers = userSimulator(11000);

const requests = batchRequestBuilder.buildRequest(mockGroups, mockUsers, true, true);
const requests = batchRequestBuilder.buildRequest(mockGroups, mockUsers, defaultOptions);

expect(requests.length).toEqual(12);
});

it("BatchRequestBuilder throws error when overwriteExisting is true", () => {
const mockGroups = groupSimulator(11000);
const mockUsers = userSimulator(11000);
const options = { ...defaultOptions, overwriteExisting: true };

const r = () => batchRequestBuilder.buildRequest(mockGroups, mockUsers, options);

expect(r).toThrow(
"You cannot use the 'Remove and re-add organization users during the next sync' option with large imports.",
);
});

it("SingleRequestBuilder returns single request for 200 users", () => {
const mockGroups = groupSimulator(200);
const mockUsers = userSimulator(200);

const requests = singleRequestBuilder.buildRequest(mockGroups, mockUsers, true, true);
const requests = singleRequestBuilder.buildRequest(mockGroups, mockUsers, defaultOptions);

expect(requests.length).toEqual(1);
});

it("BatchRequestBuilder retuns an empty array when there are no users or groups", () => {
const requests = batchRequestBuilder.buildRequest([], [], true, true);
const requests = batchRequestBuilder.buildRequest([], [], defaultOptions);

expect(requests).toEqual([]);
});
Expand Down
10 changes: 6 additions & 4 deletions src/services/single-request-builder.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,10 @@ export class SingleRequestBuilder implements RequestBuilder {
buildRequest(
groups: GroupEntry[],
users: UserEntry[],
removeDisabled: boolean,
overwriteExisting: boolean,
options: {
removeDisabled: boolean;
overwriteExisting: boolean;
},
): OrganizationImportRequest[] {
return [
new OrganizationImportRequest({
Expand All @@ -31,10 +33,10 @@ export class SingleRequestBuilder implements RequestBuilder {
return {
email: u.email,
externalId: u.externalId,
deleted: u.deleted || (removeDisabled && u.disabled),
deleted: u.deleted || (options.removeDisabled && u.disabled),
};
}),
overwriteExisting: overwriteExisting,
overwriteExisting: options.overwriteExisting,
largeImport: false,
}),
];
Expand Down
28 changes: 5 additions & 23 deletions src/services/sync.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,13 +83,7 @@ export class SyncService {
return [groups, users];
}

const reqs = this.buildRequest(
groups,
users,
syncConfig.removeDisabled,
syncConfig.overwriteExisting,
syncConfig.largeImport,
);
const reqs = this.buildRequest(groups, users, syncConfig);

const result: HashResult = await this.generateHash(reqs);

Expand Down Expand Up @@ -219,24 +213,12 @@ export class SyncService {
private buildRequest(
groups: GroupEntry[],
users: UserEntry[],
removeDisabled: boolean,
overwriteExisting: boolean,
largeImport = false,
syncConfig: SyncConfiguration,
): OrganizationImportRequest[] {
if (largeImport && groups.length + users.length > batchSize) {
return this.batchRequestBuilder.buildRequest(
groups,
users,
overwriteExisting,
removeDisabled,
);
if (syncConfig.largeImport && groups.length + users.length > batchSize) {
return this.batchRequestBuilder.buildRequest(groups, users, syncConfig);
} else {
return this.singleRequestBuilder.buildRequest(
groups,
users,
overwriteExisting,
removeDisabled,
);
return this.singleRequestBuilder.buildRequest(groups, users, syncConfig);
}
}

Expand Down